diff options
240 files changed, 33046 insertions, 14021 deletions
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 332ed2b72f..8dc712c78d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,11 +1,7 @@ <!-- -Pull requests should always be made for the `master` branch first, as that's -where development happens and the source of all future stable release branches. +Please target the `master` branch in priority. +PRs can target `3.x` if the same change was done in `master`, or is not relevant there. -Relevant fixes are cherry-picked for stable branches as needed. - -Do not create a pull request for stable branches unless the change is already -available in the `master` branch and it cannot be easily cherry-picked. -Alternatively, if the change is only relevant for that branch (e.g. rendering -fixes for the 3.2 branch). +Relevant fixes are cherry-picked for stable branches as needed by maintainers. +You can mention in the description if the change is compatible with `3.x`. --> diff --git a/core/SCsub b/core/SCsub index 1379e9df9b..3814c72877 100644 --- a/core/SCsub +++ b/core/SCsub @@ -129,6 +129,10 @@ if env["builtin_zstd"]: "decompress/zstd_decompress_block.c", "decompress/zstd_decompress.c", ] + if env["platform"] in ["android", "linuxbsd", "osx"]: + # Match platforms with ZSTD_ASM_SUPPORTED in common/portability_macros.h + # iOS x86_64 should be supported in theory, but it fails arm64 build, seems to use host S_compiler. + thirdparty_zstd_sources.append("decompress/huf_decompress_amd64.S") thirdparty_zstd_sources = [thirdparty_zstd_dir + file for file in thirdparty_zstd_sources] env_thirdparty.Prepend(CPPPATH=[thirdparty_zstd_dir, thirdparty_zstd_dir + "common"]) diff --git a/core/core_bind.cpp b/core/core_bind.cpp index fc91f83462..b5f4a1c0f6 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -83,6 +83,14 @@ Vector<String> ResourceLoader::get_recognized_extensions_for_type(const String & return ret; } +void ResourceLoader::add_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader, bool p_at_front) { + ::ResourceLoader::add_resource_format_loader(p_format_loader, p_at_front); +} + +void ResourceLoader::remove_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader) { + ::ResourceLoader::remove_resource_format_loader(p_format_loader); +} + void ResourceLoader::set_abort_on_missing_resources(bool p_abort) { ::ResourceLoader::set_abort_on_missing_resources(p_abort); } @@ -119,6 +127,8 @@ void ResourceLoader::_bind_methods() { ClassDB::bind_method(D_METHOD("load", "path", "type_hint", "cache_mode"), &ResourceLoader::load, DEFVAL(""), DEFVAL(CACHE_MODE_REUSE)); ClassDB::bind_method(D_METHOD("get_recognized_extensions_for_type", "type"), &ResourceLoader::get_recognized_extensions_for_type); + ClassDB::bind_method(D_METHOD("add_resource_format_loader", "format_loader", "at_front"), &ResourceLoader::add_resource_format_loader, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("remove_resource_format_loader", "format_loader"), &ResourceLoader::remove_resource_format_loader); ClassDB::bind_method(D_METHOD("set_abort_on_missing_resources", "abort"), &ResourceLoader::set_abort_on_missing_resources); ClassDB::bind_method(D_METHOD("get_dependencies", "path"), &ResourceLoader::get_dependencies); ClassDB::bind_method(D_METHOD("has_cached", "path"), &ResourceLoader::has_cached); @@ -153,11 +163,21 @@ Vector<String> ResourceSaver::get_recognized_extensions(const Ref<Resource> &p_r return ret; } +void ResourceSaver::add_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver, bool p_at_front) { + ::ResourceSaver::add_resource_format_saver(p_format_saver, p_at_front); +} + +void ResourceSaver::remove_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver) { + ::ResourceSaver::remove_resource_format_saver(p_format_saver); +} + ResourceSaver *ResourceSaver::singleton = nullptr; void ResourceSaver::_bind_methods() { ClassDB::bind_method(D_METHOD("save", "path", "resource", "flags"), &ResourceSaver::save, DEFVAL((uint32_t)FLAG_NONE)); ClassDB::bind_method(D_METHOD("get_recognized_extensions", "type"), &ResourceSaver::get_recognized_extensions); + ClassDB::bind_method(D_METHOD("add_resource_format_saver", "format_saver", "at_front"), &ResourceSaver::add_resource_format_saver, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("remove_resource_format_saver", "format_saver"), &ResourceSaver::remove_resource_format_saver); BIND_ENUM_CONSTANT(FLAG_NONE); BIND_ENUM_CONSTANT(FLAG_RELATIVE_PATHS); diff --git a/core/core_bind.h b/core/core_bind.h index ec9bcdbc02..99e14a75f5 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -77,6 +77,8 @@ public: Ref<Resource> load(const String &p_path, const String &p_type_hint = "", CacheMode p_cache_mode = CACHE_MODE_REUSE); Vector<String> get_recognized_extensions_for_type(const String &p_type); + void add_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader, bool p_at_front); + void remove_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader); void set_abort_on_missing_resources(bool p_abort); PackedStringArray get_dependencies(const String &p_path); bool has_cached(const String &p_path); @@ -109,6 +111,8 @@ public: Error save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags); Vector<String> get_recognized_extensions(const Ref<Resource> &p_resource); + void add_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver, bool p_at_front); + void remove_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver); ResourceSaver() { singleton = this; } }; diff --git a/core/debugger/local_debugger.cpp b/core/debugger/local_debugger.cpp index 06e08081e9..58d239ccb9 100644 --- a/core/debugger/local_debugger.cpp +++ b/core/debugger/local_debugger.cpp @@ -31,7 +31,7 @@ #include "local_debugger.h" #include "core/debugger/script_debugger.h" -#include "scene/main/scene_tree.h" +#include "core/os/os.h" struct LocalDebugger::ScriptsProfiler { struct ProfileInfoSort { @@ -273,7 +273,10 @@ void LocalDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) { script_debugger->set_depth(-1); script_debugger->set_lines_left(-1); - SceneTree::get_singleton()->quit(); + MainLoop *main_loop = OS::get_singleton()->get_main_loop(); + if (main_loop->get_class() == "SceneTree") { + main_loop->call("quit"); + } break; } else if (line.begins_with("delete")) { if (line.get_slice_count(" ") <= 1) { diff --git a/core/debugger/remote_debugger.cpp b/core/debugger/remote_debugger.cpp index 5ee4e2c368..c73e2eb3fb 100644 --- a/core/debugger/remote_debugger.cpp +++ b/core/debugger/remote_debugger.cpp @@ -208,7 +208,7 @@ void RemoteDebugger::_err_handler(void *p_this, const char *p_func, const char * rd->script_debugger->send_error(String::utf8(p_func), String::utf8(p_file), p_line, String::utf8(p_err), String::utf8(p_descr), p_editor_notify, p_type, si); } -void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p_error) { +void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p_error, bool p_rich) { RemoteDebugger *rd = static_cast<RemoteDebugger *>(p_this); if (rd->flushing && Thread::get_caller_id() == rd->flush_thread) { // Can't handle recursive prints during flush. @@ -237,7 +237,13 @@ void RemoteDebugger::_print_handler(void *p_this, const String &p_string, bool p OutputString output_string; output_string.message = s; - output_string.type = p_error ? MESSAGE_TYPE_ERROR : MESSAGE_TYPE_LOG; + if (p_error) { + output_string.type = MESSAGE_TYPE_ERROR; + } else if (p_rich) { + output_string.type = MESSAGE_TYPE_LOG_RICH; + } else { + output_string.type = MESSAGE_TYPE_LOG; + } rd->output_strings.push_back(output_string); if (overflowed) { @@ -291,6 +297,14 @@ void RemoteDebugger::flush_output() { } strings.push_back(output_string.message); types.push_back(MESSAGE_TYPE_ERROR); + } else if (output_string.type == MESSAGE_TYPE_LOG_RICH) { + if (!joined_log_strings.is_empty()) { + strings.push_back(String("\n").join(joined_log_strings)); + types.push_back(MESSAGE_TYPE_LOG_RICH); + joined_log_strings.clear(); + } + strings.push_back(output_string.message); + types.push_back(MESSAGE_TYPE_LOG_RICH); } else { joined_log_strings.push_back(output_string.message); } diff --git a/core/debugger/remote_debugger.h b/core/debugger/remote_debugger.h index fdb312ae68..fe4bbe86ea 100644 --- a/core/debugger/remote_debugger.h +++ b/core/debugger/remote_debugger.h @@ -44,6 +44,7 @@ public: enum MessageType { MESSAGE_TYPE_LOG, MESSAGE_TYPE_ERROR, + MESSAGE_TYPE_LOG_RICH, }; private: @@ -82,7 +83,7 @@ private: Thread::ID flush_thread = 0; PrintHandlerList phl; - static void _print_handler(void *p_this, const String &p_string, bool p_error); + static void _print_handler(void *p_this, const String &p_string, bool p_error, bool p_rich); ErrorHandlerList eh; static void _err_handler(void *p_this, const char *p_func, const char *p_file, int p_line, const char *p_err, const char *p_descr, bool p_editor_notify, ErrorHandlerType p_type); diff --git a/core/error/error_macros.cpp b/core/error/error_macros.cpp index 8add4b9a3a..f71a642b23 100644 --- a/core/error/error_macros.cpp +++ b/core/error/error_macros.cpp @@ -83,7 +83,13 @@ void _err_print_error(const char *p_function, const char *p_file, int p_line, co // Main error printing function. void _err_print_error(const char *p_function, const char *p_file, int p_line, const char *p_error, const char *p_message, bool p_editor_notify, ErrorHandlerType p_type) { - OS::get_singleton()->print_error(p_function, p_file, p_line, p_error, p_message, p_editor_notify, (Logger::ErrorType)p_type); + if (OS::get_singleton()) { + OS::get_singleton()->print_error(p_function, p_file, p_line, p_error, p_message, p_editor_notify, (Logger::ErrorType)p_type); + } else { + // Fallback if errors happen before OS init or after it's destroyed. + const char *err_details = (p_message && *p_message) ? p_message : p_error; + fprintf(stderr, "ERROR: %s\n at: %s (%s:%i)\n", err_details, p_function, p_file, p_line); + } _global_lock(); ErrorHandlerList *l = error_handler_list; diff --git a/core/extension/native_extension.cpp b/core/extension/native_extension.cpp index ebdfa20725..262e28b442 100644 --- a/core/extension/native_extension.cpp +++ b/core/extension/native_extension.cpp @@ -55,14 +55,7 @@ protected: virtual PropertyInfo _gen_argument_type_info(int p_arg) const override { GDNativePropertyInfo pinfo; get_argument_info_func(method_userdata, p_arg, &pinfo); - PropertyInfo ret; - ret.type = Variant::Type(pinfo.type); - ret.name = pinfo.name; - ret.class_name = pinfo.class_name; - ret.hint = PropertyHint(pinfo.hint); - ret.usage = pinfo.usage; - ret.class_name = pinfo.class_name; - return ret; + return PropertyInfo(pinfo); } public: @@ -204,16 +197,11 @@ void NativeExtension::_register_extension_class_property(const GDNativeExtension NativeExtension *self = static_cast<NativeExtension *>(p_library); StringName class_name = p_class_name; - ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property '" + String(p_info->name) + "' for unexisting class '" + class_name + "'."); + String property_name = p_info->name; + ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to register extension class property '" + property_name + "' for unexisting class '" + class_name + "'."); //Extension *extension = &self->extension_classes[class_name]; - PropertyInfo pinfo; - pinfo.type = Variant::Type(p_info->type); - pinfo.name = p_info->name; - pinfo.class_name = p_info->class_name; - pinfo.hint = PropertyHint(p_info->hint); - pinfo.hint_string = p_info->hint_string; - pinfo.usage = p_info->usage; + PropertyInfo pinfo(*p_info); ClassDB::add_property(class_name, pinfo, p_setter, p_getter); } @@ -245,13 +233,7 @@ void NativeExtension::_register_extension_class_signal(const GDNativeExtensionCl MethodInfo s; s.name = p_signal_name; for (int i = 0; i < p_argument_count; i++) { - PropertyInfo arg; - arg.type = Variant::Type(p_argument_info[i].type); - arg.name = p_argument_info[i].name; - arg.class_name = p_argument_info[i].class_name; - arg.hint = PropertyHint(p_argument_info[i].hint); - arg.hint_string = p_argument_info[i].hint_string; - arg.usage = p_argument_info[i].usage; + PropertyInfo arg(p_argument_info[i]); s.arguments.push_back(arg); } ClassDB::add_signal(class_name, s); diff --git a/core/input/input.cpp b/core/input/input.cpp index b3a68bb98c..da0c6cb62a 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -325,6 +325,7 @@ float Input::get_action_strength(const StringName &p_action, bool p_exact) const } float Input::get_action_raw_strength(const StringName &p_action, bool p_exact) const { + ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), 0.0, InputMap::get_singleton()->suggest_actions(p_action)); HashMap<StringName, Action>::ConstIterator E = action_state.find(p_action); if (!E) { return 0.0f; diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index bb9606c94b..f71ea5c39e 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -532,7 +532,13 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int } break; case Variant::RID: { - r_variant = RID(); + ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); + uint64_t id = decode_uint64(buf); + if (r_len) { + (*r_len) += 8; + } + + r_variant = RID::from_uint64(id); } break; case Variant::OBJECT: { if (type & ENCODE_FLAG_OBJECT_AS_ID) { @@ -614,9 +620,20 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int r_variant = Callable(); } break; case Variant::SIGNAL: { - r_variant = Signal(); - } break; + String name; + Error err = _decode_string(buf, len, r_len, name); + if (err) { + return err; + } + ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); + ObjectID id = ObjectID(decode_uint64(buf)); + if (r_len) { + (*r_len) += 8; + } + + r_variant = Signal(id, StringName(name)); + } break; case Variant::DICTIONARY: { ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); int32_t count = decode_uint32(buf); @@ -1352,10 +1369,12 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo } break; case Variant::RID: { - } break; - case Variant::CALLABLE: { - } break; - case Variant::SIGNAL: { + RID rid = p_variant; + + if (buf) { + encode_uint64(rid.get_id(), buf); + } + r_len += 8; } break; case Variant::OBJECT: { if (p_full_objects) { @@ -1419,6 +1438,18 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo } } break; + case Variant::CALLABLE: { + } break; + case Variant::SIGNAL: { + Signal signal = p_variant; + + _encode_string(signal.get_name(), buf, r_len); + + if (buf) { + encode_uint64(signal.get_object_id(), buf); + } + r_len += 8; + } break; case Variant::DICTIONARY: { Dictionary d = p_variant; diff --git a/core/object/object.cpp b/core/object/object.cpp index 440da00c17..5f2287c9d3 100644 --- a/core/object/object.cpp +++ b/core/object/object.cpp @@ -493,7 +493,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons uint32_t pcount; const GDNativePropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount); for (uint32_t i = 0; i < pcount; i++) { - p_list->push_back(PropertyInfo(Variant::Type(pinfo[i].type), pinfo[i].class_name, PropertyHint(pinfo[i].hint), pinfo[i].hint_string, pinfo[i].usage, pinfo[i].class_name)); + p_list->push_back(PropertyInfo(pinfo[i])); } if (_extension->free_property_list) { _extension->free_property_list(_extension_instance, pinfo); diff --git a/core/object/object.h b/core/object/object.h index e065634000..1f6386e6b4 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -190,6 +190,14 @@ struct PropertyInfo { type(Variant::OBJECT), class_name(p_class_name) {} + explicit PropertyInfo(const GDNativePropertyInfo &pinfo) : + type((Variant::Type)pinfo.type), + name(pinfo.name), + class_name(pinfo.class_name), // can be null + hint((PropertyHint)pinfo.hint), + hint_string(pinfo.hint_string), // can be null + usage(pinfo.usage) {} + bool operator==(const PropertyInfo &p_info) const { return ((type == p_info.type) && (name == p_info.name) && diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h index 406a431a11..7eea48370e 100644 --- a/core/object/script_language_extension.h +++ b/core/object/script_language_extension.h @@ -671,7 +671,7 @@ public: uint32_t pcount; const GDNativePropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount); for (uint32_t i = 0; i < pcount; i++) { - p_list->push_back(PropertyInfo(Variant::Type(pinfo[i].type), pinfo[i].class_name, PropertyHint(pinfo[i].hint), pinfo[i].hint_string, pinfo[i].usage, pinfo[i].class_name)); + p_list->push_back(PropertyInfo(pinfo[i])); } if (native_info->free_property_list_func) { native_info->free_property_list_func(instance, pinfo); @@ -716,9 +716,9 @@ public: m.name = minfo[i].name; m.flags = minfo[i].flags; m.id = minfo[i].id; - m.return_val = PropertyInfo(Variant::Type(minfo[i].return_value.type), minfo[i].return_value.class_name, PropertyHint(minfo[i].return_value.hint), minfo[i].return_value.hint_string, minfo[i].return_value.usage, minfo[i].return_value.class_name); + m.return_val = PropertyInfo(minfo[i].return_value); for (uint32_t j = 0; j < minfo[i].argument_count; j++) { - m.arguments.push_back(PropertyInfo(Variant::Type(minfo[i].arguments[j].type), minfo[i].arguments[j].class_name, PropertyHint(minfo[i].arguments[j].hint), minfo[i].arguments[j].hint_string, minfo[i].arguments[j].usage, minfo[i].arguments[j].class_name)); + m.arguments.push_back(PropertyInfo(minfo[i].arguments[j])); } const Variant *def_values = (const Variant *)minfo[i].default_arguments; for (uint32_t j = 0; j < minfo[i].default_argument_count; j++) { diff --git a/core/os/os.cpp b/core/os/os.cpp index 93477f4288..b9daf6fa53 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -100,6 +100,21 @@ void OS::print(const char *p_format, ...) { va_end(argp); } +void OS::print_rich(const char *p_format, ...) { + if (!_stdout_enabled) { + return; + } + + va_list argp; + va_start(argp, p_format); + + if (_logger) { + _logger->logv(p_format, argp, false); + } + + va_end(argp); +} + void OS::printerr(const char *p_format, ...) { if (!_stderr_enabled) { return; diff --git a/core/os/os.h b/core/os/os.h index c6ea9d869a..af6c38cbe0 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -120,6 +120,7 @@ public: void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify = false, Logger::ErrorType p_type = Logger::ERR_ERROR); void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; + void print_rich(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; void printerr(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3; virtual String get_stdin_string(bool p_block = true) = 0; diff --git a/core/string/print_string.cpp b/core/string/print_string.cpp index 919c9e08e3..f58486e0a5 100644 --- a/core/string/print_string.cpp +++ b/core/string/print_string.cpp @@ -79,7 +79,98 @@ void __print_line(String p_string) { _global_lock(); PrintHandlerList *l = print_handler_list; while (l) { - l->printfunc(l->userdata, p_string, false); + l->printfunc(l->userdata, p_string, false, false); + l = l->next; + } + + _global_unlock(); +} + +void __print_line_rich(String p_string) { + if (!_print_line_enabled) { + return; + } + + // Convert a subset of BBCode tags to ANSI escape codes for correct display in the terminal. + // Support of those ANSI escape codes varies across terminal emulators, + // especially for italic and strikethrough. + String p_string_ansi = p_string; + + p_string_ansi = p_string_ansi.replace("[b]", "\u001b[1m"); + p_string_ansi = p_string_ansi.replace("[/b]", "\u001b[22m"); + p_string_ansi = p_string_ansi.replace("[i]", "\u001b[3m"); + p_string_ansi = p_string_ansi.replace("[/i]", "\u001b[23m"); + p_string_ansi = p_string_ansi.replace("[u]", "\u001b[4m"); + p_string_ansi = p_string_ansi.replace("[/u]", "\u001b[24m"); + p_string_ansi = p_string_ansi.replace("[s]", "\u001b[9m"); + p_string_ansi = p_string_ansi.replace("[/s]", "\u001b[29m"); + + p_string_ansi = p_string_ansi.replace("[indent]", " "); + p_string_ansi = p_string_ansi.replace("[/indent]", ""); + p_string_ansi = p_string_ansi.replace("[code]", "\u001b[2m"); + p_string_ansi = p_string_ansi.replace("[/code]", "\u001b[22m"); + p_string_ansi = p_string_ansi.replace("[url]", ""); + p_string_ansi = p_string_ansi.replace("[/url]", ""); + p_string_ansi = p_string_ansi.replace("[center]", "\n\t\t\t"); + p_string_ansi = p_string_ansi.replace("[/center]", ""); + p_string_ansi = p_string_ansi.replace("[right]", "\n\t\t\t\t\t\t"); + p_string_ansi = p_string_ansi.replace("[/right]", ""); + + if (p_string_ansi.contains("[color")) { + p_string_ansi = p_string_ansi.replace("[color=black]", "\u001b[30m"); + p_string_ansi = p_string_ansi.replace("[color=red]", "\u001b[91m"); + p_string_ansi = p_string_ansi.replace("[color=green]", "\u001b[92m"); + p_string_ansi = p_string_ansi.replace("[color=lime]", "\u001b[92m"); + p_string_ansi = p_string_ansi.replace("[color=yellow]", "\u001b[93m"); + p_string_ansi = p_string_ansi.replace("[color=blue]", "\u001b[94m"); + p_string_ansi = p_string_ansi.replace("[color=magenta]", "\u001b[95m"); + p_string_ansi = p_string_ansi.replace("[color=pink]", "\u001b[38;5;218m"); + p_string_ansi = p_string_ansi.replace("[color=purple]", "\u001b[38;5;98m"); + p_string_ansi = p_string_ansi.replace("[color=cyan]", "\u001b[96m"); + p_string_ansi = p_string_ansi.replace("[color=white]", "\u001b[97m"); + p_string_ansi = p_string_ansi.replace("[color=orange]", "\u001b[38;5;208m"); + p_string_ansi = p_string_ansi.replace("[color=gray]", "\u001b[90m"); + p_string_ansi = p_string_ansi.replace("[/color]", "\u001b[39m"); + } + if (p_string_ansi.contains("[bgcolor")) { + p_string_ansi = p_string_ansi.replace("[bgcolor=black]", "\u001b[40m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=red]", "\u001b[101m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=green]", "\u001b[102m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=lime]", "\u001b[102m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=yellow]", "\u001b[103m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=blue]", "\u001b[104m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=magenta]", "\u001b[105m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=pink]", "\u001b[48;5;218m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=purple]", "\u001b[48;5;98m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=cyan]", "\u001b[106m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=white]", "\u001b[107m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=orange]", "\u001b[48;5;208m"); + p_string_ansi = p_string_ansi.replace("[bgcolor=gray]", "\u001b[100m"); + p_string_ansi = p_string_ansi.replace("[/bgcolor]", "\u001b[49m"); + } + if (p_string_ansi.contains("[fgcolor")) { + p_string_ansi = p_string_ansi.replace("[fgcolor=black]", "\u001b[30;40m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=red]", "\u001b[91;101m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=green]", "\u001b[92;102m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=lime]", "\u001b[92;102m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=yellow]", "\u001b[93;103m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=blue]", "\u001b[94;104m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=magenta]", "\u001b[95;105m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=pink]", "\u001b[38;5;218;48;5;218m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=purple]", "\u001b[38;5;98;48;5;98m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=cyan]", "\u001b[96;106m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=white]", "\u001b[97;107m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=orange]", "\u001b[38;5;208;48;5;208m"); + p_string_ansi = p_string_ansi.replace("[fgcolor=gray]", "\u001b[90;100m"); + p_string_ansi = p_string_ansi.replace("[/fgcolor]", "\u001b[39;49m"); + } + + OS::get_singleton()->print_rich("%s\n", p_string_ansi.utf8().get_data()); + + _global_lock(); + PrintHandlerList *l = print_handler_list; + while (l) { + l->printfunc(l->userdata, p_string, false, true); l = l->next; } @@ -96,7 +187,7 @@ void print_error(String p_string) { _global_lock(); PrintHandlerList *l = print_handler_list; while (l) { - l->printfunc(l->userdata, p_string, true); + l->printfunc(l->userdata, p_string, true, false); l = l->next; } diff --git a/core/string/print_string.h b/core/string/print_string.h index f7d0f25030..823e2c29e8 100644 --- a/core/string/print_string.h +++ b/core/string/print_string.h @@ -35,7 +35,7 @@ extern void (*_print_func)(String); -typedef void (*PrintHandlerFunc)(void *, const String &p_string, bool p_error); +typedef void (*PrintHandlerFunc)(void *, const String &p_string, bool p_error, bool p_rich); struct PrintHandlerList { PrintHandlerFunc printfunc = nullptr; @@ -59,6 +59,7 @@ void remove_print_handler(const PrintHandlerList *p_handler); extern bool _print_line_enabled; extern bool _print_error_enabled; extern void __print_line(String p_string); +extern void __print_line_rich(String p_string); extern void print_error(String p_string); extern void print_verbose(String p_string); @@ -66,9 +67,18 @@ inline void print_line(Variant v) { __print_line(stringify_variants(v)); } +inline void print_line_rich(Variant v) { + __print_line_rich(stringify_variants(v)); +} + template <typename... Args> void print_line(Variant p_var, Args... p_args) { __print_line(stringify_variants(p_var, p_args...)); } +template <typename... Args> +void print_line_rich(Variant p_var, Args... p_args) { + __print_line_rich(stringify_variants(p_var, p_args...)); +} + #endif // PRINT_STRING_H diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index f4e0748c27..8d687effcf 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -38,7 +38,9 @@ #include <initializer_list> -template <class T, class U = uint32_t, bool force_trivial = false> +// If tight, it grows strictly as much as needed. +// Otherwise, it grows exponentially (the default and what you want in most cases). +template <class T, class U = uint32_t, bool force_trivial = false, bool tight = false> class LocalVector { private: U count = 0; @@ -121,7 +123,7 @@ public: _FORCE_INLINE_ bool is_empty() const { return count == 0; } _FORCE_INLINE_ U get_capacity() const { return capacity; } _FORCE_INLINE_ void reserve(U p_size) { - p_size = nearest_power_of_2_templated(p_size); + p_size = tight ? p_size : nearest_power_of_2_templated(p_size); if (p_size > capacity) { capacity = p_size; data = (T *)memrealloc(data, capacity * sizeof(T)); @@ -262,4 +264,7 @@ public: } }; +template <class T, class U = uint32_t, bool force_trivial = false> +using TightLocalVector = LocalVector<T, U, force_trivial, true>; + #endif // LOCAL_VECTOR_H diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 3696ffae60..e0cfb42e1e 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -304,6 +304,13 @@ public: v->_get_obj().id = ObjectID(); } + static void update_object_id(Variant *v) { + const Object *o = v->_get_obj().obj; + if (o) { + v->_get_obj().id = o->get_instance_id(); + } + } + _FORCE_INLINE_ static void *get_opaque_pointer(Variant *v) { switch (v->type) { case Variant::NIL: diff --git a/core/variant/variant_utility.cpp b/core/variant/variant_utility.cpp index d1b5e285d2..2bca5f8284 100644 --- a/core/variant/variant_utility.cpp +++ b/core/variant/variant_utility.cpp @@ -560,6 +560,22 @@ struct VariantUtilityFunctions { r_error.error = Callable::CallError::CALL_OK; } + static inline void print_rich(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) { + String s; + for (int i = 0; i < p_arg_count; i++) { + String os = p_args[i]->operator String(); + + if (i == 0) { + s = os; + } else { + s += os; + } + } + + print_line_rich(s); + r_error.error = Callable::CallError::CALL_OK; + } + static inline void print_verbose(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) { if (OS::get_singleton()->is_stdout_verbose()) { String s; @@ -1306,6 +1322,7 @@ void Variant::_register_variant_utility_functions() { FUNCBINDVARARGS(str, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); FUNCBINDR(error_string, sarray("error"), Variant::UTILITY_FUNC_TYPE_GENERAL); FUNCBINDVARARGV(print, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); + FUNCBINDVARARGV(print_rich, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); FUNCBINDVARARGV(printerr, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); FUNCBINDVARARGV(printt, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); FUNCBINDVARARGV(prints, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 1a0253a28b..1943221309 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -657,6 +657,16 @@ [b]Note:[/b] Consider using [method push_error] and [method push_warning] to print error and warning messages instead of [method print]. This distinguishes them from print messages used for debugging purposes, while also displaying a stack trace when an error or warning is printed. </description> </method> + <method name="print_rich" qualifiers="vararg"> + <description> + Converts one or more arguments of any type to string in the best way possible and prints them to the console. The following BBCode tags are supported: b, i, u, s, indent, code, url, center, right, color, bgcolor, fgcolor. Color tags only support named colors such as [code]red[/code], [i]not[/i] hexadecimal color codes. Unsupported tags will be left as-is in standard output. + When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Displaying ANSI escape codes is currently only supported on Linux and macOS. Support for ANSI escape codes may vary across terminal emulators, especially for italic and strikethrough. + [codeblock] + print_rich("[code][b]Hello world![/b][/code]") # Prints out: [b]Hello world![/b] + [/codeblock] + [b]Note:[/b] Consider using [method push_error] and [method push_warning] to print error and warning messages instead of [method print] or [method print_rich]. This distinguishes them from print messages used for debugging purposes, while also displaying a stack trace when an error or warning is printed. + </description> + </method> <method name="print_verbose" qualifiers="vararg"> <description> If verbose mode is enabled ([method OS.is_stdout_verbose] returning [code]true[/code]), converts one or more arguments of any type to string in the best way possible and prints them to the console. diff --git a/doc/classes/AnimationNodeStateMachineTransition.xml b/doc/classes/AnimationNodeStateMachineTransition.xml index 94e6a2f23d..206164d675 100644 --- a/doc/classes/AnimationNodeStateMachineTransition.xml +++ b/doc/classes/AnimationNodeStateMachineTransition.xml @@ -19,6 +19,12 @@ [/csharp] [/codeblocks] </member> + <member name="advance_expression" type="String" setter="set_advance_expression" getter="get_advance_expression" default=""""> + Use an expression as a condition for state machine transitions. It is possible to create complex animation advance conditions for switching between states and gives much greater flexibility for creating complex state machines by directly interfacing with the script code. + </member> + <member name="advance_expression_base_node" type="NodePath" setter="set_advance_expression_base_node" getter="get_advance_expression_base_node" default="NodePath("")"> + The path to the [Node] used to evaluate an [Expression] if one is not explictly specified internally. + </member> <member name="auto_advance" type="bool" setter="set_auto_advance" getter="has_auto_advance" default="false"> Turn on the transition automatically when this state is reached. This works best with [constant SWITCH_MODE_AT_END]. </member> diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml index 67e64c6bee..ecac228a26 100644 --- a/doc/classes/AnimationTree.xml +++ b/doc/classes/AnimationTree.xml @@ -37,6 +37,9 @@ <member name="active" type="bool" setter="set_active" getter="is_active" default="false"> If [code]true[/code], the [AnimationTree] will be processing. </member> + <member name="advance_expression_base_node" type="NodePath" setter="set_advance_expression_base_node" getter="get_advance_expression_base_node" default="NodePath(".")"> + The path to the [Node] used to evaluate the AnimationNode [Expression] if one is not explictly specified internally. + </member> <member name="anim_player" type="NodePath" setter="set_animation_player" getter="get_animation_player" default="NodePath("")"> The path to the [AnimationPlayer] used for animating. </member> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 2391cb892c..553005c4c4 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -494,6 +494,12 @@ <member name="debug/shapes/navigation/geometry_color" type="Color" setter="" getter="" default="Color(0.1, 1, 0.7, 0.4)"> Color of the navigation geometry, visible when "Visible Navigation" is enabled in the Debug menu. </member> + <member name="debug/shapes/paths/geometry_color" type="Color" setter="" getter="" default="Color(0.1, 1, 0.7, 0.4)"> + Color of the curve path geometry, visible when "Visible Paths" is enabled in the Debug menu. + </member> + <member name="debug/shapes/paths/geometry_width" type="float" setter="" getter="" default="2.0"> + Line width of the curve path geometry, visible when "Visible Paths" is enabled in the Debug menu. + </member> <member name="display/mouse_cursor/custom_image" type="String" setter="" getter="" default=""""> Custom image for the mouse cursor (limited to 256×256). </member> diff --git a/doc/classes/ResourceLoader.xml b/doc/classes/ResourceLoader.xml index 1ffb0dba5c..d6e9a233b0 100644 --- a/doc/classes/ResourceLoader.xml +++ b/doc/classes/ResourceLoader.xml @@ -11,6 +11,15 @@ <link title="OS Test Demo">https://godotengine.org/asset-library/asset/677</link> </tutorials> <methods> + <method name="add_resource_format_loader"> + <return type="void" /> + <argument index="0" name="format_loader" type="ResourceFormatLoader" /> + <argument index="1" name="at_front" type="bool" default="false" /> + <description> + Registers a new [ResourceFormatLoader]. The ResourceLoader will use the ResourceFormatLoader as described in [method load]. + This method is performed implictly for ResourceFormatLoaders written in GDScript (see [ResourceFormatLoader] for more information). + </description> + </method> <method name="exists"> <return type="bool" /> <argument index="0" name="path" type="String" /> @@ -89,6 +98,13 @@ Loads the resource using threads. If [code]use_sub_threads[/code] is [code]true[/code], multiple threads will be used to load the resource, which makes loading faster, but may affect the main thread (and thus cause game slowdowns). </description> </method> + <method name="remove_resource_format_loader"> + <return type="void" /> + <argument index="0" name="format_loader" type="ResourceFormatLoader" /> + <description> + Unregisters the given [ResourceFormatLoader]. + </description> + </method> <method name="set_abort_on_missing_resources"> <return type="void" /> <argument index="0" name="abort" type="bool" /> diff --git a/doc/classes/ResourceSaver.xml b/doc/classes/ResourceSaver.xml index a029fb9acf..815c7e8813 100644 --- a/doc/classes/ResourceSaver.xml +++ b/doc/classes/ResourceSaver.xml @@ -10,6 +10,15 @@ <tutorials> </tutorials> <methods> + <method name="add_resource_format_saver"> + <return type="void" /> + <argument index="0" name="format_saver" type="ResourceFormatSaver" /> + <argument index="1" name="at_front" type="bool" default="false" /> + <description> + Registers a new [ResourceFormatSaver]. The ResourceSaver will use the ResourceFormatSaver as described in [method save]. + This method is performed implictly for ResourceFormatSavers written in GDScript (see [ResourceFormatSaver] for more information). + </description> + </method> <method name="get_recognized_extensions"> <return type="PackedStringArray" /> <argument index="0" name="type" type="Resource" /> @@ -17,6 +26,13 @@ Returns the list of extensions available for saving a resource of a given type. </description> </method> + <method name="remove_resource_format_saver"> + <return type="void" /> + <argument index="0" name="format_saver" type="ResourceFormatSaver" /> + <description> + Unregisters the given [ResourceFormatSaver]. + </description> + </method> <method name="save"> <return type="int" enum="Error" /> <argument index="0" name="path" type="String" /> diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index c6b80f171a..cf6ab977db 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -221,6 +221,9 @@ <member name="debug_navigation_hint" type="bool" setter="set_debug_navigation_hint" getter="is_debugging_navigation_hint" default="false"> If [code]true[/code], navigation polygons will be visible when running the game from the editor for debugging purposes. </member> + <member name="debug_paths_hint" type="bool" setter="set_debug_paths_hint" getter="is_debugging_paths_hint" default="false"> + If [code]true[/code], curves from [Path2D] and [Path3D] nodes will be visible when running the game from the editor for debugging purposes. + </member> <member name="edited_scene_root" type="Node" setter="set_edited_scene_root" getter="get_edited_scene_root"> The root of the edited scene. </member> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index f9ec0d115d..b18232f5c3 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -4,41 +4,41 @@ Lightweight object used for general-purpose animation via script, using [Tweener]s. </brief_description> <description> - Tweens are mostly useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them. + Tweens are mostly useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them. Animating something with a [Tween] is called tweening. [Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween]; it would be difficult to do the same thing with an [AnimationPlayer] node. Tweens are also more light-weight than [AnimationPlayer], so they are very much suited for simple animations or general tasks that don't require visual tweaking provided by the editor. They can be used in a fire-and-forget manner for some logic that normally would be done by code. You can e.g. make something shoot periodically by using a looped [CallbackTweener] with a delay. A [Tween] can be created by using either [method SceneTree.create_tween] or [method Node.create_tween]. [Tween]s created manually (i.e. by using [code]Tween.new()[/code]) are invalid and can't be used for tweening values. - A [Tween] animation is composed of a sequence of [Tweener]s, which by default are executed one after another. You can create a sequence by appending [Tweener]s to the [Tween]. Animating something with a [Tweener] is called tweening. Example tweening sequence looks like this: + A tween animation is created by adding [Tweener]s to the [Tween] object, using [method tween_property], [method tween_interval], [method tween_callback] or [method tween_method]: [codeblock] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) [/codeblock] - This sequence will make the [code]$Sprite[/code] node turn red, then shrink and finally the [method Node.queue_free] is called to remove the sprite. See methods [method tween_property], [method tween_interval], [method tween_callback] and [method tween_method] for more usage information. - When a [Tweener] is created with one of the [code]tween_*[/code] methods, a chained method call can be used to tweak the properties of this [Tweener]. For example, if you want to set different transition type in the above example, you can do: + This sequence will make the [code]$Sprite[/code] node turn red, then shrink, before finally calling [method Node.queue_free] to free the sprite. [Tweener]s are executed one after another by default. This behavior can be changed using [method parallel] and [method set_parallel]. + When a [Tweener] is created with one of the [code]tween_*[/code] methods, a chained method call can be used to tweak the properties of this [Tweener]. For example, if you want to set a different transition type in the above example, you can use [method set_trans]: [codeblock] var tween = get_tree().create_tween() tween.tween_property($Sprite, "modulate", Color.red, 1).set_trans(Tween.TRANS_SINE) tween.tween_property($Sprite, "scale", Vector2(), 1).set_trans(Tween.TRANS_BOUNCE) tween.tween_callback($Sprite.queue_free) [/codeblock] - Most of the [Tween] methods can be chained this way too. In this example the [Tween] is bound and have set a default transition: + Most of the [Tween] methods can be chained this way too. In the following example the [Tween] is bound to the running script's node and a default transition is set for its [Tweener]s: [codeblock] var tween = get_tree().create_tween().bind_node(self).set_trans(Tween.TRANS_ELASTIC) tween.tween_property($Sprite, "modulate", Color.red, 1) tween.tween_property($Sprite, "scale", Vector2(), 1) tween.tween_callback($Sprite.queue_free) [/codeblock] - Another interesting use for [Tween]s is animating arbitrary set of objects: + Another interesting use for [Tween]s is animating arbitrary sets of objects: [codeblock] var tween = create_tween() for sprite in get_children(): - tween.tween_property(sprite, "position", Vector2(), 1) + tween.tween_property(sprite, "position", Vector2(0, 0), 1) [/codeblock] In the example above, all children of a node are moved one after another to position (0, 0). - Some [Tweener]s use transitions and eases. The first accepts an [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls where the [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. + Some [Tweener]s use transitions and eases. The first accepts a [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls where the [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url] - [b]Note:[/b] All [Tween]s will automatically start by default. To prevent a [Tween] from autostarting, you can call [method stop] immediately after it was created. + [b]Note:[/b] All [Tween]s will automatically start by default. To prevent a [Tween] from autostarting, you can call [method stop] immediately after it is created. </description> <tutorials> </tutorials> @@ -67,15 +67,15 @@ <return type="bool" /> <argument index="0" name="delta" type="float" /> <description> - Processes the [Tween] by given [code]delta[/code] value, in seconds. Mostly useful when the [Tween] is paused, for controlling it manually. Can also be used to end the [Tween] animation immediately, by using [code]delta[/code] longer than the whole duration. + Processes the [Tween] by the given [code]delta[/code] value, in seconds. This is mostly useful for manual control when the [Tween] is paused. It can also be used to end the [Tween] animation immediately, by setting [code]delta[/code] longer than the whole duration of the [Tween] animation. Returns [code]true[/code] if the [Tween] still has [Tweener]s that haven't finished. - [b]Note:[/b] The [Tween] will become invalid after finished, but you can call [method stop] after the step, to keep it and reset. + [b]Note:[/b] The [Tween] will become invalid in the next processing frame after its animation finishes. Calling [method stop] after performing [method custom_step] instead keeps and resets the [Tween]. </description> </method> <method name="get_total_elapsed_time" qualifiers="const"> <return type="float" /> <description> - Returns the total time in seconds the [Tween] has been animating (i.e. time since it started, not counting pauses etc.). The time is affected by [method set_speed_scale] and [method stop] will reset it to [code]0[/code]. + Returns the total time in seconds the [Tween] has been animating (i.e. the time since it started, not counting pauses etc.). The time is affected by [method set_speed_scale], and [method stop] will reset it to [code]0[/code]. [b]Note:[/b] As it results from accumulating frame deltas, the time returned after the [Tween] has finished animating will be slightly greater than the actual [Tween] duration. </description> </method> @@ -105,7 +105,7 @@ <method name="is_valid"> <return type="bool" /> <description> - Returns whether the [Tween] is valid. A valid [Tween] is a [Tween] contained by the scene tree (i.e. the array from [method SceneTree.get_processed_tweens] will contain this [Tween]). [Tween] might become invalid when it has finished tweening or was killed, also when created with [code]Tween.new()[/code]. Invalid [Tween] can't have [Tweener]s appended, because it can't animate them. + Returns whether the [Tween] is valid. A valid [Tween] is a [Tween] contained by the scene tree (i.e. the array from [method SceneTree.get_processed_tweens] will contain this [Tween]). A [Tween] might become invalid when it has finished tweening, is killed, or when created with [code]Tween.new()[/code]. Invalid [Tween]s can't have [Tweener]s appended. </description> </method> <method name="kill"> @@ -152,8 +152,8 @@ <argument index="0" name="loops" type="int" default="0" /> <description> Sets the number of times the tweening sequence will be repeated, i.e. [code]set_loops(2)[/code] will run the animation twice. - Calling this method without arguments will make the [Tween] run infinitely, until it is either killed by [method kill] or by freeing bound node, or all the animated objects have been freed (which makes further animation impossible). - [b]Warning:[/b] Make sure to always add some duration/delay when using infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] with no delay or [PropertyTweener] with invalid node) are equivalent to infinite [code]while[/code] loops and will freeze your game. If a [Tween]'s lifetime depends on some node, always use [method bind_node]. + Calling this method without arguments will make the [Tween] run infinitely, until either it is killed with [method kill], the [Tween]'s bound node is freed, or all the animated objects have been freed (which makes further animation impossible). + [b]Warning:[/b] Make sure to always add some duration/delay when using infinite loops. To prevent the game freezing, 0-duration looped animations (e.g. a single [CallbackTweener] with no delay) are stopped after a small number of loops, which may produce unexpected results. If a [Tween]'s lifetime depends on some node, always use [method bind_node]. </description> </method> <method name="set_parallel"> @@ -221,7 +221,7 @@ <return type="IntervalTweener" /> <argument index="0" name="time" type="float" /> <description> - Creates and appends an [IntervalTweener]. This method can be used to create delays in the tween animation, as an alternative for using the delay in other [Tweener]s or when there's no animation (in which case the [Tween] acts as a timer). [code]time[/code] is the length of the interval, in seconds. + Creates and appends an [IntervalTweener]. This method can be used to create delays in the tween animation, as an alternative to using the delay in other [Tweener]s, or when there's no animation (in which case the [Tween] acts as a timer). [code]time[/code] is the length of the interval, in seconds. Example: creating an interval in code execution. [codeblock] # ... some code @@ -271,7 +271,7 @@ <argument index="2" name="final_val" type="Variant" /> <argument index="3" name="duration" type="float" /> <description> - Creates and appends a [PropertyTweener]. This method tweens a [code]property[/code] of an [code]object[/code] between an initial value and [code]final_val[/code] in a span of time equal to [code]duration[/code], in seconds. The initial value by default is a value at the time the tweening of the [PropertyTweener] start. For example: + Creates and appends a [PropertyTweener]. This method tweens a [code]property[/code] of an [code]object[/code] between an initial value and [code]final_val[/code] in a span of time equal to [code]duration[/code], in seconds. The initial value by default is the property's value at the time the tweening of the [PropertyTweener] starts. For example: [codeblock] var tween = create_tween() tween.tween_property($Sprite, "position", Vector2(100, 200), 1) @@ -292,19 +292,19 @@ <signal name="finished"> <description> Emitted when the [Tween] has finished all tweening. Never emitted when the [Tween] is set to infinite looping (see [method set_loops]). - [b]Note:[/b] The [Tween] is removed (invalidated) after this signal is emitted, but it doesn't happen immediately, but on the next processing frame. Calling [method stop] inside the signal callback will preserve the [Tween]. + [b]Note:[/b] The [Tween] is removed (invalidated) in the next processing frame after this signal is emitted. Calling [method stop] inside the signal callback will prevent the [Tween] from being removed. </description> </signal> <signal name="loop_finished"> <argument index="0" name="loop_count" type="int" /> <description> - Emitted when a full loop is complete (see [method set_loops]), providing the loop index. This signal is not emitted after final loop, use [signal finished] instead for this case. + Emitted when a full loop is complete (see [method set_loops]), providing the loop index. This signal is not emitted after the final loop, use [signal finished] instead for this case. </description> </signal> <signal name="step_finished"> <argument index="0" name="idx" type="int" /> <description> - Emitted when one step of the [Tween] is complete, providing the step index. One step is either a single [Tweener] or a group of [Tweener]s running parallelly. + Emitted when one step of the [Tween] is complete, providing the step index. One step is either a single [Tweener] or a group of [Tweener]s running in parallel. </description> </signal> </signals> diff --git a/doc/translations/ar.po b/doc/translations/ar.po index 8354193353..dcfbccb71c 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -545,7 +545,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1258,7 +1258,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28458,7 +28458,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31083,7 +31083,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34834,12 +34845,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي قسمة كل من Ø§Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: doc/classes/MeshInstance.xml msgid "" @@ -34875,7 +34892,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35674,6 +35694,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35720,6 +35743,9 @@ msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35763,6 +35789,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35782,6 +35811,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35917,11 +35949,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36037,6 +36105,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "ÙŠÙØ±Ø¬Ø¹ جيب المَعلم." @@ -36249,20 +36334,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36479,6 +36584,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36649,7 +36764,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38531,13 +38654,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38549,7 +38678,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38559,15 +38691,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40279,6 +40417,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45801,7 +45943,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49377,20 +49530,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49398,19 +49559,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49442,14 +49612,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54140,24 +54318,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54166,8 +54343,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54175,16 +54353,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54196,7 +54374,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54226,21 +54404,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54276,11 +54457,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54320,16 +54500,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54391,10 +54570,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54448,8 +54627,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54480,16 +54659,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54497,7 +54675,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58467,11 +58645,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63353,7 +63531,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ca.po b/doc/translations/ca.po index 234b5cd60c..8576fd5bf3 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -507,7 +507,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1214,7 +1214,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28377,7 +28377,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30999,7 +30999,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34746,11 +34757,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34787,7 +34803,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35579,6 +35598,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35624,6 +35646,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35667,6 +35692,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35686,6 +35714,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35815,11 +35846,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35929,6 +35996,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36135,20 +36219,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36362,6 +36466,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36531,7 +36645,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38406,13 +38528,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38424,7 +38552,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38434,15 +38565,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40149,6 +40286,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45649,7 +45790,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49222,20 +49374,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49243,19 +49403,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49287,14 +49456,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53983,24 +54160,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54009,8 +54185,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54018,16 +54195,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54039,7 +54216,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54069,21 +54246,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54119,11 +54299,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54163,16 +54342,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54234,10 +54412,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54291,8 +54469,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54323,16 +54501,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54340,7 +54517,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58308,11 +58485,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63183,7 +63360,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 72d9388f80..dba0a87744 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -387,7 +387,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1094,7 +1094,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28254,7 +28254,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30876,7 +30876,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34623,11 +34634,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34664,7 +34680,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35456,6 +35475,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35501,6 +35523,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35544,6 +35569,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35563,6 +35591,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35692,11 +35723,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35806,6 +35873,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36012,20 +36096,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36239,6 +36343,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36408,7 +36522,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38283,13 +38405,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38301,7 +38429,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38311,15 +38442,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40026,6 +40163,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45526,7 +45667,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49099,20 +49251,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49120,19 +49280,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49164,14 +49333,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53860,24 +54037,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53886,8 +54062,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53895,16 +54072,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53916,7 +54093,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53946,21 +54123,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -53996,11 +54176,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54040,16 +54219,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54111,10 +54289,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54168,8 +54346,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54200,16 +54378,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54217,7 +54394,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58185,11 +58362,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63060,7 +63237,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 4b60e4d7c4..e6d0fc8c49 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -542,7 +542,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1574,7 +1574,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28847,7 +28847,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31473,7 +31473,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35229,12 +35240,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Vrátà zbytek po dÄ›lenà dvou vektorů." #: doc/classes/MeshInstance.xml msgid "" @@ -35270,7 +35287,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36070,6 +36090,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36116,6 +36139,9 @@ msgstr "Vrátà sinus parametru." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36159,6 +36185,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36178,6 +36207,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36314,11 +36346,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36434,6 +36502,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Vracà [code]true[/code] pokud [code]s[/code] je nula nebo téměř nula." @@ -36648,20 +36733,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36881,6 +36986,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37051,7 +37166,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38933,13 +39056,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38951,7 +39080,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38961,15 +39093,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40685,6 +40823,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46218,7 +46360,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49795,20 +49948,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49816,19 +49977,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49860,14 +50030,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54566,24 +54744,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54592,8 +54769,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54601,16 +54779,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54622,7 +54800,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54652,21 +54830,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54702,11 +54883,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54746,16 +54926,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54817,10 +54996,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54874,8 +55053,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54906,16 +55085,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54923,7 +55101,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58901,11 +59079,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63819,7 +63997,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/de.po b/doc/translations/de.po index 640725bd9a..14a4d14da6 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -47,12 +47,13 @@ # Andreas <self@andreasbresser.de>, 2022. # Christian Packenius <christian@packenius.com>, 2022. # Hannes Petersen <01zustrom.baklava@icloud.com>, 2022. +# Hans Peter <figefi6308@runqx.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-13 19:27+0000\n" -"Last-Translator: Hannes Petersen <01zustrom.baklava@icloud.com>\n" +"PO-Revision-Date: 2022-06-22 23:17+0000\n" +"Last-Translator: Hans Peter <figefi6308@runqx.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/de/>\n" "Language: de\n" @@ -60,7 +61,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -606,7 +607,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1774,7 +1775,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -30628,7 +30629,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -33267,7 +33268,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34560,6 +34572,8 @@ msgid "" "Displays plain text in a line or wrapped inside a rectangle. For formatted " "text, use [RichTextLabel]." msgstr "" +"Zeigt einfachen Text in einer Zeile oder in einem Rechteck an. Verwenden Sie " +"für formatierten Text [RichTextLabel]." #: doc/classes/Label.xml msgid "" @@ -34576,6 +34590,19 @@ msgid "" "emoji) are [i]not[/i] supported on Windows. They will display as unknown " "characters instead. This will be resolved in Godot 4.0." msgstr "" +"Label zeigt einfachen Text auf dem Bildschirm an. Sie können die horizontale " +"und vertikale Ausrichtung steuern und den Text innerhalb des " +"Begrenzungsrahmens des Nodes umbrechen. Fett, kursiv oder andere " +"Formatierungen werden nicht unterstützt. Verwenden Sie stattdessen " +"[RichTextLabel] für diesen Zweck.\n" +"[b]Hinweis:[/b] Im Gegensatz zu den meisten anderen [Steuerelementen] ist " +"Labels [member Control.mouse_filter] standardmäßig auf [constant Control." +"MOUSE_FILTER_IGNORE] eingestellt (d.h. es reagiert nicht auf Mauseingaben). " +"Das bedeutet, dass ein Label keinen konfigurierten [member Control." +"hint_tooltip] anzeigt, solange Sie seinen Mausfilter nicht ändern.\n" +"[b]Hinweis:[/b] Unicode-Zeichen nach [code]0xffff[/code] (wie die meisten " +"Emoji) werden [i]nicht[/i] von Windows unterstützt. Sie werden stattdessen " +"als unbekannte Zeichen angezeigt. Dies wird in Godot 4.0 behoben." #: doc/classes/Label.xml msgid "Returns the amount of lines of text the Label has." @@ -34602,6 +34629,9 @@ msgid "" "Controls the text's horizontal align. Supports left, center, right, and " "fill, or justify. Set it to one of the [enum Align] constants." msgstr "" +"Steuert die horizontale Ausrichtung des Textes. Unterstützt links, " +"zentriert, rechts und füllen oder ausrichten. Setzen Sie ihn auf eine der " +"[enum Align] Konstanten." #: doc/classes/Label.xml msgid "" @@ -34609,12 +34639,19 @@ msgid "" "If you resize the node, it will change its height automatically to show all " "the text." msgstr "" +"Wenn [code]An[/code], wird der Text innerhalb des Begrenzungsrechtecks des " +"Nodes angepasst (Es wird automatisch eine neue Zeile angefangen, wenn der " +"Text nicht in eine Zeile passt). Sollte der Text nicht in das " +"Begrenzungsrechtecks des Nodes passen, wird das Begrenzungsrechteck " +"automatisch in der Höhe angepasst." #: doc/classes/Label.xml msgid "" "If [code]true[/code], the Label only shows the text that fits inside its " "bounding rectangle and will clip text horizontally." msgstr "" +"Wenn [code]An[/code], zeigt das Label nur den Text, der in sein " +"Begrenzungsrechteck passt an und schneidet den restlichen Text ab." #: doc/classes/Label.xml msgid "" @@ -34624,7 +34661,7 @@ msgstr "" #: doc/classes/Label.xml msgid "Limits the lines of text the node shows on screen." -msgstr "" +msgstr "Begrenzt die Textzeilen, die das Node auf dem Bildschirm anzeigt." #: doc/classes/Label.xml msgid "" @@ -34632,24 +34669,32 @@ msgid "" "code] to 0.5, only up to half of the text's characters will display on " "screen. Useful to animate the text in a dialog box." msgstr "" +"Begrenzt die Anzahl der sichtbaren Zeichen. Wenn Sie [code]percent_visible[/" +"code] auf 0,5 setzen, wird nur der halbe Text auf dem Bildschirm angezeigt. " +"Nützlich, um den Text in einem Dialogfeld zu animieren." #: doc/classes/Label.xml doc/classes/Label3D.xml msgid "The text to display on screen." -msgstr "" +msgstr "Der Text, der auf dem Bildschirm angezeigt werden soll." #: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml msgid "If [code]true[/code], all the text displays as UPPERCASE." msgstr "" +"Wenn [code]An[/code] , wird der gesamte Text in GROSSBUCHSTABEN angezeigt." #: doc/classes/Label.xml msgid "" "Controls the text's vertical align. Supports top, center, bottom, and fill. " "Set it to one of the [enum VAlign] constants." msgstr "" +"Steuert die vertikale Ausrichtung des Textes. Unterstützt oben, mitte, unten " +"und füllen. Setzen Sie ihn auf eine der [enum VAlign] Konstanten." #: doc/classes/Label.xml msgid "Restricts the number of characters to display. Set to -1 to disable." msgstr "" +"Begrenzt die Anzahl der anzuzeigenden Zeichen. Zum Deaktivieren auf -1 " +"setzen." #: doc/classes/Label.xml doc/classes/Label3D.xml doc/classes/TextMesh.xml msgid "Align rows to the left (default)." @@ -37043,12 +37088,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Gibt die Anzahl der Punkte auf der Blend-Achse zurück." #: doc/classes/MeshInstance.xml msgid "" @@ -37084,7 +37135,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -37884,6 +37938,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -37930,6 +37987,9 @@ msgstr "Gibt die Anzahl der Spuren in der Animation zurück." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -37974,6 +38034,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -37993,6 +38056,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -38137,11 +38203,47 @@ msgid "Destroys the given RID." msgstr "Gibt den gegebenen Übergang zurück." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -38264,6 +38366,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Logischer ODER-Operator ([code]oder[/code] oder [code]||[/code])." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Logischer ODER-Operator ([code]oder[/code] oder [code]||[/code])." @@ -38484,21 +38603,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "Der Name des Audiobusses des Bereichs." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -38719,6 +38857,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "Wenn [code]true[/code], ist die Filterung aktiviert." @@ -38895,7 +39043,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -40787,13 +40943,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -40805,7 +40967,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -40815,15 +40980,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -42542,6 +42713,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -48152,7 +48327,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -51747,20 +51933,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51768,19 +51962,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51812,14 +52015,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -56573,24 +56784,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -56599,8 +56809,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -56608,16 +56819,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -56629,7 +56840,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56659,21 +56870,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -56709,11 +56923,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56753,16 +56966,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56824,10 +57036,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -56881,8 +57093,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -56913,16 +57125,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -56930,7 +57141,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -60960,11 +61171,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -65929,7 +66140,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/el.po b/doc/translations/el.po index e19557ebb4..782205fcfa 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -402,7 +402,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1109,7 +1109,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28303,7 +28303,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30928,7 +30928,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34679,12 +34690,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "ΕπιστÏÎφει το υπόλοιπο των 2 διανυσμάτων." #: doc/classes/MeshInstance.xml msgid "" @@ -34720,7 +34737,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35513,6 +35533,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35559,6 +35582,9 @@ msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35602,6 +35628,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35621,6 +35650,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35756,11 +35788,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35876,6 +35944,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "ΕπιστÏÎφει το ημίτονο της παÏαμÎÏ„Ïου." @@ -36088,20 +36173,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36318,6 +36423,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36488,7 +36603,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38370,13 +38493,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38388,7 +38517,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38398,15 +38530,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40118,6 +40256,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45627,7 +45769,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49203,20 +49356,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49224,19 +49385,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49268,14 +49438,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53966,24 +54144,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53992,8 +54169,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54001,16 +54179,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54022,7 +54200,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54052,21 +54230,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54102,11 +54283,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54146,16 +54326,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54217,10 +54396,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54274,8 +54453,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54306,16 +54485,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54323,7 +54501,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58293,11 +58471,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63179,7 +63357,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/es.po b/doc/translations/es.po index 4c4982ad59..242710fe39 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -599,7 +599,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1749,7 +1749,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -37418,7 +37418,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -40959,7 +40959,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" "Este control proporciona una lista seleccionable de elementos que pueden " "estar en una sola (o varias columnas) con opción de texto, iconos o ambos. " @@ -45877,14 +45888,17 @@ msgstr "" "material de anulación." #: doc/classes/MeshInstance.xml -#, fuzzy -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" -"Devuelve el [Material] sobreescrito para la superficie especificada del " -"recurso [Mesh]." #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +#, fuzzy +msgid "Returns the number of surface override materials." msgstr "Devuelve el número de materiales de la superficie." #: doc/classes/MeshInstance.xml @@ -45921,11 +45935,11 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -#, fuzzy -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" -"Devuelve el [Material] sobreescrito para la superficie especificada del " -"recurso [Mesh]." #: doc/classes/MeshInstance.xml msgid "The [Mesh] resource for the instance." @@ -46972,6 +46986,9 @@ msgstr "Nodo de navegación y busqueda de caminos basado en una malla." #: doc/classes/Navigation.xml #, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -47030,6 +47047,9 @@ msgstr "Devuelve el [RID] de la forma enésima de un área." #: doc/classes/Navigation.xml #, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -47082,6 +47102,9 @@ msgstr "Navegación 2D y nodo de búsqueda de caminos." #: doc/classes/Navigation2D.xml #, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -47105,6 +47128,9 @@ msgstr "" #: doc/classes/Navigation2D.xml #, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -47252,12 +47278,48 @@ msgid "Destroys the given RID." msgstr "Quita la identificación del tile dado." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Create a new map." msgstr "Crea un [Area2D]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -47387,6 +47449,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Devuelve [code]true[/code] si existe la [code]signal[/code] dada." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -47611,21 +47690,40 @@ msgstr "La instancia no tiene un tipo." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "El radio del cilindro." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -47862,6 +47960,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "Si [code]true[/code], se activan las pulsaciones de paso." @@ -48045,7 +48153,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -50740,13 +50856,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -50758,28 +50880,39 @@ msgid "Emitted when the node is renamed." msgstr "Emitido cuando el nodo es renombrado." #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." -msgstr "Emitido cuando el nodo entra en el árbol." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." msgstr "Emitido después de que el nodo sale del árbol y ya no está activo." #: doc/classes/Node.xml +#, fuzzy msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" "Emitido cuando el nodo está todavÃa activo pero a punto de salir del árbol. " "Este es el lugar adecuado para la des-inicialización (o un \"destructor\", " "si se quiere)." #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." -msgstr "Notificación recibida cuando el nodo entra en un [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." +msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +#, fuzzy +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" "Notificación recibida cuando el nodo está a punto de salir de un [SceneTree]." @@ -53118,6 +53251,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" "Devuelve los argumentos de la lÃnea de mando pasados al motor.\n" @@ -60447,10 +60584,19 @@ msgstr "El PopupMenu muestra una lista de opciones." #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" -"[PopupMenu] es un [Control] que muestra una lista de opciones. Son populares " -"en las barras de herramientas o en los menús contextuales." #: doc/classes/PopupMenu.xml msgid "" @@ -64918,20 +65064,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -64939,19 +65093,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -64983,14 +65146,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -71099,24 +71270,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -71125,8 +71295,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -71134,16 +71305,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -71155,7 +71326,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -71185,21 +71356,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -71235,11 +71409,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -71279,16 +71452,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -71350,10 +71522,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -71407,8 +71579,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -71439,16 +71611,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -71456,7 +71627,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -76497,11 +76668,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" "Devuelve [code]true[/code] si esta string es un identificador válido. Un " @@ -82666,6 +82837,7 @@ msgid "Control to show a tree of items." msgstr "Control para mostrar un árbol de objetos." #: doc/classes/Tree.xml +#, fuzzy msgid "" "This shows a tree of items that can be selected, expanded and collapsed. The " "tree can have multiple columns with custom controls like text editing, " @@ -82687,7 +82859,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" "Esto muestra un árbol de objetos que pueden ser seleccionados, expandidos y " "colapsados. El árbol puede tener múltiples columnas con controles " diff --git a/doc/translations/fa.po b/doc/translations/fa.po index ee4b608fbd..a8972b49a5 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -15,12 +15,13 @@ # ahmad maftoon <ahmadmaftoon.1387@gmail.com>, 2021. # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. +# ilia khormali <iliakhormaly1384@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-04-03 08:11+0000\n" -"Last-Translator: Giga hertz <gigahertzyt@gmail.com>\n" +"PO-Revision-Date: 2022-06-21 15:55+0000\n" +"Last-Translator: ilia khormali <iliakhormaly1384@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fa/>\n" "Language: fa\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -106,6 +107,7 @@ msgstr "" msgid "" "This method should typically be overridden by the user to have any effect." msgstr "" +"این روش معمولا نیازمند است توسط خود ÙØ±Ø¯ نوشته شود تا بتواند تاثییری بگذارد." #: doc/tools/make_rst.py msgid "" @@ -548,7 +550,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1527,7 +1529,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28696,7 +28698,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31318,7 +31320,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35065,11 +35078,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -35106,7 +35124,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35904,6 +35925,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35949,6 +35973,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35992,6 +36019,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36011,6 +36041,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36140,11 +36173,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36254,6 +36323,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36460,20 +36546,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36687,6 +36793,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36856,7 +36972,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38731,13 +38855,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38749,7 +38879,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38759,15 +38892,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40474,6 +40613,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45986,7 +46129,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49559,20 +49713,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49580,19 +49742,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49624,14 +49795,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54324,24 +54503,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54350,8 +54528,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54359,16 +54538,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54380,7 +54559,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54410,21 +54589,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54460,11 +54642,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54504,16 +54685,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54575,10 +54755,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54632,8 +54812,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54664,16 +54844,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54681,7 +54860,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58649,11 +58828,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63524,7 +63703,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/fi.po b/doc/translations/fi.po index 108f9f7780..9c41935f5e 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -469,7 +469,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1176,7 +1176,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28386,7 +28386,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31011,7 +31011,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34763,12 +34774,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Palauttaa kahden vektorin jäännöksen." #: doc/classes/MeshInstance.xml msgid "" @@ -34804,7 +34821,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35597,6 +35617,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35643,6 +35666,9 @@ msgstr "Palauttaa parametrin sinin." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35686,6 +35712,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35705,6 +35734,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35840,11 +35872,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35960,6 +36028,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Laskee kahden vektorin ristitulon." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Laskee kahden vektorin ristitulon." @@ -36173,20 +36258,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36403,6 +36508,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36573,7 +36688,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38455,13 +38578,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38473,7 +38602,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38483,15 +38615,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40203,6 +40341,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45712,7 +45854,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49288,20 +49441,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49309,19 +49470,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49353,14 +49523,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54051,24 +54229,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54077,8 +54254,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54086,16 +54264,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54107,7 +54285,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54137,21 +54315,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54187,11 +54368,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54231,16 +54411,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54302,10 +54481,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54359,8 +54538,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54391,16 +54570,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54408,7 +54586,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58380,11 +58558,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63269,7 +63447,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/fil.po b/doc/translations/fil.po index d34766797c..1ae1d0b02b 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -403,7 +403,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1110,7 +1110,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28273,7 +28273,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30895,7 +30895,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34642,11 +34653,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34683,7 +34699,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35475,6 +35494,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35520,6 +35542,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35563,6 +35588,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35582,6 +35610,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35711,11 +35742,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35825,6 +35892,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36031,20 +36115,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36258,6 +36362,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36427,7 +36541,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38302,13 +38424,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38320,7 +38448,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38330,15 +38461,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40045,6 +40182,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45545,7 +45686,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49118,20 +49270,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49139,19 +49299,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49183,14 +49352,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53879,24 +54056,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53905,8 +54081,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53914,16 +54091,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53935,7 +54112,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53965,21 +54142,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54015,11 +54195,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54059,16 +54238,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54130,10 +54308,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54187,8 +54365,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54219,16 +54397,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54236,7 +54413,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58204,11 +58381,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63079,7 +63256,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 98f4921109..2dcac4940b 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -61,7 +61,7 @@ msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-19 11:54+0000\n" +"PO-Revision-Date: 2022-06-28 04:52+0000\n" "Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" @@ -608,6 +608,7 @@ msgstr "" "nouveau en une instance. Utile pour la désérialisation." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -622,7 +623,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -984,6 +985,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -1807,6 +1809,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1827,7 +1830,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -2079,9 +2082,9 @@ msgid "" "[code]true[/code] encoding objects is allowed (and can potentially include " "code)." msgstr "" -"Encode la valeur d'une variable en un tableau d'octets ([i]byte array[/i]). " -"Lorsque [code]full_objects[/code] a la valeur [code]true[/code], l'encodage " -"d'objets est autorisé (et peut potentiellement inclure du code)." +"Encode la valeur d'une variable en un tableau d'octets. Lorsque " +"[code]full_objects[/code] a la valeur [code]true[/code], l'encodage d'objets " +"est autorisé (et peut potentiellement inclure du code)." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -3986,9 +3989,8 @@ msgid "Gamepad right analog trigger." msgstr "Gâchette analogique droite de la manette." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "VR Controller analog trigger." -msgstr "Axe du déclencheur gauche du contrôleur de jeu." +msgstr "Gâchette analogique de la manette VR." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -4016,7 +4018,7 @@ msgid "" "MIDI note OFF message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." msgstr "" -"Le message MIDI pour la note OFF. Référez vous à la documentation de " +"Le message OFF pour la note MIDI. Référez vous à la documentation de " "[InputEventMIDI] pour avoir des informations concernant les entrées MIDI." #: doc/classes/@GlobalScope.xml @@ -4040,18 +4042,17 @@ msgid "" "MIDI control change message. This message is sent when a controller value " "changes. Controllers include devices such as pedals and levers." msgstr "" -"Le message MIDI de changement de contrôle. Ce message est envoyé lorsqu'un " +"Le message de changement de contrôle MIDI. Ce message est envoyé lorsqu'un " "contrôleur change de valeur. Les contrôleurs comprennent des dispositifs " "comme des pédales, des leviers." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "MIDI program change message. This message sent when the program patch number " "changes." msgstr "" -"Le message de changement de programme MIDI. Ce message est envoyé lorsque " -"l'on reçoit une consigne de changement de programme." +"Le message de changement de programme MIDI. Ce message est envoyé lorsque le " +"nombre du patch du programme est changée." #: doc/classes/@GlobalScope.xml msgid "" @@ -4065,6 +4066,8 @@ msgid "" "MIDI pitch bend message. This message is sent to indicate a change in the " "pitch bender (wheel or lever, typically)." msgstr "" +"Le message de la hauteur MIDI. Ce message est envoyé pour indiquer un " +"changement dans le plieur de hauteur (généralement une roue ou un levier)." #: doc/classes/@GlobalScope.xml msgid "" @@ -5203,6 +5206,7 @@ msgstr "" "entrée, le dialogue sera accepté." #: doc/classes/AcceptDialog.xml +#, fuzzy msgid "" "Removes the [code]button[/code] from the dialog. Does NOT free the " "[code]button[/code]. The [code]button[/code] must be a [Button] added with " @@ -5211,7 +5215,7 @@ msgid "" "custom_action] signal or cancel this dialog." msgstr "" "Enlever le [code]bouton[/code] de la boite de la boîte de dialogue. Ne " -"libère pas le bouton. Le bouton dois être un [Button] ajouté avec la méthode " +"libère PAS le bouton. Le bouton dois être un [Button] ajouté avec la méthode " "[method add_button] ou [method add_cancel] ." #: doc/classes/AcceptDialog.xml @@ -6580,7 +6584,7 @@ msgstr "" "- L'animation à mélanger quand la valeur est dans la plage [code][-1.0, 0.0]" "[/code].\n" "- L'animation à mélanger quand la valeur est dans la plage [code][0.0, 1.0][/" -"code]." +"code]" #: doc/classes/AnimationNodeAdd3.xml doc/classes/AnimationNodeAnimation.xml #: doc/classes/AnimationNodeBlend2.xml @@ -7950,15 +7954,15 @@ msgid "" "_physics_process])." msgstr "" "Les animations progresseront pendant les trames physiques (dans [méthode " -"Node._physics_process)]" +"Node._physics_process)]." #: doc/classes/AnimationTree.xml msgid "" "The animations will progress during the idle frame (i.e. [method Node." "_process])." msgstr "" -"Les animations progresseront pendant les trames d'inactivité (dans [méthode " -"Node._process)]" +"Les animations progresseront pendant les trames d'inactivité (dans [method " +"Node._process])." #: doc/classes/AnimationTree.xml msgid "The animations will only progress manually (see [method advance])." @@ -8724,6 +8728,20 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" +"Émis quand une des [Shape] d'un [PhysicsBody] ou [GridMap] entre dans une " +"des [Shape] de cette Area. Nécessite [member monitoring] d'être à " +"[code]true[/code]. Les [GridMap] sont détectées si le [MeshLibrary] à une " +"[Shape] de Collision.\n" +"[code]body_rid[/code] le [RID] du [CollisionObject] du [PhysicsBody] ou du " +"[MeshLibrary] utilisé par le [PhysicsServer].\n" +"[code]body[/code] le [Node], s'il existe dans l'arborescence, du " +"[PhysicsBody] ou [GridMap].\n" +"[code]body_shape_index[/code] l'index de la [Shape] du [PhysicsBody] ou " +"[GridMap] utilisé par le [PhysicsServer]. Obtenez le nÅ“ud [CollisionShape] " +"avec [code]body.shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] l'index de la [Shape] de cette Area utilisée " +"par le [PhysicsServer]. Obtenez le nÅ“ud [CollisionShape] nÅ“ud avec " +"[code]self.shape_owner_get_owner(local_shape_index)[/code]." #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "This area does not affect gravity/damping." @@ -8941,6 +8959,11 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Émis quand un [PhysicsBody2D] ou [TileMap] entre dans cette Area2D. " +"Nécessite [member monitoring] d'être [code]true[/code]. Les [TileMap] sont " +"détectés si le [TileSet] a une [Shape2D] de Collision.\n" +"[code]body[/code] le [Node], s'il existe dans l'arborescence, de l'autre " +"[PhysicsBody2D] ou [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -8950,6 +8973,11 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" +"Émis quand un [PhysicsBody2D] ou [TileMap] quitte dans cette Area2D. " +"Nécessite [member monitoring] d'être [code]true[/code]. Les [TileMap] sont " +"détectés si le [TileSet] a une [Shape2D] de Collision.\n" +"[code]body[/code] le [Node], s'il existe dans l'arborescence, de l'autre " +"[PhysicsBody2D] ou [TileMap]." #: doc/classes/Area2D.xml msgid "" @@ -11122,7 +11150,7 @@ msgstr "" " return min(0, abs(u - v) - 1)\n" "[/codeblock]\n" "[method estimate_cost] doit retourne la valeur minimale de la distance, soit " -"[code]_estimate_cost(u, v) <= compute_cost(u, v)[ /code]. Cela sert d'indice " +"[code]_estimate_cost(u, v) <= compute_cost(u, v)[/code]. Cela sert d'indice " "pour l'algorithme la méthode [code]_compute_cost[/code] peut être longue à " "calculer. Si ce n'est pas le cas, utilisez [method estimate_cost] pour " "retourner la même valeur que [method compute_cost] pour fournir à " @@ -11132,7 +11160,7 @@ msgstr "" "limite inférieure du coût du chemin, les chemins retournés par A* seront les " "chemins les moins coûteux. Ici, le coût d'un chemin correspond à la somme " "des résultats [méthode compute_cost] de tous les segments dans le chemin " -"multiplié par le [code]weight_scale[/code]s des paramètres de fin des " +"multiplié par le [code]weight_scale[/code] des paramètres de fin des " "segments respectifs. Si les méthodes par défaut sont utilisées et que le " "[code]weight_scale[/code] de tous les points est [code]1.0[/code], ça " "correspond à la somme des distances euclidiennes de tous les segments du " @@ -11838,6 +11866,11 @@ msgid "" "samples if available, or an empty [PoolVector2Array] if insufficient data " "was available." msgstr "" +"Retourne les prochains [code]frames[/code] d'échantillonnage audio de la " +"mémoire interne en anneau.\n" +"Retourne un [PoolVector2Array] contenant exactement [code]frames[/code] " +"échantillons audio si disponible, ou un [PoolVector2Array] vide s'il n'y a " +"pas assez de données disponibles." #: doc/classes/AudioEffectCapture.xml #, fuzzy @@ -12179,6 +12212,9 @@ msgid "" "over frequencies from 31 Hz to 16000 Hz.\n" "Each frequency can be modulated between -60/+24 dB." msgstr "" +"Ajoute un effet audio d'égaliseur de 10 bandes à un bus audio. Vous donne le " +"contrôle des fréquences de 31 Hz à 16000 Hz.\n" +"Chaque fréquence peut être modulée entre -60/+24 dB." #: doc/classes/AudioEffectEQ10.xml msgid "" @@ -12214,6 +12250,9 @@ msgid "" "over frequencies from 22 Hz to 22000 Hz.\n" "Each frequency can be modulated between -60/+24 dB." msgstr "" +"Ajoute un effet audio d'égaliseur de 21 bandes à un bus audio. Vous donne le " +"contrôle des fréquences de 22 Hz à 22000 Hz.\n" +"Chaque fréquence peut être modulée entre -60/+24 dB." #: doc/classes/AudioEffectEQ21.xml msgid "" @@ -12271,6 +12310,9 @@ msgid "" "frequencies from 32 Hz to 10000 Hz.\n" "Each frequency can be modulated between -60/+24 dB." msgstr "" +"Ajoute un effet audio d'égaliseur de 6 bandes à un bus audio. Vous donne le " +"contrôle des fréquences de 32 Hz à 10000 Hz.\n" +"Chaque fréquence peut être modulée entre -60/+24 dB." #: doc/classes/AudioEffectEQ6.xml msgid "" @@ -13394,9 +13436,9 @@ msgid "" msgstr "" "Décide dans quelle mesure [url=https://fr.wikipedia.org/wiki/" "Effet_Doppler]L'effet Doppler[/url] doit être calculé.\n" -"[b]Note :[/b] Ce n'est efficace que si la propriété actuelle [Camera] " -"enregistrée [member Camera.doppler_tracking] est définie à une valeur autre " -"que [constant Camera. DOPPLER_TRACKING_DISABLED]" +"[b]Note :[/b] Ce n'est actif que si la propriété [member Camera." +"doppler_tracking] de la [Camera] actuelle est définie à une valeur autre que " +"[constant Camera.DOPPLER_TRACKING_DISABLED]." #: doc/classes/AudioStreamPlayer3D.xml msgid "The angle in which the audio reaches cameras undampened." @@ -13594,6 +13636,19 @@ msgid "" "[code]32000[/code] or [code]22050[/code] may be usable with no loss in " "quality." msgstr "" +"Le taux d'échantillonnage pour mélanger ce son. Les valeurs plus élevées " +"nécessitent plus d'espace de stockage, mais proposent une meilleure " +"qualité.\n" +"Dans les jeux, les taux d'échantillonnage courants sont [code]11025[/code], " +"[code]16000[/code], [code]22050[/code], [code]32000[/code], [code]44100[/" +"code], et [code]48000[/code].\n" +"D'après le [url=https://fr.wikipedia.org/wiki/" +"Th%C3%A9or%C3%A8me_d'%C3%A9chantillonnage]Théorème d'échantillonnage[/url], " +"il n'y a aucune différence de qualité pour l'audition humaine au-delà de 40 " +"000 Hz (puisque la plupart des humains ne peuvent entendre que jusqu'à 20 " +"000 Hz, et souvent bien moins). Si vous générez des sons inférieurs tels que " +"les voix, des taux d'échantillonnage inférieurs tels que [code]32000[/code] " +"ou [code]22050[/code] peuvent être utilisables sans perte de qualité audible." #: doc/classes/AudioStreamSample.xml msgid "If [code]true[/code], audio is stereo." @@ -14269,8 +14324,8 @@ msgid "" "discarded. Don't use the epsilon argument, it does nothing." msgstr "" "Retourne [code]true[/code] si cette base et [code]b[/code] sont " -"approximativement égales, en appelant [method @GDScript.is_equal_approx] sur " -"chaque composantes.\n" +"approximativement égales, en appelant [code]is_equal_approx[/code] sur " +"chaque composant.\n" "[b]Note :[/b] Pour des raisons compliquées, l'argument epsilon est toujours " "ignoré. Ne l'utilisez pas, il ne sert à rien." @@ -15333,6 +15388,11 @@ msgid "" "objects affect how audio is perceived (changing the audio's [member " "AudioStreamPlayer3D.pitch_scale])." msgstr "" +"Simulate [url=https://fr.wikipedia.org/wiki/Effet_Doppler]l'effet Doppler[/" +"url] en suivant la position des objets qui ont changé lors de " +"[code]_process[/code]. Les changements dans la vitesse relative de cette " +"caméra par rapport à ces objets affectent la façon dont l'audio est perçu " +"(changement de la hauteur [member AudioStreamPlayer3D.pitch_scale])." #: doc/classes/Camera.xml msgid "" @@ -15363,6 +15423,21 @@ msgid "" "limits. You can use [method get_camera_screen_center] to get the real " "position." msgstr "" +"Le nÅ“ud de la caméra pour les scènes 2D. Il force l'écran (le calque actuel) " +"à défiler en suivant ce nÅ“ud. Cela rend plus facile (et plus rapide) de " +"programmer des scènes qui défilent que de changer manuellement la position " +"des nÅ“uds basés sur [CanvasItem].\n" +"Ce nÅ“ud est destiné à être une simple aide pour obtenir les objets qui vont " +"rapidement, mais plus de fonctionnalités peuvent être désirées pour changer " +"la façon dont la caméra se comporte. Pour faire votre propre nÅ“ud de caméra " +"personnalisé, héritez de [Node2D] et modifiez la transformation du canevas " +"en paramétrant [member Viewport.canvas_transform] dans [Viewport] (vous " +"pouvez obtenir le [Viewport] actuel en utilisant [method Node." +"get_viewport])\n" +"Notez que la [code]position[/code] de la [Camera2D] ne représente pas la " +"position réelle de l'écran, qui peut différer en raison de lissage ou de " +"limites appliqués. Vous pouvez utiliser [method get_camera_screen_center] " +"pour obtenir la position réelle." #: doc/classes/Camera2D.xml doc/classes/TileMap.xml doc/classes/TileSet.xml msgid "2D Isometric Demo" @@ -15382,6 +15457,7 @@ msgid "" "Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" "assigned camera." msgstr "" +"Enlève toute caméra [Camera2D] du [Viewport] parent assigné en interne." #: doc/classes/Camera2D.xml msgid "Forces the camera to update scroll immediately." @@ -15875,7 +15951,7 @@ msgstr "" "parente a changé.\n" "[b]Note :[/b] Sauf exception, toutes les paramètres d'angle doivent être des " "spécifiés en [i]radians[/i]. Pour convertir des degrés en radians, utilisez " -"[méthod @GDScript.deg2rad]" +"[méthod @GDScript.deg2rad]." #: doc/classes/CanvasItem.xml doc/classes/CanvasLayer.xml #: doc/classes/InputEvent.xml doc/classes/Viewport.xml @@ -16034,6 +16110,7 @@ msgstr "" "avec anti-crénelage." #: doc/classes/CanvasItem.xml +#, fuzzy msgid "" "Draws multiple disconnected lines with a uniform [code]width[/code] and " "segment-by-segment coloring. Colors assigned to line segments match by index " @@ -16394,6 +16471,12 @@ msgid "" "top-level. The [CanvasItem] will effectively act as if it was placed as a " "child of a bare [Node]. See also [method is_set_as_toplevel]." msgstr "" +"Si [code]enable[/code] est [code]true[/code], ce [CanvasItem] n'héritera " +"[i]pas[/i] de sa transformation de son [CanvasItem] parent. Son ordre " +"d'affichage sera également modifié pour dessiner sur les autres [CanvasItem] " +"qui ne sont pas prioritaires. Le [CanvasItem] se comportera efficacement " +"comme s'il était placé comme un enfant d'un [Node] vide. Voir aussi [method " +"is_set_as_toplevel]." #: doc/classes/CanvasItem.xml msgid "" @@ -16401,12 +16484,17 @@ msgid "" "[constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] when its local transform " "changes." msgstr "" +"Si [code]enable[/code] est [code]true[/code], ce nÅ“ud recevra [constant " +"NOTIFICATION_LOCAL_TRANSFORM_CHANGED] lorsque sa transformation locale " +"changera." #: doc/classes/CanvasItem.xml msgid "" "If [code]enable[/code] is [code]true[/code], this node will receive " "[constant NOTIFICATION_TRANSFORM_CHANGED] when its global transform changes." msgstr "" +"Si [code]enable[/code] est [code]true[/code], ce nÅ“ud recevra [constant " +"NOTIFICATION_TRANSFORM_CHANGED] lorsque sa transformation globale changera." #: doc/classes/CanvasItem.xml msgid "" @@ -16426,7 +16514,7 @@ msgstr "" msgid "" "The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." msgstr "" -"Les claques de rendu où le [CanvasItem] est affecté par les nÅ“uds [Light2D]." +"Les calques de rendu où le [CanvasItem] est affecté par les nÅ“uds [Light2D]." #: doc/classes/CanvasItem.xml msgid "The material applied to textures on this [CanvasItem]." @@ -16652,7 +16740,7 @@ msgstr "" #: doc/classes/CanvasLayer.xml msgid "Canvas layers" -msgstr "Claques du canevas" +msgstr "Calques du canevas" #: doc/classes/CanvasLayer.xml msgid "Returns the RID of the canvas used by this layer." @@ -16934,6 +17022,15 @@ msgid "" "See also [BaseButton] which contains common properties and methods " "associated with this node." msgstr "" +"Une case à cocher qui permet à l'utilisateur de faire un choix binaire " +"(pouvoir seulement choisir une des deux options). C'est similaire à un " +"[CheckButton] dans ses fonctionnalités, mais avec une apparence différente. " +"Pour suivre les recommendations d'interface établies, il est recommandé " +"d'utiliser une CheckBox lorsqu'il n'a [b]pas[/b] d'effet immédiat sur " +"quelque chose. Par exemple, quand le basculement sera effectif qu'une fois " +"un bouton de confirmation pressé.\n" +"Voir aussi [BaseButton] qui contient des propriétés et des méthodes communes " +"associées à ce nÅ“ud." #: doc/classes/CheckBox.xml msgid "The [CheckBox] text's font color." @@ -16950,6 +17047,9 @@ msgid "" "text color of the checkbox. Disabled, hovered, and pressed states take " "precedence over this color." msgstr "" +"La couleur de la police du texte de la [CheckBox] quand elle a le focus. Ne " +"remplace que la couleur normale du texte de la case à cocher. Les états " +"désactivé, survolé et pressé sont prioritaires sur cette couleur." #: doc/classes/CheckBox.xml msgid "The [CheckBox] text's font color when it's hovered." @@ -17422,6 +17522,8 @@ msgid "" "The camera's collision margin. The camera can't get closer than this " "distance to a colliding object." msgstr "" +"La marge de collision de la caméra. La caméra ne peut pas se rapprocher plus " +"d'un objet de collision que cette distance." #: doc/classes/ClippedCamera.xml msgid "The camera's process callback. See [enum ProcessMode]." @@ -17454,6 +17556,8 @@ msgid "" "Creates a new shape owner for the given object. Returns [code]owner_id[/" "code] of the new owner for future reference." msgstr "" +"Crée un nouveau propriétaire de forme pour l'objet donné. Retourne " +"[code]owner_id[/code] du nouveau propriétaire pour une prochaine référence." #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" @@ -17662,7 +17766,7 @@ msgstr "" "CollisionObject2D peut avoir autant de propriétaires de forme qui " "nécessaire. Les propriétaires de forme ne sont pas des nÅ“uds et ne " "apparaissent pas dans l'éditeur, mais sont accessibles par le code en " -"utilisant les méthodes [code]shape_owner[* /code].\n" +"utilisant les méthodes [code]shape_owner_*[/code].\n" "[b]Note :[/b] Seules les collisions entre des objets dans le même canevas " "(dans une même [Viewport] ou [CanvasLayer]) sont supportées. Le comportement " "des collisions entre des objets dans différents canevas est indéfini." @@ -17735,6 +17839,14 @@ msgid "" "and-masks]Collision layers and masks[/url] in the documentation for more " "information." msgstr "" +"Le calque physique où est ce CollisionObject2D. Les objets de collision " +"peuvent exister dans un ou plusieurs des 32 calques différents. Voir aussi " +"[member collision_mask].\n" +"[b]Note :[/b] Un contact est détecté si l'objet A est dans l'un des calques " +"que l'objet B scanne, ou si l'objet B est dans tous les calques que l'objet " +"A scanne. Voir [url=$DOCS_URL/tutorials/physics/physics_introduction." +"html#collision-layers-and-masks]Calques et masques de Collision[/url] dans " +"la documentation pour plus d'informations." #: doc/classes/CollisionObject2D.xml msgid "" @@ -17746,6 +17858,14 @@ msgid "" "and-masks]Collision layers and masks[/url] in the documentation for more " "information." msgstr "" +"Le calque physique que ce CollisionObject2D scanne. Les objets de collision " +"peuvent exister dans un ou plusieurs des 32 calques différents. Voir aussi " +"[member collision_mask].\n" +"[b]Note :[/b] Un contact est détecté si l'objet A est dans l'une des calques " +"que l'objet B scanne, ou l'objet B est dans toutes les calques que l'objet A " +"scanne. Voir [url=$DOCS_URL/tutorials/physics/physics_introduction." +"html#collision-layers-and-masks]Collision calques et masques[/url] dans la " +"documentation pour plus d'informations." #: doc/classes/CollisionObject2D.xml msgid "" @@ -17753,6 +17873,10 @@ msgid "" "[code]true[/code] and at least one [code]collision_layer[/code] bit to be " "set. See [method _input_event] for details." msgstr "" +"Émis lorsqu'un événement d'entrée se produit. Nécessite [member " +"input_pickable] d'être à [code]true[/code] et au moins un des bits de " +"[code]collision_layer[/code] d'être définit. Voir [method input_event] pour " +"plus de détails." #: doc/classes/CollisionObject2D.xml msgid "" @@ -17760,6 +17884,9 @@ msgid "" "[member input_pickable] to be [code]true[/code] and at least one " "[code]collision_layer[/code] bit to be set." msgstr "" +"Émis lorsque le curseur de la souris entre dans l'une de ces formes. " +"Nécessite [member input_pickable] d'être à [code]true[/code] et au moins un " +"des bits de [code]collision_layer[/code] d'être définit." #: doc/classes/CollisionObject2D.xml msgid "" @@ -17767,6 +17894,9 @@ msgid "" "[member input_pickable] to be [code]true[/code] and at least one " "[code]collision_layer[/code] bit to be set." msgstr "" +"Émis lorsque le curseur de la souris sort de toutes les formes. Nécessite " +"[member input_pickable] d'être à [code]true[/code] et au moins un des bits " +"de [code]collision_layer[/code] d'être définit." #: doc/classes/CollisionPolygon.xml msgid "Editor-only class for defining a collision polygon in 3D space." @@ -17846,10 +17976,12 @@ msgid "" "first. The returned value is a clone of the [PoolVector2Array], not a " "reference." msgstr "" +"La liste des sommets du polygone. Le dernier point sera relié au premier. La " +"valeur retournée est un copie du [PoolVector2Array], et non une référence." #: doc/classes/CollisionPolygon2D.xml msgid "Collisions will include the polygon and its contained area." -msgstr "" +msgstr "Les collisions comprendront ce polygone et sa zone englobante." #: doc/classes/CollisionPolygon2D.xml msgid "Collisions will only include the polygon edges." @@ -17905,6 +18037,7 @@ msgstr "La forme réelle appartenant à cette forme de collision." #: doc/classes/CollisionShape2D.xml msgid "Node that represents collision shape data in 2D space." msgstr "" +"Le nÅ“ud qui représente les données de forme de collision dans l'espace 2D." #: doc/classes/CollisionShape2D.xml msgid "" @@ -18302,7 +18435,7 @@ msgstr "" "var color = Color(1, 1, 1, 0.5)\n" "var s1 = color.to_html() # Retourne \"7fffffff\"\n" "var s2 = color.to_html(false) # Retourne \"ffffff\"\n" -"/[codeblock]" +"[/codeblock]" #: doc/classes/Color.xml msgid "" @@ -19007,6 +19140,11 @@ msgid "" "[ColorPickerButton] instead if you need a button that brings up a " "[ColorPicker] in a pop-up." msgstr "" +"Affiche un widget de sélection de couleurs. Utile pour sélectionner une " +"couleur dans un espace de couleur RGB/RGBA.\n" +"[b]Note :[/b] Ce contrôle est lui-même le widget de sélection de couleur. " +"Vous pouvez utiliser un [ColorPickerButton] en remplacement si vous avez " +"souhaitez un bouton qui affiche un [ColorPicker] dans une pop-up." #: doc/classes/ColorPicker.xml msgid "" @@ -19250,6 +19388,11 @@ msgid "" "$ColorRect.color = Color(1, 0, 0, 1) # Set ColorRect's color to red.\n" "[/codeblock]" msgstr "" +"La couleur de remplissage.\n" +"[codeblock]\n" +"$ColorRect.color = Color(1, 0, 0, 1) # Définit la couleur du ColorRect à " +"rouge.\n" +"[/codeblock]" #: doc/classes/ConcavePolygonShape.xml msgid "Concave polygon shape." @@ -19581,6 +19724,11 @@ msgid "" "The output file uses an INI-style structure.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" +"Enregistre le contenu de l'objet [ConfigFile] crypté par le fichier AES-256 " +"donné en paramètre, en utilisant le [code]key[/code] fourni pour le crypté. " +"Le fichier de sortie utilise une structure de type INI.\n" +"Retourne une des constantes de code [enum Error] ([code]OK[/code] sur le " +"succès)." #: doc/classes/ConfigFile.xml msgid "" @@ -19589,6 +19737,12 @@ msgid "" "encrypt it. The output file uses an INI-style structure.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" +"Enregistre le contenu de l'objet [ConfigFile] crypté avec la clé AES-256 " +"donnée en paramètre, en utilisant le mot de passe [code]password[/code] " +"fourni pour le crypté. Le fichier de sortie utilise une structure de type " +"INI.\n" +"Retourne une des constantes de code [enum Error] ([code]OK[/code] sur le " +"succès)." #: doc/classes/ConfigFile.xml msgid "" @@ -19612,6 +19766,13 @@ msgid "" "get_cancel().connect(\"pressed\", self, \"cancelled\")\n" "[/codeblock]." msgstr "" +"Le dialogue pour la confirmation des actions. Ce dialogue hérite de " +"[AcceptDialog], mais a par défaut un bouton OK et Annuler (dans l'ordre " +"définit par le système d'exploitation hôte).\n" +"Pour annuler l'action, vous pouvez utiliser:\n" +"[codeblock]\n" +"get_cancel().connect(\"pressed\", self, \"cancelled\")\n" +"[/codeblock]." #: doc/classes/ConfirmationDialog.xml msgid "" @@ -20080,6 +20241,17 @@ msgid "" " color = data[\"color\"]\n" "[/codeblock]" msgstr "" +"Godot appelle cette méthode pour transmettre le résultat [code]data[/code] " +"d'un paramètre. Godot appelle d'abord [method can_drop_data] pour tester si " +"[code]data[/code] est autorisé à recevoir à [code]position[/code] où " +"[code]position[/code] est local à ce contrôle.\n" +"[codeblock]\n" +"func can_drop_data(position, data):\n" +" return typeof(data) == TYPE_DICTIONARY and data.has(\"color\")\n" +"\n" +"func drop_data(position, data):\n" +" color = data[\"color\"]\n" +"/[codeblock]" #: doc/classes/Control.xml msgid "" @@ -20111,6 +20283,10 @@ msgid "" "Margin] enum. A getter method for [member anchor_bottom], [member " "anchor_left], [member anchor_right] and [member anchor_top]." msgstr "" +"Retourne l'ancre identifiée par la constante [code]margin[/code] de " +"l'énumération [enum Margin]. Une méthode de getter pour [member " +"anchor_bottom], [member anchor_left], [member anchor_right] et [member " +"anchor_top]." #: doc/classes/Control.xml msgid "" @@ -20143,6 +20319,29 @@ msgid "" " modulate = get_color(\"font_color\", \"Button\")\n" "[/codeblock]" msgstr "" +"Retourne un [Color] de la première correspondance dans le [Theme] de " +"l'arborescence si ce [Theme] a un élément de couleur avec le nom [code]name[/" +"code] et le type [code]theme_type[/code] spécifiés. Si [code]theme_type[/" +"code] n'est pas précisé, le nom de classe du contrôle actuel sera utilisé " +"pour le type, ou [member theme_type_variation] si elle est définie. Si le " +"type est un nom de classe, ses classes parentes sont également testées, par " +"ordre d'héritage.\n" +"Pour le contrôle actuel, ses surcharges locales sont considérées en premier " +"(voir [method add_color_override]), puis son nom [member theme]. Après le " +"contrôle actuel, chaque contrôle parental et son [membre theme] assigné " +"seront pris en considération ; les contrôles sans [member theme] attribué " +"sont ignorés. Si aucune correspondance de [Theme] n'est trouvée dans " +"l'arborescence, le [Theme] personnalisé du projet (voir [membre " +"ProjectSettings.gui/theme/custom]) et le [Theme] par défaut seront " +"utilisés.\n" +"[codeblock]\n" +"func _ready():\n" +" # Obtenir la couleur de police définie pour la classe actuelle du " +"Contrôle actuel, si elle existe.\n" +" modulate = get_color(\"font_color\")\n" +" # Obtenir la couleur de police définie pour la classe Button.\n" +" modulate = get_color(\"font_color\", \"Button\")\n" +"[/codeblock]" #: doc/classes/Control.xml msgid "" @@ -20159,6 +20358,10 @@ msgid "" "[code]theme_type[/code].\n" "See [method get_color] for details." msgstr "" +"Retourne une constante du premier [Theme] correspondant dans l'arborescence " +"si ce [Theme] a un élément constant avec le code nommé [code]name[/code] et " +"le type [code]theme_type[/code].\n" +"Voir [method get_color] pour plus de détails." #: doc/classes/Control.xml msgid "" @@ -20520,7 +20723,7 @@ msgstr "" "exemple, lorsque l'ancre gauche est fixée à 1 et que l'ancre droite a une " "valeur de 0,5, l'ancre droite aura également une valeur de 1. Si " "[code]push_opposite_anchor[/code] est [code]false[/code], l'ancre gauche a " -"alors la valeur 0.5" +"alors la valeur 0.5." #: doc/classes/Control.xml msgid "" @@ -20776,6 +20979,12 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the bottom of this one." msgstr "" +"Signale à Godot qu'il ne devrait pas donner le focus du clavier si " +"l'utilisateur presse la flèche bas sur le clavier ou le gamepad par défaut. " +"Vous pouvez modifier la clé en éditant l'action d'entrée [code]ui_down[/" +"code]. Le nÅ“ud doit être un [Control]. Si cette propriété n'est pas définie, " +"Godot placera le focus sur le [Control] le plus proche en-dessous de celui-" +"ci." #: doc/classes/Control.xml msgid "" @@ -20785,6 +20994,12 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the left of this one." msgstr "" +"Signale à Godot qu'il ne doit pas donner le focus du clavier si " +"l'utilisateur appuie sur la flèche gauche sur le clavier ou le gamepad par " +"défaut. Vous pouvez modifier la clé en éditant l'action d'entrée " +"[code]ui_left[/code]. Le nÅ“ud doit être un [Control]. Si cette propriété " +"n'est pas définie, Godot placera le focus sur le [Control] le plus proche à " +"gauche de celui-ci." #: doc/classes/Control.xml msgid "" @@ -20794,6 +21009,12 @@ msgid "" "must be a [Control]. If this property is not set, Godot will give focus to " "the closest [Control] to the bottom of this one." msgstr "" +"Signale à Godot qu'il ne doit pas donner le focus du clavier si " +"l'utilisateur presse la flèche droite sur le clavier ou le gamepad par " +"défaut. Vous pouvez modifier la clé en éditant l'action d'entrée " +"[code]ui_right[/code]. Le nÅ“ud doit être un [Control]. Si cette propriété " +"n'est pas définie, Godot placera le focus sur le [Control] le plus proche en-" +"dessous de celui-ci." #: doc/classes/Control.xml msgid "" @@ -20803,6 +21024,12 @@ msgid "" "[Control]. If this property is not set, Godot will give focus to the closest " "[Control] to the bottom of this one." msgstr "" +"Signale à Godot qu'il ne devrait pas donner le focus du clavier si " +"l'utilisateur appuie sur la flèche haut sur le clavier ou sur le gamepad par " +"défaut. Vous pouvez modifier la clé en éditant l'action d'entrée " +"[code]ui_top[/code]. Le nÅ“ud doit être un [Control]. Si cette propriété " +"n'est pas définie, Godot placera le focus sur le [Control] le plus proche en-" +"dessous de celui-ci." #: doc/classes/Control.xml msgid "" @@ -20812,6 +21039,11 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" +"Signale à Godot qu'il ne devrait pas donner le focus du clavier si " +"l'utilisateur presse \"Tab\" sur un clavier par défaut. Vous pouvez modifier " +"la clé en éditant l'action d'entrée [code]ui_focus_next[/code].\n" +"Si cette propriété n'est pas définie, Godot choisira la « meilleure solution " +"» basée sur les nÅ“uds environnants dans l'arborescence." #: doc/classes/Control.xml msgid "" @@ -20821,6 +21053,11 @@ msgid "" "If this property is not set, Godot will select a \"best guess\" based on " "surrounding nodes in the scene tree." msgstr "" +"Signale à Godot qu'il ne devrait pas donner le focus du clavier si " +"l'utilisateur presse \"Shift+Tab\" sur un clavier par défaut. Vous pouvez " +"modifier la clé en éditant l'action d'entrée [code]ui_focus_prev[/code].\n" +"Si cette propriété n'est pas définie, Godot choisira la « meilleure solution " +"» basée sur les nÅ“uds environnants dans l'arborescence." #: doc/classes/Control.xml msgid "" @@ -20955,6 +21192,11 @@ msgid "" "[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the " "system." msgstr "" +"La forme par défaut du curseur pour ce contrôle. Utile pour les greffons de " +"Godot et applications ou jeux qui utilisent les curseurs de souris du " +"système.\n" +"[b]Note :[/b] Sur Linux, les formes peuvent varier selon le thème du curseur " +"du système." #: doc/classes/Control.xml msgid "" @@ -20963,6 +21205,11 @@ msgid "" "Also controls whether the control can receive the [signal mouse_entered], " "and [signal mouse_exited] signals. See the constants to learn what each does." msgstr "" +"Contrôle si la commande sera en mesure de recevoir les événements d'entrée " +"de la souris via [method gui_input] et comment ces événements seront " +"traités. Contrôle également si le contrôle peut recevoir les signaux [signal " +"mouse_entered] et [signal mouse_exited]. Voyez les constantes pour connaitre " +"le rôle de chacun." #: doc/classes/Control.xml msgid "" @@ -21023,6 +21270,21 @@ msgid "" "[code]yield(get_tree(), \"idle_frame\")[/code] then set its [member " "rect_scale] property." msgstr "" +"Le facteur de mise à l'échelle, relative à [member rect_size]. Changez cette " +"propriété pour changer l'échelle du nÅ“ud centré sur [member " +"rect_pivot_offset]. Le[member hint_tooltip] du Control sera également " +"réduite en fonction de cette valeur.\n" +"[b]Note :[/b] Cette propriété est principalement destinée à être utilisée " +"pour les animation. Le texte à l'intérieur du Control sera pixelisé ou flou " +"lorsque la mise à l'échelle change. Pour supporter plusieurs résolutions " +"dans votre projet, utilisez un mode d'étirement approprié suivant la " +"[url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/" +"url] au lieu de changer chaque Control individuellement.\n" +"[b]Note :[/b] Si le nÅ“ud de contrôle est un enfant d'un nÅ“ud [Container], " +"l'échelle sera réinitialisée à [code]Vector2(1, 1)[/code] lorsque la scène " +"est instanciée. Pour définir l'échelle du Control lors de son instanciation, " +"attendez une trame avec [code]yield(get_tree,) \"idle_frame\")[/code] puis " +"définissez son [member rect_scale]." #: doc/classes/Control.xml msgid "" @@ -21143,6 +21405,19 @@ msgid "" " # Not hovering over area.\n" "[/codeblock]" msgstr "" +"Émis lorsque la souris quitte la zone [code]Rect[/code] de contrôle, à " +"condition que l'événement l'atteigne.\n" +"[b]Note :[/b] [signal mouse_exited] sera émis si la souris entre dans un " +"nÅ“ud [Control] enfant, même si le curseur de la souris est encore à " +"l'intérieur de la zone [code]Rect[/code] du parent.\n" +"Si vous voulez vérifier si la souris a vraiment quitté la zone, en ignorant " +"les nÅ“uds parents, vous pouvez utiliser le code comme ceci :\n" +"[codeblock]\n" +"func on_mouse_exited():\n" +" if not Rect2(Vector2(), rect_size)." +"has_point(get_local_mouse_position()):\n" +" # Ne survole pas la zone.\n" +"[/codeblock]" #: doc/classes/Control.xml msgid "Emitted when the control changes size." @@ -21261,6 +21536,10 @@ msgid "" "when the user hovers the node. It tells the user they're currently dragging " "an item, like a node in the Scene dock." msgstr "" +"Affiche le curseur de la souris de déposé-glissé, souvent un poing fermé ou " +"un symbole de croix, lorsque l'utilisateur survole le nÅ“ud. Ça précise à " +"l'utilisateur qu'il déplace actuellement un objet, comme un nÅ“ud dans le " +"dock de Scene." #: doc/classes/Control.xml msgid "" @@ -21268,12 +21547,18 @@ msgid "" "an open hand. It tells the user they can drop an item they're currently " "grabbing, like a node in the Scene dock." msgstr "" +"Affiche le curseur de la souris lorsque l'utilisateur survole le nÅ“ud. Ça " +"peut être une main ouverte. Ça précise à l'utilisateur qu'il peut déposer un " +"élément qu'il était en traint de déplacer, comme un nÅ“ud dans le dock de " +"Scene." #: doc/classes/Control.xml msgid "" "Show the system's forbidden mouse cursor when the user hovers the node. " "Often a crossed circle." msgstr "" +"Affiche le curseur de souris d'interdition système lorsque l'utilisateur " +"survole le nÅ“ud. C'est souvent un cercle barré." #: doc/classes/Control.xml msgid "" @@ -21281,6 +21566,10 @@ msgid "" "node. A double-headed vertical arrow. It tells the user they can resize the " "window or the panel vertically." msgstr "" +"Afficher le curseur de souris de redimensionnement vertical lorsque " +"l'utilisateur survole le nÅ“ud. Une flèche verticale à double tête. Ça " +"précise à l'utilisateur qu'il peut redimensionner la fenêtre ou le panneau " +"verticalement." #: doc/classes/Control.xml msgid "" @@ -21288,6 +21577,10 @@ msgid "" "node. A double-headed horizontal arrow. It tells the user they can resize " "the window or the panel horizontally." msgstr "" +"Affiche le curseur de la souris de redimensionnement horizontal lorsque " +"l'utilisateur survole le nÅ“ud. Une flèche horizontale à double tête. Ça " +"précise à l'utilisateur qu'il peut redimensionner la fenêtre ou le panneau " +"horizontalement." #: doc/classes/Control.xml msgid "" @@ -21296,6 +21589,11 @@ msgid "" "top right. It tells the user they can resize the window or the panel both " "horizontally and vertically." msgstr "" +"Affiche le curseur de la souris de redimensionnement de la fenêtre lorsque " +"l'utilisateur survole le nÅ“ud. Le curseur est une flèche à double tête qui " +"va du bas à gauche au sommet à droite. Ça précise à l'utilisateur qu'il peut " +"redimensionner la fenêtre ou le panneau à la fois horizontalement et " +"verticalement." #: doc/classes/Control.xml msgid "" @@ -21304,6 +21602,11 @@ msgid "" "bottom right, the opposite of [constant CURSOR_BDIAGSIZE]. It tells the user " "they can resize the window or the panel both horizontally and vertically." msgstr "" +"Affiche le curseur de la souris de redimensionnement de la fenêtre lorsque " +"l'utilisateur survole le nÅ“ud. Le curseur est une flèche à double tête qui " +"va du haut à gauche au bas à droite, le contraire de [constant " +"CURSOR_BDIAGSIZE]. Ça précise à l'utilisateur qu'il peut redimensionner la " +"fenêtre ou le panneau à la fois horizontalement et verticalement." #: doc/classes/Control.xml msgid "" @@ -21311,6 +21614,9 @@ msgid "" "2 double-headed arrows at a 90 degree angle. It tells the user they can move " "a UI element freely." msgstr "" +"Affiche le curseur de la souris de déplacement lorsque l'utilisateur survole " +"le nÅ“ud. Il montre 2 flèches doubles à un angle de 90 degrés. Ça précise à " +"l'utilisateur qu'il peut déplacer un élément d'interface librement." #: doc/classes/Control.xml msgid "" @@ -24626,7 +24932,7 @@ msgid "" "returns an empty String." msgstr "" "Sur Windows, retourne le nom du disque (du moins la partition) passé en " -"argument (par exemple [code]C:[/code)].\n" +"argument (par exemple [code]C:[/code]).\n" "Sur macOS, retourne le chemin vers le volume monté qui est passé en " "argument.\n" "Sur Linux, retourne le chemin vers le volume monté, ou le favoris GTK 3, " @@ -24995,7 +25301,7 @@ msgstr "" "police TTF, vous pouvez utiliser [url=https://fontforge.org/]FontForge[/url] " "pour cela. Dans FontForge, utilisez [b]Fichier > Polices Générales[/b], " "cliquez sur [b]Options[/b], puis choisissez la fonctionnalité voulue lors de " -"la génération de la police" +"la génération de la police." #: doc/classes/DynamicFont.xml msgid "Adds a fallback font." @@ -25299,12 +25605,21 @@ msgid "" "In case of a directory code-sign will error if you place non code object in " "directory." msgstr "" +"Ajoute un objet partagé ou un dossier contenant uniquement des objets " +"partagés avec les étiquettes [code]tags[/code] et le chemin de destination " +"[code]path[/code].\n" +"[b]Note :[/b] En cas d'exportation pour macOS, ces objets partagés seront " +"ajoutés au dossier [code]Frameworks[/code] de l'app bundle.\n" +"Pour les dossiers, \"code-sign\" affichera une erreur si vous placez dans ce " +"dossier un objet qui n'est pas du code." #: doc/classes/EditorExportPlugin.xml msgid "" "To be called inside [method _export_file]. Skips the current file, so it's " "not included in the export." msgstr "" +"Sera appelé dans [method export_file]. Ignore le fichier actuel, il ne " +"figurera donc pas dans l'exportation." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25324,6 +25639,17 @@ msgid "" "To manage editor feature profiles visually, use [b]Editor > Manage Feature " "Profiles...[/b] at the top of the editor window." msgstr "" +"Un profil d'éditeur peut être utilisé pour désactiver certaines " +"fonctionnalités spécifiques de l'éditeur Godot. Lorsqu'elles sont " +"désactivées, ces fonctionnalités n'apparaîtront pas dans l'éditeur, ce qui " +"rend simplie l'éditeur. Cela est utile dans les milieux d'éducation pour " +"réduire la confusion ou lorsque vous travaillez dans une équipe. Par " +"exemple, les artistes et les concepteurs de niveau pourraient utiliser un " +"profil de fonctionnalités qui désactive l'éditeur de script pour éviter des " +"modifications accidentelles aux fichiers qu'ils ne sont pas censés " +"modifier.\n" +"Pour gérer visuellement les profils d'éditeur, utilisez [b]Éditeur > Gérer " +"les profils de fonctionnalités.[/b] en haut de la fenêtre de l'éditeur." #: doc/classes/EditorFeatureProfile.xml msgid "Returns the specified [code]feature[/code]'s human-readable name." @@ -25336,6 +25662,9 @@ msgid "" "is disabled. When disabled, the class won't appear in the Create New Node " "dialog." msgstr "" +"Retourne [code]true[/code] si la classe spécifiée par [code]class_name[/" +"code] est désactivée. Lorsqu'elle est désactivée, la classe n'apparaitre pas " +"dans le dialogue \"Créer un nouveau nÅ“ud\"." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25357,12 +25686,19 @@ msgid "" "appear in the inspector when selecting a node that extends the class " "specified by [code]class_name[/code]." msgstr "" +"Retourne [code]true[/code] si [code]property[/code] est désactivé dans la " +"classe spécifiée par [code]class_name[/code]. Lorsqu'une propriété est " +"désactivée, elle n'apparaît pas dans l'inspecteur pour un nÅ“ud qui étend la " +"classe spécifiée par [code]class_name[/code]." #: doc/classes/EditorFeatureProfile.xml msgid "" "Returns [code]true[/code] if the [code]feature[/code] is disabled. When a " "feature is disabled, it will disappear from the editor entirely." msgstr "" +"Retourne [code]true[/code] si la fonctionnalité [code]feature[/code] est " +"désactivée. Lorsqu'une fonctionnalité est désactivée, elle disparaîtra " +"entièrement de l'éditeur." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25370,6 +25706,9 @@ msgid "" "format obtained by using the feature profile manager's [b]Export[/b] button " "or the [method save_to_file] method." msgstr "" +"Charge un profil d'éditeur depuis un fichier. Le fichier doit respecter le " +"format JSON obtenu en utilisant le bouton [b]Export[/b] ou via la méthode " +"[method save_to_file]." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25377,6 +25716,9 @@ msgid "" "imported using the feature profile manager's [b]Import[/b] button or the " "[method load_from_file] button." msgstr "" +"Enregistre le profil de fonctionnalité de l'éditeur dans un fichier au " +"format JSON. Il peut ensuite être importé en utilisant le bouton [b]Import[/" +"b] ou la méthode [method load_from_file]." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25384,6 +25726,9 @@ msgid "" "by [code]class_name[/code]. When disabled, the class won't appear in the " "Create New Node dialog." msgstr "" +"Si [code]disable[/code] est [code]true[/code], désactive la classe nommée " +"[code]class_name[/code]. Lorsqu'elle est désactivée, la classe n'apparait " +"pas dans le dialogue \"Créer un nouveau nÅ“ud\"." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25392,6 +25737,11 @@ msgid "" "appear in the Create New Node dialog but the inspector will be read-only " "when selecting a node that extends the class." msgstr "" +"Si [code]disable[/code] est [code]true[/code], désactive l'édition de la " +"classe nommée [code]class_name[/code]. Lorsqu'elle est désactivée, la classe " +"apparaîtra toujours dans le dialogue \"Créer un nouveau nÅ“ud\", mais " +"l'inspecteur ne permettra pas de modifier ses propriétés pour les nÅ“uds qui " +"étendent cette classe." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25485,6 +25835,11 @@ msgid "" "For example, [code]\"*.tscn, *.scn; Scenes\"[/code] results in filter text " "\"Scenes (*.tscn, *.scn)\"." msgstr "" +"Ajoute une option de filtrage d'extension de fichier délimitée par des " +"virgules à [EditorFileDialog] avec une étiquette optionnelle délimitée par " +"des point-virgules.\n" +"Par exemple, [code]\"*.tscn, *.scn; Scenes\"[/code] donne le filtre \"Scenes " +"(*.tscn, *.scn)\"." #: doc/classes/EditorFileDialog.xml msgid "Removes all filters except for \"All Files (*)\"." @@ -25497,6 +25852,11 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne le [code]VBoxContainer[/code] utilisé pour afficher le système de " +"fichiers.\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud requis en interne, l'enlever et " +"le libérer peut causer un plantage. Si vous voulez le cacher lui ou un de " +"ses enfants, utilisez la propriété [membre CanvasItem.visible]." #: doc/classes/EditorFileDialog.xml msgid "" @@ -25926,6 +26286,13 @@ msgid "" "code] unless overridden by a specific importer. See [enum ResourceImporter." "ImportOrder] for some predefined values." msgstr "" +"Retourne l'ordre de lancement de cet importateur lors de l'importation de " +"ressources. Les importateurs avec un ordre d'importation plus [i]bas[/i] " +"seront appelés en premier, et des valeurs supérieures seront appelées après. " +"Utilisez-le pour s'assurer que l'importateur fonctionne après l'importation " +"des dépendances. L'ordre d'importation par défaut est [code]0[/code] à moins " +"d'être remplacé par un importateur spécifique. Voir [enum ResourceImporter." +"ImportOrder] pour certaines valeurs prédéfinies." #: doc/classes/EditorImportPlugin.xml msgid "Gets the unique name of the importer." @@ -25969,6 +26336,9 @@ msgid "" "get_import_options] to get the default options for the preset and [method " "get_preset_name] to get the name of the preset." msgstr "" +"Retourne le nombre de préréglages initiaux définis par le greffon. Utilisez " +"[method get_import_options] pour obtenir les options par défaut pour le " +"préréglage et [method get_preset_name] pour obtenir son nom." #: doc/classes/EditorImportPlugin.xml msgid "Gets the name of the options preset at this index." @@ -25979,12 +26349,17 @@ msgid "" "Gets the priority of this plugin for the recognized extension. Higher " "priority plugins will be preferred. The default priority is [code]1.0[/code]." msgstr "" +"Retourne la priorité de ce greffon pour l'extension reconnue. Des greffons " +"le plus prioritaires seront préférés. La priorité par défaut est [code]1.0[/" +"code]." #: doc/classes/EditorImportPlugin.xml msgid "" "Gets the list of file extensions to associate with this loader (case-" "insensitive). e.g. [code][\"obj\"][/code]." msgstr "" +"Retourne la liste des extensions de fichier à associer à ce chargeur " +"(insensible à la casse). Par exemple [code][\"obj\"][/code]." #: doc/classes/EditorImportPlugin.xml msgid "" @@ -26000,12 +26375,18 @@ msgid "" "directory (see [member ProjectSettings.application/config/" "use_hidden_project_data_directory])." msgstr "" +"Retourne l'extension utilisée pour sauvegarder cette ressource dans le " +"dossier [code].import[/code] (voir [membre ProjectSettings.application/" +"config/use_hidden_project_data_directory])." #: doc/classes/EditorImportPlugin.xml msgid "" "Gets the name to display in the import window. You should choose this name " "as a continuation to \"Import as\", e.g. \"Import as Special Mesh\"." msgstr "" +"Retourne le nom à afficher dans la fenêtre d'importation. Vous devriez " +"choisir ce nom comme une suite à \"Importer comme\", par exemple \"Importer " +"comme Maillage Spécial\"." #: doc/classes/EditorImportPlugin.xml msgid "" @@ -26015,6 +26396,13 @@ msgid "" "This method must be overridden to do the actual importing work. See this " "class' description for an example of overriding this method." msgstr "" +"Importe [code]source_file[/code] dans [code]save_path[/code] avec l'option " +"[code]options[/code] d'importation spécifié. Les tableaux " +"[code]platform_variants[/code] et [code]gen_files[/code] seront modifiés par " +"cette fonction.\n" +"Cette méthode doit être surchargée pour exécuter le véritable travail " +"d'importation. Voir la description de cette classe pour un exemple de " +"surcharge de cette méthode." #: doc/classes/EditorInspector.xml #, fuzzy @@ -26048,6 +26436,33 @@ msgid "" "groups. So properties with group usage usually use capitalized names instead " "of snake_cased names." msgstr "" +"Il s'agit du contrôle qui permet l'édition des propriétés dans les dialogues " +"des Paramètres de l'éditeur, le dock Inspecteur, etc. Pour obtenir le " +"[EditorInspector] utilisé dans le fichier d'inspecteur de l'éditeur, " +"utilisez [method EditorInterface.get_inspector]\n" +"[EditorInspector] affichera les propriétés dans le même ordre que le tableau " +"retourné par [method Object.get_property_list]\n" +"Si le nom d'un propriété établie est semblable à celui d'un chemin (c'est-à -" +"dire s'il commence par des barres obliques), [EditorInspector] créera des " +"sections imbriquées pour les « dossier » suivant le chemin. Par exemple, si " +"une propriété est nommée [code]highlighting/gdscript/node_path_color[/code], " +"elle sera affichée comme \"Node Path Color\" dans la section \"GDScript\" " +"imbriquée dans la section \"Highlighting\".\n" +"Si une propriété a l'usage [constant @GlobalScope.PROPERTY_USAGE_GROUP], " +"elle regroupera les propriétés dont le nom commence par la chaîne d'indice " +"de la propriété. Le groupe se termine quand une propriété ne commence pas " +"avec cette chaîne d'indice ou quand un nouveau groupe commence. Un nom de " +"groupe vide termine le groupe actuel. [EditorInspector] créera une section " +"tout en haut pour chaque groupe. Par exemple, si une propriété avec " +"l'utilisation de groupe est nommée [code]Collide With[/code] et que sa " +"chaîne d'indice est [code]collide_with[/code], une propriété " +"[code]collide_with_area[/code] suivante sera affichée comme \"Area\" dans la " +"section \"Collide With\".\n" +"[b]Note :[/b] Contrairement aux sections créées à partir de noms de " +"propriété selon des chemins, [EditorInspector] a obtenu le nom de sections " +"créées à partir de groupes. Ainsi, les propriétés avec l'utilisation de " +"groupe utilisent généralement des noms capitalisés au lieu des noms en " +"\"snake_case\"." #: doc/classes/EditorInspector.xml msgid "" @@ -26057,16 +26472,24 @@ msgid "" "code] editor setting hasn't passed yet since this method was last called. " "(By default, this interval is set to 0.3 seconds.)" msgstr "" +"Actualise l'inspecteur.\n" +"[b]Note :[/b] Pour économiser les ressources CPU, l'appel de cette méthode " +"ne fera rien si le temps spécifié dans [code]docks/property_editor/" +"auto_refresh_interval[/code] des réglages de l'éditeur n'a pas encore été " +"écoulé depuis le dernier appel à cette méthode. (Par défaut, cet intervalle " +"est de 0,3 secondes.)" #: doc/classes/EditorInspector.xml msgid "" "Emitted when the Edit button of an [Object] has been pressed in the " "inspector. This is mainly used in the remote scene tree inspector." msgstr "" +"Émis lorsque le bouton Edit d'un [Objet] a été pressé dans l'inspecteur. " +"Ceci est principalement utilisé dans l'inspecteur d'une scène distante." #: doc/classes/EditorInspector.xml msgid "Emitted when a property is edited in the inspector." -msgstr "" +msgstr "Émis lorsqu'une propriété est modifiée dans l'inspecteur." #: doc/classes/EditorInspector.xml msgid "" @@ -26191,12 +26614,22 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorPlugin.get_editor_interface]." msgstr "" +"EditorInterface vous donne le contrôle de la fenêtre de l'éditeur Godot. Il " +"permet de personnaliser la fenêtre, d'enregistrer et (re)charger des scènes, " +"de faire des aperçus des mailles, d'inspecter et d'éditer des ressources et " +"des objets, et fournit l'accès à [EditorSettings], [EditorFileSystem], " +"[EditorResourcePreview], [ScriptEditor], la fenêtre d'affichage de l'éditeur " +"et des informations sur les scènes.\n" +"[b]Note :[/b] Cette classe ne doit pas être instanciée directement. Accédez " +"plutôt au singleton en utilisant [method EditorPlugin.get_editor_interface]." #: doc/classes/EditorInterface.xml msgid "" "Edits the given [Node]. The node will be also selected if it's inside the " "scene tree." msgstr "" +"Édite le [Node] donné. Le nÅ“ud sera également sélectionné s'il s'agit d'une " +"arborescence de scène." #: doc/classes/EditorInterface.xml msgid "" @@ -26250,6 +26683,12 @@ msgid "" "[b]Warning:[/b] Removing and freeing this node will render a part of the " "editor useless and may cause a crash." msgstr "" +"Retourne le contrôle principal de l'éditeur. Utilisez-le comme parent pour " +"les écrans principaux.\n" +"[b]Note :[/b] Cela retourne le contrôle principal de l'éditeur contenant " +"tout l'éditeur, pas seulement les vues 2D ou 3D.\n" +"[b]Avertissement :[/b] Enlever et libérer ce nÅ“ud rendra une partie de " +"l'éditeur inutile et peut causer un crash." #: doc/classes/EditorInterface.xml msgid "" @@ -26257,6 +26696,9 @@ msgid "" "[b]Warning:[/b] Removing and freeing this node will render a part of the " "editor useless and may cause a crash." msgstr "" +"Retourne l'instance [FileSystemDock] de l'éditeur.\n" +"[b]Avertissement :[/b] Enlever et libérer ce nÅ“ud rendra une partie de " +"l'éditeur inutile et peut causer un crash." #: doc/classes/EditorInterface.xml msgid "" @@ -26264,6 +26706,9 @@ msgid "" "[b]Warning:[/b] Removing and freeing this node will render a part of the " "editor useless and may cause a crash." msgstr "" +"Retourne l'instance [EditorInspector] de l'éditeur.\n" +"[b]Avertissement :[/b] Enlever et libérer ce nÅ“ud rendra une partie de " +"l'éditeur inutile et peut causer un crash." #: doc/classes/EditorInterface.xml msgid "Returns an [Array] with the file paths of the currently opened scenes." @@ -26274,6 +26719,8 @@ msgid "" "Returns the name of the scene that is being played. If no scene is currently " "being played, returns an empty string." msgstr "" +"Retourne le nom de la scène qui est en train d'être jouée. Si aucune scène " +"n'est actuellement jouée, retourne une chaîne vide." #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorFileSystem] instance." @@ -26289,6 +26736,9 @@ msgid "" "[b]Warning:[/b] Removing and freeing this node will render a part of the " "editor useless and may cause a crash." msgstr "" +"Retourne l'instance [ScriptEditor].\n" +"[b]Avertissement :[/b] Enlever et libérer ce nÅ“ud rendra une partie de " +"l'éditeur inutile et peut causer un crash." #: doc/classes/EditorInterface.xml msgid "" @@ -26431,7 +26881,7 @@ msgstr "" "vous de masquer le bouton si besoin. Lorsque votre greffon est désactivé, " "assurez-vous de supprimer votre contrôle personnalisé avec [method " "remove_control_from_bottom_panel] et de le libérer avec [method Node." -"queue_free]" +"queue_free]." #: doc/classes/EditorPlugin.xml msgid "" @@ -26452,7 +26902,7 @@ msgstr "" "personnalisés vous-même (et probablement le cacher après l'avoir ajouté).\n" "Lorsque votre greffon est désactivé, assurez-vous de supprimer votre " "contrôle personnalisé avec [method remove_control_from_container] et de le " -"libérer avec [method Node.queue_free]" +"libérer avec [method Node.queue_free]." #: doc/classes/EditorPlugin.xml msgid "" @@ -26469,7 +26919,7 @@ msgstr "" "l'éditeur enregistrera la position du dock pour d'autres sessions.\n" "Lorsque votre greffon est désactivé, assurez-vous de supprimer votre " "contrôle personnalisé avec [method remove_control_from_container] et de le " -"libérer avec [method Node.queue_free]" +"libérer avec [method Node.queue_free]." #: doc/classes/EditorPlugin.xml msgid "" @@ -26904,6 +27354,25 @@ msgid "" " return state\n" "[/codeblock]" msgstr "" +"Surchargez cette méthode pour fournir des données d'état que vous souhaitez " +"enregistrer, comme la position de la vue, les paramètres de grille, les " +"réductions, etc. Ceci est utilisé pour enregistrer la scène (ainsi l'état " +"est maintenu lors de l'ouverture suivante) et pour les onglets (pour que " +"l'état soit restauré quand l'onglet est ouvert à nouveau). Ces données sont " +"automatiquement sauvegardées pour chaque scène dans un fichier " +"[code]editstate[/code] dans le dossier de métadonnées de l'éditeur. Si vous " +"souhaitez stocker des données globales (indépendantes de la scène) pour " +"votre greffon, utilisez plutôt [method get_window_layout].\n" +"Utilisez [method set_state] pour restaurer votre état sauvegardé.\n" +"[b]Note :[/b] Cette méthode ne devrait pas être utilisée pour sauvegarder " +"des paramètres importants qui devraient persister dans le projet.\n" +"[b]Note :[/b] Vous devez implémenter [method get_greffon_name] pour que " +"l'état soit stocké et restauré correctement.\n" +"[codeblock]\n" +"func get_state():\n" +" var state = {\"zoom\": zoom, \"preferred_color\": my_color}\n" +" return state\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -26929,6 +27398,21 @@ msgid "" " configuration.set_value(\"MyPlugin\", \"icon_color\", $Icon.modulate)\n" "[/codeblock]" msgstr "" +"Surchargez cette méthode pour fournir la mise en page de l'interface du " +"greffon ou toute autre donnée que vous souhaitez enregistrer. Ceci est " +"utilisé pour sauvegarder la mise en page de l'éditeur du projet lorsque " +"[method queue_save_layout] est appelée ou la mise en page de l'éditeur a été " +"modifiée (par exemple, changer la position d'un dock). Les données sont " +"enregistrées dans le fichier [code]editor_layout.cfg[/code] dans le dossier " +"des métadonnées de l'éditeur.\n" +"Utilisez [method set_window_layout] pour restaurer la mise en page qui a été " +"sauvegardée.\n" +"[codeblock]\n" +"func get_window_layout(configuration):\n" +" configuration.set_value(\"MyPlugin\", \"window_position\", $Window." +"position)\n" +" configuration.set_value(\"MyPlugin\", \"icon_color\", $Icon.modulate)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -26954,7 +27438,7 @@ msgid "" msgstr "" "Retourne [code]true[/code] si c'est ce greffon de l'éditeur concerne l'écran " "principal (qui va dans le sélecteur d'espace de travail à côté de [b]2D[/b], " -"[b]3D[/b], [b]Script[/b] et [b]AssetLib[/b)]." +"[b]3D[/b], [b]Script[/b] et [b]AssetLib[/b])." #: doc/classes/EditorPlugin.xml msgid "Minimizes the bottom panel." @@ -27071,6 +27555,15 @@ msgid "" " preferred_color = data.get(\"my_color\", Color.white)\n" "[/codeblock]" msgstr "" +"Restaure l'état enregistrée par [méthode get_state]. Cette méthode est " +"appelée lorsque l'onglet de scène actuelle est changé dans l'éditeur.\n" +"[b]Note :[/b] Votre greffon doit implémenter [method get_greffon_name], " +"sinon il ne sera pas reconnu et cette méthode ne sera pas appelée.\n" +"[codeblock]\n" +"func set_state(data):\n" +" zoom = data.get(\"zoom\", 1.0)\n" +" preferred_color = data.get(\"my_color\", Color.white)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -27085,6 +27578,17 @@ msgid "" "Color.white)\n" "[/codeblock]" msgstr "" +"Restaurer la disposition de l'interface du greffon et les données " +"enregistrées par [method get_window_layout]. Cette méthode est appelée pour " +"chaque greffon au démarrage de l'éditeur. Utilisez le fichier " +"[code]configuration[/code] pour lire vos données sauvegardées.\n" +"[codeblock]\n" +"func set_window_layout(configuration):\n" +" $Window.position = configuration.get_value(\"MyPlugin\", " +"\"window_position\", Vector2())\n" +" $Icon.modulate = configuration.get_value(\"MyPlugin\", \"icon_color\", " +"Color.white)\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -27443,6 +27947,10 @@ msgid "" "generate] or [method generate_from_path] for small previews as well.\n" "By default, it returns [code]false[/code]." msgstr "" +"Si cette fonction retourne [code]true[/code], le générateur appellera " +"[method generate] ou [method generate_from_path] pour les aperçus de petite " +"taille.\n" +"Par défaut, il retourne [code]false[/code]." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "" @@ -27453,6 +27961,12 @@ msgid "" "Care must be taken because this function is always called from a thread (not " "the main thread)." msgstr "" +"Génère un aperçu d'une ressource donnée avec la taille spécifiée. Cela doit " +"toujours être implémenté.\n" +"Retourner une texture vide est une bonne façon de signaler un échec et " +"laisser un autre générateur s'occuper de l'aperçu.\n" +"Ça nécessite de prendre des précautions parce que cette fonction est " +"toujours appelée à partir d'un fil d'exécution qui n'est pas celui principal." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "" @@ -27464,6 +27978,13 @@ msgid "" "Care must be taken because this function is always called from a thread (not " "the main thread)." msgstr "" +"Génère un aperçu directement à partir d'un chemin avec la taille spécifiée. " +"La mise en Å“uvre est facultative, car le code par défaut va charger et " +"appeler [method generate].\n" +"Retourner une texture vide est une bonne façon de signaler un échec et " +"laisser un autre générateur s'occuper de l'aperçu.\n" +"Ça nécessite de prendre des précautions parce que cette fonction est " +"toujours appelée à partir d'un fil d'exécution qui n'est pas celui principal." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "" @@ -27472,6 +27993,11 @@ msgid "" "methods [method generate] or [method generate_from_path].\n" "By default, it returns [code]false[/code]." msgstr "" +"Si cette fonction retourne [code]true[/code], le générateur générera " +"automatiquement les petits aperçus à partir de la texture de " +"prévisualisation de taille normale générée par les méthodes [method " +"generate] ou [method generate_from_path].\n" +"Par défaut, elle retourne [code]false[/code]." #: doc/classes/EditorResourcePreviewGenerator.xml msgid "" @@ -27492,6 +28018,10 @@ msgid "" "To use [EditorSceneImporter], register it using the [method EditorPlugin." "add_scene_import_plugin] method first." msgstr "" +"[EditorSceneImporter] permet de définir un script importateur pour un format " +"3D tiers.\n" +"Pour utiliser [EditorSceneImporter], enregistrez-le d'abord en utilisant la " +"méthode [method EditorPlugin.add_scene_import_greffon]." #: modules/fbx/doc_classes/EditorSceneImporterFBX.xml msgid "FBX 3D asset importer." @@ -27794,7 +28324,7 @@ msgstr "" "var list_of_settings = settings.get_property_list()\n" "[/codeblock]\n" "[b]Note :[/b] Cette classe ne devrait être pas instanciée. Accédez plutôt au " -"singleton [method EditorInterface.get_editor_settings]" +"singleton [method EditorInterface.get_editor_settings]." #: doc/classes/EditorSettings.xml msgid "" @@ -31422,6 +31952,11 @@ msgid "" "on ([code]p1[/code], [code]q1[/code]) as well the accompanying point on " "([code]p2[/code], [code]q2[/code])." msgstr "" +"À partir de deux segments 2D (de [code]p1[/code] à [code]q1[/code]) et (de " +"[code]p2[/code] à [code]q2[/code]), retourne les deux points qui sont les " +"plus proches de l'autre segment sur ces deux segments. Retourne un " +"[PoolVector2Array] qui contient deux points, un sur chaque segment (de " +"[code]p1[/code] à [code]q1[/code], et de [code]p2[/code] à [code]q2[/code])." #: doc/classes/Geometry.xml msgid "Used internally by the engine." @@ -31452,6 +31987,9 @@ msgid "" "it's located exactly [i]on[/i] the circle's boundary, otherwise returns " "[code]false[/code]." msgstr "" +"Retourne [code]true[/code] si [code]point[/code] est à l'intérieur du cercle " +"ou s'il se trouve exactement [i]sur[/i] la bordure du cercle, et retourne " +"[code]false[/code] sinon." #: doc/classes/Geometry.xml msgid "" @@ -31459,6 +31997,9 @@ msgid "" "code] or if it's located exactly [i]on[/i] polygon's boundary, otherwise " "returns [code]false[/code]." msgstr "" +"Retourne [code]true[/code] si [code]point[/code] est à l'intérieur du " +"[code]polygon[/code] ou s'il se trouve exactement [i]sur[/i] la bodure du " +"polygone, retourne [code]false[/code] sinon." #: doc/classes/Geometry.xml msgid "" @@ -31476,6 +32017,14 @@ msgid "" "[code]null[/code].\n" "[b]Note:[/b] The lines are specified using direction vectors, not end points." msgstr "" +"Vérifie si les deux lignes (de [code]from_a[/code] et en direction de " +"[code]dir_a[/code]) et (de [code]from_b[/code] et en direction de " +"[code]dir_b[/code]) s'intersectent. Si oui, retourne le point d'intersection " +"dans un [Vector2]. Si aucune intersection n'existe, retourne [code]null[/" +"code].\n" +"[b]Note :[/b] Ces lignes sont spécifiées en utilisant des vecteurs de " +"direction, pas des points de fin, puisqu'une ligne n'a pas par définition de " +"fin." #: doc/classes/Geometry.xml msgid "" @@ -31484,6 +32033,11 @@ msgid "" "[Vector2] that specifies the positions of each tile, [code]size[/code] " "contains the overall size of the whole atlas as [Vector2]." msgstr "" +"À partir d'un tableau de [Vector2] représentant des tuiles, construit un " +"atlas. Le dictionnaire retourné a deux clés : [code]points[/code] est un " +"tableau de [Vector2] qui précise les positions de chaque tuile, et " +"[code]size[/code] contient la taille globale de l'atlas entier sous forme de " +"[Vector2]." #: doc/classes/Geometry.xml msgid "" @@ -31494,6 +32048,12 @@ msgid "" "polygons (holes) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" +"Fusionne (combine) les polygones [code]polygon_a[/code] et [code]polygon_b[/" +"code] et retourne un tableau de polygones fusionnés. Ça utilise " +"[OPERATION_UNION] entre les polygones.\n" +"L'opération peut fournir un polygone extérieur (la limite) et plusieurs " +"polygones à intérieur (représentant les trous) qui pourraient être " +"distingués en appelant [méthode is_polygon_clockwise]." #: doc/classes/Geometry.xml msgid "" @@ -31520,6 +32080,29 @@ msgid "" "150), Vector2(50, 150)]\n" "[/codeblock]" msgstr "" +"Gonfle ou dégonfle [code]polygon[/code] par la quantité [code]delta[/code] " +"unités (pixels) dans toutes les directions. Si [code]delta[/code] est " +"positif, le polygone décale chaque sommet vers l'extérieur. Si [code]delta[/" +"code] est négatif, décale chaque sommet vers l'intérieur. Retourne une liste " +"des polygones parce que gonflage/dégonflage peut produire plusieurs " +"polygones distinctes. Retourne un tableau vide si [code]delta[/code] est " +"négatif et la valeur absolue de celui-ci dépasse approximativement les " +"dimensions du rectangle minimal englobant du polygone.\n" +"Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " +"voir [enum PolyJoinType].\n" +"L'opération peut fournir un polygone extérieur (la limite extérieure) et " +"plusieurs polygones à intérieur (représentant les trous) qui pourraient être " +"distingués en appelant [méthode is_polygon_clockwise].\n" +"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode " +"[méthode Transform2D.xform]:\n" +"[codeblock]\n" +"var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " +"100), Vector2(0, 100)])\n" +"var offset = Vector2(50, 50)\n" +"polygon = Transform2D(0, offset).xform(polygon)\n" +"print(polygon) # Affiche [Vector2(50, 50), Vector2(150, 50), Vector2(150, " +"150), Vector2(50, 150)]\n" +"[/codeblock]" #: doc/classes/Geometry.xml msgid "" @@ -31536,6 +32119,18 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" +"par la quantité [code]delta[/code] unités (pixels) dans toutes les " +"directions. Si [code]delta[/code] est positif, le polygone décale chaque " +"sommet vers l'extérieur. Retourne une liste des polygones parce que gonflage/" +"dégonflage peut produire plusieurs polygones distinctes. Si [code]delta[/" +"code] est négatif, retourne un tableau vide.\n" +"Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " +"voir [enum PolyJoinType].\n" +"Chaque point d'extrémité du polygone sera arrondi suivant [code]end_type[/" +"code], voir [enum PolyEndType].\n" +"L'opération peut fournir un polygone extérieur (la limite extérieur) et " +"plusieurs polygones à intérieur (représentant les trous) qui pourraient être " +"distingués en appelant [method is_polygon_clockwise]." #: doc/classes/Geometry.xml msgid "" @@ -31581,6 +32176,11 @@ msgid "" "If an intersection takes place, the returned array contains the point of " "intersection and the cylinder's normal at the point of intersection." msgstr "" +"Vérifie si le segment (de [code]from[/code] à [code]to[/code]) intersecte le " +"cylindre avec la hauteur [code]height[/code] qui est centré à l'origine et a " +"rayon de [code]radius[/code]. Si non, retourne un [PoolVector3Array] vide. " +"S'il y une intersection, le tableau retourné contient le point et la normale " +"de l'intersection." #: doc/classes/Geometry.xml msgid "" @@ -31589,6 +32189,10 @@ msgid "" "of intersection as [Vector2]. If no intersection takes place, returns " "[code]null[/code]." msgstr "" +"Vérifie si les deux segments (de [code]from_a[/code] à [code]to_a[/code]) et " +"(de [code]from_b[/code] à [code]to_b[/code]) intersectent. Si oui, retournez " +"le point d'intersection dans un [Vector2]. Si aucune intersection n'a lieu, " +"retourne [code]null[/code]." #: doc/classes/Geometry.xml msgid "" @@ -31617,6 +32221,13 @@ msgid "" "triangles). If the triangulation did not succeed, an empty [PoolIntArray] is " "returned." msgstr "" +"Triangule l'aire spécifiée par un ensemble discret de [code]points[/code] de " +"sorte qu'aucun point ne soit à l'intérieur du cercle d'un des triangles " +"résultant. Retourne un [PoolIntArray] où chaque triangle se compose de trois " +"indices de point consécutifs de [code]points[/code] (c'est-à -dire que le " +"tableau retourné aura [code]n * 3[/code] éléments, avec [code]n[/code] étant " +"le nombre de triangles trouvés). Si la triangulation n'a pas réussi, un " +"[PoolIntArray] vide sera retourné." #: doc/classes/Geometry.xml msgid "" @@ -31628,6 +32239,13 @@ msgid "" "contour will be flipped if it's clockwise. If the triangulation did not " "succeed, an empty [PoolIntArray] is returned." msgstr "" +"Triangule le polygone spécifié par les points dans [code]polygon[/code]. " +"Retourne un [PoolIntArray] où chaque triangle se compose de trois indices de " +"point consécutifs de [code]polygon[/code] (c'est-à -dire le tableau retourné " +"aura [code]n * 3[/code] éléments, avec [code]n[/code] étant le nombre de " +"triangles trouvés). Les triangles de sortie seront toujours dans le sens " +"anti-horaire, et le contour sera inversé si c'est dans le sens horaire. Si " +"la triangulation n'a pas réussi, un [PoolIntArray] vide sera retourné." #: doc/classes/Geometry.xml msgid "" @@ -31715,12 +32333,16 @@ msgid "" "Overrides the bounding box of this node with a custom one. To remove it, set " "an [AABB] with all fields set to zero." msgstr "" +"Surcharge le rectangle englobant de ce nÅ“ud avec un personnalisé. Pour le " +"supprimer, définissez un [AABB] avec tous les champs mis à zéro." #: doc/classes/GeometryInstance.xml msgid "" "Sets the [enum GeometryInstance.Flags] specified. See [enum GeometryInstance." "Flags] for options." msgstr "" +"Défini le [enum GeometryInstance.Flags] spécifiés. Voir [enum " +"GeometryInstance.Flags] pour les options." #: doc/classes/GeometryInstance.xml msgid "" @@ -31860,6 +32482,8 @@ msgid "" "Unused in this class, exposed for consistency with [enum VisualServer." "InstanceFlags]." msgstr "" +"Inutilisé dans cette classe, mais exposé pour être cohérent avec [enum " +"VisualServer.InstanceFlags]." #: doc/classes/GIProbe.xml msgid "Real-time global illumination (GI) probe." @@ -31896,10 +32520,43 @@ msgid "" "emit light when used in a [GIProbe]. Only emissive [SpatialMaterial]s can " "emit light in a [GIProbe]." msgstr "" +"[GIProbe] sont utilisées pour fournir une lumière indirecte en temps réel et " +"en haute qualité aux scènes. Ils pré-calculent les lumières émises par " +"objets et les effets statiques pour simuler le comportement complexe de la " +"lumière en temps réel. Les [GIProbe] doivent être calculées avant " +"utilisation, mais une fois calculées, les objets dynamiques recevront la " +"lumière. De plus, les lumières peuvent être entièrement dynamiques ou " +"calculées.\n" +"Placer des [GIProbe] dans une scène peut réduire grandement les " +"performances, la qualité de la sonde peut être réduite en échange de " +"meilleures performances depuis les [ProjectSettings] en utilisant [membre " +"ProjectSettings.rendering/quality/voxel_cone_tracing/high_quality]\n" +"[b]La génération procédurale :[/b] Une [GIProbe] peut être calculée dans un " +"projet exporté, ce qui lui permet d'être adaptée pour niveaux générés de " +"manière procédurale ou construits par l'utilisateur tant que la géométrie " +"est générée à l'avance.\n" +"[b]Performance :[/b] La [GIProbe] est relativement exigeant pour le GPU et " +"n'est pas adaptée au matériel d'entrée de gamme tel que les cartes " +"graphiques intégrées (utilisez plutôt [BakedLightmap]). Pour supporter le " +"matériel d'entrée de gamme, envisagez d'ajouter une option pour désactiver " +"les [GIProbe] dans les menus d'options de votre projet. Une [GIProbe] peut " +"être désactivé en cachant son nÅ“ud.\n" +"[b]Note :[/b] Les maillages doivent avoir des murs suffisamment épais pour " +"éviter les fuites de lumière au travers (évitez les murs qui n'ont qu'un " +"seul côté). Pour les niveaux intérieurs, enfermez votre géométrie de niveau " +"dans une boîte suffisamment grande bouchez les trous pour fermer le " +"maillage. Pour éviter les fuites de lumière, vous pouvez également placer " +"stratégiquement des nÅ“uds [MeshInstance] temporaires avec [membre " +"GeometryInstance.use_in_baked_light] activés. Ces nÅ“uds temporaires peuvent " +"alors être cachés une fois le calcul des [GIProbe] terminé.\n" +"[b]Note :[/b] En raison d'une limitation de rendu, les [ShaderMaterial] avec " +"émission ne peuvent pas émettre de lumière lorsqu'ils sont utilisés avec une " +"[GIProbe]. Seuls les [SpatialMaterial] peuvent émettre de la lumière qui " +"sera pris en compte par un [GIProbe]." #: doc/classes/GIProbe.xml msgid "GI probes" -msgstr "" +msgstr "Les sondes GI" #: doc/classes/GIProbe.xml msgid "" @@ -31941,6 +32598,8 @@ msgid "" "[i]Deprecated.[/i] This property has been deprecated due to known bugs and " "no longer has any effect when enabled." msgstr "" +"[i]Obsolète.[/i] Cette propriété a été rendue obsolète en raison de bugs " +"connus et n'a plus d'effet lorsqu'elle est activée." #: doc/classes/GIProbe.xml msgid "The [GIProbeData] resource that holds the data for this [GIProbe]." @@ -32028,6 +32687,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFAccessor] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFAccessor] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFAnimation.xml msgid "" @@ -32036,6 +32699,10 @@ msgid "" "to [GLTFAnimation] within a script will cause an error in an exported " "project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFAnimation] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFBufferView.xml msgid "" @@ -32044,6 +32711,10 @@ msgid "" "to [GLTFBufferView] within a script will cause an error in an exported " "project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFBufferView] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFCamera.xml msgid "" @@ -32051,6 +32722,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFCamera] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFCamera] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFDocument.xml msgid "" @@ -32058,6 +32733,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFDocument] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFDocument] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32065,12 +32744,18 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFLight] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFLight] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" "The [Color] of the light. Defaults to white. A black color causes the light " "to have no effect." msgstr "" +"La [Color] de la lumière. La couleur par défauts est blanc. Une couleur " +"noire fait que la lumière n'a aucun effet." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32081,6 +32766,13 @@ msgid "" "brightness. When creating a Godot [SpotLight], the ratio between the inner " "and outer cone angles is used to calculate the attenuation of the light." msgstr "" +"L'angle intérieur du cône dans un projecteur. Doit être inférieur ou égal à " +"l'angle de cône externe.\n" +"Dans cet angle, la lumière est à pleine luminosité. Entre les angles " +"intérieur et extérieur de cône, il y a une transition de la luminosité " +"totale à aucune. Lors de la création d'un [SpotLight], le rapport entre les " +"angles de cône intérieur et extérieur est utilisé pour calculer " +"l'atténuation de la lumière." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32089,6 +32781,10 @@ msgid "" "directional lights. When creating a Godot light, this value is converted to " "a unitless multiplier." msgstr "" +"L'intensité de la lumière. Ceci est exprimé en candelas (lumens par " +"stéradian) pour les lumières en point et les spots, et en lux (lumens par " +"m²) pour les lumières directionnels. En créant une lumière, cette valeur est " +"convertie en un multiplicateur sans unité." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32107,6 +32803,10 @@ msgid "" "with no range defined behave like physical lights (which have infinite " "range). When creating a Godot light, the range is clamped to 4096." msgstr "" +"La portée de la lumière, au-delà de laquelle la lumière n'a plus aucun " +"effet. Les feux GLTF sans limite de portée définie se comportent comme des " +"lumières physiques (qui ont une portée infinie). Lors de la création d'une " +"lumière Godot, la portée est fixée à 4096 unités." #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32114,6 +32814,9 @@ msgid "" "and \"directional\", which correspond to Godot's [OmniLight], [SpotLight], " "and [DirectionalLight] respectively." msgstr "" +"Le type de lumière. Les valeurs acceptées par Godot sont « point », « spot » " +"et « directionnelle », qui correspondent respectivement au type Godot " +"[OmniLight], [SpotLight] et [DirectionalLight]." #: modules/gltf/doc_classes/GLTFMesh.xml msgid "" @@ -32121,6 +32824,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFMesh] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFMesh] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFNode.xml msgid "" @@ -32128,6 +32835,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFNode] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFNode] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFSkeleton.xml msgid "" @@ -32135,6 +32846,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFSkeleton] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que dans les éditeurs. Le " +"chargement et l'économie de glTF en cours est [i]not[/i] disponible dans les " +"projets exportés. Les références à [GLTFSkeleton] dans un script causeront " +"une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFSpecGloss.xml msgid "" @@ -32143,6 +32858,10 @@ msgid "" "to [GLTFSpecGloss] within a script will cause an error in an exported " "project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que dans les éditeurs. Le " +"chargement et l'économie de glTF en cours est [i]not[/i] disponible dans les " +"projets exportés. Les références à [GLTFSpecGloss] dans un script causeront " +"une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFState.xml msgid "" @@ -32150,6 +32869,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFState] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFState] dans un script " +"causeront une erreur dans un projet exporté." #: modules/gltf/doc_classes/GLTFTexture.xml msgid "" @@ -32157,6 +32880,10 @@ msgid "" "loading and saving is [i]not[/i] available in exported projects. References " "to [GLTFTexture] within a script will cause an error in an exported project." msgstr "" +"[b]Note :[/b] Cette classe n'est compilée que pour les version de l'éditeur. " +"Le chargement et l'enregistrement au format glTF n'est [i]pas[/i] disponible " +"dans les projets exportés. Les références à [GLTFTexture] dans un script " +"causeront une erreur dans un projet exporté." #: modules/mono/doc_classes/GodotSharp.xml msgid "Bridge between Godot and the Mono runtime (Mono-enabled builds only)." @@ -32233,6 +32960,8 @@ msgid "" "A color interpolator resource which can be used to generate colors between " "user-defined color points." msgstr "" +"Une ressource d'interpolation de couleur qui peut être utilisé pour générer " +"des couleurs entre des points de couleur définis par l'utilisateur." #: doc/classes/Gradient.xml msgid "" @@ -32242,11 +32971,18 @@ msgid "" "will initially have 2 colors (black and white), one (black) at ramp lower " "offset 0 and the other (white) at the ramp higher offset 1." msgstr "" +"À partir d'un ensemble de couleurs, cette ressource les interpolera dans " +"l'ordre. Cela signifie que si vous avez la couleur 1, la couleur 2 et la " +"couleur 3, la rampe interpolera de la couleur 1 à la couleur 2 et de la " +"couleur 2 à la couleur 3. La rampe aura d'abord 2 couleurs (noir et blanc), " +"la première couleur (le noir) sera utilisé pour les positions inférieurs à 0 " +"et l'autre (le blanc) pour les positions supérieurs à 1." #: doc/classes/Gradient.xml msgid "" "Adds the specified color to the end of the ramp, with the specified offset." msgstr "" +"Ajoute la couleur spécifiée à la fin du dégradé, à la position spécifiée." #: doc/classes/Gradient.xml msgid "Returns the color of the ramp color at index [code]point[/code]." @@ -32289,6 +33025,8 @@ msgid "" "Defines how the colors between points of the gradient are interpolated. See " "[enum InterpolationMode] for available modes." msgstr "" +"Définit comment les couleurs entre les points du dégradé sont interpolées. " +"Voir [enum InterpolationMode] pour les modes disponibles." #: doc/classes/Gradient.xml msgid "Gradient's offsets returned as a [PoolRealArray]." @@ -32300,6 +33038,9 @@ msgid "" "uniform between. This might cause visible aliasing when used for a gradient " "texture in some cases." msgstr "" +"Interpolation constante, la couleur change brusquement à chaque point et " +"reste uniforme entre. Cela pourrait causer un crénelage visible lorsqu'elle " +"est utilisée pour une texture de dégradé dans certains cas." #: doc/classes/GradientTexture.xml msgid "Gradient-filled texture." @@ -32314,6 +33055,12 @@ msgid "" "at fixed steps (see [member width]). See also [GradientTexture2D] and " "[CurveTexture]." msgstr "" +"GradientTexture utilise un [Gradient] pour remplir la texture. Le gradient " +"sera rempli de gauche à droite en utilisant les couleurs obtenues du " +"dégradé. Cela signifie que la texture ne représente pas nécessairement une " +"copie exacte du dégradé, mais plutôt une interpolation des échantillons " +"obtenus du dégradé à des étapes fixes (voir [member width)]. Voir aussi " +"[GradientTexture2D] et [CurveTexture]." #: doc/classes/GradientTexture.xml msgid "The [Gradient] that will be used to fill the texture." @@ -32340,6 +33087,13 @@ msgid "" "[member width] and [member height]). See also [GradientTexture] and " "[CurveTexture]." msgstr "" +"La texture utilise un [Gradient] pour remplir les données la texture 2D. Le " +"dégradé est rempli selon les types spécifiés [member fill] et [member " +"repeat] en utilisant les couleurs obtenues du dégradé. La texture ne " +"représente pas nécessairement une copie exacte du dégradé, mais plutôt une " +"interpolation des échantillons obtenus du dégradé à des étapes fixes (voir " +"[member width] et [member height]). Voir aussi [GradientTexture] et " +"[CurveTexture]." #: doc/classes/GradientTexture2D.xml msgid "" @@ -32347,6 +33101,9 @@ msgid "" "by interpolating colors starting from [member fill_from] to [member fill_to] " "offsets." msgstr "" +"Le type de remplissage du dégradé, c'est l'une des valeurs de [enum Fill]. " +"La texture est remplie par des couleurs interpolées à partir des positions " +"de [member fill_from] à [member fill_to]." #: doc/classes/GradientTexture2D.xml msgid "" @@ -32379,6 +33136,10 @@ msgid "" "filled starting from [member fill_from] to [member fill_to] offsets by " "default, but the gradient fill can be repeated to cover the entire texture." msgstr "" +"Le type de répétition du dégradé, c'est l'une des valeurs de [enum Repeat]. " +"La texture est remplie à partir des positions de [member fill_from] à " +"[member fill_to] par défaut, mais le remplissage peut être répété pour " +"couvrir toute la texture." #: doc/classes/GradientTexture2D.xml msgid "" @@ -32388,6 +33149,12 @@ msgid "" "code], the generated texture will use low dynamic range; overbright colors " "will be clamped ([constant Image.FORMAT_RGBA8] format)." msgstr "" +"Si [code]true[/code], la texture générée aura une gamme dynamique élevée (le " +"format sera [constant Image.FORMAT_RGBAF]). Cela permet aux effets de lueur " +"de fonctionner si [member Environment.glow_enabled] est [code]true[/code]. " +"Si [code]false[/code], la texture générée utilisera une plage dynamique " +"basse ; les couleurs trop lumineuses seront limitées (le format sera " +"[constant Image.FORMAT_RGBA8]." #: doc/classes/GradientTexture2D.xml msgid "" @@ -32399,17 +33166,19 @@ msgstr "" #: doc/classes/GradientTexture2D.xml msgid "The colors are linearly interpolated in a straight line." -msgstr "" +msgstr "Les couleurs sont linéairement interpolées selon une ligne droite." #: doc/classes/GradientTexture2D.xml msgid "The colors are linearly interpolated in a circular pattern." -msgstr "" +msgstr "Les couleurs sont linéairement interpolées selon un motif circulaire." #: doc/classes/GradientTexture2D.xml msgid "" "The gradient fill is restricted to the range defined by [member fill_from] " "to [member fill_to] offsets." msgstr "" +"Le remplissage du dégradé est limité à la plage définie par les positions de " +"[member fill_from] à [member fill_to]." #: doc/classes/GradientTexture2D.xml msgid "" @@ -32424,12 +33193,16 @@ msgid "" "The texture is filled starting from [member fill_from] to [member fill_to] " "offsets, mirroring the pattern in both directions." msgstr "" +"La texture est remplie à partir des positions de [member fill_from] à " +"[member fill_to], en répétant en miroir le motif dans les deux directions." #: doc/classes/GraphEdit.xml msgid "" "GraphEdit is an area capable of showing various GraphNodes. It manages " "connection events between them." msgstr "" +"GraphEdit est une zone capable de montrer divers GraphNode. Il gère les " +"événements de connexion entre eux." #: doc/classes/GraphEdit.xml msgid "" @@ -32440,24 +33213,37 @@ msgid "" "It is greatly advised to enable low-processor usage mode (see [member OS." "low_processor_usage_mode]) when using GraphEdits." msgstr "" +"GraphEdit gère la représentation des GraphNode qu'il contient, ainsi que les " +"connexions et les déconnections entre eux. Les signaux sont envoyés pour " +"chacun de ces deux événements. La déconnection entre les emplacements des " +"GraphNode est désactivé par défaut.\n" +"Il est fortement conseillé d'activer le mode d'utilisation à faible " +"processeur (voir [member OS.low_processor_usage_mode)] lors de l'utilisation " +"des GraphEdit." #: doc/classes/GraphEdit.xml msgid "" "Makes possible the connection between two different slot types. The type is " "defined with the [method GraphNode.set_slot] method." msgstr "" +"Rend possible la connexion entre deux types différents d'emplacements. Le " +"type est défini avec la méthode [method GraphNode.set_slot]." #: doc/classes/GraphEdit.xml msgid "" "Makes possible to disconnect nodes when dragging from the slot at the left " "if it has the specified type." msgstr "" +"Permet de déconnecter les nÅ“uds en glissant l'emplacement à gauche s'il a le " +"type spécifié." #: doc/classes/GraphEdit.xml msgid "" "Makes possible to disconnect nodes when dragging from the slot at the right " "if it has the specified type." msgstr "" +"Permet de déconnecter les nÅ“uds en glissant de l'emplacement à droite s'il a " +"le type spécifié." #: doc/classes/GraphEdit.xml msgid "Removes all connections between nodes." @@ -32481,6 +33267,10 @@ msgid "" "[code]to[/code] GraphNode. If the connection does not exist, no connection " "is removed." msgstr "" +"Supprimer la connexion entre l'emplacement [code]from_port[/code] du " +"GraphNode [code]from[/code] et l'emplacement [code]to_port[/code] du " +"GraphNode [code]to[/code]. Si la connexion n'existe pas, aucune connexion ne " +"sera supprimée." #: doc/classes/GraphEdit.xml msgid "" @@ -32488,6 +33278,9 @@ msgid "" "in a structure of the form [code]{ from_port: 0, from: \"GraphNode name 0\", " "to_port: 1, to: \"GraphNode name 1\" }[/code]." msgstr "" +"Retourne un Array contenant la liste des connexions. Une connexion se " +"compose d'une structure de la forme [code]{ from_port: 0, from: \"GraphNode " +"name 0\", to_port: 1, to: \"GraphNode name 1\" }[/code]." #: doc/classes/GraphEdit.xml msgid "" @@ -32498,6 +33291,13 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne le [HBoxContainer] qui contient les contrôles de zoom et de " +"magnétisation de la grille en haut à gauche du graphe. Vous pouvez utiliser " +"cette méthode pour repositionner la barre d'outils ou pour y ajouter vos " +"propres contrôles personnalisés.\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud interne requis, l'enlever et le " +"libérer peut causer un plantage. Si vous voulez le cacher lui ou un de ses " +"enfants, utilisez plutôt la propriété [membre CanvasItem.visible]." #: doc/classes/GraphEdit.xml msgid "" @@ -32505,28 +33305,38 @@ msgid "" "[code]from[/code] GraphNode is connected to the [code]to_port[/code] slot of " "the [code]to[/code] GraphNode." msgstr "" +"Retourne [code]true[/code] si l'emplacement [code]from_port[/code] du " +"GraphNode [code]from[/code] est connecté à l'emplacement [code]to_port[/" +"code] du GraphNode [code]to[/code]." #: doc/classes/GraphEdit.xml msgid "Returns whether it's possible to connect slots of the specified types." msgstr "" +"Retourne s'il est possible de connecter les emplacements des types spécifiés." #: doc/classes/GraphEdit.xml msgid "" "Makes it not possible to connect between two different slot types. The type " "is defined with the [method GraphNode.set_slot] method." msgstr "" +"Permet d'empêcher de connecter deux types d'emplacements différents. Le type " +"est défini avec la méthode [method GraphNode.set_slot]." #: doc/classes/GraphEdit.xml msgid "" "Removes the possibility to disconnect nodes when dragging from the slot at " "the left if it has the specified type." msgstr "" +"Supprime la possibilité de déconnecter les nÅ“uds en glissant l'emplacement " +"de gauche si elle a le type spécifié." #: doc/classes/GraphEdit.xml msgid "" "Removes the possibility to disconnect nodes when dragging from the slot at " "the right if it has the specified type." msgstr "" +"Supprime la possibilité de déconnecter les nÅ“uds en glissant l'emplacement " +"de droite si elle a le type spécifié." #: doc/classes/GraphEdit.xml msgid "" @@ -32534,6 +33344,9 @@ msgid "" "[code]from_port[/code] and [code]to[/code]'s [code]to_port[/code] with the " "color provided in the [code]activity[/code] theme property." msgstr "" +"Définit la coloration de la connexion entre [code]from[/code] de " +"[code]from_port[/code] et [code]to[/code]) de [code]to_port[/code] avec la " +"couleur spécifiée dans la propriété [code]activity[/code] du thème." #: doc/classes/GraphEdit.xml msgid "Sets the specified [code]node[/code] as the one selected." @@ -32553,12 +33366,17 @@ msgid "" "The size of the minimap rectangle. The map itself is based on the size of " "the grid area and is scaled to fit this rectangle." msgstr "" +"La taille du rectangle de la mini-carte. La carte elle-même est basée sur la " +"taille de la zone de grille et est mise à l'échelle pour s'adapter à ce " +"rectangle." #: doc/classes/GraphEdit.xml msgid "" "If [code]true[/code], enables disconnection of existing connections in the " "GraphEdit by dragging the right end." msgstr "" +"Si [code]true[/code], permet de déconnecter les connexions existantes dans " +"le GraphEdit en faisant glisser l'extrémité droite." #: doc/classes/GraphEdit.xml msgid "The scroll offset." @@ -32607,6 +33425,8 @@ msgid "" "Emitted when user dragging connection from input port into empty space of " "the graph." msgstr "" +"Émis quand l'utilisateur fait glisser la connexion du port d'entrée vers " +"l'espace vide du graphe." #: doc/classes/GraphEdit.xml msgid "" @@ -32623,6 +33443,8 @@ msgid "" "Emitted when user dragging connection from output port into empty space of " "the graph." msgstr "" +"Émis lorsque l'utilisateur fait glisser la connexion du port de sortie vers " +"l'espace vide du graphe." #: doc/classes/GraphEdit.xml msgid "Emitted when the user presses [code]Ctrl + C[/code]." @@ -32641,6 +33463,9 @@ msgid "" "slot of [code]from[/code] GraphNode and [code]to_slot[/code] slot of " "[code]to[/code] GraphNode is attempted to be removed." msgstr "" +"Émis au GraphEdit lors d'une tentative de supprimer la connexion entre " +"l'emplacement [code]from_slot[/code] du GraphNode [code]from[/code] et " +"l'emplacement [code]to_slot[/code] de GraphNode [code]to[/code]." #: doc/classes/GraphEdit.xml msgid "" @@ -32739,6 +33564,24 @@ msgid "" "are on the right side of GraphNode. Only enabled slots are counted as " "connections." msgstr "" +"Un GraphNode est un conteneur. Chaque GraphNode peut avoir plusieurs " +"emplacement d'entrée et de sortie, parfois appelé ports, permettant des " +"connexions entre les GraphNode. Pour ajouter une emplacement à un GraphNode, " +"ajoutez-lui n'importe quel nÅ“ud enfant dérivé de [Control].\n" +"Après l'ajout d'au moins un enfant au GraphNode, de nouvelles sections " +"seront automatiquement créées dans l'inspecteur appelé 'Emplacement'. " +"Lorsque cet 'Emplacement' est agrandi, vous verrez la liste avec l'index " +"pour chaque emplacement. Vous pouvez cliquer sur chacun d'eux les agrandir " +"davantage.\n" +"Dans l'inspecteur, vous pouvez activer (montrer) ou désactiver (cacher) ces " +"emplacements. Par défaut, toutes les emplacements sont désactivées afin que " +"vous ne voyez pas d'emplacements sur votre GraphNode au début. Vous pouvez " +"attribuer un type à chaque emplacement. Seules les emplacements du même type " +"pourront se connecter. Vous pouvez également attribuer des couleurs aux " +"emplacements. Une liste des entrées et sorties est défini pour chaque " +"élément d'interface inclus dans le GraphNode. Les connexions d'entrée sont " +"sur la gauche et les connexions de sortie sur la droite du GraphNode. Seuls " +"les emplacements activés sont comptés comme des connexions." #: doc/classes/GraphNode.xml msgid "Disables all input and output slots of the GraphNode." @@ -32834,6 +33677,21 @@ msgid "" "Individual properties can be set using one of the [code]set_slot_*[/code] " "methods. You must enable at least one side of the slot to do so." msgstr "" +"Définit les propriétés de l'emplacement avec identifiant [code]idx[/code].\n" +"Si [code]enable_left[code]/[code]right[/code], un port apparaîtra et " +"l'emplacement pourra être connectée de ce côté.\n" +"[code]type_left[code]/[code]right[/code] est un type arbitraire du port. " +"Seuls les ports avec le même type peuvent être connectés.\n" +"[code]color_left[code]/[code]right[/code] est la teinte de l'icône du port " +"de ce côté.\n" +"[code]custom_left[code]/[code]right[/code] est une texture personnalisée " +"pour le port de ce côté.\n" +"[b]Note :[/b] Cette méthode ne définit que les propriétés de l'emplacement. " +"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au " +"GraphNode.\n" +"Les propriétés individuelles peuvent être définies en utilisant l'une des " +"méthodes [code]set_slot_*[/code]. Vous devez activer au moins un côté de " +"l'emplacement pour le faire." #: doc/classes/GraphNode.xml msgid "" @@ -32857,6 +33715,9 @@ msgid "" "[code]enable_left[/code] is [code]true[/code], a port will appear on the " "left side and the slot will be able to be connected from this side." msgstr "" +"Bascule le côté gauche (entrée) de l'emplacement à l'index [code]idx[/code]. " +"Si [code]enable_left[/code] est [code]true[/code], un port apparaîtra sur le " +"côté gauche et l'emplacement pourra être connecté de ce côté." #: doc/classes/GraphNode.xml msgid "" @@ -32864,6 +33725,9 @@ msgid "" "[code]enable_right[/code] is [code]true[/code], a port will appear on the " "right side and the slot will be able to be connected from this side." msgstr "" +"Bascule le côté droit (sortie) de l'emplacement à l'index [code]idx[/code]. " +"Si [code]enable_right[/code] est [code]true[/code], un port apparaîtra sur " +"le côté droit et l'emplacement pourra être connecté de ce côté." #: doc/classes/GraphNode.xml msgid "" @@ -32903,6 +33767,9 @@ msgid "" "[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " "signal, the GraphNode needs to be resized manually." msgstr "" +"Si [code]true[/code], l'utilisateur peut redimensionner le GraphNode.\n" +"[b]Note :[/b] Faire glisser la poignée n'émettra que le signal [signal " +"resize_request], le GraphNode doit être redimensionné manuellement." #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is selected." @@ -32914,6 +33781,9 @@ msgid "" "[b]Note:[/b] Pressing it will only emit the [signal close_request] signal, " "the GraphNode needs to be removed manually." msgstr "" +"Si [code]true[/code], le bouton de fermeture sera visible.\n" +"[b]Note :[/b] Appuyer ce bouton n'émettra que le signal [signal " +"close_request], le GraphNode doit être retiré manuellement." #: doc/classes/GraphNode.xml msgid "The text displayed in the GraphNode's title bar." @@ -33064,12 +33934,25 @@ msgid "" "[b]Note:[/b] GridContainer only works with child nodes inheriting from " "Control. It won't rearrange child nodes inheriting from Node2D." msgstr "" +"GridContainer arrangera ses enfants du type Control dans une structure en " +"grille, les colonnes de la grille sont spécifiées en utilisant la propriété " +"[member columns] et le nombre de lignes sera égal au nombre d'enfants dans " +"le conteneur divisé par le nombre de colonnes. Par exemple, si le conteneur " +"a 5 enfants et 2 colonnes, il y aura 3 rangées dans le conteneur.\n" +"Notez que la mise en page des grilles conservera les colonnes et les rangées " +"pour chaque taille du conteneur, et que les colonnes vides seront étendues " +"automatiquement.\n" +"[b]Note :[/b] GridContainer ne fonctionne que avec des nÅ“uds d'enfants " +"héritant de Control. Par exemple, elle ne réarrangera pas les nÅ“uds enfants " +"héritant de Node2D." #: doc/classes/GridContainer.xml msgid "" "The number of columns in the [GridContainer]. If modified, [GridContainer] " "reorders its Control-derived children to accommodate the new layout." msgstr "" +"Le nombre de colonnes dans le [GridContainer]. Si modifié, [GridContainer] " +"réarrangera à ses enfants de type Control suivant la nouvelle mise en page." #: doc/classes/GridContainer.xml doc/classes/HFlowContainer.xml #: doc/classes/VFlowContainer.xml @@ -33102,6 +33985,22 @@ msgid "" "light not affect the first layer, the whole GridMap won't be lit by the " "light in question." msgstr "" +"GridMap vous permet de placer de manière interactive des maillages sur une " +"grille. Il fonctionne à la fois à partir de l'éditeur et des scripts, et " +"vous pouvez vous en servir pour créer des éditeurs de niveau dans un jeu.\n" +"GridMaps utilise une [MeshLibrary] qui contient une liste de tuiles. Chaque " +"tuile est un maillage avec des matériaux, en plus de formes de collision et " +"de navigation en option.\n" +"Un GridMap contient une collection de cellules. Chaque cellule de grille se " +"réfère à une tuile dans le [MeshLibrary]. Toutes les cellules de la carte " +"ont les mêmes dimensions.\n" +"En interne, un GridMap est divisé par des d'octants séparés pour améliorer " +"le rendu et le traitement physique. Chaque octant a les mêmes dimensions et " +"peut contenir plusieurs cellules.\n" +"[b]Note :[/b] GridMap ne s'étend pas [VisualInstance] et donc de ne pas être " +"cachés ou masqués à partir de [member VisualInstance.layers]. Si vous " +"ajoutez une lumière qui n'affecte pas le premier calque, aucune partie de " +"l'ensemble du GridMap ne sera éclairé par cette lumière." #: modules/gridmap/doc_classes/GridMap.xml msgid "Using gridmaps" @@ -33129,6 +34028,8 @@ msgid "" "The orientation of the cell at the grid-based X, Y and Z coordinates. -1 is " "returned if the cell is empty." msgstr "" +"L'orientation de la cellule aux coordonnées X, Y et Z. -1 est retourné si la " +"cellule est vide." #: modules/gridmap/doc_classes/GridMap.xml msgid "Returns an individual bit on the [member collision_layer]." @@ -33178,6 +34079,11 @@ msgid "" "Optionally, the item's orientation can be passed. For valid orientation " "values, see [method Basis.get_orthogonal_index]." msgstr "" +"Définit l'indice de maillage de la cellule pour ces coordonnées X, Y et Z de " +"la grille.\n" +"Un index négatif comme [constant INVALID_CELL_ITEM] effacera la cellule.\n" +"En option, l'orientation de l'objet peut être spécifiée. Pour les valeurs " +"d'orientation valides, voir [method Basis.get_orthogonal_index]." #: modules/gridmap/doc_classes/GridMap.xml msgid "Sets an individual bit on the [member collision_layer]." @@ -33222,6 +34128,8 @@ msgid "" "The size of each octant measured in number of cells. This applies to all " "three axis." msgstr "" +"La taille de chaque octant mesurée en nombre de cellules. Ceci s'applique " +"aux trois axes." #: modules/gridmap/doc_classes/GridMap.xml msgid "" @@ -33652,6 +34560,10 @@ msgid "" "[method finish] is called to append [code]data[/code] to the message, but " "cannot be called until [method start] has been called." msgstr "" +"Met à jour le message pour être un HMAC. Ceci peut être appelé plusieurs " +"fois avant que [method finish] soit appelé pour ajouter les données " +"[code]data[/code] au message, mais ne peut être appelé avant que [method " +"start] ne soit appelé." #: doc/classes/HScrollBar.xml msgid "Horizontal scroll bar." @@ -33669,6 +34581,9 @@ msgid "" "Icon used as a button to scroll the [ScrollBar] left. Supports custom step " "using the [member ScrollBar.custom_step] property." msgstr "" +"L'icône utilisée comme bouton pour défiler la [ScrollBar] de gauche. " +"Supporte une valeur de déplacement personnalisé en utilisant la propriété " +"[member ScrollBar.custom_step]." #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml msgid "Displayed when the mouse cursor hovers over the decrement button." @@ -33772,13 +34687,15 @@ msgstr "" #: doc/classes/HSlider.xml msgid "The background of the area to the left of the grabber." -msgstr "" +msgstr "L'arrière-plan de la zone à gauche du glisseur." #: doc/classes/HSlider.xml msgid "" "The background for the whole slider. Determines the height of the " "[code]grabber_area[/code]." msgstr "" +"L'arrière-plan pour tout le curseur. Détermine la hauteur de " +"[code]grabber_area[/code]." #: doc/classes/HSplitContainer.xml msgid "Horizontal split container." @@ -33788,7 +34705,7 @@ msgstr "Conteneur fractionné horizontal." msgid "" "Horizontal split container. See [SplitContainer]. This goes from left to " "right." -msgstr "" +msgstr "Conteneur horizontal. Voir [SplitContainer]. Va de gauche à droite." #: doc/classes/HSplitContainer.xml doc/classes/VSplitContainer.xml msgid "" @@ -33806,7 +34723,7 @@ msgstr "L'espace entre les côtés des conteneurs." #: doc/classes/HSplitContainer.xml doc/classes/VSplitContainer.xml msgid "The icon used for the grabber drawn in the middle area." -msgstr "" +msgstr "L'icône utilisée pour le glisseur affiché au milieu." #: doc/classes/HTTPClient.xml msgid "Low-level hyper-text transfer protocol client." @@ -33846,6 +34763,42 @@ msgid "" "are otherwise valid. If this is a concern, you may want to use automatically " "managed certificates with a short validity period." msgstr "" +"Client de protocole de transfert hypertexte (parfois appelé \"User Agent\"). " +"Utilisé pour faire des requêtes HTTP pour télécharger du contenu web, des " +"fichiers et d'autres données ou communiquer avec divers services, ou pour " +"d'autres cas d'utilisation. [b]Voir le nÅ“ud [HTTPRequest] pour une " +"alternative de haut-niveau[/b].\n" +"[b]Note :[/b] Ce client doit seulement se connecter à un hôte une fois (voir " +"[method connect_to_host)] pour envoyer plusieurs requêtes. En raison de " +"cela, les méthodes qui prennent des URL prennent généralement juste la " +"partie après l'hôte au lieu de l'URL complète, puisque le client est déjà " +"connecté à l'hôte. Voir [method request] pour un exemple complet pour " +"pouvoir démarrer.\n" +"Un [HTTPClient] devrait être réutilisé entre plusieurs requêtes ou pour se " +"connecter à différents hôtes au lieu de créer un client par requête. " +"Supporte les serveurs SSL et la vérification des certificats des serveurs " +"SSL. Les codes de statut HTTP de la gamme 2xx indiquent un succès, 3xx une " +"redirection (c.-à -d. \"essayez à nouveau, mais ici\"), 4xx que quelque chose " +"ne va pas avec la requête, et 5xx qu'un problème est survenu du côté du " +"serveur.\n" +"Pour plus d'informations sur HTTP, voir [url=https://developer.mozilla.org/" +"en-US/docs/Web/HTTP] (ou lire le RFC 2616 pour le lire directement depuis la " +"soruce : [url=https://tools.ietf.org/html/rfc2616])\n" +"[b]Note :[/b] Lorsque vous effectuez des requêtes HTTP d'un projet exporté " +"vers HTML5, gardez à l'esprit que le serveur distant peut ne pas autoriser " +"des requêtes d'origine étrangère en raison de [url=https://developer.mozilla." +"org/en-US/docs/Web/HTTP/CORS]CORS[/url]. Si vous hébergez le serveur en " +"question, vous devez modifier son implémentation pour permettre des requêtes " +"d'origine étrangère en ajoutant l'en-tête HTTP [code]Access-Control-Allow-" +"Origin: *[/code].\n" +"[b]Note :[/b] Le support SSL/TLS est actuellement limité à TLS 1.0, TLS 1.1 " +"et TLS 1.2. Tenter de se connecter à un serveur TLS 1.3 retournera une " +"erreur.\n" +"[b]Avertissement :[/b] La révocation du certificat SSL/TLS et le pinning de " +"certificat ne sont pas supportés. Les certificats révoqués sont acceptés " +"aussi longtemps qu'ils sont valides. Si c'est un problème, vous pouvez " +"utiliser des certificats gérés automatiquement avec une courte période de " +"validité." #: doc/classes/HTTPClient.xml msgid "Closes the current connection, allowing reuse of this [HTTPClient]." @@ -33864,6 +34817,14 @@ msgid "" "[code]verify_host[/code] will check the SSL identity of the host if set to " "[code]true[/code]." msgstr "" +"Se connecte à un hôte. C'est nécessaire avant toute requête.\n" +"L'hôte ne doit pas avoir \"http://\" d'ajouté au début, mais ignorera " +"l'identifiant du protocole si fourni.\n" +"Si aucun [code]port[/code] n'est spécifié (ou [code]-1[/code] est utilisé), " +"il est automatiquement défini à 80 pour HTTP et 443 pour HTTPS (dans le cas " +"où [code]use_ssl[/code] est activé).\n" +"[code]verify_host[/code] vérifie l'identité SSL de l'hôte si elle est " +"définie à [code]true[/code]." #: doc/classes/HTTPClient.xml msgid "" @@ -33872,6 +34833,11 @@ msgid "" "value returned will be [code]-1[/code]. If using chunked transfer encoding, " "the body length will also be [code]-1[/code]." msgstr "" +"Retourne la longueur du corps de la requête.\n" +"[b]Note :[/b] Certains serveurs web peuvent ne pas envoyer de longueur du " +"corps. Dans ce cas, la valeur retournée sera [code]-1[/code]. Si vous " +"utilisez l'encodage de transfert par morceau, la longueur du corps sera " +"également [code]-1[/code]." #: doc/classes/HTTPClient.xml msgid "Returns the response's HTTP status code." @@ -33931,6 +34897,8 @@ msgid "" "This needs to be called in order to have any request processed. Check " "results with [method get_status]." msgstr "" +"Cela doit être appelé pour que les requêtes puissent être traitée. Vérifiez " +"les résultats avec [method get_status]." #: doc/classes/HTTPClient.xml msgid "" @@ -34039,6 +35007,18 @@ msgid "" "Method].\n" "Sends the body data raw, as a byte array and does not encode it in any way." msgstr "" +"Envoyez une requête brute à l'hôte connecté.\n" +"Le paramètre URL est généralement juste la partie après le nom de l'hôte, " +"donc pour [code]http://somehost.com/index.php[/code], c'est [code]/index." +"php[/code]. Lors de l'envoi de requêtes vers un serveur de proxy HTTP, ça " +"doit être une URL absolue. Pour [constant HTTPClient.METHOD_OPTIONS] " +"requêtes, [code]*[/code] est également autorisé. Pour [constant HTTPClient." +"METHOD_CONNECT] demande, ça doit être le composant d'autorité ([code]host:" +"port[/code]).\n" +"Les en-têtes sont des en-têtes de requête HTTP. Pour les méthodes HTTP " +"disponibles, voir [enum Method].\n" +"Envoie les données de corps brutes, comme un tableau d'octet et ne l'encode " +"pas." #: doc/classes/HTTPClient.xml doc/classes/HTTPRequest.xml msgid "" @@ -34095,6 +35075,10 @@ msgid "" "GET request, but without the response body. This is useful to request " "metadata like HTTP headers or to check if a resource exists." msgstr "" +"La méthode HTTP \"HEAD\". La méthode \"HEAD\" demande une réponse identique " +"à celle d'une requête \"GET\", mais sans le corps de la réponse. Ceci est " +"utile pour demander des métadonnées comme des en-têtes HTTP ou pour vérifier " +"si une ressource existe." #: doc/classes/HTTPClient.xml msgid "" @@ -34102,6 +35086,10 @@ msgid "" "specified resource, often causing a change in state or side effects on the " "server. This is often used for forms and submitting data or uploading files." msgstr "" +"La méthode HTTP \"POST\". La méthode \"POST\" est utilisée pour soumettre " +"une entité à la ressource spécifiée, causant souvent un changement d'état " +"sur le serveur. Ceci est souvent utilisé pour les formulaires, pour " +"soumettre des données ou télécharger des fichiers." #: doc/classes/HTTPClient.xml msgid "" @@ -34110,6 +35098,11 @@ msgid "" "\"create or update\" and PUT as \"update\", although many services tend to " "not make a clear distinction or change their meaning)." msgstr "" +"La méthode HTTP \"PUT\". La méthode \"PUT\" demander à remplacer toutes les " +"représentations actuelles de la ressource cible par les données fournies. " +"(Vous pouvez considérer \"POST\" comme une méthode pour \"créer ou mettre à " +"jour\" et \"PUT\" comme \"mise à jour\", même que de nombreux services ne " +"font pas de distinction voire en change leur sens)." #: doc/classes/HTTPClient.xml msgid "" @@ -34124,6 +35117,9 @@ msgid "" "HTTP OPTIONS method. The OPTIONS method asks for a description of the " "communication options for the target resource. Rarely used." msgstr "" +"La méthode HTTP \"OPTIONS\". La méthode \"OPTIONS\" demande une description " +"des options de communication pour la ressource cible. Elle est rarement " +"utilisée." #: doc/classes/HTTPClient.xml msgid "" @@ -34131,18 +35127,25 @@ msgid "" "the path to the target resource. Returns the entire HTTP request received in " "the response body. Rarely used." msgstr "" +"La méthode HTTP \"TRACE\". La méthode \"TRACE\" effectue un test de boucle " +"de message suivant le chemin vers la ressource cible. Retourne toute la " +"requête \"HTTP\" reçue dans le corps de réponse. Elle est rarement utilisée." #: doc/classes/HTTPClient.xml msgid "" "HTTP CONNECT method. The CONNECT method establishes a tunnel to the server " "identified by the target resource. Rarely used." msgstr "" +"La méthode HTTP \"CONNECT\". La méthode \"CONNECT\" établit un tunnel vers " +"serveur identifié par la ressource cible. Elle est rarement utilisée." #: doc/classes/HTTPClient.xml msgid "" "HTTP PATCH method. The PATCH method is used to apply partial modifications " "to a resource." msgstr "" +"La méthode HTTP \"PATCH\". La méthode \"PATCH\" est utilisée pour appliquer " +"des modifications partielles à une ressource." #: doc/classes/HTTPClient.xml msgid "Represents the size of the [enum Method] enum." @@ -34161,6 +35164,7 @@ msgstr "" #: doc/classes/HTTPClient.xml msgid "Status: DNS failure: Can't resolve the hostname for the given URL." msgstr "" +"Statut: Échec du DNS : N'a pu résoudre le nom d'hôte pour l'URL spécifiée." #: doc/classes/HTTPClient.xml msgid "Status: Currently connecting to server." @@ -34196,6 +35200,9 @@ msgid "" "everything so far is OK and that the client should continue with the request " "(or ignore this status if already finished)." msgstr "" +"Le code d'état HTTP [code]100 Continue[/code]. La réponse intermédiaire qui " +"indique que tout est bon jusqu'à présent et que le client devrait continuer " +"avec cette demande (ou ignorer ce statut s'il a déjà terminé)." #: doc/classes/HTTPClient.xml msgid "" @@ -34203,6 +35210,9 @@ msgid "" "[code]Upgrade[/code] request header by the client. Indicates the protocol " "the server is switching to." msgstr "" +"Le code d'état HTTP [code]101 Switching Protocol[/code]. Envoyé en réponse à " +"une en-tête de requête [code]Upgrade[/code] du client. Précise le nouveau " +"protocole que le serveur utilise dès à présent." #: doc/classes/HTTPClient.xml msgid "" @@ -34224,6 +35234,13 @@ msgid "" "TRACE: The message body contains the request message as received by the " "server." msgstr "" +"Le code d'état HTTP [code]200 OK[/code]. La requête a réussi. C'est la " +"réponse par défaut pour les requêtes réussies. La signification varie selon " +"la requête. Pour \"GET\" : La ressource a été récupérée et est transmise " +"dans le corps du message. Pour \"HEAD\" : Les en-têtes de l'entité sont dans " +"le corps du message. Pour \"POST\" : La ressource décrivant le résultat de " +"l'action est transmise dans le corps du message. Pour \"TRACE\" : Le corps " +"du message contient le message de requête reçu par le serveur." #: doc/classes/HTTPClient.xml msgid "" @@ -34231,6 +35248,9 @@ msgid "" "new resource has been created as a result of it. This is typically the " "response sent after a PUT request." msgstr "" +"Le code d'état HTTP [code]201 Created[/code]. La requête a réussi et une " +"nouvelle ressource a été créée en conséquence. C'est généralement la réponse " +"envoyée après une requête \"PUT\"." #: doc/classes/HTTPClient.xml msgid "" @@ -34240,6 +35260,11 @@ msgid "" "processing the request. It is intended for cases where another process or " "server handles the request, or for batch processing." msgstr "" +"Le code d'état HTTP [code]202 Accepted[/code]. La requête a été reçue mais " +"n'a pas encore été traitée. Aucune réponse n'est envoyé même asynchrone " +"indiquant le résultat du traitement de cette requête. Il est destiné aux cas " +"où un autre processus ou un serveur traite la requête, ou pour le traitement " +"par lots." #: doc/classes/HTTPClient.xml msgid "" @@ -34249,6 +35274,11 @@ msgid "" "party copy. Except this condition, 200 OK response should be preferred " "instead of this response." msgstr "" +"Le code d'état HTTP [code]203 Non-Authoritative Information[/code]. Ce code " +"de réponse signifie que l'ensemble de méta-donnée retournée n'est pas la " +"copie exacte de celles sur le serveur d'origine, mais composée à partir " +"d'une copie locale ou autre. Sauf dans ce cas, la réponse 200 \"OK\" est " +"préférable à la place de cette réponse." #: doc/classes/HTTPClient.xml msgid "" @@ -34256,6 +35286,10 @@ msgid "" "for this request, but the headers may be useful. The user-agent may update " "its cached headers for this resource with the new ones." msgstr "" +"Le code d'état HTTP [code]204 No Content[/code]. Il n'y a pas de contenu à " +"retourner en réponse à cette requête, mais les en-têtes peuvent contenir des " +"informations. Le user-agent peut mettre à jour les en-têtes de cette " +"ressource qu'il a en cache avec ces nouvelles données." #: doc/classes/HTTPClient.xml msgid "" @@ -34264,6 +35298,10 @@ msgid "" "caused the request to be sent to its original state as received from the " "origin server." msgstr "" +"Le code d'état HTTP [code]205 Reset Content[/code]. Le serveur a rempli la " +"requête et souhaite que le client réinitialise son « vue de document » qui a " +"envoyé la requête à son état original tel qu'il a été reçu du serveur " +"d'origine." #: doc/classes/HTTPClient.xml msgid "" @@ -34271,6 +35309,9 @@ msgid "" "used because of a range header sent by the client to separate download into " "multiple streams." msgstr "" +"Le code d'état HTTP [code]206 Partial Content[/code]. Ce code de réponse est " +"utilisé suivant l'intervalle spécifié dans l'en-tête envoyé par le client " +"pour que le téléchargement soit disponible dans plusieurs flux." #: doc/classes/HTTPClient.xml msgid "" @@ -34278,6 +35319,9 @@ msgid "" "response conveys information about multiple resources in situations where " "multiple status codes might be appropriate." msgstr "" +"Le code d'état HTTP [code]207 Multi-Status[/code] (WebDAV). Une réponse " +"multi-états qui transmet des informations sur plusieurs ressources dans des " +"situations où plusieurs codes de statut seraient appropriés." #: doc/classes/HTTPClient.xml msgid "" @@ -34285,6 +35329,10 @@ msgid "" "DAV: propstat response element to avoid enumerating the internal members of " "multiple bindings to the same collection repeatedly." msgstr "" +"Le code d'état HTTP [code]208 Already Reported[/code] (WebDAV). Utilisé à " +"l'intérieur d'un DAV : l'élément de réponse \"propstat\" pour éviter " +"d'énumérer plusieurs fois les membres internes de liaisons d'une même " +"collection." #: doc/classes/HTTPClient.xml msgid "" @@ -34292,6 +35340,10 @@ msgid "" "a GET request for the resource, and the response is a representation of the " "result of one or more instance-manipulations applied to the current instance." msgstr "" +"Le code d'état HTTP [code]226 IM Used[/code] (WebDAV). Le serveur a traité " +"une requête GET pour cette ressource, et la réponse est une représentation " +"du résultat d'une ou plusieurs manipulations d'instance appliquées à " +"l'instance actuelle." #: doc/classes/HTTPClient.xml msgid "" @@ -34299,6 +35351,10 @@ msgid "" "one possible responses and there is no standardized way to choose one of the " "responses. User-agent or user should choose one of them." msgstr "" +"Le code d'état HTTP [code]300 Multiple Choice[/code]. La requête a plusieurs " +"réponses possibles et il n'y a pas de moyen spécifique de choisir la bonne " +"réponse. C'est alors le user-agent ou l'utilisateur qui devrait la choisir " +"parmi celle retournées." #: doc/classes/HTTPClient.xml msgid "" @@ -34306,6 +35362,9 @@ msgid "" "response code means the URI of requested resource has been changed. The new " "URI is usually included in the response." msgstr "" +"Le code d'état HTTP [code]301 Moved Permanently[/code]. Redirection. Ce code " +"de réponse signifie que l'URI des ressources demandées a été modifiée. La " +"nouvelle URI est généralement retournée dans cette réponse." #: doc/classes/HTTPClient.xml msgid "" @@ -34652,6 +35711,7 @@ msgid "A node with the ability to send HTTP(S) requests." msgstr "Un nÅ“ud qui permet d'envoyer des requêtes HTTP(S)." #: doc/classes/HTTPRequest.xml +#, fuzzy msgid "" "A node with the ability to send HTTP requests. Uses [HTTPClient] " "internally.\n" @@ -34678,7 +35738,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -37638,7 +38698,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -39640,7 +40711,7 @@ msgstr "" #: doc/classes/Light.xml msgid "The light will affect objects in the selected layers." -msgstr "La lumière affectera les objets dans les claques sélectionnés." +msgstr "La lumière affectera les objets dans les calques sélectionnés." #: doc/classes/Light.xml msgid "" @@ -41903,12 +42974,17 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -#, fuzzy -msgid "Returns the [Material] for a surface of the [Mesh] resource." -msgstr "Retourne le matériel affecté à la [ImmediateGeometry3D]." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." +msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +#, fuzzy +msgid "Returns the number of surface override materials." msgstr "Retourne le nombre de surfaces du matériau." #: doc/classes/MeshInstance.xml @@ -41945,7 +43021,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -42783,6 +43862,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -42829,6 +43911,9 @@ msgstr "Retourne le [RID] de la énième forme d'une zone." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -42872,6 +43957,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -42891,6 +43979,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -43046,11 +44137,47 @@ msgid "Destroys the given RID." msgstr "Supprimer le RID renseigné." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "Crée une nouvelle carte." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -43171,6 +44298,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Retourne [code]true[/code] si le [code]signal[/code] donné existe." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -43394,20 +44538,40 @@ msgstr "L’instance n’a pas de type." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." -msgstr "Le rayon de l'agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -43636,6 +44800,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "Si [code]true[/code], les titres des colonnes sont visibles." @@ -43813,7 +44987,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -45609,12 +46791,11 @@ msgid "" msgstr "" #: doc/classes/Node.xml -#, fuzzy msgid "" "Sends a [method rpc] using an unreliable protocol. Returns [code]null[/code]." msgstr "" -"Envoie un [method rpc] en utilisant un protocole non fiable. Retourne un " -"[Variant] vide." +"Envoie un [method rpc] en utilisant un protocole non fiable. Retourne " +"[code]null[/code]." #: doc/classes/Node.xml msgid "" @@ -45839,13 +47020,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -45857,8 +47044,11 @@ msgid "Emitted when the node is renamed." msgstr "Émis quand le nÅ“ud est renommé." #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." -msgstr "Émis quand le nÅ“ud entre dans l'arborescence." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." @@ -45867,15 +47057,22 @@ msgstr "Émis quand le nÅ“ud quitte l'arborescence et n'est plus actif." #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." -msgstr "La notification reçue quand un nÅ“ud entre dans le [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." +msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +#, fuzzy +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "La notification reçue quand le nÅ“ud va quitter le [SceneTree]." #: doc/classes/Node.xml @@ -47872,6 +49069,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -53979,10 +55180,19 @@ msgstr "Un PopupMenu affiche une liste d'options." #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" -"Un [PopupMenu] est un [Control] qui affiche une liste d'options. Souvent " -"utilisé dans les barres d'outils ou les menus contextuels." #: doc/classes/PopupMenu.xml msgid "" @@ -56378,211 +57588,211 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 1." -msgstr "Le nom facultatif pour le claque 1 de physique 2D." +msgstr "Le nom facultatif pour le calque 1 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 10." -msgstr "Le nom facultatif pour le claque 10 de physique 2D." +msgstr "Le nom facultatif pour le calque 10 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 11." -msgstr "Le nom facultatif pour le claque 11 de physique 2D." +msgstr "Le nom facultatif pour le calque 11 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 12." -msgstr "Le nom facultatif pour le claque 12 de physique 2D." +msgstr "Le nom facultatif pour le calque 12 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 13." -msgstr "Le nom facultatif pour le claque 13 de physique 2D." +msgstr "Le nom facultatif pour le calque 13 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 14." -msgstr "Le nom facultatif pour le claque 14 de physique 2D." +msgstr "Le nom facultatif pour le calque 14 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 15." -msgstr "Le nom facultatif pour le claque 15 de physique 2D." +msgstr "Le nom facultatif pour le calque 15 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 16." -msgstr "Le nom facultatif pour le claque 16 de physique 2D." +msgstr "Le nom facultatif pour le calque 16 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 17." -msgstr "Le nom facultatif pour le claque 17 de physique 2D." +msgstr "Le nom facultatif pour le calque 17 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 18." -msgstr "Le nom facultatif pour le claque 18 de physique 2D." +msgstr "Le nom facultatif pour le calque 18 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 19." -msgstr "Le nom facultatif pour le claque 19 de physique 2D." +msgstr "Le nom facultatif pour le calque 19 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 2." -msgstr "Le nom facultatif pour le claque 2 de physique 2D." +msgstr "Le nom facultatif pour le calque 2 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 20." -msgstr "Le nom facultatif pour le claque 20 de physique 2D." +msgstr "Le nom facultatif pour le calque 20 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 21." -msgstr "Le nom optionnel pour le claque physique 2D numéro 21." +msgstr "Le nom optionnel pour le calque physique 2D numéro 21." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 22." -msgstr "Le nom optionnel pour le claque physique 2D numéro 22." +msgstr "Le nom optionnel pour le calque physique 2D numéro 22." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 23." -msgstr "Le nom optionnel pour le claque physique 2D numéro 23." +msgstr "Le nom optionnel pour le calque physique 2D numéro 23." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 24." -msgstr "Le nom optionnel pour le claque physique 2D numéro 24." +msgstr "Le nom optionnel pour le calque physique 2D numéro 24." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 25." -msgstr "Le nom optionnel pour le claque physique 2D numéro 25." +msgstr "Le nom optionnel pour le calque physique 2D numéro 25." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 26." -msgstr "Le nom optionnel pour le claque physique 2D numéro 26." +msgstr "Le nom optionnel pour le calque physique 2D numéro 26." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 27." -msgstr "Le nom optionnel pour le claque physique 2D numéro 27." +msgstr "Le nom optionnel pour le calque physique 2D numéro 27." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 28." -msgstr "Le nom optionnel pour le claque physique 2D numéro 28." +msgstr "Le nom optionnel pour le calque physique 2D numéro 28." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 29." -msgstr "Le nom optionnel pour le claque physique 2D numéro 29." +msgstr "Le nom optionnel pour le calque physique 2D numéro 29." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 3." -msgstr "Le nom facultatif pour le claque 3 de physique 2D." +msgstr "Le nom facultatif pour le calque 3 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 30." -msgstr "Le nom optionnel pour le claque physique 2D numéro 30." +msgstr "Le nom optionnel pour le calque physique 2D numéro 30." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 31." -msgstr "Le nom optionnel pour le claque physique 2D numéro 31." +msgstr "Le nom optionnel pour le calque physique 2D numéro 31." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 32." -msgstr "Le nom optionnel pour le claque physique 2D numéro 32." +msgstr "Le nom optionnel pour le calque physique 2D numéro 32." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 4." -msgstr "Le nom facultatif pour le claque 4 de physique 2D." +msgstr "Le nom facultatif pour le calque 4 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 5." -msgstr "Le nom facultatif pour le claque 5 de physique 2D." +msgstr "Le nom facultatif pour le calque 5 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 6." -msgstr "Le nom facultatif pour le claque 6 de physique 2D." +msgstr "Le nom facultatif pour le calque 6 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 7." -msgstr "Le nom facultatif pour le claque 7 de physique 2D." +msgstr "Le nom facultatif pour le calque 7 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 8." -msgstr "Le nom facultatif pour le claque 8 de physique 2D." +msgstr "Le nom facultatif pour le calque 8 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 9." -msgstr "Le nom facultatif pour le claque 9 de physique 2D." +msgstr "Le nom facultatif pour le calque 9 de physique 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 1." -msgstr "Le nom facultatif pour le claque 1 de rendu 2D." +msgstr "Le nom facultatif pour le calque 1 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 10." -msgstr "Le nom facultatif pour le claque 10 de rendu 2D." +msgstr "Le nom facultatif pour le calque 10 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 11." -msgstr "Le nom facultatif pour le claque 11 de rendu 2D." +msgstr "Le nom facultatif pour le calque 11 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 12." -msgstr "Le nom facultatif pour le claque 12 de rendu 2D." +msgstr "Le nom facultatif pour le calque 12 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 13." -msgstr "Le nom facultatif pour le claque 13 de rendu 2D." +msgstr "Le nom facultatif pour le calque 13 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 14." -msgstr "Le nom facultatif pour le claque 14 de rendu 2D." +msgstr "Le nom facultatif pour le calque 14 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 15." -msgstr "Le nom facultatif pour le claque 15 de rendu 2D." +msgstr "Le nom facultatif pour le calque 15 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 16." -msgstr "Le nom facultatif pour le claque 16 de rendu 2D." +msgstr "Le nom facultatif pour le calque 16 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 17." -msgstr "Le nom facultatif pour le claque 17 de rendu 2D." +msgstr "Le nom facultatif pour le calque 17 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 18." -msgstr "Le nom facultatif pour le claque 18 de rendu 2D." +msgstr "Le nom facultatif pour le calque 18 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 19." -msgstr "Le nom facultatif pour le claque 19 de rendu 2D." +msgstr "Le nom facultatif pour le calque 19 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 2." -msgstr "Le nom facultatif pour le claque 2 de rendu 2D." +msgstr "Le nom facultatif pour le calque 2 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 20." -msgstr "Le nom facultatif pour le claque 20 de rendu 2D." +msgstr "Le nom facultatif pour le calque 20 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 3." -msgstr "Le nom facultatif pour le claque 3 de rendu 2D." +msgstr "Le nom facultatif pour le calque 3 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 4." -msgstr "Le nom facultatif pour le claque 4 rendu 2D." +msgstr "Le nom facultatif pour le calque 4 rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 5." -msgstr "Le nom facultatif pour le claque 5 de rendu 2D." +msgstr "Le nom facultatif pour le calque 5 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 6." -msgstr "Le nom facultatif pour le claque 6 rendu 2D." +msgstr "Le nom facultatif pour le calque 6 rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 7." -msgstr "Le nom facultatif pour le claque 7 de rendu 2D." +msgstr "Le nom facultatif pour le calque 7 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 8." -msgstr "Le nom facultatif pour le claque 8 de rendu 2D." +msgstr "Le nom facultatif pour le calque 8 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D render layer 9." -msgstr "Le nom facultatif pour le claque 9 de rendu 2D." +msgstr "Le nom facultatif pour le calque 9 de rendu 2D." #: doc/classes/ProjectSettings.xml msgid "" @@ -56778,212 +57988,212 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 1." -msgstr "Le nom facultatif pour le claque 1 de physique 3D." +msgstr "Le nom facultatif pour le calque 1 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 10." -msgstr "Le nom facultatif pour le claque 10 de physique 3D." +msgstr "Le nom facultatif pour le calque 10 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 11." -msgstr "Le nom facultatif pour le claque 11 de physique 3D." +msgstr "Le nom facultatif pour le calque 11 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 12." -msgstr "Le nom facultatif pour le claque 12 de physique 3D." +msgstr "Le nom facultatif pour le calque 12 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 13." -msgstr "Le nom facultatif pour le claque 13 de physique 3D." +msgstr "Le nom facultatif pour le calque 13 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 14." -msgstr "Le nom facultatif pour le claque 14 de physique 3D." +msgstr "Le nom facultatif pour le calque 14 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 15." -msgstr "Le nom facultatif pour le claque 15 de physique 3D." +msgstr "Le nom facultatif pour le calque 15 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 16." -msgstr "Le nom facultatif pour le claque 16 de physique 3D." +msgstr "Le nom facultatif pour le calque 16 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 17." -msgstr "Le nom facultatif pour le claque 17 de physique 3D." +msgstr "Le nom facultatif pour le calque 17 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 18." -msgstr "Le nom facultatif pour le claque 18 de physique 3D." +msgstr "Le nom facultatif pour le calque 18 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 19." -msgstr "Le nom facultatif pour le claque 19 de physique 3D." +msgstr "Le nom facultatif pour le calque 19 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 2." -msgstr "Le nom facultatif pour le claque 2 de physique 3D." +msgstr "Le nom facultatif pour le calque 2 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 20." -msgstr "Le nom facultatif pour le claque 20 de physique 3D." +msgstr "Le nom facultatif pour le calque 20 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 21." -msgstr "Le nom facultatif pour le claque 21 de physique 3D." +msgstr "Le nom facultatif pour le calque 21 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 22." -msgstr "Le nom facultatif pour le claque 22 de physique 3D." +msgstr "Le nom facultatif pour le calque 22 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 23." -msgstr "Le nom facultatif pour le claque 23 de physique 3D." +msgstr "Le nom facultatif pour le calque 23 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 24." -msgstr "Le nom facultatif pour le claque 24 de physique 3D." +msgstr "Le nom facultatif pour le calque 24 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 25." -msgstr "Le nom facultatif pour le claque 25 de physique 3D." +msgstr "Le nom facultatif pour le calque 25 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 26." -msgstr "Le nom facultatif pour le claque 26 de physique 3D." +msgstr "Le nom facultatif pour le calque 26 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 27." -msgstr "Le nom facultatif pour le claque 27 de physique 3D." +msgstr "Le nom facultatif pour le calque 27 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 28." -msgstr "Le nom facultatif pour le claque 28 de physique 3D." +msgstr "Le nom facultatif pour le calque 28 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 29." -msgstr "Le nom facultatif pour le claque 29 de physique 3D." +msgstr "Le nom facultatif pour le calque 29 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 3." -msgstr "Le nom facultatif pour le claque 3 de physique 3D." +msgstr "Le nom facultatif pour le calque 3 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 30." -msgstr "Le nom facultatif pour le claque 30 de physique 3D." +msgstr "Le nom facultatif pour le calque 30 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 31." -msgstr "Le nom facultatif pour le claque 31 de physique 3D." +msgstr "Le nom facultatif pour le calque 31 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 32." -msgstr "Le nom facultatif pour le claque 32 de physique 3D." +msgstr "Le nom facultatif pour le calque 32 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 4." -msgstr "Le nom facultatif pour le claque 4 de physique 3D." +msgstr "Le nom facultatif pour le calque 4 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 5." -msgstr "Le nom facultatif pour le claque 5 de physique 3D." +msgstr "Le nom facultatif pour le calque 5 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 6." -msgstr "Le nom facultatif pour le claque 6 de physique 3D." +msgstr "Le nom facultatif pour le calque 6 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 7." -msgstr "Le nom facultatif pour le claque 7 de physique 3D." +msgstr "Le nom facultatif pour le calque 7 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 8." -msgstr "Le nom facultatif pour le claque 8 de physique 3D." +msgstr "Le nom facultatif pour le calque 8 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 9." -msgstr "Le nom facultatif pour le claque 9 de physique 3D." +msgstr "Le nom facultatif pour le calque 9 de physique 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 1." -msgstr "Le nom facultatif pour le claque 1 de rendu 3D." +msgstr "Le nom facultatif pour le calque 1 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 10." -msgstr "Le nom facultatif pour le claque 10 de rendu 3D." +msgstr "Le nom facultatif pour le calque 10 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 11." -msgstr "Le nom facultatif pour le claque 11 de rendu 3D." +msgstr "Le nom facultatif pour le calque 11 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 12." -msgstr "Le nom facultatif pour le claque 12 de rendu 3D." +msgstr "Le nom facultatif pour le calque 12 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 13." -msgstr "Le nom facultatif pour le claque 13 de rendu 3D." +msgstr "Le nom facultatif pour le calque 13 de rendu 3D." #: doc/classes/ProjectSettings.xml #, fuzzy msgid "Optional name for the 3D render layer 14." -msgstr "Le nom facultatif pour le claque 14 de rendu 3D" +msgstr "Le nom facultatif pour le calque 14 de rendu 3D" #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 15." -msgstr "Le nom facultatif pour le claque 15 de rendu 3D." +msgstr "Le nom facultatif pour le calque 15 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 16." -msgstr "Le nom facultatif pour le claque 16 de rendu 3D." +msgstr "Le nom facultatif pour le calque 16 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 17." -msgstr "Le nom facultatif pour le claque 17 de rendu 3D." +msgstr "Le nom facultatif pour le calque 17 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 18." -msgstr "Le nom facultatif pour le claque 18 de rendu 3D." +msgstr "Le nom facultatif pour le calque 18 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 19." -msgstr "Le nom facultatif pour le claque 19 de rendu 3D." +msgstr "Le nom facultatif pour le calque 19 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 2." -msgstr "Le nom facultatif pour le claque 2 de rendu 3D." +msgstr "Le nom facultatif pour le calque 2 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 20." -msgstr "Le nom facultatif pour le claque 20 de rendu 3D." +msgstr "Le nom facultatif pour le calque 20 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 3." -msgstr "Le nom facultatif pour le claque 3 de rendu 3D." +msgstr "Le nom facultatif pour le calque 3 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 4." -msgstr "Le nom facultatif pour le claque 4 de rendu 3D." +msgstr "Le nom facultatif pour le calque 4 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 5." -msgstr "Le nom facultatif pour le claque 5 de rendu 3D." +msgstr "Le nom facultatif pour le calque 5 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 6." -msgstr "Le nom facultatif pour le claque 6 de rendu 3D." +msgstr "Le nom facultatif pour le calque 6 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 7." -msgstr "Le nom facultatif pour le claque 7 de rendu 3D." +msgstr "Le nom facultatif pour le calque 7 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 8." -msgstr "Le nom facultatif pour le claque 8 de rendu 3D." +msgstr "Le nom facultatif pour le calque 8 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D render layer 9." -msgstr "Le nom facultatif pour le claque 9 de rendu 3D." +msgstr "Le nom facultatif pour le calque 9 de rendu 3D." #: doc/classes/ProjectSettings.xml msgid "" @@ -57211,14 +58421,15 @@ msgid "" msgstr "" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "Size of the hash table used for the broad-phase 2D hash grid algorithm.\n" "[b]Note:[/b] Not used if [member ProjectSettings.physics/2d/use_bvh] is " "enabled." msgstr "" "Taille de la table de hachage utilisée pour l'algorithme de grille de " -"hachage 2D à large phase." +"hachage 2D à large phase.\n" +"[b]Note :[/b] Non utilisé si [member ProjectSettings.physics/2d/use_bvh] est " +"actif." #: doc/classes/ProjectSettings.xml msgid "" @@ -57794,20 +59005,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -57815,19 +59034,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -57859,14 +59087,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -62893,6 +64129,7 @@ msgid "" msgstr "" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -62907,24 +64144,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -62933,8 +64169,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -62942,16 +64179,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -62963,7 +64200,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" "[SceneTreeTween] est un tween géré par l'arborescence. Contrairement à un " "[Tween], il ne nécessite pas la création d'un nÅ“ud.\n" @@ -63078,21 +64315,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -63128,11 +64368,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -63172,16 +64411,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -63258,12 +64496,13 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -63361,12 +64600,13 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -63426,16 +64666,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -63443,7 +64682,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -67706,11 +68945,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -70491,7 +71730,7 @@ msgid "" "way to render them in a hardware-accelerated manner." msgstr "" "Les [TextureArray] stockent un tableau de plusieurs [Image] dans une seule " -"[Texture] de base. Chaque claque de ce tableau de textures génère ses " +"[Texture] de base. Chaque calque de ce tableau de textures génère ses " "propres mipmaps. C'est une bonne alternative pour les atlas de textures. " "Voir aussi [Texture3D].\n" "Les [TextureArray] doivent être affichés avec des shaders. Après " @@ -72157,7 +73396,7 @@ msgstr "Retourne le [enum TileMode] de la tuile." #: doc/classes/TileSet.xml msgid "Returns the tile's Z index (drawing layer)." -msgstr "Retourne l'index selon Z (le claque d'affichage) de la tuile." +msgstr "Retourne l'index selon Z (le calque d'affichage) de la tuile." #: doc/classes/TileSet.xml msgid "Sets a light occluder for the tile." @@ -73194,6 +74433,7 @@ msgid "Control to show a tree of items." msgstr "Un contrôle pour afficher l'arborescence d'éléments." #: doc/classes/Tree.xml +#, fuzzy msgid "" "This shows a tree of items that can be selected, expanded and collapsed. The " "tree can have multiple columns with custom controls like text editing, " @@ -73215,7 +74455,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" "Ça affiche une arborescence d'éléments qui peuvent être sélectionnés, " "développés ou réduits. Cette arborescence peut avoir plusieurs colonnes avec " @@ -76662,13 +77913,12 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "" "If [code]true[/code], the viewport will use a unique copy of the [World] " "defined in [member world]." msgstr "" -"Si [code]true[/code], la fenêtre d'affichage utilisera le [World] défini par " -"la propriété [code]world[/code]." +"Si [code]true[/code], la fenêtre d'affichage utilisera une copie du [World] " +"défini dans la propriété [member world]." #: doc/classes/Viewport.xml msgid "" @@ -77315,7 +78565,7 @@ msgstr "" #: doc/classes/VisualInstance.xml msgid "Enables a particular layer in [member layers]." -msgstr "Active un claque spécifique dans [member layers]." +msgstr "Active un calque spécifique dans [member layers]." #: doc/classes/VisualInstance.xml msgid "" @@ -79213,9 +80463,7 @@ msgstr "" "RID qui est retourné. Ce RID peut être utilisé dans la plupart des fonctions " "[code]camera_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez cette caméra à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "" @@ -79480,9 +80728,7 @@ msgstr "" "consulté avec le RID qui est retourné. Ce RID peut être utilisé dans la " "plupart des fonctions [code]canvas_light_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez ce canevas de lumière à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "" @@ -79503,9 +80749,7 @@ msgstr "" "consulté avec le RID qui est retourné. Ce RID peut être utilisé dans la " "plupart des fonctions [code]canvas_light_ocluder_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez ce occulteur de lumière à une instance " -"en utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "Enables or disables light occluder." @@ -79687,9 +80931,7 @@ msgstr "" "avec le RID qui est retourné. Ce RID peut être utilisé dans la plupart des " "fonctions [code]environment_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez cet environnement à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "" @@ -79722,7 +80964,7 @@ msgstr "Définit l'intensité de la couleur de l'arrière-plan." #: doc/classes/VisualServer.xml msgid "Sets the maximum layer to use if using Canvas background mode." msgstr "" -"Définit le claque maximal à utiliser si l'arrière-plan utilise un canevas." +"Définit le calque maximal à utiliser si l'arrière-plan utilise un canevas." #: doc/classes/VisualServer.xml msgid "" @@ -80516,9 +81758,7 @@ msgstr "" "avec le RID qui est retourné. Ce RID peut être utilisé dans la plupart des " "fonctions [code]material_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez cette lumière spot à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "Returns the value of a certain material's parameter." @@ -81218,9 +82458,7 @@ msgstr "" "le RID qui est retourné. Ce RID peut être utilisé dans la plupart des " "fonctions [code]shader_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez ce shader vide à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml #, fuzzy @@ -81278,9 +82516,7 @@ msgstr "" "RID qui est retourné. Ce RID peut être utilisé dans la plupart des fonctions " "[code]skeleton_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez ce squelette à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "Returns the number of bones allocated for this skeleton." @@ -81298,9 +82534,7 @@ msgstr "" "RID qui est retourné. Ce RID peut être utilisé dans la plupart des fonctions " "[code]sky_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez ce ciel vide à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "Sets a sky's texture." @@ -81346,9 +82580,7 @@ msgstr "" "avec le RID qui est retourné. Ce RID peut être utilisé dans la plupart des " "fonctions [code]texture_*[/code] VisualServer.\n" "Une fois terminé avec votre RID, vous voudrez libérer le RID à l’aide de la " -"méthode statique [method free_rid] du VisualServer.\n" -"Pour placer dans une scène, attachez cette texture vide à une instance en " -"utilisant la [method instance_set_base] utilisant le RID retourné." +"méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml msgid "" @@ -81779,15 +83011,16 @@ msgid "Number of weights/bones per vertex." msgstr "Nombre de poids / os par sommet." #: doc/classes/VisualServer.xml +#, fuzzy msgid "The minimum Z-layer for canvas items." msgstr "" -"Le niveau minimal du claque de profondeur pour les éléments de canevas." +"Le niveau minimal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml #, fuzzy msgid "The maximum Z-layer for canvas items." msgstr "" -"Le niveau maximal du claque de profondeur pour les éléments de canevas." +"Le niveau maximal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "" @@ -86051,7 +87284,7 @@ msgstr "L’espace physique du World." #: doc/classes/World2D.xml msgid "Class that has everything pertaining to a 2D world." -msgstr "" +msgstr "La classe pour tout ce qui est en rapport avec le monde 2D." #: doc/classes/World2D.xml msgid "" @@ -86090,6 +87323,8 @@ msgid "" "Default environment properties for the entire scene (post-processing " "effects, lighting and background settings)." msgstr "" +"Les propriétés par défaut de l'environnement de toute la scène (effets de " +"post-processing, éclairage et réglages de l'arrière-plan)." #: doc/classes/WorldEnvironment.xml msgid "" diff --git a/doc/translations/gl.po b/doc/translations/gl.po index 92ad8f3f22..39d5ab2f2b 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -395,7 +395,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1102,7 +1102,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28262,7 +28262,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30884,7 +30884,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34631,11 +34642,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34672,7 +34688,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35464,6 +35483,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35509,6 +35531,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35552,6 +35577,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35571,6 +35599,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35700,11 +35731,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35814,6 +35881,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36020,20 +36104,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36247,6 +36351,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36416,7 +36530,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38291,13 +38413,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38309,7 +38437,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38319,15 +38450,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40034,6 +40171,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45534,7 +45675,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49107,20 +49259,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49128,19 +49288,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49172,14 +49341,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53868,24 +54045,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53894,8 +54070,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53903,16 +54080,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53924,7 +54101,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53954,21 +54131,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54004,11 +54184,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54048,16 +54227,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54119,10 +54297,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54176,8 +54354,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54208,16 +54386,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54225,7 +54402,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58193,11 +58370,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63068,7 +63245,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/hi.po b/doc/translations/hi.po index 147b3b4099..a104e2ae6d 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -394,7 +394,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1101,7 +1101,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28261,7 +28261,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30883,7 +30883,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34630,11 +34641,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34671,7 +34687,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35463,6 +35482,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35508,6 +35530,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35551,6 +35576,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35570,6 +35598,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35699,11 +35730,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35813,6 +35880,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36019,20 +36103,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36246,6 +36350,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36415,7 +36529,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38290,13 +38412,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38308,7 +38436,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38318,15 +38449,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40033,6 +40170,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45533,7 +45674,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49106,20 +49258,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49127,19 +49287,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49171,14 +49340,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53867,24 +54044,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53893,8 +54069,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53902,16 +54079,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53923,7 +54100,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53953,21 +54130,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54003,11 +54183,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54047,16 +54226,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54118,10 +54296,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54175,8 +54353,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54207,16 +54385,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54224,7 +54401,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58192,11 +58369,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63067,7 +63244,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/hu.po b/doc/translations/hu.po index cda670b22d..280424c8c0 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -413,7 +413,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1120,7 +1120,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28280,7 +28280,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30902,7 +30902,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34649,11 +34660,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34690,7 +34706,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35482,6 +35501,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35527,6 +35549,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35570,6 +35595,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35589,6 +35617,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35718,11 +35749,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35832,6 +35899,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36038,20 +36122,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36265,6 +36369,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36434,7 +36548,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38309,13 +38431,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38327,7 +38455,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38337,15 +38468,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40052,6 +40189,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45552,7 +45693,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49125,20 +49277,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49146,19 +49306,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49190,14 +49359,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53886,24 +54063,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53912,8 +54088,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53921,16 +54098,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53942,7 +54119,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53972,21 +54149,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54022,11 +54202,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54066,16 +54245,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54137,10 +54315,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54194,8 +54372,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54226,16 +54404,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54243,7 +54420,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58211,11 +58388,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63086,7 +63263,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/id.po b/doc/translations/id.po index da727b40e7..2f741d544d 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -558,7 +558,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1505,7 +1505,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28686,7 +28686,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31308,7 +31308,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35055,12 +35066,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/MeshInstance.xml msgid "" @@ -35096,7 +35113,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35894,6 +35914,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35940,6 +35963,9 @@ msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35983,6 +36009,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36002,6 +36031,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36134,11 +36166,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36252,6 +36320,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Mengembalikan nilai hiperbolik tangen dari parameter." @@ -36463,20 +36548,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36691,6 +36796,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36860,7 +36975,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38737,13 +38860,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38755,7 +38884,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38765,15 +38897,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40482,6 +40620,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45998,7 +46140,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49573,20 +49726,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49594,19 +49755,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49638,14 +49808,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54335,24 +54513,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54361,8 +54538,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54370,16 +54548,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54391,7 +54569,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54421,21 +54599,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54471,11 +54652,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54515,16 +54695,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54586,10 +54765,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54643,8 +54822,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54675,16 +54854,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54692,7 +54870,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58662,11 +58840,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63541,7 +63719,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/is.po b/doc/translations/is.po index ec65de5cfb..4dd42d807e 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -394,7 +394,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1101,7 +1101,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28261,7 +28261,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30883,7 +30883,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34630,11 +34641,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34671,7 +34687,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35463,6 +35482,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35508,6 +35530,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35551,6 +35576,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35570,6 +35598,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35699,11 +35730,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35813,6 +35880,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36019,20 +36103,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36246,6 +36350,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36415,7 +36529,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38290,13 +38412,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38308,7 +38436,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38318,15 +38449,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40033,6 +40170,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45533,7 +45674,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49106,20 +49258,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49127,19 +49287,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49171,14 +49340,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53867,24 +54044,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53893,8 +54069,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53902,16 +54079,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53923,7 +54100,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53953,21 +54130,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54003,11 +54183,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54047,16 +54226,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54118,10 +54296,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54175,8 +54353,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54207,16 +54385,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54224,7 +54401,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58192,11 +58369,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63067,7 +63244,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/it.po b/doc/translations/it.po index f1a35b0de3..9157d2ecc0 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -589,7 +589,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1743,7 +1743,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -29446,7 +29446,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -32078,7 +32078,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35845,12 +35856,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Restituisce il resto dei due vettori." #: doc/classes/MeshInstance.xml msgid "" @@ -35886,7 +35903,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36686,6 +36706,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36732,6 +36755,9 @@ msgstr "Restituisce il seno del parametro." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36775,6 +36801,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36794,6 +36823,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36930,11 +36962,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -37051,6 +37119,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." @@ -37267,20 +37352,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37500,6 +37605,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37673,7 +37788,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -39558,13 +39681,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -39576,7 +39705,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -39586,15 +39718,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -41314,6 +41452,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46855,7 +46997,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -50432,20 +50585,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50453,19 +50614,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50497,14 +50667,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -55204,24 +55382,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -55230,8 +55407,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -55239,16 +55417,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -55260,7 +55438,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55290,21 +55468,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -55340,11 +55521,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55384,16 +55564,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55455,10 +55634,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -55512,8 +55691,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -55544,16 +55723,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -55561,7 +55739,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -59541,11 +59719,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -64467,7 +64645,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ja.po b/doc/translations/ja.po index 8bb3d16322..75d4179693 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -561,7 +561,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1693,7 +1693,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -31499,7 +31499,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -34141,7 +34141,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -37961,12 +37972,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "BitmapFontã®ã‚¢ãƒˆãƒ©ã‚¹ã«å«ã¾ã‚Œã‚‹ãƒ†ã‚¯ã‚¹ãƒãƒ£æ•°ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/MeshInstance.xml msgid "" @@ -38002,7 +38019,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -38809,6 +38829,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -38855,6 +38878,9 @@ msgstr "アニメーションã®ãƒˆãƒ©ãƒƒã‚¯æ•°ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -38899,6 +38925,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -38918,6 +38947,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -39061,11 +39093,47 @@ msgid "Destroys the given RID." msgstr "指定ã•れãŸé·ç§»ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -39186,6 +39254,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "è«–ç†OR演算å ([code]or[/code] ã¾ãŸã¯ [code]||[/code])。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -39407,21 +39492,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "円柱ã®åŠå¾„。" +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -39642,6 +39746,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "[code]true[/code]ã®å ´åˆã€æ³•ç·šãƒžãƒƒãƒ”ãƒ³ã‚°ãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚" @@ -39818,7 +39932,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -41710,13 +41832,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -41728,7 +41856,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -41738,15 +41869,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -43470,6 +43607,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -49041,7 +49182,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -52642,20 +52794,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52663,19 +52823,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52707,14 +52876,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -57454,24 +57631,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -57480,8 +57656,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -57489,16 +57666,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -57510,7 +57687,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57540,21 +57717,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -57590,11 +57770,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57634,16 +57813,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -57705,10 +57883,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -57762,8 +57940,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -57794,16 +57972,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -57811,7 +57988,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -62090,11 +62267,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -67056,7 +67233,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ko.po b/doc/translations/ko.po index e3dd797c36..a30a93f652 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -535,7 +535,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1266,7 +1266,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28563,7 +28563,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31194,7 +31194,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34946,12 +34957,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "ë‘ ë²¡í„°ì˜ ë‚˜ë¨¸ì§€ë¥¼ 반환합니다." #: doc/classes/MeshInstance.xml msgid "" @@ -34987,7 +35004,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35786,6 +35806,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35832,6 +35855,9 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35875,6 +35901,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35894,6 +35923,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36029,11 +36061,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36149,6 +36217,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." @@ -36361,20 +36446,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36591,6 +36696,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36761,7 +36876,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38768,13 +38891,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38786,7 +38915,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38796,15 +38928,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40517,6 +40655,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46038,7 +46180,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49614,20 +49767,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49635,19 +49796,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49679,14 +49849,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54377,24 +54555,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54403,8 +54580,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54412,16 +54590,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54433,7 +54611,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54463,21 +54641,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54513,11 +54694,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54557,16 +54737,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54628,10 +54807,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54685,8 +54864,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54717,16 +54896,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54734,7 +54912,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58704,11 +58882,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63590,7 +63768,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/lt.po b/doc/translations/lt.po index fc686e4bb2..1139bf4f82 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -404,7 +404,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1111,7 +1111,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28271,7 +28271,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30893,7 +30893,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34640,11 +34651,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34681,7 +34697,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35473,6 +35492,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35518,6 +35540,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35561,6 +35586,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35580,6 +35608,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35709,11 +35740,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35823,6 +35890,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36029,20 +36113,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36256,6 +36360,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36425,7 +36539,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38300,13 +38422,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38318,7 +38446,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38328,15 +38459,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40043,6 +40180,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45543,7 +45684,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49116,20 +49268,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49137,19 +49297,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49181,14 +49350,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53877,24 +54054,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53903,8 +54079,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53912,16 +54089,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53933,7 +54110,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53963,21 +54140,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54013,11 +54193,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54057,16 +54236,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54128,10 +54306,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54185,8 +54363,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54217,16 +54395,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54234,7 +54411,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58202,11 +58379,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63077,7 +63254,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 27ebbed1af..627035b696 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -409,7 +409,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1116,7 +1116,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28279,7 +28279,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30901,7 +30901,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34648,11 +34659,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34689,7 +34705,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35481,6 +35500,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35526,6 +35548,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35569,6 +35594,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35588,6 +35616,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35717,11 +35748,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35831,6 +35898,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36037,20 +36121,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36264,6 +36368,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36433,7 +36547,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38308,13 +38430,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38326,7 +38454,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38336,15 +38467,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40051,6 +40188,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45551,7 +45692,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49124,20 +49276,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49145,19 +49305,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49189,14 +49358,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53885,24 +54062,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53911,8 +54087,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53920,16 +54097,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53941,7 +54118,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53971,21 +54148,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54021,11 +54201,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54065,16 +54244,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54136,10 +54314,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54193,8 +54371,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54225,16 +54403,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54242,7 +54419,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58210,11 +58387,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63085,7 +63262,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/mr.po b/doc/translations/mr.po index caaec0b107..d4e8907c1d 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -392,7 +392,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1099,7 +1099,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28259,7 +28259,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30881,7 +30881,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34628,11 +34639,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34669,7 +34685,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35461,6 +35480,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35506,6 +35528,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35549,6 +35574,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35568,6 +35596,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35697,11 +35728,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35811,6 +35878,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36017,20 +36101,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36244,6 +36348,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36413,7 +36527,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38288,13 +38410,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38306,7 +38434,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38316,15 +38447,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40031,6 +40168,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45531,7 +45672,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49104,20 +49256,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49125,19 +49285,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49169,14 +49338,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53865,24 +54042,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53891,8 +54067,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53900,16 +54077,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53921,7 +54098,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53951,21 +54128,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54001,11 +54181,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54045,16 +54224,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54116,10 +54294,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54173,8 +54351,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54205,16 +54383,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54222,7 +54399,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58190,11 +58367,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63065,7 +63242,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 6bdd8e4b1e..9aa8c17200 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -404,7 +404,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1111,7 +1111,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28271,7 +28271,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30893,7 +30893,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34640,11 +34651,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34681,7 +34697,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35473,6 +35492,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35518,6 +35540,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35561,6 +35586,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35580,6 +35608,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35709,11 +35740,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35823,6 +35890,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36029,20 +36113,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36256,6 +36360,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36425,7 +36539,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38300,13 +38422,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38318,7 +38446,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38328,15 +38459,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40043,6 +40180,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45543,7 +45684,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49116,20 +49268,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49137,19 +49297,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49181,14 +49350,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53877,24 +54054,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53903,8 +54079,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53912,16 +54089,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53933,7 +54110,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53963,21 +54140,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54013,11 +54193,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54057,16 +54236,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54128,10 +54306,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54185,8 +54363,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54217,16 +54395,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54234,7 +54411,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58202,11 +58379,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63077,7 +63254,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ne.po b/doc/translations/ne.po index d7f2a9f0cb..f129446976 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -392,7 +392,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1099,7 +1099,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28259,7 +28259,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30881,7 +30881,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34628,11 +34639,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34669,7 +34685,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35461,6 +35480,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35506,6 +35528,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35549,6 +35574,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35568,6 +35596,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35697,11 +35728,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35811,6 +35878,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36017,20 +36101,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36244,6 +36348,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36413,7 +36527,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38288,13 +38410,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38306,7 +38434,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38316,15 +38447,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40031,6 +40168,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45531,7 +45672,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49104,20 +49256,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49125,19 +49285,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49169,14 +49338,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53865,24 +54042,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53891,8 +54067,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53900,16 +54077,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53921,7 +54098,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53951,21 +54128,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54001,11 +54181,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54045,16 +54224,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54116,10 +54294,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54173,8 +54351,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54205,16 +54383,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54222,7 +54399,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58190,11 +58367,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63065,7 +63242,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/nl.po b/doc/translations/nl.po index 71605513cd..7a96e774df 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -453,7 +453,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1160,7 +1160,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28331,7 +28331,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30953,7 +30953,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34700,11 +34711,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34741,7 +34757,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35533,6 +35552,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35578,6 +35600,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35621,6 +35646,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35640,6 +35668,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35769,11 +35800,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35883,6 +35950,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36089,20 +36173,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36316,6 +36420,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36485,7 +36599,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38360,13 +38482,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38378,7 +38506,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38388,15 +38519,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40103,6 +40240,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45603,7 +45744,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49176,20 +49328,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49197,19 +49357,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49241,14 +49410,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53938,24 +54115,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53964,8 +54140,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53973,16 +54150,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53994,7 +54171,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54024,21 +54201,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54074,11 +54254,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54118,16 +54297,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54189,10 +54367,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54246,8 +54424,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54278,16 +54456,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54295,7 +54472,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58263,11 +58440,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63138,7 +63315,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/pl.po b/doc/translations/pl.po index 6e5324af99..640cfea1c8 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -574,7 +574,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1565,7 +1565,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28837,7 +28837,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31466,7 +31466,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35240,12 +35251,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Zwraca resztÄ™ z dwóch wektorów." #: doc/classes/MeshInstance.xml msgid "" @@ -35281,7 +35298,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36081,6 +36101,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36127,6 +36150,9 @@ msgstr "Zwraca sinus parametru." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36170,6 +36196,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36189,6 +36218,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36327,11 +36359,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36449,6 +36517,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Operator logiczny OR ([code]or[/code] or [code]||[/code])." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Operator logiczny OR ([code]or[/code] or [code]||[/code])." @@ -36668,20 +36753,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36898,6 +37003,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37071,7 +37186,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38955,13 +39078,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38973,7 +39102,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38983,15 +39115,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40706,6 +40844,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46246,7 +46388,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49822,20 +49975,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49843,19 +50004,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49887,14 +50057,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54596,24 +54774,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54622,8 +54799,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54631,16 +54809,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54652,7 +54830,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54682,21 +54860,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54732,11 +54913,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54776,16 +54956,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54847,10 +55026,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54904,8 +55083,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54936,16 +55115,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54953,7 +55131,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58927,11 +59105,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63826,7 +64004,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/pt.po b/doc/translations/pt.po index 6b214ae81a..54c5f5f2ef 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -534,6 +534,7 @@ msgstr "" "inst2dict]), de volta numa instância. Útil para desserialização." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -548,7 +549,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1686,7 +1687,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -29145,7 +29146,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31771,7 +31772,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35532,12 +35544,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Retorna o seno do parâmetro." #: doc/classes/MeshInstance.xml msgid "" @@ -35573,7 +35591,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36365,6 +36386,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36411,6 +36435,9 @@ msgstr "Retorna o RID do ecrã usada por essa camada." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36454,6 +36481,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36473,6 +36503,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36610,11 +36643,47 @@ msgid "Destroys the given RID." msgstr "Retorna o [RID] do objeto." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36730,6 +36799,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Retorna o produto cruzado deste vetor e [code]b[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36944,21 +37030,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "A cor do texto." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37174,6 +37279,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37343,7 +37458,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -39227,13 +39350,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -39245,8 +39374,11 @@ msgid "Emitted when the node is renamed." msgstr "Emitido quando o nó é renomeado." #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." -msgstr "Emitido quando o nó entra na árvore." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." @@ -39255,15 +39387,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40972,6 +41110,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46475,7 +46617,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -50052,20 +50205,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50073,19 +50234,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50117,14 +50287,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54816,24 +54994,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54842,8 +55019,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54851,16 +55029,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54872,7 +55050,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54902,21 +55080,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54952,11 +55133,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54996,16 +55176,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55067,10 +55246,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -55124,8 +55303,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -55156,16 +55335,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -55173,7 +55351,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -59163,11 +59341,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -64049,7 +64227,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index 16779b76ff..b32492887a 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -584,6 +584,7 @@ msgstr "" "inst2dict]), de volta em uma instância. Útil para desserialização." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -598,7 +599,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1717,6 +1718,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1737,7 +1739,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -29478,7 +29480,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -32113,7 +32115,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35883,12 +35896,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Retorna o número de nós nesta [SceneTree]." #: doc/classes/MeshInstance.xml msgid "" @@ -35924,7 +35943,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36724,6 +36746,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36770,6 +36795,9 @@ msgstr "Retorna o número de nós nesta [SceneTree]." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36813,6 +36841,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36832,6 +36863,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36970,11 +37004,47 @@ msgid "Destroys the given RID." msgstr "Retorna o [RID] do objeto." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -37092,6 +37162,23 @@ msgstr "" "Retorna a [Cor] em [code]name[/code] se o tema tiver [code]node_type[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -37308,21 +37395,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "A cor do texto." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37541,6 +37647,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37714,7 +37830,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -39600,13 +39724,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -39618,8 +39748,11 @@ msgid "Emitted when the node is renamed." msgstr "Emitido quando o nó é renomeado." #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." -msgstr "Emitido quando o nó entra na árvore." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." @@ -39628,15 +39761,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -41349,6 +41488,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46893,7 +47036,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -50473,20 +50627,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50494,19 +50656,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50538,14 +50709,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -55247,24 +55426,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -55273,8 +55451,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -55282,16 +55461,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -55303,7 +55482,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55333,21 +55512,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -55383,11 +55565,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55427,16 +55608,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55498,10 +55678,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -55555,8 +55735,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -55587,16 +55767,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -55604,7 +55783,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -59599,11 +59778,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -64511,7 +64690,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ro.po b/doc/translations/ro.po index dbc5017a08..260a63446f 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -420,7 +420,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1127,7 +1127,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28294,7 +28294,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30916,7 +30916,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34663,11 +34674,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34704,7 +34720,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35496,6 +35515,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35541,6 +35563,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35584,6 +35609,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35603,6 +35631,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35732,11 +35763,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35846,6 +35913,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36052,20 +36136,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36279,6 +36383,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36448,7 +36562,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38324,13 +38446,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38342,7 +38470,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38352,15 +38483,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40067,6 +40204,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45567,7 +45708,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49140,20 +49292,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49161,19 +49321,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49205,14 +49374,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53901,24 +54078,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53927,8 +54103,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53936,16 +54113,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53957,7 +54134,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53987,21 +54164,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54037,11 +54217,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54081,16 +54260,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54152,10 +54330,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54209,8 +54387,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54241,16 +54419,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54258,7 +54435,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58226,11 +58403,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63101,7 +63278,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/ru.po b/doc/translations/ru.po index ec2940636f..36dbb7d50d 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -592,6 +592,7 @@ msgstr "" "ÑкземплÑÑ€ объекта. Полезно Ð´Ð»Ñ Ð´ÐµÑериализации." #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -606,7 +607,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1772,7 +1773,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -30121,7 +30122,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -32749,7 +32750,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -36540,12 +36552,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Возвращает чиÑло Ñлементов в маÑÑиве." #: doc/classes/MeshInstance.xml msgid "" @@ -36581,7 +36599,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -37381,6 +37402,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -37427,6 +37451,9 @@ msgstr "Возвращает количеÑтво дорожек в анимац #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -37470,6 +37497,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -37489,6 +37519,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -37626,11 +37659,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -37752,6 +37821,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "ЛогичеÑкий оператор ИЛИ ([code]or[/code] или [code]||[/code])." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "ЛогичеÑкий оператор ИЛИ ([code]or[/code] или [code]||[/code])." @@ -37968,21 +38054,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy -msgid "The radius of the agent." -msgstr "Цвет Ñффекта отражениÑ." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -38202,6 +38307,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "ЕÑли [code]true[/code], текÑтура отражена по горизонтали." @@ -38375,7 +38490,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -40343,13 +40466,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -40361,7 +40490,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -40371,15 +40503,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -42104,6 +42242,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -47667,7 +47809,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -51265,20 +51418,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51286,19 +51447,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51330,14 +51500,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -56086,24 +56264,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -56112,8 +56289,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -56121,16 +56299,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -56142,7 +56320,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56172,21 +56350,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -56222,11 +56403,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56266,16 +56446,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -56337,10 +56516,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -56394,8 +56573,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -56426,16 +56605,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -56443,7 +56621,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -60453,11 +60631,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -65390,7 +65568,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/sk.po b/doc/translations/sk.po index 20caeea6c2..9fb9613f0d 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -395,7 +395,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1102,7 +1102,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28265,7 +28265,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30887,7 +30887,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34634,11 +34645,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34675,7 +34691,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35467,6 +35486,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35512,6 +35534,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35555,6 +35580,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35574,6 +35602,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35703,11 +35734,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35817,6 +35884,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36023,20 +36107,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36250,6 +36354,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36419,7 +36533,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38294,13 +38416,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38312,7 +38440,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38322,15 +38453,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40037,6 +40174,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45537,7 +45678,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49110,20 +49262,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49131,19 +49291,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49175,14 +49344,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53871,24 +54048,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53897,8 +54073,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53906,16 +54083,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53927,7 +54104,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53957,21 +54134,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54007,11 +54187,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54051,16 +54230,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54122,10 +54300,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54179,8 +54357,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54211,16 +54389,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54228,7 +54405,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58196,11 +58373,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63071,7 +63248,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index 4d48a80e07..765c89be10 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -406,7 +406,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1113,7 +1113,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28276,7 +28276,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30898,7 +30898,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34645,11 +34656,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34686,7 +34702,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35478,6 +35497,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35523,6 +35545,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35566,6 +35591,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35585,6 +35613,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35714,11 +35745,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35828,6 +35895,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36034,20 +36118,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36261,6 +36365,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36430,7 +36544,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38305,13 +38427,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38323,7 +38451,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38333,15 +38464,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40048,6 +40185,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45548,7 +45689,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49121,20 +49273,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49142,19 +49302,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49186,14 +49355,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53882,24 +54059,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53908,8 +54084,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53917,16 +54094,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53938,7 +54115,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53968,21 +54145,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54018,11 +54198,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54062,16 +54241,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54133,10 +54311,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54190,8 +54368,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54222,16 +54400,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54239,7 +54416,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58207,11 +58384,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63082,7 +63259,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/sv.po b/doc/translations/sv.po index 4836ca862f..706b410d30 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -395,7 +395,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1102,7 +1102,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28262,7 +28262,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30884,7 +30884,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34631,11 +34642,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34672,7 +34688,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35464,6 +35483,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35509,6 +35531,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35552,6 +35577,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35571,6 +35599,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35700,11 +35731,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35814,6 +35881,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36020,20 +36104,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36247,6 +36351,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36416,7 +36530,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38291,13 +38413,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38309,7 +38437,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38319,15 +38450,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40034,6 +40171,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45534,7 +45675,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49107,20 +49259,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49128,19 +49288,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49172,14 +49341,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53868,24 +54045,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -53894,8 +54070,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -53903,16 +54080,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -53924,7 +54101,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -53954,21 +54131,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54004,11 +54184,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54048,16 +54227,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54119,10 +54297,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54176,8 +54354,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54208,16 +54386,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54225,7 +54402,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58193,11 +58370,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63068,7 +63245,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/th.po b/doc/translations/th.po index 0bdffafffa..68c0dd503a 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -473,7 +473,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1187,7 +1187,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28381,7 +28381,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31045,7 +31045,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34804,12 +34815,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "คืนค่าชื่à¸à¸‚à¸à¸‡à¸à¸¸à¸›à¸à¸£à¸“์เสียงทั้งหมดที่ตรวจพบในระบบ" #: doc/classes/MeshInstance.xml msgid "" @@ -34845,7 +34862,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35637,6 +35657,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35683,6 +35706,9 @@ msgstr "คืนค่าผà¸à¸œà¸±à¸™à¸£à¸¹à¸—สà¸à¸‡à¸‚à¸à¸‡à¸žà¸²à¸£à¸² #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35726,6 +35752,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35745,6 +35774,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35877,11 +35909,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35996,6 +36064,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "คืนค่าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าขà¸à¸‡à¸¥à¸³à¹‚พง" @@ -36207,20 +36292,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36435,6 +36540,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36604,7 +36719,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38532,13 +38655,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38550,7 +38679,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38560,15 +38692,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40277,6 +40415,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45784,7 +45926,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49364,20 +49517,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49385,19 +49546,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49429,14 +49599,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54128,24 +54306,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54154,8 +54331,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54163,16 +54341,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54184,7 +54362,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54214,21 +54392,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54264,11 +54445,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54308,16 +54488,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54379,10 +54558,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54436,8 +54615,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54468,16 +54647,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54485,7 +54663,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58456,11 +58634,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63335,7 +63513,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/tl.po b/doc/translations/tl.po index 5ced19938d..4361ff7318 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -441,7 +441,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1178,7 +1178,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28351,7 +28351,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -30973,7 +30973,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34732,11 +34743,16 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +msgid "Returns the number of surface override materials." msgstr "" #: doc/classes/MeshInstance.xml @@ -34773,7 +34789,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35565,6 +35584,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35610,6 +35632,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35653,6 +35678,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35672,6 +35700,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35804,11 +35835,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35927,6 +35994,23 @@ msgstr "" "so-sort ay hindi pinapagana." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" @@ -36133,20 +36217,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36360,6 +36464,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36529,7 +36643,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38404,13 +38526,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38422,7 +38550,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38432,15 +38563,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40147,6 +40284,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45650,7 +45791,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49223,20 +49375,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49244,19 +49404,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49288,14 +49457,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -53984,24 +54161,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54010,8 +54186,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54019,16 +54196,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54040,7 +54217,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54070,21 +54247,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54120,11 +54300,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54164,16 +54343,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54235,10 +54413,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54292,8 +54470,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54324,16 +54502,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54341,7 +54518,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58309,11 +58486,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63190,7 +63367,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/tr.po b/doc/translations/tr.po index d7cc5bd8df..01b71d7673 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -554,7 +554,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1684,7 +1684,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -29097,7 +29097,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31724,7 +31724,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35484,12 +35495,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "İki vektörün kalanını döndürür." #: doc/classes/MeshInstance.xml msgid "" @@ -35525,7 +35542,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -36324,6 +36344,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36370,6 +36393,9 @@ msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36413,6 +36439,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36432,6 +36461,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36569,11 +36601,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36690,6 +36758,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Verilen deÄŸerin sinüsünü döndürür." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Verilen deÄŸerin sinüsünü döndürür." @@ -36902,20 +36987,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37132,6 +37237,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -37304,7 +37419,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -39188,13 +39311,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -39206,7 +39335,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -39216,15 +39348,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40936,6 +41074,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46468,7 +46610,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -50044,20 +50197,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50065,19 +50226,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -50109,14 +50279,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54814,24 +54992,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54840,8 +55017,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54849,16 +55027,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54870,7 +55048,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54900,21 +55078,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54950,11 +55131,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54994,16 +55174,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -55065,10 +55244,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -55122,8 +55301,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -55154,16 +55333,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -55171,7 +55349,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -59143,11 +59321,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -64032,7 +64210,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/uk.po b/doc/translations/uk.po index 22271dc2ea..e943465bca 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -530,7 +530,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1245,7 +1245,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28459,7 +28459,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31084,7 +31084,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34836,12 +34847,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Повертає лишок за двома векторами." #: doc/classes/MeshInstance.xml msgid "" @@ -34877,7 +34894,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35677,6 +35697,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35723,6 +35746,9 @@ msgstr "Повертає ÑÐ¸Ð½ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35766,6 +35792,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35785,6 +35814,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35920,11 +35952,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36040,6 +36108,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "ОбчиÑлює векторний добуток двох векторів та [code]with[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "ОбчиÑлює векторний добуток цього вектора Ñ– [code]b[/code]." @@ -36253,20 +36338,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36483,6 +36588,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36653,7 +36768,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38535,13 +38658,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38553,7 +38682,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38563,15 +38695,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40283,6 +40421,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45806,7 +45948,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49382,20 +49535,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49403,19 +49564,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49447,14 +49617,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54145,24 +54323,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54171,8 +54348,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54180,16 +54358,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54201,7 +54379,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54231,21 +54409,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54281,11 +54462,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54325,16 +54505,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54396,10 +54575,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54453,8 +54632,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54485,16 +54664,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54502,7 +54680,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58474,11 +58652,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63363,7 +63541,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/vi.po b/doc/translations/vi.po index b813d4a4a5..81411cebb9 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -532,7 +532,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1462,7 +1462,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28756,7 +28756,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31383,7 +31383,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -35137,12 +35148,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "Trả vá» phần dư cá»§a hai vector." #: doc/classes/MeshInstance.xml msgid "" @@ -35178,7 +35195,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35977,6 +35997,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -36023,6 +36046,9 @@ msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -36066,6 +36092,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -36085,6 +36114,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -36221,11 +36253,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -36341,6 +36409,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "Trả vá» sin cá»§a tham số." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "Trả vá» sin cá»§a tham số." @@ -36554,20 +36639,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36784,6 +36889,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml #, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "Nếu [code]true[/code] thì láºt ngang há»a tiết." @@ -36955,7 +37070,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38839,13 +38962,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38857,7 +38986,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38867,15 +38999,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40587,6 +40725,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -46118,7 +46260,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49698,20 +49851,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49719,19 +49880,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49763,14 +49933,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54466,24 +54644,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54492,8 +54669,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54501,16 +54679,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54522,7 +54700,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54552,21 +54730,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54602,11 +54783,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54646,16 +54826,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54717,10 +54896,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54774,8 +54953,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54806,16 +54985,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54823,7 +55001,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58797,11 +58975,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63685,7 +63863,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index aed2ffbe21..e39b32f496 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -62,7 +62,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-19 11:54+0000\n" +"PO-Revision-Date: 2022-06-23 04:30+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -516,7 +516,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -536,7 +535,7 @@ msgid "" "want a true content-aware comparison, you have to use [code]deep_equal[/" "code]." msgstr "" -"æ ¹æ®å®žé™…的内容对两个值进行比较,对于 `Array` 或 `Dictionary` 会递归至最深一" +"æ ¹æ®å®žé™…的内容对两个值进行比较,对于 [Array] 或 [Dictionary] 会递归至最深一" "层。\n" "与 [code]==[/code] çš„å¼‚åŒæœ‰ï¼š\n" "- 对于 [code]null[/code]ã€[code]int[/code]ã€[code]float[/code]ã€" @@ -571,6 +570,7 @@ msgstr "" "将(之å‰ä½¿ç”¨ [method inst2dict] 创建的)å—典转æ¢å›žå®žä¾‹ã€‚适用于ååºåˆ—化。" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -585,7 +585,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -659,7 +659,7 @@ msgid "" "[/codeblock]\n" "For the integer remainder operation, use the % operator." msgstr "" -"返回 [code]a/b[/code] 的浮点型余数, 符å·ä¸Ž [code]a[/code]一致。\n" +"返回 [code]a/b[/code] 的浮点型余数,符å·ä¸Ž [code]a[/code]一致。\n" "[codeblock]\n" "r = fmod(7, 5.5) # r = 1.5\n" "[/codeblock]\n" @@ -875,7 +875,7 @@ msgstr "" "如果 [code]a[/code] å’Œ [code]b[/code] å½¼æ¤è¿‘似相ç‰ï¼Œåˆ™è¿”回 [code]true[/" "code]。\n" "è¿™é‡Œï¼Œè¿‘ä¼¼ç›¸ç‰æ„å‘³ç€ [code]a[/code] å’Œ [code]b[/code] 相互之间在一个å°çš„内部 " -"ε 里,这个内部 ε éšç€æ•°å—的大å°è€Œå˜åŒ–。 \n" +"ε 里,这个内部 ε éšç€æ•°å—的大å°è€Œå˜åŒ–。\n" "相åŒç¬¦å·çš„æ— 穷大值被认为是相ç‰çš„。" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1203,7 +1203,7 @@ msgid "" msgstr "" "å°† JSON 文本解æžä¸º Variant。(使用 [method typeof] 检查 Variant 的类型是å¦ç¬¦" "åˆæ‚¨çš„æœŸæœ›ã€‚)\n" -"[b]注æ„:[/b]JSON 规范未定义整数或浮点类型,仅定义了 [i]number[/i] 类型。 å› " +"[b]注æ„:[/b]JSON 规范未定义整数或浮点类型,仅定义了 [i]number[/i] ç±»åž‹ã€‚å› " "æ¤ï¼Œè§£æž JSON 文本会将所有数值转æ¢ä¸º [float] 类型。\n" "[b]注æ„:[/b]JSON 对象ä¸ä¼šåƒ Godot å—å…¸é‚£æ ·ä¿ç•™é”®é¡ºåºï¼Œå› æ¤ï¼Œå¦‚æžœå—典是由 " "JSON æž„é€ çš„ï¼Œåˆ™ä¸åº”ä¾èµ–于特定顺åºçš„键。相å,JSON 数组ä¿ç•™å…¶å…ƒç´ 的顺åºï¼š\n" @@ -1462,7 +1462,7 @@ msgstr "" "[codeblock]\n" "prints(rand_range(0, 1), rand_range(0, 1)) # 输出举例 0.135591 0.405263\n" "[/codeblock]\n" -"[b]注æ„:[/b]与 [code]randf() * (to - from) + from[/code] ç‰ä»·ã€‚" +"[b]注æ„:[/b]相当于 [code]randf() * (to - from) + from[/code]。" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1688,6 +1688,7 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1708,7 +1709,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -1725,7 +1726,7 @@ msgstr "" "smoothstep(0, 2, -5.0) # 返回 0.0\n" "smoothstep(0, 2, 0.5) # 返回 0.15625\n" "smoothstep(0, 2, 1.0) # 返回 0.5\n" -"smoothstep(0, 2, 2.0) # 返回1.0\n" +"smoothstep(0, 2, 2.0) # 返回 1.0\n" "[/codeblock]\n" "与曲线值为 [code]-1.6521[/code] çš„ [method ease] 相比,[method smoothstep] è¿”" "回最平滑的曲线,导数没有çªç„¶å˜åŒ–ã€‚å¦‚æžœä½ éœ€è¦æ‰§è¡Œæ›´é«˜çº§çš„过渡,请使用 [Tween] " @@ -2029,7 +2030,7 @@ msgstr "" "# æ— é™æ—‹è½¬ï¼ˆå¼§åº¦ï¼‰\n" "angle = wrapf(angle + 0.1, -PI, PI)\n" "[/codeblock]\n" -"[b]注æ„:[/b]如果 [code]min[/code] 为 [code]0[/code],则ç‰ä»·äºŽ [method " +"[b]注æ„:[/b]如果 [code]min[/code] 为 [code]0[/code],则相当于 [method " "fposmod]ï¼Œå› æ¤è¯·æ”¹ç”¨å®ƒã€‚\n" "通过让用户控制最å°å€¼ï¼Œ[code]wrapf[/code] 比使用 [method fposmod] æ–¹æ³•æ›´çµæ´»ã€‚" @@ -2061,7 +2062,7 @@ msgstr "" "# result 是 -2\n" "var result = wrapi(-6, -5, -1)\n" "[/codeblock]\n" -"[b]注æ„:[/b]如果 [code]min[/code] 为 [code]0[/code],则ç‰ä»·äºŽ [method " +"[b]注æ„:[/b]如果 [code]min[/code] 为 [code]0[/code],则相当于 [method " "posmod]ï¼Œå› æ¤å»ºè®®æ”¹ç”¨å®ƒã€‚\n" "通过让用户控制最å°å€¼ï¼Œ[code]wrapi[/code] 比使用 [method posmod] æ–¹æ³•æ›´çµæ´»ã€‚" @@ -2150,14 +2151,14 @@ msgstr "" msgid "" "Constant that represents how many times the diameter of a circle fits around " "its perimeter. This is equivalent to [code]TAU / 2[/code]." -msgstr "常é‡ï¼Œè¡¨ç¤ºåœ†çš„周长是直径的多少å€ã€‚ç‰ä»·äºŽ [code]TAU / 2[/code]。" +msgstr "常é‡ï¼Œè¡¨ç¤ºåœ†çš„周长是直径的多少å€ã€‚相当于 [code]TAU / 2[/code]。" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" "The circle constant, the circumference of the unit circle in radians. This " "is equivalent to [code]PI * 2[/code], or 360 degrees in rotations." msgstr "" -"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚ç‰ä»·äºŽ [code]PI * 2[/code]ï¼Œå³ 360 度的旋转" +"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚相当于 [code]PI * 2[/code]ï¼Œå³ 360 度的旋转" "值。" #: modules/gdscript/doc_classes/@GDScript.xml @@ -2638,11 +2639,11 @@ msgstr "å°é”®ç›˜çš„æ•°å— 9。" #: doc/classes/@GlobalScope.xml msgid "Left Super key (Windows key)." -msgstr "å·¦ Super 键( Windows é”® )。" +msgstr "å·¦ Super 键(Windows 键)。" #: doc/classes/@GlobalScope.xml msgid "Right Super key (Windows key)." -msgstr "å³ Super 键( Windows é”® )。" +msgstr "å³ Super 键(Windows 键)。" #: doc/classes/@GlobalScope.xml msgid "Context menu key." @@ -2763,31 +2764,31 @@ msgstr "å¯åŠ¨å¤šåª’ä½“é”®ã€‚" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 0 key." -msgstr "å¿«æ·å¯åЍ键0。" +msgstr "å¿«æ·å¯åЍ键 0。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 1 key." -msgstr "å¿«æ·å¯åЍ键1。" +msgstr "å¿«æ·å¯åЍ键 1。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 2 key." -msgstr "å¿«æ·å¯åЍ键2。" +msgstr "å¿«æ·å¯åЍ键 2。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 3 key." -msgstr "å¿«æ·å¯åЍ键3。" +msgstr "å¿«æ·å¯åЍ键 3。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 4 key." -msgstr "å¿«æ·å¯åЍ键4。" +msgstr "å¿«æ·å¯åЍ键 4。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 5 key." -msgstr "å¿«æ·å¯åЍ键5。" +msgstr "å¿«æ·å¯åЍ键 5。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 6 key." -msgstr "å¿«æ·å¯åЍ键6。" +msgstr "å¿«æ·å¯åЍ键 6。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 7 key." @@ -2799,35 +2800,35 @@ msgstr "å¿«æ·å¯åЍ键 8。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 9 key." -msgstr "å¿«æ·å¯åЍ键9。" +msgstr "å¿«æ·å¯åЍ键 9。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut A key." -msgstr "å¿«æ·å¯åЍ键 A 。" +msgstr "å¿«æ·å¯åЍ键 A。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut B key." -msgstr "å¿«æ·å¯åЍ键 B 。" +msgstr "å¿«æ·å¯åЍ键 B。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut C key." -msgstr "å¿«æ·å¯åЍ键 C 。" +msgstr "å¿«æ·å¯åЍ键 C。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut D key." -msgstr "å¿«æ·å¯åЍ键 D 。" +msgstr "å¿«æ·å¯åЍ键 D。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut E key." -msgstr "å¿«æ·å¯åЍ键 E 。" +msgstr "å¿«æ·å¯åЍ键 E。" #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut F key." -msgstr "å¿«æ·å¯åЍ键 F 。" +msgstr "å¿«æ·å¯åЍ键 F。" #: doc/classes/@GlobalScope.xml msgid "Unknown key." -msgstr "未知 键。" +msgstr "未知键。" #: doc/classes/@GlobalScope.xml msgid "Space key." @@ -3400,8 +3401,8 @@ msgid "" "mask should be preferred to [constant KEY_MASK_META] or [constant " "KEY_MASK_CTRL] for system shortcuts as it handles all platforms correctly." msgstr "" -"Command 键掩ç 。在 macOS,这ç‰åŒäºŽ [constant KEY_MASK_META]。而在其他平å°ï¼Œè¿™" -"ç‰åŒäºŽ [constant KEY_MASK_CTRL]。相对使用 [constant KEY_MASK_META] 或 " +"Command 键掩ç 。在 macOS 上相当于 [constant KEY_MASK_META]。而在其他平å°åˆ™ç›¸" +"当于 [constant KEY_MASK_CTRL]。相对使用 [constant KEY_MASK_META] 或 " "[constant KEY_MASK_CTRL] æ¥ä½œä¸ºç³»ç»Ÿå¿«æ·é”®ï¼Œåº”ä¼˜å…ˆä½¿ç”¨æ¤æŽ©ç ,以便能让所有平å°" "æ£ç¡®å¤„ç†ã€‚" @@ -3427,11 +3428,11 @@ msgstr "é¼ æ ‡ä¸é”®ã€‚" #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 1 (only present on some mice)." -msgstr "é¼ æ ‡é¢å¤–é”®1(仅在æŸäº›é¼ æ ‡ä¸Šæœ‰å®žçŽ°ï¼‰ã€‚" +msgstr "é¼ æ ‡é¢å¤–é”® 1(仅在æŸäº›é¼ æ ‡ä¸Šæœ‰å®žçŽ°ï¼‰ã€‚" #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 2 (only present on some mice)." -msgstr "é¼ æ ‡é¢å¤–é”®2(仅在æŸäº›é¼ æ ‡ä¸Šæœ‰å®žçŽ°ï¼‰ã€‚" +msgstr "é¼ æ ‡é¢å¤–é”® 2(仅在æŸäº›é¼ æ ‡ä¸Šæœ‰å®žçŽ°ï¼‰ã€‚" #: doc/classes/@GlobalScope.xml msgid "Mouse wheel up." @@ -3463,11 +3464,11 @@ msgstr "é¼ æ ‡ä¸é”®æŽ©ç 。" #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 1 mask." -msgstr "é¼ æ ‡é¢å¤–é”®1掩ç 。" +msgstr "é¼ æ ‡é¢å¤–é”® 1 掩ç 。" #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 2 mask." -msgstr "é¼ æ ‡é¢å¤–é”®2掩ç 。" +msgstr "é¼ æ ‡é¢å¤–é”® 2 掩ç 。" #: doc/classes/@GlobalScope.xml msgid "Invalid button or axis." @@ -3475,27 +3476,27 @@ msgstr "æ— æ•ˆæŒ‰é’®æˆ–è½´ã€‚" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 0." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮0。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 0。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 1." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮1。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 1。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 2." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮2。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 2。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 3." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮3。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 3。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 4." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮4。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 4。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 5." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮5。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 5。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 6." @@ -3515,55 +3516,55 @@ msgstr "æ¸¸æˆæ‰‹æŸ„按钮 9。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 10." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮10。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 10。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 11." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮11。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 11。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 12." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮12。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 12。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 13." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮13。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 13。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 14." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮14。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 14。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 15." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮15。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 15。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 16." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮16。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 16。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 17." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮17。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 17。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 18." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮18。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 18。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 19." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮19。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 19。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 20." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮20。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 20。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 21." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮21。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 21。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 22." -msgstr "æ¸¸æˆæ‰‹æŸ„按钮22。" +msgstr "æ¸¸æˆæ‰‹æŸ„按钮 22。" #: doc/classes/@GlobalScope.xml msgid "" @@ -3628,35 +3629,37 @@ msgstr "ä»»å¤©å ‚æŽ§åˆ¶å™¨ Y 键。" #: doc/classes/@GlobalScope.xml msgid "Grip (side) buttons on a VR controller." -msgstr "VRæŽ§åˆ¶å™¨ä¸Šçš„æ¡æŠŠï¼ˆä¾§é¢ï¼‰æŒ‰é’®ã€‚" +msgstr "VR æŽ§åˆ¶å™¨ä¸Šçš„æ¡æŠŠï¼ˆä¾§é¢ï¼‰æŒ‰é’®ã€‚" #: doc/classes/@GlobalScope.xml msgid "Push down on the touchpad or main joystick on a VR controller." -msgstr "VR控制器上的触摸æ¿/主摇æ†çš„å‘下键。" +msgstr "VR 控制器上的触摸æ¿/主摇æ†çš„å‘下键。" #: doc/classes/@GlobalScope.xml msgid "Trigger on a VR controller." -msgstr "VR控制器上的扳机键。" +msgstr "VR 控制器上的扳机键。" #: doc/classes/@GlobalScope.xml msgid "" "A button on the right Oculus Touch controller, X button on the left " "controller (also when used in OpenVR)." -msgstr "å³ä¾§Oculus Touch控制器的A按钮,左控制器的X按钮(需当使用OpenVR时)。" +msgstr "" +"Oculus Touch å³æŽ§åˆ¶å™¨çš„ A 按钮,左控制器的 X 按钮(需当使用 OpenVR 时)。" #: doc/classes/@GlobalScope.xml msgid "" "B button on the right Oculus Touch controller, Y button on the left " "controller (also when used in OpenVR)." -msgstr "å³ä¾§Oculus Touch控制器的B按钮,左控制器的Y按钮(需当使用OpenVR时)。" +msgstr "" +"Oculus Touch å³æŽ§åˆ¶å™¨çš„ B 按钮,左控制器的 Y 按钮(需当使用 OpenVR 时)。" #: doc/classes/@GlobalScope.xml msgid "Menu button on either Oculus Touch controller." -msgstr "ä»»æ„Oculus Touch控制器上的èœå•按钮。" +msgstr "ä»»æ„ Oculus Touch 控制器上的èœå•按钮。" #: doc/classes/@GlobalScope.xml msgid "Menu button in OpenVR (Except when Oculus Touch controllers are used)." -msgstr "OpenVRä¸çš„èœå•按钮(使用 Oculus Touch 控制器时除外)。" +msgstr "OpenVR ä¸çš„èœå•按钮(使用 Oculus Touch 控制器时除外)。" #: doc/classes/@GlobalScope.xml msgid "Gamepad button Select." @@ -3752,11 +3755,11 @@ msgstr "æ¸¸æˆæ‰‹æŸ„峿‘‡æ†åž‚直轴。" #: doc/classes/@GlobalScope.xml msgid "Generic gamepad axis 4." -msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´4。" +msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´ 4。" #: doc/classes/@GlobalScope.xml msgid "Generic gamepad axis 5." -msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´5。" +msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´ 5。" #: doc/classes/@GlobalScope.xml msgid "Gamepad left trigger analog axis." @@ -3768,11 +3771,11 @@ msgstr "æ¸¸æˆæ‰‹æŸ„å³è§¦å‘模拟轴。" #: doc/classes/@GlobalScope.xml msgid "Generic gamepad axis 8." -msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´8。" +msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´ 8。" #: doc/classes/@GlobalScope.xml msgid "Generic gamepad axis 9." -msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´9。" +msgstr "é€šç”¨çš„æ¸¸æˆæ‰‹æŸ„è½´ 9。" #: doc/classes/@GlobalScope.xml msgid "Represents the maximum number of joystick axes supported." @@ -3788,23 +3791,23 @@ msgstr "æ¸¸æˆæ‰‹æŸ„å³ä¾§æ¨¡æ‹Ÿè§¦å‘器。" #: doc/classes/@GlobalScope.xml msgid "VR Controller analog trigger." -msgstr "VR控制器模拟触å‘器。" +msgstr "VR 控制器模拟触å‘器。" #: doc/classes/@GlobalScope.xml msgid "VR Controller analog grip (side buttons)." -msgstr "VRæŽ§åˆ¶å™¨çš„æ¨¡æ‹Ÿæ¡æŠŠï¼ˆä¾§é¢æŒ‰é’®ï¼‰ã€‚" +msgstr "VR æŽ§åˆ¶å™¨çš„æ¨¡æ‹Ÿæ¡æŠŠï¼ˆä¾§é¢æŒ‰é’®ï¼‰ã€‚" #: doc/classes/@GlobalScope.xml msgid "" "OpenVR touchpad X axis (Joystick axis on Oculus Touch and Windows MR " "controllers)." -msgstr "OpenVR触摸æ¿X轴(Oculus Touchå’ŒWindows MR控制器的æ“纵æ†è½´ï¼‰ã€‚" +msgstr "OpenVR è§¦æ‘¸æ¿ X 轴(Oculus Touch å’Œ Windows MR 控制器的æ“纵æ†è½´ï¼‰ã€‚" #: doc/classes/@GlobalScope.xml msgid "" "OpenVR touchpad Y axis (Joystick axis on Oculus Touch and Windows MR " "controllers)." -msgstr "OpenVR触摸æ¿Y轴(Oculus Touchå’ŒWindows MR控制器的æ“纵æ†è½´ï¼‰ã€‚" +msgstr "OpenVR è§¦æ‘¸æ¿ Y 轴(Oculus Touch å’Œ Windows MR 控制器的æ“纵æ†è½´ï¼‰ã€‚" #: doc/classes/@GlobalScope.xml msgid "" @@ -4164,7 +4167,7 @@ msgstr "" "通过æç¤ºä¸²[code]\"min,max\"[/code] 或[code]\"min,max,step\"[/code]æ¥æç¤ºä¸€ä¸ª" "整数或浮点数属性应当è½åœ¨æŒ‡å®šèŒƒå›´å†…。æç¤ºä¸²å¯ä»¥é€‰æ‹©æ€§åœ°åŒ…å« " "[code]\"or_greater\"[/code] 与/或 [code]\"or_lesser\"[/code] æ¥å…许手动输入的" -"值超过或低于最大最å°å€¼ã€‚例如: [code]\"-360,360,1,or_greater,or_lesser\"[/" +"值超过或低于最大最å°å€¼ã€‚例如:[code]\"-360,360,1,or_greater,or_lesser\"[/" "code]。" #: doc/classes/@GlobalScope.xml @@ -4179,7 +4182,7 @@ msgstr "" "æç¤ºä¸€ä¸ªæ•´æ•°æˆ–浮点数属性应当è½åœ¨é€šè¿‡æç¤ºå—符串[code]\"min,max\"[/code] 或" "[code]\"min,max,step\"[/code]æ¥æŒ‡å®šçš„范围内。æç¤ºå—符串å¯ä»¥é€‰æ‹©æ€§åœ°åŒ…å« " "[code]\"or_greater\"[/code] 与/或 [code]\"or_lesser\"[/code] æ¥å…许手动输入的" -"值超过最大值或低于最å°å€¼ã€‚例如: [code]\"0.01,100,0.01,or_greater\"[/code]。" +"值超过最大值或低于最å°å€¼ã€‚例如:[code]\"0.01,100,0.01,or_greater\"[/code]。" #: doc/classes/@GlobalScope.xml msgid "" @@ -4238,13 +4241,13 @@ msgstr "" msgid "" "Hints that an integer property is a bitmask using the optionally named 2D " "render layers." -msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„2D渲染层。" +msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 2D 渲染层。" #: doc/classes/@GlobalScope.xml msgid "" "Hints that an integer property is a bitmask using the optionally named 2D " "physics layers." -msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„2D物ç†å±‚。" +msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 2D 物ç†å±‚。" #: doc/classes/@GlobalScope.xml msgid "" @@ -4256,20 +4259,19 @@ msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ msgid "" "Hints that an integer property is a bitmask using the optionally named 3D " "render layers." -msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„3D渲染层。" +msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 3D 渲染层。" #: doc/classes/@GlobalScope.xml msgid "" "Hints that an integer property is a bitmask using the optionally named 3D " "physics layers." -msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å¤‡æˆ–ä¸å…·å¤‡å‘½åçš„3D物ç†å±‚。" +msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 3D 物ç†å±‚。" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Hints that an integer property is a bitmask using the optionally named 3D " "navigation layers." -msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 2D 导航层。" +msgstr "æç¤ºä¸€ä¸ªæ•´æ•°å±žæ€§æ˜¯ä¸€ä¸ªæŽ©ç ,使用ç€å…·å或ä¸å…·åçš„ 3D 导航层。" #: doc/classes/@GlobalScope.xml msgid "" @@ -4913,7 +4915,7 @@ msgstr "" msgid "" "Registers a [LineEdit] in the dialog. When the enter key is pressed, the " "dialog will be accepted." -msgstr "åœ¨å¯¹è¯æ¡†ä¸æ³¨å†Œ [LineEdit]。 å½“æŒ‰ä¸‹å›žè½¦é”®æ—¶ï¼Œå¯¹è¯æ¡†å°†è¢«æŽ¥å—。" +msgstr "åœ¨å¯¹è¯æ¡†ä¸æ³¨å†Œ [LineEdit]ã€‚å½“æŒ‰ä¸‹å›žè½¦é”®æ—¶ï¼Œå¯¹è¯æ¡†å°†è¢«æŽ¥å—。" #: doc/classes/AcceptDialog.xml msgid "" @@ -4945,13 +4947,13 @@ msgid "" "dialog if the input is valid. As such, this property can't be used in " "[FileDialog] to disable hiding the dialog when pressing OK." msgstr "" -"如果为 [code]true[/code],按下OKæŒ‰é’®æ—¶å¯¹è¯æ¡†å°†éšè—。如果è¦åœ¨æ”¶åˆ° [signal " +"如果为 [code]true[/code]ï¼ŒæŒ‰ä¸‹ç¡®å®šæŒ‰é’®æ—¶å¯¹è¯æ¡†å°†éšè—。如果è¦åœ¨æ”¶åˆ° [signal " "confirmed] ä¿¡å·æ—¶æ‰§è¡Œç±»ä¼¼è¾“入验è¯çš„æ“ä½œï¼Œåˆ™å¯ä»¥å°†å…¶è®¾ç½®ä¸º [code]false[/" "code],然åŽåœ¨è‡ªå·±çš„逻辑ä¸å¤„ç†å¯¹è¯æ¡†çš„éšè—。\n" "[b]注æ„:[/b]从æ¤ç±»æ´¾ç”Ÿçš„æŸäº›èŠ‚ç‚¹å¯ä»¥å…·æœ‰ä¸åŒçš„默认值,并且å¯èƒ½æœ‰è‡ªå·±çš„内置逻" -"辑会覆盖æ¤è®¾ç½®ã€‚ 例如,[FileDialog] 默认其为 [code]false[/code],并在按下OKæ—¶" -"实现了自己的输入验è¯ä»£ç ,如果输入有效,最终将éšè—å¯¹è¯æ¡†ã€‚å› æ¤ï¼Œä¸èƒ½åœ¨ " -"[FileDialog] ä¸ä½¿ç”¨æ¤å±žæ€§æ¥ç¦æ¢åœ¨æŒ‰OKæ—¶éšè—å¯¹è¯æ¡†ã€‚" +"辑会覆盖æ¤è®¾ç½®ã€‚例如,[FileDialog] 默认其为 [code]false[/code],并在按下确定" +"时实现了自己的输入验è¯ä»£ç ,如果输入有效,最终将éšè—å¯¹è¯æ¡†ã€‚å› æ¤ï¼Œä¸èƒ½åœ¨ " +"[FileDialog] ä¸ä½¿ç”¨æ¤å±žæ€§æ¥ç¦æ¢åœ¨æŒ‰ç¡®å®šæ—¶éšè—å¯¹è¯æ¡†ã€‚" #: doc/classes/AcceptDialog.xml msgid "The text displayed by the dialog." @@ -4959,15 +4961,15 @@ msgstr "å¯¹è¯æ¡†æ˜¾ç¤ºçš„æ–‡æœ¬ã€‚" #: doc/classes/AcceptDialog.xml msgid "Emitted when the dialog is accepted, i.e. the OK button is pressed." -msgstr "接å—å¯¹è¯æ¡†æ—¶ï¼Œå³æŒ‰ä¸‹OK按钮时å‘出。" +msgstr "接å—å¯¹è¯æ¡†æ—¶ï¼Œå³æŒ‰ä¸‹ç¡®å®šæŒ‰é’®æ—¶å‘出。" #: doc/classes/AcceptDialog.xml msgid "Emitted when a custom button is pressed. See [method add_button]." -msgstr "按下自定义按钮时å‘出。 å‚阅[method add_button]。" +msgstr "按下自定义按钮时å‘å‡ºã€‚è§ [method add_button]。" #: doc/classes/AESContext.xml msgid "Interface to low level AES encryption features." -msgstr "低级AESåŠ å¯†åŠŸèƒ½æŽ¥å£ã€‚" +msgstr "底层 AES åŠ å¯†åŠŸèƒ½æŽ¥å£ã€‚" #: doc/classes/AESContext.xml msgid "" @@ -5014,9 +5016,9 @@ msgstr "" "var aes = AESContext.new()\n" "\n" "func _ready():\n" -" var key = \"My secret key!!!\" # Key must be either 16 or 32 bytes.\n" -" var data = \"My secret text!!\" # Data size must be multiple of 16 " -"bytes, apply padding if needed.\n" +" var key = \"My secret key!!!\" # 密钥必须是 16 或 32 å—节。\n" +" var data = \"My secret text!!\" # æ•°æ®å¤§å°å¿…须是 16 å—èŠ‚çš„å€æ•°ï¼Œéœ€è¦æ—¶æ·»" +"åŠ è¡¥ç™½ã€‚\n" " # ECB åŠ å¯†\n" " aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8())\n" " var encrypted = aes.update(data.to_utf8())\n" @@ -5028,7 +5030,7 @@ msgstr "" " # ECB æ ¡éªŒ\n" " assert(decrypted == data.to_utf8())\n" "\n" -" var iv = \"My secret iv!!!!\" # IV must be of exactly 16 bytes.\n" +" var iv = \"My secret iv!!!!\" # IV 必须是 16 å—节。\n" " # CBC åŠ å¯†\n" " aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8(), iv.to_utf8())\n" " encrypted = aes.update(data.to_utf8())\n" @@ -5043,7 +5045,7 @@ msgstr "" #: doc/classes/AESContext.xml msgid "Close this AES context so it can be started again. See [method start]." -msgstr "关闿¤AES上下文,以便å¯ä»¥å†æ¬¡å¯åŠ¨å®ƒã€‚ å‚阅[method start]。" +msgstr "关闿¤ AES 上下文,以便å¯ä»¥å†æ¬¡å¯åŠ¨å®ƒã€‚è§ [method start]。" #: doc/classes/AESContext.xml msgid "" @@ -5064,9 +5066,9 @@ msgid "" "(initialization vector) of exactly 16 bytes, is only needed when [code]mode[/" "code] is either [constant MODE_CBC_ENCRYPT] or [constant MODE_CBC_DECRYPT]." msgstr "" -"以给定的[code]模å¼[/code]å¯åЍAES上下文。必须始终æä¾›16或32å—节的[code]key[/" -"code],而仅当[code]mode[/code]ä¸ºä»¥ä¸‹ä¸¤ç§æƒ…况时æ‰éœ€è¦æ£å¥½ä¸º16å—节的[code]iv[/" -"code](åˆå§‹åŒ–å‘é‡ï¼‰ [constant MODE_CBC_ENCRYPT]或[constant " +"以给定的 [code]mode[/code] å¯åЍ AES 上下文。必须始终æä¾› 16 或 32 å—节的 " +"[code]key[/code],而仅当 [code]mode[/code] ä¸ºä»¥ä¸‹ä¸¤ç§æƒ…况时æ‰éœ€è¦æ£å¥½ä¸º 16 å—" +"节的 [code]iv[/code](åˆå§‹åŒ–å‘é‡ï¼‰[constant MODE_CBC_ENCRYPT] 或 [constant " "MODE_CBC_DECRYPT]。" #: doc/classes/AESContext.xml @@ -5078,24 +5080,25 @@ msgid "" "some padding if needed." msgstr "" "è¿è¡Œæ¤ AES 上下文所需的æ“作。将返回包å«åŠ å¯†ï¼ˆæˆ–è§£å¯†ï¼‰ç»™å®š [code]src[/code] 结" -"果的[PoolByteArray] 。有关æ“作模å¼ï¼Œè¯·å‚阅[method start]。\n" -"[b]注æ„:[/b][code]src[/code]的大å°å¿…须是16å€çš„倿•°ã€‚如果需è¦ï¼Œåº”用一些填充。" +"果的 [PoolByteArray] 。有关æ“作模å¼ï¼Œè¯·å‚阅 [method start]。\n" +"[b]注æ„:[/b][code]src[/code] 的大å°å¿…须是 16 å€çš„倿•°ã€‚如果需è¦ï¼Œåº”用一些填" +"充。" #: doc/classes/AESContext.xml msgid "AES electronic codebook encryption mode." -msgstr "AES电å密ç ç°¿åŠ å¯†æ¨¡å¼ã€‚" +msgstr "AES 电å密ç ç°¿åŠ å¯†æ¨¡å¼ã€‚" #: doc/classes/AESContext.xml msgid "AES electronic codebook decryption mode." -msgstr "AES电å密ç 簿解密模å¼ã€‚" +msgstr "AES 电å密ç 簿解密模å¼ã€‚" #: doc/classes/AESContext.xml msgid "AES cipher blocker chaining encryption mode." -msgstr "AES密ç å°é”器链å¼åŠ å¯†æ¨¡å¼ã€‚" +msgstr "AES 密ç å°é”器链å¼åŠ å¯†æ¨¡å¼ã€‚" #: doc/classes/AESContext.xml msgid "AES cipher blocker chaining decryption mode." -msgstr "AES密ç å°é”器链å¼è§£å¯†æ¨¡å¼ã€‚" +msgstr "AES 密ç å°é”器链å¼è§£å¯†æ¨¡å¼ã€‚" #: doc/classes/AESContext.xml msgid "Maximum value for the mode enum." @@ -5151,8 +5154,8 @@ msgid "" "[code]true[/code], the animation will be played in reverse." msgstr "" "æ’æ”¾ç”± [code]anim[/code] æŒ‡å®šçš„æ’æ”¾ã€‚如果没有指定 [code]anim[/code] 傿•°ï¼Œåˆ™" -"æ’æ”¾å½“å‰åŠ¨ç”»ã€‚ 如果 [code]backwards[/code] 为 [code]true[/code] ï¼Œåˆ™å€’åºæ’放" -"动画。" +"æ’æ”¾å½“å‰åŠ¨ç”»ã€‚å¦‚æžœ [code]backwards[/code] 为 [code]true[/code] ï¼Œåˆ™å€’åºæ’放动" +"画。" #: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml msgid "Stops the current animation (does not reset the frame counter)." @@ -5202,7 +5205,7 @@ msgstr "纹ç†çš„绘图åç§»é‡ã€‚" #: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml msgid "If [code]true[/code], the [member animation] is currently playing." -msgstr "如果 [code]true[/code]ï¼Œåˆ™è¡¨ç¤ºå½“å‰æ£åœ¨æ’放 [member animation]。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™è¡¨ç¤ºå½“å‰æ£åœ¨æ’放 [member animation]。" #: doc/classes/AnimatedSprite.xml msgid "The animation speed is multiplied by this value." @@ -5219,7 +5222,7 @@ msgstr "" #: doc/classes/AnimatedSprite.xml doc/classes/AnimatedSprite3D.xml msgid "Emitted when [member frame] changed." -msgstr "当[member frame]更改时å‘出。" +msgstr "当 [member frame] 更改时å‘出。" #: doc/classes/AnimatedSprite3D.xml msgid "" @@ -5281,17 +5284,17 @@ msgid "" "[b]Note:[/b] AnimatedTexture doesn't support using [AtlasTexture]s. Each " "frame needs to be a separate [Texture]." msgstr "" -"[AnimatedTexture]是一ç§èµ„æºæ ¼å¼ï¼Œç”¨äºŽåŸºäºŽå¸§çš„动画,其ä¸å¤šä¸ªçº¹ç†è‡ªåŠ¨é“¾æŽ¥èµ·æ¥ï¼Œ" -"æ¯å¸§æœ‰é¢„定义延迟。与[AnimationPlayer]或[AnimatedSprite]ä¸åŒï¼Œå®ƒä¸æ˜¯ä¸€ä¸ª" -"[Node],其优点是å¯åœ¨ä»»ä½•å¯ä»¥ä½¿ç”¨[Texture]资æºçš„地方使用,例如在[TileSet]" -"ä¸ã€‚\n" -"åŠ¨ç”»çš„æ’æ”¾ç”±[member fps]å±žæ€§ä»¥åŠæ¯ä¸€å¸§çš„å¯é€‰å»¶è¿ŸæŽ§åˆ¶ï¼Œå‚阅[method " -"set_frame_delay]ã€‚åŠ¨ç”»æ˜¯å¾ªçŽ¯æ’æ”¾çš„ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼Œåœ¨æ’æ”¾å®Œæœ€åŽä¸€å¸§åŽï¼Œå®ƒå°†è‡ªåŠ¨ä»Ž" -"第0叧釿–°å¼€å§‹ã€‚\n" -"[AnimatedTexture]ç›®å‰è¦æ±‚所有帧的纹ç†å…·æœ‰ç›¸åŒçš„尺寸,å¦åˆ™è¾ƒå¤§çš„纹ç†ä¼šè¢«è£å‰ªï¼Œ" -"与最å°çš„纹ç†ç›¸åŒ¹é…。\n" -"[b]注æ„:[/b]AnimatedTexture䏿”¯æŒä½¿ç”¨[AtlasTexture]。æ¯ä¸€å¸§éƒ½éœ€è¦æ˜¯ä¸€ä¸ªå•独" -"çš„[Texture]。" +"[AnimatedTexture] 是一ç§èµ„æºæ ¼å¼ï¼Œç”¨äºŽåŸºäºŽå¸§çš„动画,其ä¸å¤šä¸ªçº¹ç†è‡ªåŠ¨é“¾æŽ¥èµ·" +"æ¥ï¼Œæ¯å¸§æœ‰é¢„定义延迟。与 [AnimationPlayer] 或 [AnimatedSprite] ä¸åŒï¼Œå®ƒä¸æ˜¯ä¸€" +"个 [Node],其优点是å¯åœ¨ä»»ä½•å¯ä»¥ä½¿ç”¨ [Texture] 资æºçš„地方使用,例如在 " +"[TileSet] ä¸ã€‚\n" +"åŠ¨ç”»çš„æ’æ”¾ç”± [member fps] å±žæ€§ä»¥åŠæ¯ä¸€å¸§çš„å¯é€‰å»¶è¿ŸæŽ§åˆ¶ï¼ˆè§ [method " +"set_frame_delay]ï¼‰ã€‚åŠ¨ç”»æ˜¯å¾ªçŽ¯æ’æ”¾çš„ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼Œåœ¨æ’æ”¾å®Œæœ€åŽä¸€å¸§åŽï¼Œå®ƒå°†è‡ªåЍ" +"从第 0 叧釿–°å¼€å§‹ã€‚\n" +"[AnimatedTexture] ç›®å‰è¦æ±‚所有帧的纹ç†å…·æœ‰ç›¸åŒçš„尺寸,å¦åˆ™è¾ƒå¤§çš„纹ç†ä¼šè¢«è£" +"剪,与最å°çš„纹ç†ç›¸åŒ¹é…。\n" +"[b]注æ„:[/b]AnimatedTexture 䏿”¯æŒä½¿ç”¨ [AtlasTexture]。æ¯ä¸€å¸§éƒ½éœ€è¦æ˜¯ä¸€ä¸ªå•" +"独的 [Texture]。" #: doc/classes/AnimatedTexture.xml msgid "Returns the given frame's delay value." @@ -5299,7 +5302,7 @@ msgstr "返回给定帧的延迟值。" #: doc/classes/AnimatedTexture.xml msgid "Returns the given frame's [Texture]." -msgstr "返回给定帧的[Texture]。" +msgstr "返回给定帧的 [Texture]。" #: doc/classes/AnimatedTexture.xml msgid "" @@ -5317,16 +5320,16 @@ msgid "" "Total duration: 2.7 s\n" "[/codeblock]" msgstr "" -"在æ¤å¸§å’Œä¸‹ä¸€å¸§ä¹‹é—´è®¾ç½®é¢å¤–çš„å»¶è¿Ÿï¼ˆä»¥ç§’ä¸ºå†…ï¼‰ï¼Œè¯¥å»¶è¿Ÿå°†æ·»åŠ åˆ° [member fps] 定" -"义的时间间隔ä¸ã€‚默认情况下,框架没有延迟定义。如果定义了延迟值,则æ¤å¸§å’Œä¸‹ä¸€" -"帧之间的最终时间间隔将是 [code]1.0 / fps + delay[/code] 。\n" -"例如,对于具有 3 帧ã€2 个 FPS å’Œ 1.2 第二帧上的帧延迟的动画,由æ¤äº§ç”Ÿçš„回放将" +"设置这一帧和下一帧之间的é¢å¤–延迟(å•ä½ä¸ºç§’ï¼‰ï¼Œè¯¥å»¶è¿Ÿå°†æ·»åŠ åˆ° [member fps] 定" +"义的时间间隔ä¸ã€‚默认情况下所有帧都没有定义延迟。如果定义了延迟值,则这一帧和" +"下一帧之间的最终时间间隔将是 [code]1.0 / fps + delay[/code] 。\n" +"例如,å‡è®¾æŸä¸ªåŠ¨ç”»ä¸€å…± 3 帧,FPS 为 2,第二帧上的延迟为 1.2ï¼Œé‚£ä¹ˆæ’æ”¾ç»“果就会" "是:\n" "[codeblock]\n" -"Frame 0: 0.5 s (1 / fps)\n" -"Frame 1: 1.7 s (1 / fps + 1.2)\n" -"Frame 2: 0.5 s (1 / fps)\n" -"Total duration: 2.7 s\n" +"第 0 帧:0.5 秒(1 / fps)\n" +"第 1 帧:1.7 秒(1 / fps + 1.2)\n" +"第 2 帧:0.5 秒(1 / fps)\n" +"总时长:2.7 ç§’\n" "[/codeblock]" #: doc/classes/AnimatedTexture.xml @@ -5357,11 +5360,12 @@ msgid "" "For example, an animation with 8 frames, no frame delay and a [code]fps[/" "code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds." msgstr "" -"动画速度,以æ¯ç§’帧数为å•ä½ã€‚æ¤å€¼å®šä¹‰åŠ¨ç”»ä¸¤ä¸ªå¸§ä¹‹é—´çš„é»˜è®¤æ—¶é—´é—´éš”ï¼Œå¹¶å› æ¤åŸºäºŽ " -"[member frames] 属性定义动画循环的总体æŒç»æ—¶é—´ã€‚值为 0 表示æ¯ç§’没有预定义的帧" -"æ•°ï¼ŒåŠ¨ç”»å°†æ ¹æ®æ¯ä¸ªå¸§çš„å¸§å»¶è¿Ÿæ’æ”¾ï¼ˆè¯·å‚阅 [method set_frame_delay])。\n" -"例如,具有 8 å¸§ï¼Œæ— å¸§å»¶è¿Ÿä¸” [code]fps[/code] 值为 2 的动画将è¿è¡Œ 4 秒,æ¯å¸§æŒ" -"ç» 0.5 秒。" +"动画速度,以æ¯ç§’帧数为å•ä½ã€‚这个值定义的是该动画ä¸ä¸¤ä¸ªå¸§ä¹‹é—´çš„默认时间间隔," +"å› æ¤å¯ä»¥æ ¹æ® [member frames] 属性得到动画循环的总体æŒç»æ—¶é—´ã€‚值为 0 表示没有" +"定义æ¯ç§’å¸§æ•°ï¼Œè¯¥åŠ¨ç”»å°†æ ¹æ®å„ä¸ªå¸§çš„å¸§å»¶è¿Ÿè¿›è¡Œæ’æ”¾ï¼ˆè§ [method " +"set_frame_delay])。\n" +"例如,å‡è®¾æŸä¸ªåŠ¨ç”»ä¸€å…± 8 å¸§ï¼Œæ— å¸§å»¶è¿Ÿï¼Œåˆ™ [code]fps[/code] 值为 2 时动画将è¿" +"行 4 秒,æ¯å¸§æŒç» 0.5 秒。" #: doc/classes/AnimatedTexture.xml msgid "" @@ -5370,8 +5374,8 @@ msgid "" "for the animation to take new frames into account. The maximum number of " "frames is [constant MAX_FRAMES]." msgstr "" -"动画ä¸è¦ä½¿ç”¨çš„帧数。虽然您å¯ä»¥ä½¿ç”¨[method set_frame_texture]独立创建帧,但是" -"您需è¦ä¸ºåŠ¨ç”»è®¾ç½®æ¤å€¼ä»¥è€ƒè™‘新帧。最大帧数为[constant MAX_FRAMES]。" +"动画ä¸è¦ä½¿ç”¨çš„帧数。虽然您å¯ä»¥ä½¿ç”¨ [method set_frame_texture] 独立创建帧,但" +"是您需è¦ä¸ºåŠ¨ç”»è®¾ç½®æ¤å€¼ä»¥è€ƒè™‘新帧。最大帧数为 [constant MAX_FRAMES]。" #: doc/classes/AnimatedTexture.xml msgid "" @@ -5379,8 +5383,8 @@ msgid "" "back to the first frame after reaching the end. Note that reaching the end " "will not set [member pause] to [code]true[/code]." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™åŠ¨ç”»å°†åªæ’放一次,并且在到达结尾åŽå°†ä¸ä¼šå¾ªçŽ¯å›žåˆ°ç¬¬" -"一帧。请注æ„,到达终点ä¸ä¼šå°† [member pause] 设置为 [code]true[/code]。" +"如果为 [code]true[/code]ï¼Œåˆ™åŠ¨ç”»å°†åªæ’放一次,并且在到达结尾åŽå°†ä¸ä¼šå¾ªçŽ¯å›žåˆ°" +"第一帧。请注æ„,到达终点ä¸ä¼šå°† [member pause] 设置为 [code]true[/code]。" #: doc/classes/AnimatedTexture.xml msgid "" @@ -5388,16 +5392,17 @@ msgid "" "at [member current_frame]). The animation will continue from where it was " "paused when changing this property to [code]false[/code]." msgstr "" -"如果[code]true[/code],则动画将暂åœåœ¨å½“å‰ä½ç½®ï¼ˆå³[member current_frame])。将" -"æ¤å±žæ€§æ›´æ”¹ä¸º [code]false[/code] 时,动画将从暂åœå¤„ç»§ç»æ’放。" +"如果为 [code]true[/code],则动画将暂åœåœ¨å½“å‰ä½ç½®ï¼ˆå³ [member " +"current_frame])。将æ¤å±žæ€§æ›´æ”¹ä¸º [code]false[/code] 时,动画将从暂åœå¤„ç»§ç»æ’" +"放。" #: doc/classes/AnimatedTexture.xml msgid "" "The maximum number of frames supported by [AnimatedTexture]. If you need " "more frames in your animation, use [AnimationPlayer] or [AnimatedSprite]." msgstr "" -"[AnimatedTexture]支æŒçš„æœ€å¤§å¸§æ•°ã€‚如果动画ä¸éœ€è¦æ›´å¤šå¸§ï¼Œè¯·ä½¿ç”¨" -"[AnimationPlayer]或[AnimatedSprite]。" +"[AnimatedTexture] 支æŒçš„æœ€å¤§å¸§æ•°ã€‚如果动画ä¸éœ€è¦æ›´å¤šå¸§ï¼Œè¯·ä½¿ç”¨ " +"[AnimationPlayer] 或 [AnimatedSprite]。" #: doc/classes/Animation.xml msgid "Contains data used to animate everything in the engine." @@ -5536,32 +5541,32 @@ msgid "" "[code]stream[/code]. The [code]track_idx[/code] must be the index of an " "Audio Track." msgstr "" -"å°† [code]key_idx[/code] æ‰€æ ‡è¯†çš„é”®æµè®¾ç½®ä¸º[code]stream[/code]值。" -"[code]track_idx[/code]必须是一个音频轨é“的索引。" +"å°† [code]key_idx[/code] æ‰€æ ‡è¯†çš„é”®æµè®¾ç½®ä¸º [code]stream[/code] 值。" +"[code]track_idx[/code] 必须是音频轨é“的索引。" #: doc/classes/Animation.xml msgid "" "Returns the in handle of the key identified by [code]key_idx[/code]. The " "[code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å…¥å¥æŸ„, [code]track_idx[/code] å¿…é¡»" -"是è´å¡žå°”轨é“的索引。" +"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å…¥å¥æŸ„,[code]track_idx[/code] 必须是" +"è´å¡žå°”轨é“的索引。" #: doc/classes/Animation.xml msgid "" "Returns the out handle of the key identified by [code]key_idx[/code]. The " "[code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å‡ºå¥æŸ„, [code]track_idx[/code] å¿…é¡»" -"是è´å¡žå°”轨é“的索引。" +"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å‡ºå¥æŸ„,[code]track_idx[/code] 必须是" +"è´å¡žå°”轨é“的索引。" #: doc/classes/Animation.xml msgid "" "Returns the value of the key identified by [code]key_idx[/code]. The " "[code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回由 [code]key_idx[/code] 识别的键的值, [code]track_idx[/code] 必须是è´å¡ž" -"尔轨é“的索引。" +"返回由 [code]key_idx[/code] 识别的键的值,[code]track_idx[/code] 必须是è´å¡žå°”" +"轨é“的索引。" #: doc/classes/Animation.xml msgid "" @@ -5581,7 +5586,7 @@ msgid "" "Returns the interpolated value at the given [code]time[/code] (in seconds). " "The [code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回给定 [code]time[/code] 处的æ’值(以秒为å•ä½ï¼‰ã€‚ [code]track_idx[/code] å¿…" +"返回给定 [code]time[/code] 处的æ’值(以秒为å•ä½ï¼‰ã€‚[code]track_idx[/code] å¿…" "须是è´å¡žå°”轨é“的索引。" #: doc/classes/Animation.xml @@ -5618,13 +5623,13 @@ msgstr "清除动画(清除所有轨é“å¹¶é‡ç½®æ‰€æœ‰ï¼‰ã€‚" msgid "" "Adds a new track that is a copy of the given track from [code]to_animation[/" "code]." -msgstr "从[code]to_animation[/code]䏿·»åŠ ä¸€ä¸ªæ–°çš„è½¨é“,它是给定轨é“的副本。" +msgstr "从 [code]to_animation[/code] 䏿·»åŠ ä¸€ä¸ªæ–°çš„è½¨é“,它是给定轨é“的副本。" #: doc/classes/Animation.xml msgid "" "Returns the index of the specified track. If the track is not found, return " "-1." -msgstr "返回指定轨迹的索引。如果没有找到,返回-1。" +msgstr "返回指定轨迹的索引。如果没有找到,返回 -1。" #: doc/classes/Animation.xml msgid "Returns the amount of tracks in the animation." @@ -5634,7 +5639,7 @@ msgstr "返回动画ä¸çš„æ›²ç›®é‡ã€‚" msgid "" "Returns all the key indices of a method track, given a position and delta " "time." -msgstr "返回给定ä½ç½®å’Œdelta时间的方法轨迹的所有关键指数。" +msgstr "返回给定ä½ç½®å’Œ delta 时间的方法轨迹的所有关键指数。" #: doc/classes/Animation.xml msgid "Returns the method name of a method track." @@ -5783,11 +5788,11 @@ msgid "" "For example, [code]\"character/skeleton:ankle\"[/code] or [code]\"character/" "mesh:transform/local\"[/code]." msgstr "" -"设置轨é“的路径。路径必须是指å‘èŠ‚ç‚¹åœºæ™¯æ ‘çš„æœ‰æ•ˆè·¯å¾„ï¼Œå¿…é¡»ä»Žå°†è¦å®žçŽ°åŠ¨ç”»çš„èŠ‚ç‚¹" -"的父节点开始指定。控件属性或骨骼的轨é“必须在路径åŽé¢åŠ ä¸Šå®ƒä»¬çš„åå—,用" -"[code]\":\"[/code]分隔。\n" -"例如,[code]\"character/skeleton:ankle\"[/code] 或[code]\"character/mesh:" -"transform/local\"[/code] 。" +"设置轨é“的路径。路径必须是指å‘åœºæ™¯æ ‘èŠ‚ç‚¹çš„æœ‰æ•ˆè·¯å¾„ï¼Œå¿…é¡»ä»Žå°†è¦å®žçŽ°åŠ¨ç”»çš„èŠ‚ç‚¹" +"的父节点开始指定。控制属性或骨骼的轨é“必须在路径åŽé¢åŠ ä¸Šå®ƒä»¬çš„åå—,用 " +"[code]\":\"[/code] 分隔。\n" +"例如,[code]\"character/skeleton:ankle\"[/code] 或 [code]\"character/mesh:" +"transform/local\"[/code]。" #: doc/classes/Animation.xml msgid "" @@ -6098,9 +6103,9 @@ msgid "" "[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " "[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." msgstr "" -"ç”±ç»§æ‰¿è‡ªè¯¥ç±»ä¸”å†…éƒ¨æœ‰æ ‘çš„èŠ‚ç‚¹å‘出,当其一个节点å‘生å˜åŒ–时。å‘出æ¤ä¿¡å·çš„节点有" +"ç”±ç»§æ‰¿è‡ªè¯¥ç±»ä¸”å†…éƒ¨æœ‰æ ‘çš„èŠ‚ç‚¹å‘出,当其一个节点å‘生å˜åŒ–时。å‘出æ¤ä¿¡å·çš„节点有 " "[AnimationNodeBlendSpace1D]ã€[AnimationNodeBlendSpace2D]ã€" -"[AnimationNodeStateMachine]å’Œ[AnimationNodeBlendTree]。" +"[AnimationNodeStateMachine] å’Œ [AnimationNodeBlendTree]。" #: doc/classes/AnimationNode.xml msgid "Do not use filtering." @@ -6127,8 +6132,8 @@ msgid "" "A resource to add to an [AnimationNodeBlendTree]. Blends two animations " "additively based on an amount value in the [code][0.0, 1.0][/code] range." msgstr "" -"æ·»åŠ åˆ° [AnimationNodeBlendTree] 的资æºã€‚æ ¹æ®[code][0.0,1.0][/code]范围内的é‡" -"å€¼åŠ æ³•æ··åˆä¸¤ä¸ªåŠ¨ç”»ã€‚" +"æ·»åŠ åˆ° [AnimationNodeBlendTree] 的资æºã€‚æ ¹æ® [code][0.0,1.0][/code] 范围内的" +"é‡å€¼åŠ æ³•æ··åˆä¸¤ä¸ªåŠ¨ç”»ã€‚" #: doc/classes/AnimationNodeAdd2.xml doc/classes/AnimationNodeAdd3.xml #: doc/classes/AnimationNodeBlend2.xml doc/classes/AnimationNodeBlend3.xml @@ -6137,8 +6142,9 @@ msgid "" "code] when calling [method AnimationNode.blend_input], forcing the blended " "animations to update every frame." msgstr "" -"如果[code]true[/code],在调用[method AnimationNode.blend_input]时,将" -"[code]optimization[/code] to[code]false[/code],强制混åˆåŽçš„动画æ¯ä¸€å¸§æ›´æ–°ã€‚" +"如果为 [code]true[/code],在调用 [method AnimationNode.blend_input] 时,将 " +"[code]optimization[/code] 设置为 [code]false[/code],强制混åˆåŽçš„动画æ¯ä¸€å¸§æ›´" +"新。" #: doc/classes/AnimationNodeAdd3.xml msgid "" @@ -6219,7 +6225,7 @@ msgid "" "Animation to use as an output. It is one of the animations provided by " "[member AnimationTree.anim_player]." msgstr "" -"作为输出使用的动画。它是[member AnimationTree.anim_player]æä¾›çš„动画之一。" +"作为输出使用的动画。它是 [member AnimationTree.anim_player] æä¾›çš„动画之一。" #: doc/classes/AnimationNodeBlend2.xml msgid "Blends two animations linearly inside of an [AnimationNodeBlendTree]." @@ -6263,8 +6269,8 @@ msgid "" "Blends linearly between two of any number of [AnimationNode] of any type " "placed on a virtual axis." msgstr "" -"åœ¨è™šæ‹Ÿè½´ä¸Šæ”¾ç½®çš„ä»»æ„æ•°é‡çš„[AnimationNode]的任æ„类型的两个[AnimationNode]之间" -"线性混åˆã€‚" +"åœ¨è™šæ‹Ÿè½´ä¸Šæ”¾ç½®çš„ä»»æ„æ•°é‡çš„ [AnimationNode] 的任æ„类型的两个 [AnimationNode] " +"之间线性混åˆã€‚" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "" @@ -6302,42 +6308,42 @@ msgstr "返回混åˆè½´ä¸Šçš„点的数é‡ã€‚" msgid "" "Returns the [AnimationNode] referenced by the point at index [code]point[/" "code]." -msgstr "返回索引[code]point[/code]处的点所引用的[AnimationNode]。" +msgstr "返回索引 [code]point[/code] 处的点所引用的 [AnimationNode]。" #: doc/classes/AnimationNodeBlendSpace1D.xml #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Returns the position of the point at index [code]point[/code]." -msgstr "返回索引[code]point[/code]处的点的ä½ç½®ã€‚" +msgstr "返回索引 [code]point[/code] 处的点的ä½ç½®ã€‚" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "Removes the point at index [code]point[/code] from the blend axis." -msgstr "将索引[code]point[/code]处的点从混åˆè½´ä¸Šåˆ 除。" +msgstr "将索引 [code]point[/code] 处的点从混åˆè½´ä¸Šåˆ 除。" #: doc/classes/AnimationNodeBlendSpace1D.xml #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "Changes the [AnimationNode] referenced by the point at index [code]point[/" "code]." -msgstr "改å˜ç´¢å¼•[code]point[/code]处的点所引用的[AnimationNode]。" +msgstr "改å˜ç´¢å¼• [code]point[/code] 处的点所引用的 [AnimationNode]。" #: doc/classes/AnimationNodeBlendSpace1D.xml #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "Updates the position of the point at index [code]point[/code] on the blend " "axis." -msgstr "æ›´æ–°æ··åˆè½´ä¸Šç´¢å¼•[code]point[/code]处的点的ä½ç½®ã€‚" +msgstr "æ›´æ–°æ··åˆè½´ä¸Šç´¢å¼• [code]point[/code] 处的点的ä½ç½®ã€‚" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "" "The blend space's axis's upper limit for the points' position. See [method " "add_blend_point]." -msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸Šé™ã€‚请å‚阅 [method add_blend_point]。" +msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "" "The blend space's axis's lower limit for the points' position. See [method " "add_blend_point]." -msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸‹é™ã€‚请å‚阅 [method add_blend_point]。" +msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸‹é™ã€‚è§ [method add_blend_point]。" #: doc/classes/AnimationNodeBlendSpace1D.xml msgid "Position increment to snap to when moving a point on the axis." @@ -6351,7 +6357,7 @@ msgstr "æ··åˆç©ºé—´è™šæ‹Ÿè½´çš„æ ‡ç¾ã€‚" msgid "" "Blends linearly between three [AnimationNode] of any type placed in a 2D " "space." -msgstr "åœ¨äºŒç»´ç©ºé—´ä¸æ”¾ç½®çš„三个任æ„类型的[AnimationNode]之间线性èžåˆã€‚" +msgstr "在 2D ç©ºé—´ä¸æ”¾ç½®çš„三个任æ„类型的 [AnimationNode] 之间线性èžåˆã€‚" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" @@ -6402,7 +6408,7 @@ msgstr "返回混åˆç©ºé—´ä¸çš„点的数é‡ã€‚" msgid "" "Returns the [AnimationRootNode] referenced by the point at index " "[code]point[/code]." -msgstr "返回索引[code]point[/code]处的点所引用的[AnimationRootNode]。" +msgstr "返回索引 [code]point[/code] 处的点所引用的 [AnimationRootNode]。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Returns the number of triangles in the blend space." @@ -6413,16 +6419,17 @@ msgid "" "Returns the position of the point at index [code]point[/code] in the " "triangle of index [code]triangle[/code]." msgstr "" -"返回索引[code]point[/code]处的点在索引[code]triangle[/code]的三角形ä¸çš„ä½ç½®ã€‚" +"返回索引 [code]point[/code] 处的点在索引 [code]triangle[/code] 的三角形ä¸çš„ä½" +"置。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Removes the point at index [code]point[/code] from the blend space." -msgstr "从混åˆç©ºé—´ä¸åˆ 除索引[code]point[/code]处的点。" +msgstr "从混åˆç©ºé—´ä¸åˆ 除索引 [code]point[/code] 处的点。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "Removes the triangle at index [code]triangle[/code] from the blend space." -msgstr "从混åˆç©ºé—´ä¸åˆ 除索引[code]triangle[/code]处的三角形。" +msgstr "从混åˆç©ºé—´ä¸åˆ 除索引 [code]triangle[/code] 处的三角形。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" @@ -6430,7 +6437,7 @@ msgid "" "mesh updates every time you add or remove points with [method " "add_blend_point] and [method remove_blend_point]." msgstr "" -"如果 [code]true[/code],混åˆç©ºé—´ä¼šè‡ªåŠ¨è¿›è¡Œä¸‰è§’æµ‹é‡ã€‚æ¯æ¬¡ä½¿ç”¨ [method " +"如果为 [code]true[/code],混åˆç©ºé—´ä¼šè‡ªåŠ¨è¿›è¡Œä¸‰è§’æµ‹é‡ã€‚æ¯æ¬¡ä½¿ç”¨ [method " "add_blend_point] å’Œ [method remove_blend_point] æ·»åŠ æˆ–ç§»é™¤ç‚¹æ—¶ï¼Œç½‘æ ¼éƒ½ä¼šæ›´" "新。" @@ -6438,21 +6445,19 @@ msgstr "" msgid "" "Controls the interpolation between animations. See [enum BlendMode] " "constants." -msgstr "控制动画之间的æ’值。å‚阅 [enum BlendMode] 常é‡ã€‚" +msgstr "控制动画之间的æ’å€¼ã€‚è§ [enum BlendMode] 常é‡ã€‚" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "The blend space's X and Y axes' upper limit for the points' position. See " "[method add_blend_point]." -msgstr "" -"æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸Šé™ã€‚请å‚阅 [method add_blend_point]。" +msgstr "æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" "The blend space's X and Y axes' lower limit for the points' position. See " "[method add_blend_point]." -msgstr "" -"æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸‹é™ã€‚请å‚阅 [method add_blend_point]。" +msgstr "æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸‹é™ã€‚è§ [method add_blend_point]。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Position increment to snap to when moving a point." @@ -6460,11 +6465,11 @@ msgstr "移动点时è¦å¯¹é½çš„ä½ç½®å¢žé‡ã€‚" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Name of the blend space's X axis." -msgstr "æ··åˆç©ºé—´Xè½´çš„å称。" +msgstr "æ··åˆç©ºé—´ X è½´çš„å称。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "Name of the blend space's Y axis." -msgstr "æ··åˆç©ºé—´Yè½´çš„å称。" +msgstr "æ··åˆç©ºé—´ Y è½´çš„å称。" #: doc/classes/AnimationNodeBlendSpace2D.xml msgid "" @@ -6487,7 +6492,7 @@ msgid "" "Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " "the last animation's playback position." msgstr "" -"类似于[constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„æ’æ”¾ä½ç½®å¼€å§‹æ–°çš„动" +"类似于 [constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„æ’æ”¾ä½ç½®å¼€å§‹æ–°çš„动" "画。" #: doc/classes/AnimationNodeBlendTree.xml @@ -6611,8 +6616,8 @@ msgid "" "seconds) between 0 and this value will be added to [member " "autorestart_delay]." msgstr "" -"如果[member autorestart]为 [code]true[/code],则介于0å’Œæ¤å€¼ä¹‹é—´çš„éšæœºé™„åŠ å»¶è¿Ÿ" -"(以秒为å•ä½ï¼‰å°†æ·»åŠ åˆ°[member autorestart_delay]。" +"如果 [member autorestart] 为 [code]true[/code],则介于0å’Œæ¤å€¼ä¹‹é—´çš„éšæœºé™„åŠ å»¶" +"迟(以秒为å•ä½ï¼‰å°†æ·»åŠ åˆ° [member autorestart_delay]。" #: doc/classes/AnimationNodeOutput.xml msgid "Generic output node to be added to [AnimationNodeBlendTree]." @@ -6636,8 +6641,8 @@ msgid "" "[/codeblock]" msgstr "" "包å«ä»£è¡¨åŠ¨ç”»çŠ¶æ€çš„多个节点,以图的形å¼è¿žæŽ¥ã€‚节点转æ¢å¯ä»¥é…置为自动å‘生或通过" -"代ç ,使用最çŸè·¯å¾„算法。从[AnimationTree]èŠ‚ç‚¹ä¸æ£€ç´¢" -"[AnimationNodeStateMachinePlayback]对象,对其进行编程控制。\n" +"代ç ,使用最çŸè·¯å¾„算法。从 [AnimationTree] èŠ‚ç‚¹ä¸æ£€ç´¢ " +"[AnimationNodeStateMachinePlayback] 对象,对其进行编程控制。\n" "[b]示例:[/b]\n" "[codeblock]\n" "var state_machine = $AnimationTree.get(\"parameters/playback\")\n" @@ -6648,7 +6653,7 @@ msgstr "" msgid "" "Adds a new node to the graph. The [code]position[/code] is used for display " "in the editor." -msgstr "å‘图䏿·»åŠ ä¸€ä¸ªæ–°èŠ‚ç‚¹ã€‚ [code]position[/code]ç”¨äºŽåœ¨ç¼–è¾‘å™¨ä¸æ˜¾ç¤ºã€‚" +msgstr "å‘图䏿·»åŠ ä¸€ä¸ªæ–°èŠ‚ç‚¹ã€‚[code]position[/code] ç”¨äºŽåœ¨ç¼–è¾‘å™¨ä¸æ˜¾ç¤ºã€‚" #: doc/classes/AnimationNodeStateMachine.xml msgid "Adds a transition between the given nodes." @@ -6737,7 +6742,7 @@ msgstr "将给定的节点设置为图形的起始点。" #: doc/classes/AnimationNodeStateMachinePlayback.xml msgid "Playback control for [AnimationNodeStateMachine]." -msgstr "[AnimationNodeStateMachine]çš„æ’æ”¾æŽ§ä»¶ã€‚" +msgstr "[AnimationNodeStateMachine] çš„æ’æ”¾æŽ§ä»¶ã€‚" #: doc/classes/AnimationNodeStateMachinePlayback.xml msgid "" @@ -6750,8 +6755,8 @@ msgid "" "state_machine.travel(\"some_state\")\n" "[/codeblock]" msgstr "" -"å…许控制用[AnimationNodeStateMachine]创建的[AnimationTree]çŠ¶æ€æœºã€‚用" -"[code]$AnimationTree.get(\"parameters/playback\")[/code]检索。\n" +"å…许控制用 [AnimationNodeStateMachine] 创建的 [AnimationTree] çŠ¶æ€æœºã€‚用 " +"[code]$AnimationTree.get(\"parameters/playback\")[/code] 获å–。\n" "[b]示例:[/b]\n" "[codeblock]\n" "var state_machine = $AnimationTree.get(\"parameters/playback\")\n" @@ -6769,7 +6774,7 @@ msgstr "返回当å‰åŠ¨ç”»çŠ¶æ€å†…çš„æ’æ”¾ä½ç½®ã€‚" #: doc/classes/AnimationNodeStateMachinePlayback.xml msgid "" "Returns the current travel path as computed internally by the A* algorithm." -msgstr "返回A*算法内部计算的当å‰è¡Œè¿›è·¯å¾„。" +msgstr "返回 A* 算法内部计算的当å‰è¡Œè¿›è·¯å¾„。" #: doc/classes/AnimationNodeStateMachinePlayback.xml msgid "Returns [code]true[/code] if an animation is playing." @@ -6825,8 +6830,8 @@ msgid "" "Don't use this transition during [method AnimationNodeStateMachinePlayback." "travel] or [member auto_advance]." msgstr "" -"ä¸è¦åœ¨[method AnimationNodeStateMachinePlayback.travel]或[member " -"auto_advance]期间使用这个过渡。" +"ä¸è¦åœ¨ [method AnimationNodeStateMachinePlayback.travel] 或 [member " +"auto_advance] 期间使用这个过渡。" #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "" @@ -6834,8 +6839,8 @@ msgid "" "via [method AnimationNodeStateMachinePlayback.travel] or [member " "auto_advance]." msgstr "" -"当通过[method AnimationNodeStateMachinePlayback.travel]或[member " -"auto_advance]åœ¨æ ‘ä¸æ—…行时,优先级较低的转场。" +"当通过 [method AnimationNodeStateMachinePlayback.travel] 或 [member " +"auto_advance] åœ¨æ ‘ä¸æ—…行时,优先级较低的转场。" #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "The transition type." @@ -6847,7 +6852,7 @@ msgstr "这个状æ€å’Œä¸‹ä¸€ä¸ªçжæ€ä¹‹é—´çš„äº¤å‰æ¸å˜æ—¶é—´ã€‚" #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "Emitted when [member advance_condition] is changed." -msgstr "å˜æ›´[member advance_condition]æ—¶å‘出。" +msgstr "å˜æ›´ [member advance_condition] æ—¶å‘出。" #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "" @@ -6869,17 +6874,17 @@ msgstr "ç‰å¾…当å‰çŠ¶æ€æ’放结æŸï¼Œç„¶åŽåˆ‡æ¢åˆ°ä¸‹ä¸€ä¸ªçжæ€åŠ¨ç”»çš„ #: doc/classes/AnimationNodeTimeScale.xml msgid "A time-scaling animation node to be used with [AnimationTree]." -msgstr "与[AnimationTree]一起使用的时间缩放动画节点。" +msgstr "与 [AnimationTree] 一起使用的时间缩放动画节点。" #: doc/classes/AnimationNodeTimeScale.xml msgid "" "Allows scaling the speed of the animation (or reversing it) in any children " "nodes. Setting it to 0 will pause the animation." -msgstr "å…许缩放任何å节点ä¸åŠ¨ç”»çš„é€Ÿåº¦ï¼ˆæˆ–å转)。将其设置为0将暂åœåŠ¨ç”»ã€‚" +msgstr "å…许缩放任何å节点ä¸åŠ¨ç”»çš„é€Ÿåº¦ï¼ˆæˆ–å转)。将其设置为 0 将暂åœåŠ¨ç”»ã€‚" #: doc/classes/AnimationNodeTimeSeek.xml msgid "A time-seeking animation node to be used with [AnimationTree]." -msgstr "与[AnimationTree]é…åˆä½¿ç”¨çš„寻时动画节点。" +msgstr "与 [AnimationTree] é…åˆä½¿ç”¨çš„寻时动画节点。" #: doc/classes/AnimationNodeTimeSeek.xml msgid "" @@ -6919,7 +6924,7 @@ msgstr "" #: doc/classes/AnimationNodeTransition.xml msgid "A generic animation transition node for [AnimationTree]." -msgstr "[AnimationTree]的通用动画过渡节点。" +msgstr "[AnimationTree] 的通用动画过渡节点。" #: doc/classes/AnimationNodeTransition.xml msgid "" @@ -7115,7 +7120,7 @@ msgstr "移除键å为 [code]name[/code] 的动画。" msgid "" "Renames an existing animation with key [code]name[/code] to [code]newname[/" "code]." -msgstr "将键值为[code]name[/code]的现有动画é‡å‘½å为[code]newname[/code]。" +msgstr "将键å为 [code]name[/code] 的现有动画é‡å‘½å为 [code]newname[/code]。" #: doc/classes/AnimationPlayer.xml msgid "" @@ -7183,8 +7188,8 @@ msgstr "" "当剿’放的动画的å称。如果没有动画æ£åœ¨æ’放,该属性的值是一个空å—符串。改å˜è¿™" "个值ä¸ä¼šé‡æ–°å¯åŠ¨åŠ¨ç”»ã€‚å…³äºŽæ’æ”¾åŠ¨ç”»çš„æ›´å¤šä¿¡æ¯è¯·å‚阅 [method play]。\n" "[b]注æ„:[/b]虽然这个属性会出现在检查器ä¸ï¼Œä½†å®ƒä¸æ˜¯ç”¨æ¥ç¼–辑的,也ä¸ä¼šä¿å˜åœ¨åœº" -"景ä¸ã€‚该属性主è¦ç”¨äºŽèŽ·å–当剿’æ”¾çš„åŠ¨ç”»ï¼Œå†…éƒ¨ç”¨äºŽåŠ¨ç”»æ’æ”¾è½¨é“。有关详细信æ¯ï¼Œ" -"请å‚阅动画 [Animation]。" +"景ä¸ã€‚该属性主è¦ç”¨äºŽèŽ·å–当剿’æ”¾çš„åŠ¨ç”»ï¼Œå†…éƒ¨ç”¨äºŽåŠ¨ç”»æ’æ”¾è½¨é“。详情请å‚阅 " +"[Animation]。" #: doc/classes/AnimationPlayer.xml msgid "The length (in seconds) of the currently being played animation." @@ -7202,7 +7207,7 @@ msgstr "æ–¹æ³•è°ƒç”¨è½¨é“æ‰€ä½¿ç”¨çš„调用模å¼ã€‚" msgid "" "If [code]true[/code], updates animations in response to process-related " "notifications." -msgstr "如果[code]true[/code]ï¼Œæ ¹æ®æµç¨‹ç›¸å…³é€šçŸ¥æ›´æ–°åŠ¨ç”»ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œæ ¹æ®æµç¨‹ç›¸å…³é€šçŸ¥æ›´æ–°åŠ¨ç”»ã€‚" #: doc/classes/AnimationPlayer.xml msgid "" @@ -7421,7 +7426,7 @@ msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "Adds a [code]type[/code] node to the graph with name [code]id[/code]." -msgstr "æ·»åŠ [code]type[/code]节点到图示ä¸ï¼Œå称为[code]id[/code]。" +msgstr "æ·»åŠ [code]type[/code] 节点到图示ä¸ï¼Œå称为 [code]id[/code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7429,35 +7434,35 @@ msgid "" "seconds to shift. Events between the current frame and [code]delta[/code] " "are handled." msgstr "" -"移动动画时间轴上的ä½ç½®ã€‚[code]delta[/code]是移动的时间,å•使˜¯ç§’。当å‰å¸§å’Œ" -"[code]delta[/code]之间的事件被处ç†ã€‚" +"移动动画时间轴上的ä½ç½®ã€‚[code]delta[/code] 是移动的时间,å•使˜¯ç§’。当å‰å¸§å’Œ " +"[code]delta[/code] 之间的事件被处ç†ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the [AnimationPlayer]'s [Animation] bound to the " "[AnimationTreePlayer]'s animation node with name [code]id[/code]." msgstr "" -"返回与[AnimationTreePlayer]的动画节点绑定的[Animation],å称为[code]id[/" +"返回与 [AnimationTreePlayer] 的动画节点绑定的 [Animation],å称为 [code]id[/" "code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the name of the [member master_player]'s [Animation] bound to this " "animation node." -msgstr "返回与æ¤åŠ¨ç”»èŠ‚ç‚¹ç»‘å®šçš„[member master_player]çš„[Animation]å称。" +msgstr "返回与æ¤åŠ¨ç”»èŠ‚ç‚¹ç»‘å®šçš„ [member master_player] çš„ [Animation] å称。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the absolute playback timestamp of the animation node with name " "[code]id[/code]." -msgstr "返回å称为[code]id[/code]的动画节点的ç»å¯¹æ’放时间戳。" +msgstr "返回å称为 [code]id[/code] 的动画节点的ç»å¯¹æ’放时间戳。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Binds a new [Animation] from the [member master_player] to the " "[AnimationTreePlayer]'s animation node with name [code]id[/code]." msgstr "" -"å°†å称为[code]id[/code]的新[Animation]从[member master_player]绑定到" +"å°†å称为 [code]id[/code] 的新[Animation]从[member master_player]绑定到" "[AnimationTreePlayer]的动画节点。" #: doc/classes/AnimationTreePlayer.xml @@ -7466,8 +7471,8 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" -"如果[code]enable[/code]为 [code]true[/code],则ID为[code]id[/code]的动画节点" -"将关é—修改[code]path[/code]属性的轨é“。修改åŽçš„节点的å代继ç»è¿›è¡ŒåŠ¨ç”»å¤„ç†ã€‚" +"如果[code]enable[/code]为 [code]true[/code],则ID为 [code]id[/code] 的动画节" +"点将关é—修改[code]path[/code]属性的轨é“。修改åŽçš„节点的å代继ç»è¿›è¡ŒåŠ¨ç”»å¤„ç†ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7496,7 +7501,7 @@ msgid "" "influence of B gets raised. At 1, output is input B." msgstr "" "设置Blend2节点的混åˆé‡ï¼Œç»™å®šå…¶å称和值。\n" -"一个Blend2节点混åˆä¸¤ä¸ªåŠ¨ç”»ï¼ˆAå’ŒB),混åˆé‡åœ¨0到1之间。\n" +"一个Blend2节点混åˆä¸¤ä¸ªåŠ¨ç”»ï¼ˆAå’ŒB),混åˆé‡åœ¨0 到 1之间。\n" "在0的时候,输出是输入A。接近1的时候,A的影å“å˜å°ï¼ŒB的影å“å˜å¤§ã€‚在1时,输出是" "输入B。" @@ -7506,8 +7511,8 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" -"如果[code]enable[/code]是[code]true[/code],å称为[code]id[/code]çš„Blend2节点" -"会关é—修改[code]path[/code]处属性的轨é“。被修改的节点的å节点继ç»å¤„ç†åŠ¨ç”»ã€‚" +"如果[code]enable[/code]是[code]true[/code],å称为 [code]id[/code] çš„Blend2节" +"点会关é—修改[code]path[/code]处属性的轨é“。被修改的节点的å节点继ç»å¤„ç†åŠ¨ç”»ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the blend amount of a Blend3 node given its name." @@ -7526,8 +7531,8 @@ msgstr "" "设置一个Blend3节点的混åˆå€¼ï¼Œä¼ 入节点å和混åˆå€¼ã€‚\n" "Blend3节点使用-1~1ä¹‹é—´çš„ä¸€ä¸ªå€¼æ¥æ··åˆ3个动画 (A, B-, B+).\n" "值为-1时,输出动画为B-;值从-1到0时,B-的影å“å‡å¼±ï¼ŒA的影å“å˜å¼ºï¼ŒB+的影å“为0ï¼›" -"值为0时,输出为动画A;值从0到1时,A的影å“å‡å¼±ï¼ŒB+的影å“å˜å¼ºï¼ŒB-的影å“为0;值" -"为1时,输出为动画B+。" +"值为0时,输出为动画A;值从0 到 1时,A的影å“å‡å¼±ï¼ŒB+的影å“å˜å¼ºï¼ŒB-的影å“为0ï¼›" +"值为1时,输出为动画B+。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the blend amount of a Blend4 node given its name." @@ -7547,16 +7552,16 @@ msgstr "" msgid "" "Connects node [code]id[/code] to [code]dst_id[/code] at the specified input " "slot." -msgstr "将节点[code]id[/code]è¿žæŽ¥åˆ°æŒ‡å®šè¾“å…¥æ’æ§½çš„[code]dst_id[/code]。" +msgstr "将节点 [code]id[/code] è¿žæŽ¥åˆ°æŒ‡å®šè¾“å…¥æ’æ§½çš„ [code]dst_id[/code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Disconnects nodes connected to [code]id[/code] at the specified input slot." -msgstr "æ–å¼€åœ¨æŒ‡å®šè¾“å…¥æ’æ§½è¿žæŽ¥åˆ°[code]id[/code]的节点。" +msgstr "æ–å¼€åœ¨æŒ‡å®šè¾“å…¥æ’æ§½è¿žæŽ¥åˆ° [code]id[/code] 的节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns a [PoolStringArray] containing the name of all nodes." -msgstr "è¿”å›žåŒ…å«æ‰€æœ‰èŠ‚ç‚¹åç§°çš„[PoolStringArray]。" +msgstr "è¿”å›žåŒ…å«æ‰€æœ‰èŠ‚ç‚¹åç§°çš„ [PoolStringArray]。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the mix amount of a Mix node given its name." @@ -7590,7 +7595,7 @@ msgstr "返回给定其å称节点在图示ä¸çš„ä½ç½®ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Gets the node type, will return from [enum NodeType] enum." -msgstr "获å–节点类型,将从[enum NodeType]枚举ä¸è¿”回。" +msgstr "获å–节点类型,将从 [enum NodeType] 枚举ä¸è¿”回。" #: doc/classes/AnimationTreePlayer.xml msgid "Renames a node in the graph." @@ -7602,19 +7607,19 @@ msgstr "设置节点在图示ä¸çš„ä½ç½®ï¼Œç»™å®šå…¶åç§°å’Œä½ç½®ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the autostart delay of a OneShot node given its name." -msgstr "返回给定åç§°çš„OneShot节点的自动å¯åŠ¨å»¶è¿Ÿã€‚" +msgstr "返回给定åç§°çš„ OneShot 节点的自动å¯åŠ¨å»¶è¿Ÿã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the autostart random delay of a OneShot node given its name." -msgstr "返回给定åç§°çš„OneShot节点的自动å¯åŠ¨éšæœºå»¶è¿Ÿã€‚" +msgstr "返回给定åç§°çš„ OneShot 节点的自动å¯åŠ¨éšæœºå»¶è¿Ÿã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the fade in time of a OneShot node given its name." -msgstr "返回给定åç§°çš„OneShot节点的淡入时间。" +msgstr "返回给定åç§°çš„ OneShot 节点的淡入时间。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the fade out time of a OneShot node given its name." -msgstr "返回给定其åç§°çš„OneShot节点的淡出时间。" +msgstr "返回给定其åç§°çš„ OneShot 节点的淡出时间。" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node will auto restart given its name." @@ -7622,34 +7627,34 @@ msgstr "返回OneShot节点是å¦ä¼šæ ¹æ®å…¶åç§°è‡ªåŠ¨é‡æ–°å¯åŠ¨ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node is active given its name." -msgstr "返回指定åç§°çš„OneShot节点是å¦å¤„于活动状æ€ã€‚" +msgstr "返回指定åç§°çš„ OneShot 节点是å¦å¤„于活动状æ€ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart property of a OneShot node given its name and value." -msgstr "设置OneShot节点的自动å¯åŠ¨å±žæ€§ï¼Œç»™å®šå…¶å称和值。" +msgstr "设置 OneShot 节点的自动å¯åŠ¨å±žæ€§ï¼Œç»™å®šå…¶å称和值。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart delay of a OneShot node given its name and value in " "seconds." -msgstr "设置OneShot节点的自动å¯åŠ¨å»¶è¿Ÿï¼Œç»™å®šå…¶å称和值,å•ä½ç§’。" +msgstr "设置 OneShot 节点的自动å¯åŠ¨å»¶è¿Ÿï¼Œç»™å®šå…¶å称和值,å•ä½ç§’。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the autorestart random delay of a OneShot node given its name and value " "in seconds." -msgstr "设置OneShot节点的自动é‡å¯éšæœºå»¶è¿Ÿï¼Œç»™å®šå…¶å称和数值,å•ä½ç§’。" +msgstr "设置 OneShot 节点的自动é‡å¯éšæœºå»¶è¿Ÿï¼Œç»™å®šå…¶å称和数值,å•ä½ç§’。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade in time of a OneShot node given its name and value in seconds." -msgstr "设置OneShot节点的淡入时间,给定其å称和数值,å•ä½ç§’。" +msgstr "设置 OneShot 节点的淡入时间,给定其å称和数值,å•ä½ç§’。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Sets the fade out time of a OneShot node given its name and value in seconds." -msgstr "设置OneShot节点的淡出时间,给定其å称和数值,å•ä½ç§’。" +msgstr "设置 OneShot 节点的淡出时间,给定其å称和数值,å•ä½ç§’。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7657,16 +7662,17 @@ msgid "" "[code]id[/code] turns off the track modifying the property at [code]path[/" "code]. The modified node's children continue to animate." msgstr "" -"如果[code]enable[/code]是[code]true[/code],ID为[code]id[/code]çš„OneShot节点" -"会关é—修改[code]path[/code]处属性的轨é“。被修改的节点的å节点继ç»è¿›è¡ŒåŠ¨ç”»ã€‚" +"如果[code]enable[/code]是[code]true[/code],ID为 [code]id[/code] çš„ OneShot " +"节点会关é—修改[code]path[/code]处属性的轨é“。被修改的节点的å节点继ç»è¿›è¡ŒåЍ" +"画。" #: doc/classes/AnimationTreePlayer.xml msgid "Starts a OneShot node given its name." -msgstr "å¯åŠ¨æŒ‡å®šåç§°çš„OneShot节点。" +msgstr "å¯åŠ¨æŒ‡å®šåç§°çš„ OneShot 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Stops the OneShot node with name [code]id[/code]." -msgstr "åœæ¢å称为[code]id[/code]çš„OneShot节点。" +msgstr "åœæ¢å称为 [code]id[/code] çš„ OneShot 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7679,7 +7685,7 @@ msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "Removes the animation node with name [code]id[/code]." -msgstr "移除å称为[code]id[/code]的动画节点。" +msgstr "移除å称为 [code]id[/code] 的动画节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Resets this [AnimationTreePlayer]." @@ -7688,7 +7694,7 @@ msgstr "é‡ç½®æ¤ [AnimationTreePlayer]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the time scale value of the TimeScale node with name [code]id[/code]." -msgstr "返回å称为[code]id[/code]çš„TimeScale节点的时间缩放值。" +msgstr "返回å称为 [code]id[/code] çš„TimeScale节点的时间缩放值。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7699,7 +7705,7 @@ msgid "" "If applied after a blend or mix, affects all input animations to that blend " "or mix." msgstr "" -"设置å称为[code]id[/code]çš„TimeScale节点的时间缩放为[code]scale[/code]。\n" +"设置å称为 [code]id[/code] çš„TimeScale节点的时间缩放为[code]scale[/code]。\n" "时间缩放节点用æ¥åŠ å¿«[Animation]的速度,如果缩放高于1ï¼Œå°±ä¼šå‡æ…¢å®ƒä»¬ã€‚\n" "如果在混åˆåŽåº”用,会影å“到该混åˆçš„æ‰€æœ‰è¾“入动画。" @@ -7710,34 +7716,35 @@ msgid "" "This functions as a seek in the [Animation] or the blend or mix of " "[Animation]s input in it." msgstr "" -"设置å称为[code]id[/code]çš„TimeSeek节点的时间查寻值为[code]seconds[/code]。\n" +"设置å称为 [code]id[/code] çš„TimeSeek节点的时间查寻值为[code]seconds[/" +"code]。\n" "这在[Animation]或输入的[Animation]的混åˆä¸èµ·åˆ°æŸ¥å¯»çš„作用。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Deletes the input at [code]input_idx[/code] for the transition node with " "name [code]id[/code]." -msgstr "åˆ é™¤å称为[code]id[/code]的过渡节点的[code]input_idx[/code]的输入。" +msgstr "åˆ é™¤å称为 [code]id[/code] 的过渡节点的[code]input_idx[/code]的输入。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the index of the currently evaluated input for the transition node " "with name [code]id[/code]." -msgstr "返回å称为[code]id[/code]的过渡节点的当å‰è¯„估输入的索引。" +msgstr "返回å称为 [code]id[/code] 的过渡节点的当å‰è¯„估输入的索引。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the number of inputs for the transition node with name [code]id[/" "code]. You can add inputs by right-clicking on the transition node." msgstr "" -"返回å称为[code]id[/code]çš„è¿‡æ¸¡èŠ‚ç‚¹çš„è¾“å…¥æ•°ã€‚ä½ å¯ä»¥é€šè¿‡å³é”®ç‚¹å‡»è¿‡æ¸¡èŠ‚ç‚¹æ¥å¢žåŠ " -"输入。" +"返回å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹çš„è¾“å…¥æ•°ã€‚ä½ å¯ä»¥é€šè¿‡å³é”®ç‚¹å‡»è¿‡æ¸¡èŠ‚ç‚¹æ¥å¢ž" +"åŠ è¾“å…¥ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" "Returns the cross fade time for the transition node with name [code]id[/" "code]." -msgstr "返回å称为[code]id[/code]çš„è¿‡æ¸¡èŠ‚ç‚¹çš„äº¤å‰æ·¡åŒ–时间。" +msgstr "返回å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹çš„äº¤å‰æ·¡åŒ–时间。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7745,8 +7752,8 @@ msgid "" "transition node with name [code]id[/code] is set to automatically advance to " "the next input upon completion." msgstr "" -"如果过渡节点上å称为[code]id[/code]çš„[code]input_idx[/code]的输入被设置为在完" -"æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" +"如果过渡节点上å称为 [code]id[/code] çš„[code]input_idx[/code]的输入被设置为在" +"完æˆåŽè‡ªåЍå‰è¿›åˆ°ä¸‹ä¸€ä¸ªè¾“入,则返回 [code]true[/code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7760,26 +7767,27 @@ msgid "" "The transition node with name [code]id[/code] advances to its next input " "automatically when the input at [code]input_idx[/code] completes." msgstr "" -"当[code]input_idx[/code]处的输入完æˆåŽï¼Œå称为[code]id[/code]的过渡节点自动进" -"行到下一个输入。" +"当[code]input_idx[/code]处的输入完æˆåŽï¼Œå称为 [code]id[/code] 的过渡节点自动" +"进行到下一个输入。" #: doc/classes/AnimationTreePlayer.xml msgid "" "Resizes the number of inputs available for the transition node with name " "[code]id[/code]." -msgstr "调整å称为[code]id[/code]的过渡节点的å¯ç”¨è¾“入数。" +msgstr "调整å称为 [code]id[/code] 的过渡节点的å¯ç”¨è¾“入数。" #: doc/classes/AnimationTreePlayer.xml msgid "" "The transition node with name [code]id[/code] sets its cross fade time to " "[code]time_sec[/code]." msgstr "" -"å称为[code]id[/code]çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为[code]time_sec[/code]。" +"å称为 [code]id[/code] çš„è¿‡æ¸¡èŠ‚ç‚¹å°†å…¶äº¤å‰æ·¡åŒ–时间设置为[code]time_sec[/" +"code]。" #: doc/classes/AnimationTreePlayer.xml msgid "" "If [code]true[/code], the [AnimationTreePlayer] is able to play animations." -msgstr "如果[code]true[/code],[AnimationTreePlayer]å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" +msgstr "如果为 [code]true[/code],[AnimationTreePlayer]å°±èƒ½å¤Ÿæ’æ”¾åŠ¨ç”»ã€‚" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -7810,11 +7818,11 @@ msgstr "输出节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Animation node." -msgstr "Animation节点。" +msgstr "Animation 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "OneShot node." -msgstr "OneShot节点。" +msgstr "OneShot 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Mix node." @@ -7822,31 +7830,31 @@ msgstr "Mix 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Blend2 node." -msgstr "Blend2节点。" +msgstr "Blend2 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Blend3 node." -msgstr "Blend3节点。" +msgstr "Blend3 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Blend4 node." -msgstr "Blend4节点。" +msgstr "Blend4 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "TimeScale node." -msgstr "TimeScale节点。" +msgstr "TimeScale 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "TimeSeek node." -msgstr "TimeSeek节点。" +msgstr "TimeSeek 节点。" #: doc/classes/AnimationTreePlayer.xml msgid "Transition node." -msgstr "Transition节点。" +msgstr "Transition 节点。" #: doc/classes/Area.xml msgid "3D area for detection and physics and audio influence." -msgstr "用于检测和物ç†åŠéŸ³é¢‘å½±å“çš„3D区域。" +msgstr "用于检测和物ç†åŠéŸ³é¢‘å½±å“çš„ 3D 区域。" #: doc/classes/Area.xml msgid "" @@ -7854,8 +7862,8 @@ msgid "" "exiting. Can also alter or override local physics parameters (gravity, " "damping) and route audio to custom audio buses." msgstr "" -"检测[CollisionObject]节点é‡å ã€è¿›å…¥æˆ–退出的3D区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物ç†å‚" -"数(é‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到自定义音频总线。" +"检测 [CollisionObject] 节点é‡å ã€è¿›å…¥æˆ–退出的 3D 区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物" +"ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到自定义音频总线。" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -7899,7 +7907,7 @@ msgid "" "For performance, list of overlaps is updated once per frame and before the " "physics step. Consider using signals instead." msgstr "" -"如果 [code]true[/code],则给定区域与该区域é‡å .\n" +"如果为 [code]true[/code],则给定区域与该区域é‡å .\n" "[b]注æ„:[/b]在移动物体åŽï¼Œè¿™ä¸ªæµ‹è¯•çš„ç»“æžœä¸æ˜¯å³æ—¶çš„。为了性能,é‡å 列表在æ¯ä¸€" "å¸§å’Œç‰©ç†æ¥éª¤ä¹‹å‰æ›´æ–°ä¸€æ¬¡ã€‚å¯ä»¥è€ƒè™‘用信å·ä»£æ›¿ã€‚" @@ -7916,8 +7924,8 @@ msgstr "" "如果为 [code]true[/code],则给定的物ç†ä½“与该区域é‡å .\n" "[b]注æ„:[/b]在移动物体åŽï¼Œè¿™ä¸ªæµ‹è¯•çš„ç»“æžœä¸æ˜¯å³æ—¶çš„。为了æé«˜æ€§èƒ½ï¼Œé‡å 列表在" "æ¯ä¸€å¸§å’Œç‰©ç†æ¥éª¤ä¹‹å‰æ›´æ–°ä¸€æ¬¡ã€‚å¯ä»¥è€ƒè™‘ä½¿ç”¨ä¿¡å·æ¥ä»£æ›¿ã€‚\n" -"[code]body[/code]傿•°å¯ä»¥æ˜¯ä¸€ä¸ª[PhysicsBody]或一个[GridMap]实例(虽然GridMaps" -"æœ¬èº«ä¸æ˜¯ç‰©ç†ä½“,但它们用碰撞形状注册它们的瓦片(tiles)作为一个虚拟物ç†ä½“)。" +"[code]body[/code] 傿•°å¯ä»¥æ˜¯ [PhysicsBody] 或 [GridMap] 实例(虽然 GridMap 本" +"èº«ä¸æ˜¯ç‰©ç†ä½“,但它们用碰撞形状注册它们的图å—作为一个虚拟物ç†ä½“)。" #: doc/classes/Area.xml msgid "" @@ -7959,7 +7967,7 @@ msgid "" "If [code]true[/code], gravity is calculated from a point (set via [member " "gravity_vec]). See also [member space_override]." msgstr "" -"如果 [code]true[/code],则从一个点计算é‡åŠ›ï¼ˆé€šè¿‡ [member gravity_vec] 设" +"如果为 [code]true[/code],则从一个点计算é‡åŠ›ï¼ˆé€šè¿‡ [member gravity_vec] 设" "置)。å‚阅 [member space_override]。" #: doc/classes/Area.xml doc/classes/Area2D.xml @@ -8023,7 +8031,7 @@ msgstr "" msgid "" "Override mode for gravity and damping calculations within this area. See " "[enum SpaceOverride] for possible values." -msgstr "该区域内é‡åŠ›å’Œé˜»å°¼è®¡ç®—çš„è¦†ç›–æ¨¡å¼ã€‚å¯èƒ½çš„值è§[enum SpaceOverride]。" +msgstr "该区域内é‡åŠ›å’Œé˜»å°¼è®¡ç®—çš„è¦†ç›–æ¨¡å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum SpaceOverride]。" #: doc/classes/Area.xml msgid "" @@ -8079,11 +8087,11 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" -"当[PhysicsBody]或[GridMap]进入这个区域时å‘出的。需è¦å°†ç›‘控[member monitoring]" -"设置为 [code]true[/code]。如果[MeshLibrary]有碰撞形状[Shape],就会检测到" -"[GridMap]。\n" -"[code]body[/code], 如果它å˜åœ¨äºŽåœºæ™¯æ ‘ä¸, 是å¦ä¸€ä¸ª[PhysicsBody]或[GridMap]节点" -"[Node]。" +"当 [PhysicsBody] 或 [GridMap] 进入这个区域时å‘出的。需è¦å°† [member " +"monitoring] 设置为 [code]true[/code]。如果 [MeshLibrary] 有碰撞形状 [Shape]," +"就会检测到 [GridMap]。\n" +"[code]body[/code], 如果它å˜åœ¨äºŽåœºæ™¯æ ‘ä¸, 是å¦ä¸€ä¸ª [PhysicsBody] 或 [GridMap] " +"节点 [Node]。" #: doc/classes/Area.xml msgid "" @@ -8093,11 +8101,11 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody] or [GridMap]." msgstr "" -"当[PhysicsBody]或[GridMap]离开这个Areaæ—¶å‘出的。需è¦å°†ç›‘控[member monitoring]" -"设置为 [code]true[/code]。如果[MeshLibrary]有碰撞形状[Shape],就会检测到" -"[GridMap]。\n" -"[code]body[/code], 如果它å˜åœ¨äºŽåœºæ™¯æ ‘ä¸, 是其他[PhysicsBody]或[GridMap]çš„" -"[Node]。" +"当 [PhysicsBody] 或 [GridMap] 离开这个 Area æ—¶å‘出的。需è¦å°† [member " +"monitoring] 设置为 [code]true[/code]。如果 [MeshLibrary] 有碰撞形状 [Shape]," +"就会检测到 [GridMap]。\n" +"[code]body[/code], 如果它å˜åœ¨äºŽåœºæ™¯æ ‘ä¸, 是其他 [PhysicsBody] 或 [GridMap] " +"çš„ [Node]。" #: doc/classes/Area.xml msgid "" @@ -8115,18 +8123,19 @@ msgid "" "the [PhysicsServer]. Get the [CollisionShape] node with [code]self." "shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当[PhysicsBody]或[GridMap]的一个[Shape]进入这个区域的一个[Shape]时触å‘。需è¦" -"å°†[member monitoring]设置为 [code]true[/code]。如果[MeshLibrary]有碰撞" -"[Shape],就会检测到[GridMap]。\n" -"[code]body_rid[/code] [PhysicsServer]使用的[PhysicsBody]或[MeshLibrary]çš„" -"[CollisionObject]çš„[RID]。\n" -"[code]body[/code] [PhysicsBody]或[GridMap]çš„[Node],如果它å˜åœ¨äºŽæ ‘ä¸çš„è¯ã€‚\n" -"[code]body_shape_index[/code] [PhysicsServer]使用的[PhysicsBody]或[GridMap]çš„" -"[Shape]的索引。用[code]body.shape_owner_get_owner(body_shape_index)[/code]获" -"å–[CollisionShape]节点。\n" -"[code]local_shape_index[/code]这个区域的[Shape]的索引,由[PhysicsServer]使" -"用。用[code]self.shape_owner_get_owner(local_shape_index)[/code]获得" -"[CollisionShape]节点。" +"当 [PhysicsBody] 或 [GridMap] 的一个 [Shape] 进入这个区域的一个 [Shape] 时触" +"å‘。需è¦å°† [member monitoring] 设置为 [code]true[/code]。如果 [MeshLibrary] " +"有碰撞 [Shape],就会检测到 [GridMap]。\n" +"[code]body_rid[/code] [PhysicsServer] 使用的 [PhysicsBody] 或 [MeshLibrary] " +"çš„ [CollisionObject] çš„ [RID]。\n" +"[code]body[/code] [PhysicsBody] 或 [GridMap] çš„ [Node],如果它å˜åœ¨äºŽæ ‘ä¸çš„" +"è¯ã€‚\n" +"[code]body_shape_index[/code] [PhysicsServer] 使用的 [PhysicsBody] 或 " +"[GridMap] çš„ [Shape]的索引。用 [code]body." +"shape_owner_get_owner(body_shape_index)[/code] èŽ·å– [CollisionShape] 节点。\n" +"[code]local_shape_index[/code] 这个区域的 [Shape] 的索引,由 [PhysicsServer] " +"使用。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] 获得 " +"[CollisionShape] 节点。" #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "This area does not affect gravity/damping." @@ -8172,8 +8181,8 @@ msgid "" "exiting. Can also alter or override local physics parameters (gravity, " "damping) and route audio to a custom audio bus." msgstr "" -"检测[CollisionObject2D]节点é‡å ã€è¿›å…¥æˆ–退出的2D区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物ç†" -"傿•°ï¼ˆé‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到一个自定义的音频总线。" +"检测 [CollisionObject2D] 节点é‡å ã€è¿›å…¥æˆ–退出的2D区域。还å¯ä»¥æ”¹å˜æˆ–覆盖局部物" +"ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ï¼Œå¹¶å°†éŸ³é¢‘路由到一个自定义的音频总线。" #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -8227,7 +8236,7 @@ msgid "" "For performance, the list of overlaps is updated once per frame and before " "the physics step. Consider using signals instead." msgstr "" -"如果 [code]true[/code],则给定区域与该区域é‡å 。\n" +"如果为 [code]true[/code],则给定区域与该区域é‡å 。\n" "[b]注æ„:[/b]在移动物体åŽï¼Œè¿™ä¸ªæµ‹è¯•çš„ç»“æžœä¸æ˜¯å³æ—¶çš„。为了性能,é‡å 列表在æ¯ä¸€" "å¸§å’Œç‰©ç†æ¥éª¤ä¹‹å‰æ›´æ–°ä¸€æ¬¡ã€‚å¯ä»¥è€ƒè™‘用信å·ä»£æ›¿ã€‚" @@ -8241,11 +8250,11 @@ msgid "" "[TileMap] instance (while TileMaps are not physics bodies themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" -"如果[code]true[/code],给定的物ç†ä½“就与Area2Då‘生é‡å 。\n" +"如果为 [code]true[/code],给定的物ç†ä½“就与 Area2D å‘生é‡å 。\n" "[b]注æ„:[/b]在移动物体åŽï¼Œè¿™ä¸ªæµ‹è¯•çš„ç»“æžœä¸æ˜¯å³æ—¶çš„。为了性能,é‡å 列表在æ¯ä¸€" "å¸§å’Œç‰©ç†æ¥éª¤ä¹‹å‰æ›´æ–°ä¸€æ¬¡ã€‚å¯ä»¥è€ƒè™‘ä½¿ç”¨ä¿¡å·æ¥ä»£æ›¿ã€‚\n" -"[code]body[/code]傿•°å¯ä»¥æ˜¯ä¸€ä¸ª[PhysicsBody2D]或一个[TileMap]实例(虽然" -"TileMapsæœ¬èº«ä¸æ˜¯ç‰©ç†ä½“,但它们用碰撞形状注册它们的瓦片作为一个虚拟物ç†ä½“)。" +"[code]body[/code] 傿•°å¯ä»¥æ˜¯ [PhysicsBody2D] 或 [TileMap] 实例(虽然 TileMap " +"æœ¬èº«ä¸æ˜¯ç‰©ç†ä½“,但它们用碰撞形状注册它们的图å—作为一个虚拟物ç†ä½“)。" #: doc/classes/Area2D.xml msgid "" @@ -8284,9 +8293,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" -"当å¦ä¸€ä¸ªArea2D进入这个Area2Dæ—¶å‘出的。需è¦å°†ç›‘控[member monitoring]设置为 " +"当å¦ä¸€ä¸ª Area2D 进入这个 Area2D æ—¶å‘出的。需è¦å°† [member monitoring] 设置为 " "[code]true[/code]。\n" -"[code]area[/code]傿•°æ˜¯å…¶ä»–Area2D。" +"[code]area[/code] 傿•°æ˜¯å¯¹æ–¹ Area2D。" #: doc/classes/Area2D.xml msgid "" @@ -8294,9 +8303,9 @@ msgid "" "to be set to [code]true[/code].\n" "[code]area[/code] the other Area2D." msgstr "" -"当å¦ä¸€ä¸ªArea2D离开这个Area2Dæ—¶å‘å‡ºçš„ã€‚è¦æ±‚监控[member monitoring]被设置为 " +"当å¦ä¸€ä¸ª Area2D 离开这个 Area2D æ—¶å‘å‡ºçš„ã€‚è¦æ±‚ [member monitoring] 被设置为 " "[code]true[/code]。\n" -"[code]area[/code]傿•°æ˜¯å…¶ä»–Area2D。" +"[code]area[/code] 傿•°æ˜¯å¯¹æ–¹ Area2D。" #: doc/classes/Area2D.xml msgid "" @@ -8312,17 +8321,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当å¦ä¸€ä¸ªArea2Dçš„[Shape2D]进入æ¤Area2Dçš„[Shape2D]时触å‘。需è¦å°† [member " -"monitoring] 设置为 [code]true[/code]。\n" -"[code]area_rid[/code] ç”±[Physics2DServer]使用的其他Area2Dçš„" -"[CollisionObject2D]çš„[RID]。\n" -"[code]area[/code] å…¶ä»–Area2D。\n" -"[code]area_shape_index[/code][Physics2DServer]使用的其他Area2Dçš„[Shape2D]的索" -"引。用[code]area.shape_owner_get_owner(area_shape_index)[/code]获得" -"[CollisionShape2D]节点。\n" -"[code]local_shape_index[/code]æ¤Area2Dçš„[Shape2D]的索引,由[Physics2DServer]" -"使用。用[code]self.shape_owner_get_owner(local_shape_index)[/code]获å–" -"[CollisionShape2D]节点。" +"当å¦ä¸€ä¸ª Area2D çš„ [Shape2D] 进入这个 Area2D çš„æŸä¸ª [Shape2D] 时触å‘ã€‚è¦æ±‚ " +"[member monitoring] 设置为 [code]true[/code]。\n" +"[code]area_rid[/code] ç”± [Physics2DServer] 使用的对方 Area2D çš„ " +"[CollisionObject2D] çš„ [RID]。\n" +"[code]area[/code] 对方 Area2D。\n" +"[code]area_shape_index[/code] [Physics2DServer] 使用的对方 Area2D çš„ " +"[Shape2D] 的索引。用 [code]area.shape_owner_get_owner(area_shape_index)[/" +"code] 获得 [CollisionShape2D] 节点。\n" +"[code]local_shape_index[/code] æ¤ Area2D çš„ [Shape2D] 的索引,由 " +"[Physics2DServer] 使用。用 [code]self." +"shape_owner_get_owner(local_shape_index)[/code] èŽ·å– [CollisionShape2D] 节" +"点。" #: doc/classes/Area2D.xml msgid "" @@ -8338,17 +8348,18 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当å¦ä¸€ä¸ªArea2Dçš„[Shape2D]退出这个Area2Dçš„[Shape2D]之一时触å‘ã€‚è¦æ±‚[member " -"monitoring] 被设置为 [code]true[/code]。\n" -"[code]area_rid[/code] ç”±[Physics2DServer]使用的其他Area2Dçš„" -"[CollisionObject2D]çš„[RID]。\n" -"[code]area[/code] å…¶ä»–Area2D。\n" -"[code]area_shape_index[/code][Physics2DServer]使用的其他Area2Dçš„[Shape2D]的索" -"引。用[code]area.shape_owner_get_owner(area_shape_index)[/code]获å–" -"[CollisionShape2D]节点。\n" -"[code]local_shape_index[/code]这个Area2Dçš„[Shape2D]的索引,由" -"[Physics2DServer]使用。用[code]self.shape_owner_get_owner(local_shape_index)" -"[/code]获得[CollisionShape2D]节点。" +"当å¦ä¸€ä¸ª Area2D çš„ [Shape2D] 退出这个 Area2D çš„æŸä¸ª [Shape2D] 时触å‘ã€‚è¦æ±‚ " +"[member monitoring] 设置为 [code]true[/code]。\n" +"[code]area_rid[/code] ç”± [Physics2DServer] 使用的对方 Area2D çš„ " +"[CollisionObject2D] çš„ [RID]。\n" +"[code]area[/code] 对方 Area2D。\n" +"[code]area_shape_index[/code] [Physics2DServer] 使用的对方 Area2D çš„ " +"[Shape2D] 的索引。用 [code]area.shape_owner_get_owner(area_shape_index)[/" +"code] èŽ·å– [CollisionShape2D] 节点。\n" +"[code]local_shape_index[/code] 这个 Area2D çš„ [Shape2D] 的索引,由 " +"[Physics2DServer] 使用。用 [code]self." +"shape_owner_get_owner(local_shape_index)[/code] 获得 [CollisionShape2D] 节" +"点。" #: doc/classes/Area2D.xml msgid "" @@ -8358,11 +8369,11 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" -"当一个[PhysicsBody2D]或[TileMap]进入这个Area2Dæ—¶å‘出的。需è¦å°†ç›‘控[member " -"monitoring]设置为 [code]true[/code]。如果[TileSet]有碰撞形状[Shape2D],则检测" -"到[TileMap]。\n" -"[code]body[/code]傿•°æ˜¯å…¶ä»–[PhysicsBody2D]或[TileMap]çš„[Node],如果它å˜åœ¨äºŽæ ‘" -"ä¸ã€‚" +"当一个 [PhysicsBody2D] 或 [TileMap] 进入这个 Area2D æ—¶å‘出的。需è¦å°† [member " +"monitoring] 设置为 [code]true[/code]。如果 [TileSet] 有碰撞形状 [Shape2D],则" +"检测到 [TileMap]。\n" +"[code]body[/code] 傿•°æ˜¯å…¶ä»– [PhysicsBody2D] 或 [TileMap] çš„ [Node],如果它å˜" +"åœ¨äºŽæ ‘ä¸ã€‚" #: doc/classes/Area2D.xml msgid "" @@ -8396,19 +8407,20 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当[PhysicsBody2D]或[TileMap]çš„[Shape2D]之一进入æ¤Area2Dçš„[Shape2D]之一时触" -"å‘。需è¦å°†[member monitoring]设置为 [code]true[/code]。如果[TileSet]有" -"Collision[Shape2D],就会检测到[TileMap]。\n" -"[code]body_rid[/code] [Physics2DServer]使用的[PhysicsBody2D]或[TileSet]çš„" -"[CollisionObject2D]çš„[RID]。\n" -"[code]body[/code] [PhysicsBody2D]或[TileMap]çš„[Node]ï¼Œå¦‚æžœå®ƒåœ¨æ ‘ä¸Šå˜åœ¨çš„" +"当 [PhysicsBody2D] 或 [TileMap] çš„ [Shape2D] ä¹‹ä¸€è¿›å…¥æ¤ Area2D çš„ [Shape2D] " +"之一时触å‘。需è¦å°† [member monitoring] 设置为 [code]true[/code]。如果 " +"[TileSet] 有 Collision [Shape2D],就会检测到 [TileMap]。\n" +"[code]body_rid[/code] [Physics2DServer] 使用的 [PhysicsBody2D] 或 [TileSet] " +"çš„ [CollisionObject2D] çš„ [RID]。\n" +"[code]body[/code] [PhysicsBody2D] 或 [TileMap] çš„ [Node]ï¼Œå¦‚æžœå®ƒåœ¨æ ‘ä¸Šå˜åœ¨çš„" "è¯ã€‚\n" -"[code]body_shape_index[/code] [Physics2DServer]使用的[PhysicsBody2D]或" -"[TileMap]çš„[Shape2D]的索引。用[code]body." -"shape_owner_get_owner(body_shape_index)[/code]获得[CollisionShape2D]节点。\n" -"[code]local_shape_index[/code]æ¤Area2Dçš„[Shape2D]的索引,由[Physics2DServer]" -"使用。用[code]self.shape_owner_get_owner(local_shape_index)[/code]获得" -"[CollisionShape2D]节点。" +"[code]body_shape_index[/code] [Physics2DServer] 使用的 [PhysicsBody2D] 或 " +"[TileMap] çš„ [Shape2D] 的索引。用[code]body." +"shape_owner_get_owner(body_shape_index)[/code] 获得 [CollisionShape2D] 节" +"点。\n" +"[code]local_shape_index[/code] 这个 Area2D çš„ [Shape2D] 的索引,由 " +"[Physics2DServer] 使用。用[code]self.shape_owner_get_owner(local_shape_index)" +"[/code]获得[CollisionShape2D]节点。" #: doc/classes/Area2D.xml msgid "" @@ -8428,19 +8440,20 @@ msgid "" "used by the [Physics2DServer]. Get the [CollisionShape2D] node with " "[code]self.shape_owner_get_owner(local_shape_index)[/code]." msgstr "" -"当[PhysicsBody2D]或[TileMap]的一个[Shape2D]退出这个Area2D的一个[Shape2D]æ—¶å‘" -"出的。需è¦å°†[member monitoring]设置为 [code]true[/code]。如果[TileSet]有碰撞" -"[Shape2D],就会检测到[TileMap]。\n" -"[code]body_rid[/code] 是[Physics2DServer]使用的[PhysicsBody2D]或[TileSet]çš„" -"[CollisionObject2D]çš„[RID]。\n" -"[code]body[/code] [PhysicsBody2D]或[TileMap]çš„[Node]ï¼Œå¦‚æžœå®ƒåœ¨æ ‘ä¸Šå˜åœ¨çš„" +"当 [PhysicsBody2D] 或 [TileMap] 的一个 [Shape2D] 退出这个 Area2D 的一个 " +"[Shape2D] æ—¶å‘出的。需è¦å°† [member monitoring] 设置为 [code]true[/code]。如果" +"[TileSet] 有碰撞 [Shape2D],就会检测到 [TileMap]。\n" +"[code]body_rid[/code] 是[Physics2DServer] 使用的 [PhysicsBody2D] 或 " +"[TileSet] çš„ [CollisionObject2D] çš„ [RID]。\n" +"[code]body[/code] [PhysicsBody2D] 或 [TileMap] çš„ [Node]ï¼Œå¦‚æžœå®ƒåœ¨æ ‘ä¸Šå˜åœ¨çš„" "è¯ã€‚\n" -"[code]body_shape_index[/code] [Physics2DServer]使用的[PhysicsBody2D]或" -"[TileMap]çš„[Shape2D]的索引。用[code]body." -"shape_owner_get_owner(body_shape_index)[/code]获å–[CollisionShape2D]节点。\n" -"[code]local_shape_index[/code]æ¤Area2Dçš„[Shape2D]的索引,由[Physics2DServer]" -"使用。用[code]self.shape_owner_get_owner(local_shape_index)[/code]获å–" -"[CollisionShape2D]节点。" +"[code]body_shape_index[/code] [Physics2DServer] 使用的 [PhysicsBody2D] 或 " +"[TileMap] çš„ [Shape2D]的索引。用[code]body." +"shape_owner_get_owner(body_shape_index)[/code] èŽ·å– [CollisionShape2D] 节" +"点。\n" +"[code]local_shape_index[/code] 这个 Area2D çš„ [Shape2D] 的索引,由 " +"[Physics2DServer] 使用。用 [code]self." +"shape_owner_get_owner(local_shape_index)[/code]获å–[CollisionShape2D]节点。" #: doc/classes/Array.xml msgid "A generic array datatype." @@ -8659,7 +8672,7 @@ msgstr "" msgid "" "Clears the array. This is equivalent to using [method resize] with a size of " "[code]0[/code]." -msgstr "清空数组。与调用 [method resize] 时指定大å°ä¸º [code]0[/code] ç‰ä»·ã€‚" +msgstr "清空数组。相当于调用 [method resize] 时指定大å°ä¸º [code]0[/code]。" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml #: doc/classes/PoolColorArray.xml doc/classes/PoolIntArray.xml @@ -8781,7 +8794,7 @@ msgstr "" "[\"inside\", 7].has(7) # True\n" "[\"inside\", 7].has(\"7\") # False\n" "[/codeblock]\n" -"[b]注æ„:[/b]è¿™ç‰åŒäºŽä½¿ç”¨ [code]in[/code] æ“作符,如下所示。\n" +"[b]注æ„:[/b]相当于使用 [code]in[/code] æ“作符,如下所示。\n" "[codeblock]\n" "# 将评估为 `true`。\n" "if 2 in [2, 4, 6, 8]:\n" @@ -8854,13 +8867,13 @@ msgid "" "removed element. The larger the array and the lower the index of the removed " "element, the slower [method pop_at] will be." msgstr "" -"移除并返回索引[code]position[/code]å¤„çš„æ•°ç»„å…ƒç´ ã€‚å¦‚æžœæ˜¯è´Ÿæ•°ï¼Œ[code]position[/" -"code]被认为是相对于数组的末端。如果数组是空的或者被越界访问,则ä¿ç•™æ•°ç»„ä¸åŠ¨ï¼Œ" -"并返回 [code]null[/code]。当数组被越界访问时,会打å°å‡ºä¸€æ¡é”™è¯¯ä¿¡æ¯ï¼Œä½†å½“数组" -"为空时,则ä¸ä¼šã€‚\n" -"[b]注æ„:[/b]在大的数组上,这个方法å¯èƒ½æ¯”[method pop_back]æ…¢ï¼Œå› ä¸ºå®ƒå°†é‡æ–°ç´¢" -"引ä½äºŽè¢«ç§»é™¤å…ƒç´ 之åŽçš„æ•°ç»„å…ƒç´ ã€‚æ•°ç»„è¶Šå¤§ï¼Œè¢«ç§»é™¤å…ƒç´ çš„ç´¢å¼•è¶Šä½Žï¼Œ[method " -"pop_at]的速度就越慢。" +"移除并返回索引 [code]position[/code] å¤„çš„æ•°ç»„å…ƒç´ ã€‚å¦‚æžœæ˜¯è´Ÿæ•°ï¼Œä¼šè®¤ä¸º " +"[code]position[/code] 是相对于数组的末端。如果数组是空的或者被越界访问,则ä¿" +"留数组ä¸åŠ¨ï¼Œå¹¶è¿”å›ž [code]null[/code]。当数组被越界访问时,会打å°å‡ºä¸€æ¡é”™è¯¯ä¿¡" +"æ¯ï¼Œä½†å½“数组为空时,则ä¸ä¼šã€‚\n" +"[b]注æ„:[/b]在大的数组上,这个方法å¯èƒ½æ¯” [method pop_back] æ…¢ï¼Œå› ä¸ºå®ƒå°†é‡æ–°" +"索引ä½äºŽè¢«ç§»é™¤å…ƒç´ 之åŽçš„æ•°ç»„å…ƒç´ ã€‚æ•°ç»„è¶Šå¤§ï¼Œè¢«ç§»é™¤å…ƒç´ çš„ç´¢å¼•è¶Šä½Žï¼Œ[method " +"pop_at] 的速度就越慢。" #: doc/classes/Array.xml msgid "" @@ -9146,25 +9159,25 @@ msgstr "返回æ¤ç´¢å¼•处的混åˆå½¢çŠ¶çš„å称。" msgid "" "Will perform a UV unwrap on the [ArrayMesh] to prepare the mesh for " "lightmapping." -msgstr "将在[ArrayMesh]上执行UVå±•å¼€ï¼Œä»¥å‡†å¤‡ç”¨äºŽå…‰ç…§è´´å›¾çš„ç½‘æ ¼ã€‚" +msgstr "将在 [ArrayMesh] 上执行 UV å±•å¼€ï¼Œä»¥å‡†å¤‡ç”¨äºŽå…‰ç…§è´´å›¾çš„ç½‘æ ¼ã€‚" #: doc/classes/ArrayMesh.xml msgid "Will regenerate normal maps for the [ArrayMesh]." -msgstr "将为[ArrayMesh]釿–°ç”Ÿæˆæ³•线图。" +msgstr "将为 [ArrayMesh] 釿–°ç”Ÿæˆæ³•线图。" #: doc/classes/ArrayMesh.xml msgid "" "Returns the index of the first surface with this name held within this " "[ArrayMesh]. If none are found, -1 is returned." msgstr "" -"返回æ¤[ArrayMesh]ä¸å¸¦æœ‰æ¤å称的第一个曲é¢çš„索引。如果没有找到,则返回-1。" +"è¿”å›žæ¤ [ArrayMesh] ä¸å¸¦æœ‰æ¤å称的第一个曲é¢çš„索引。如果没有找到,则返回 -1。" #: doc/classes/ArrayMesh.xml msgid "" "Returns the length in indices of the index array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -"返回请求的曲é¢çš„索引数组的长度,以指数为å•ä½ï¼ˆè¯·å‚阅 [method " +"返回请求的曲é¢çš„索引数组的长度,以指数为å•ä½ï¼ˆè§ [method " "add_surface_from_arrays])。" #: doc/classes/ArrayMesh.xml @@ -9172,14 +9185,13 @@ msgid "" "Returns the length in vertices of the vertex array in the requested surface " "(see [method add_surface_from_arrays])." msgstr "" -"返回所请求曲é¢ä¸é¡¶ç‚¹æ•°ç»„的顶点长度(请å‚阅[method " -"add_surface_from_arrays])。" +"返回所请求曲é¢ä¸é¡¶ç‚¹æ•°ç»„çš„é¡¶ç‚¹é•¿åº¦ï¼ˆè§ [method add_surface_from_arrays])。" #: doc/classes/ArrayMesh.xml msgid "" "Returns the format mask of the requested surface (see [method " "add_surface_from_arrays])." -msgstr "返回所请求表é¢çš„æ ¼å¼æŽ©ç (请å‚阅[method add_surface_from_arrays])。" +msgstr "返回所请求表é¢çš„æ ¼å¼æŽ©ç ï¼ˆè§ [method add_surface_from_arrays])。" #: doc/classes/ArrayMesh.xml msgid "Gets the name assigned to this surface." @@ -9189,15 +9201,15 @@ msgstr "获å–分é…ç»™æ¤è¡¨é¢çš„å称。" msgid "" "Returns the primitive type of the requested surface (see [method " "add_surface_from_arrays])." -msgstr "返回所请求曲é¢çš„图元类型(请å‚阅 [method add_surface_from_arrays])。" +msgstr "返回所请求曲é¢çš„å›¾å…ƒç±»åž‹ï¼ˆè§ [method add_surface_from_arrays])。" #: doc/classes/ArrayMesh.xml msgid "" "Removes a surface at position [code]surf_idx[/code], shifting greater " "surfaces one [code]surf_idx[/code] slot down." msgstr "" -"移除ä½ç½®[code]surf_idx[/code]的一个é¢ï¼Œå°†è¾ƒå¤§çš„é¢å‘下移动一个[code]surf_idx[/" -"code]槽。" +"移除ä½ç½® [code]surf_idx[/code] 的一个é¢ï¼Œå°†è¾ƒå¤§çš„é¢å‘下移动一个 " +"[code]surf_idx[/code] 槽。" #: doc/classes/ArrayMesh.xml msgid "Sets a name for a given surface." @@ -9223,7 +9235,7 @@ msgid "" "Especially useful to avoid unexpected culling when using a shader to offset " "vertices." msgstr "" -"ç”¨ç”¨æˆ·å®šä¹‰çš„ç”¨äºŽä½¿ç”¨è§†é”¥å‰”é™¤çš„ä¸€ç§æ›¿ä»£[AABB]。在使用ç€è‰²å™¨å移顶点时,é¿å…éž" +"ç”¨ç”¨æˆ·å®šä¹‰çš„ç”¨äºŽä½¿ç”¨è§†é”¥å‰”é™¤çš„ä¸€ç§æ›¿ä»£ [AABB]。在使用ç€è‰²å™¨å移顶点时,é¿å…éž" "预期的剔除特别有用。" #: doc/classes/ArrayMesh.xml @@ -9236,7 +9248,7 @@ msgstr "æ¯ä¸ªé¡¶ç‚¹çš„æƒé‡/骨指数é‡ï¼ˆå§‹ç»ˆä¸º 4)。" #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array], [PoolVector2Array], or [Array] of vertex positions." -msgstr "[PoolVector3Array], [PoolVector2Array], 或[Array]的顶点ä½ç½®ã€‚" +msgstr "[PoolVector3Array]ã€[PoolVector2Array] 或 [Array] 的顶点ä½ç½®ã€‚" #: doc/classes/ArrayMesh.xml msgid "[PoolVector3Array] of vertex normals." @@ -9248,8 +9260,8 @@ msgid "" "first 3 floats determine the tangent, and the last the binormal direction as " "-1 or 1." msgstr "" -"顶点切线的[PoolRealArray]。æ¯ä¸ªå…ƒç´ 以4个浮点数为一组,å‰3个浮点数决定切线,最" -"åŽä¸€ä¸ªæ˜¯-1或1çš„åŒæ³•线方å‘。" +"顶点切线的 [PoolRealArray]。æ¯ä¸ªå…ƒç´ 以 4 ä¸ªæµ®ç‚¹æ•°ä¸ºä¸€ç»„ï¼Œå‰ 3 个浮点数决定切" +"线,最åŽä¸€ä¸ªæ˜¯ -1 或 1 çš„åŒæ³•线方å‘。" #: doc/classes/ArrayMesh.xml msgid "[PoolColorArray] of vertex colors." @@ -9257,21 +9269,22 @@ msgstr "[PoolColorArray] 顶点颜色。" #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for UV coordinates." -msgstr "[PoolVector2Array] 用于UVåæ ‡ã€‚" +msgstr "[PoolVector2Array] 用于 UV åæ ‡ã€‚" #: doc/classes/ArrayMesh.xml msgid "[PoolVector2Array] for second UV coordinates." -msgstr "[PoolVector2Array]用于第二UVåæ ‡ã€‚" +msgstr "[PoolVector2Array] 用于第二 UV åæ ‡ã€‚" #: doc/classes/ArrayMesh.xml msgid "" "[PoolRealArray] or [PoolIntArray] of bone indices. Each element in groups of " "4 floats." -msgstr "[PoolRealArray]或[PoolIntArray]的骨骼索引。æ¯ä¸ªå…ƒç´ 以4个浮点数为一组。" +msgstr "" +"[PoolRealArray] 或 [PoolIntArray] 的骨骼索引。æ¯ä¸ªå…ƒç´ 以 4 个浮点数为一组。" #: doc/classes/ArrayMesh.xml msgid "[PoolRealArray] of bone weights. Each element in groups of 4 floats." -msgstr "骨骼æƒé‡çš„[PoolRealArray]。æ¯ä¸ªå…ƒç´ 以4个浮点数为一组。" +msgstr "骨骼æƒé‡çš„ [PoolRealArray]。æ¯ä¸ªå…ƒç´ 以 4 个浮点数为一组。" #: doc/classes/ArrayMesh.xml msgid "" @@ -9295,7 +9308,7 @@ msgstr "" #: doc/classes/ArrayMesh.xml doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Represents the size of the [enum ArrayType] enum." -msgstr "表示[enum ArrayType]枚举的大å°ã€‚" +msgstr "表示 [enum ArrayType] 枚举的大å°ã€‚" #: doc/classes/ArrayMesh.xml msgid "Array format will include vertices (mandatory)." @@ -9315,7 +9328,7 @@ msgstr "æ•°ç»„æ ¼å¼å°†åŒ…括一个颜色数组。" #: doc/classes/ArrayMesh.xml msgid "Array format will include UVs." -msgstr "æ•°ç»„æ ¼å¼å°†åŒ…括UV。" +msgstr "æ•°ç»„æ ¼å¼å°†åŒ…括 UV。" #: doc/classes/ArrayMesh.xml msgid "Array format will include another set of UVs." @@ -9335,7 +9348,7 @@ msgstr "将使用索引数组。" #: doc/classes/ARVRAnchor.xml msgid "An anchor point in AR space." -msgstr "AR空间ä¸çš„锚点。" +msgstr "AR 空间ä¸çš„锚点。" #: doc/classes/ARVRAnchor.xml msgid "" @@ -9353,12 +9366,12 @@ msgid "" "more about the real world out there especially if only part of the surface " "is in view." msgstr "" -"[ARVRAnchor]点是空间节点,它将ARå¹³å°è¯†åˆ«çš„现实世界的ä½ç½®æ˜ 射到游æˆä¸–界ä¸ç›¸åº”" -"ä½ç½®ã€‚例如,åªè¦ARKitä¸çš„平颿£€æµ‹å¼€å¯ï¼ŒARKit就会识别并更新平é¢ï¼ˆæ¡Œåã€åœ°æ¿" -"ç‰ï¼‰çš„ä½ç½®ï¼Œå¹¶ä¸ºå…¶åˆ›å»ºé”šç‚¹ã€‚\n" -"æ¤èŠ‚ç‚¹é€šè¿‡å…¶ç‰¹æœ‰IDæ˜ å°„åˆ°å…¶ä¸ä¸€ä¸ªé”šç‚¹ã€‚å½“ä½ æ”¶åˆ°ä¸€ä¸ªæ–°é”šç‚¹å¯ç”¨çš„ä¿¡å·æ—¶ï¼Œåœ¨ä½ çš„" -"场景ä¸ï¼Œåº”è¯¥ä¸ºè¯¥é”šç‚¹æ·»åŠ è¿™ä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é¢„先定义节点并设置ID;节点将简å•地ä¿" -"æŒåœ¨0,0,0,直到一个平é¢è¢«è¯†åˆ«ã€‚\n" +"[ARVRAnchor] 点是空间节点,它将 AR å¹³å°è¯†åˆ«çš„现实世界的ä½ç½®æ˜ 射到游æˆä¸–界ä¸ç›¸" +"应ä½ç½®ã€‚例如,åªè¦ ARKit ä¸çš„平颿£€æµ‹å¼€å¯ï¼ŒARKit 就会识别并更新平é¢ï¼ˆæ¡Œåã€åœ°" +"æ¿ç‰ï¼‰çš„ä½ç½®ï¼Œå¹¶ä¸ºå…¶åˆ›å»ºé”šç‚¹ã€‚\n" +"æ¤èŠ‚ç‚¹é€šè¿‡å…¶ç‰¹æœ‰ ID æ˜ å°„åˆ°å…¶ä¸ä¸€ä¸ªé”šç‚¹ã€‚å½“ä½ æ”¶åˆ°ä¸€ä¸ªæ–°é”šç‚¹å¯ç”¨çš„ä¿¡å·æ—¶ï¼Œåœ¨ä½ " +"的场景ä¸ï¼Œåº”è¯¥ä¸ºè¯¥é”šç‚¹æ·»åŠ è¿™ä¸ªèŠ‚ç‚¹ã€‚ä½ å¯ä»¥é¢„先定义节点并设置ID;节点将简å•地" +"ä¿æŒåœ¨ 0,0,0,直到一个平é¢è¢«è¯†åˆ«ã€‚\n" "请记ä½ï¼Œåªè¦å¯ç”¨äº†å¹³é¢æ£€æµ‹ï¼Œé”šçš„大å°ã€ä½ç½®å’Œæ–¹å‘就会éšç€æ£€æµ‹é€»è¾‘对外é¢çœŸå®žä¸–" "界的信æ¯è€Œæ›´æ–°ï¼Œç‰¹åˆ«æ˜¯åœ¨åªæœ‰éƒ¨åˆ†è¡¨é¢åœ¨è§†é‡Žä¸çš„æƒ…况下。" @@ -9481,14 +9494,14 @@ msgstr "" msgid "" "If active, returns the name of the associated controller if provided by the " "AR/VR SDK used." -msgstr "如果激活,如果由使用的AR/VR SDKæä¾›ï¼Œåˆ™è¿”回相关控制器的å称。" +msgstr "如果激活,如果由使用的 AR/VR SDK æä¾›ï¼Œåˆ™è¿”回相关控制器的å称。" #: doc/classes/ARVRController.xml msgid "" "Returns the hand holding this controller, if known. See [enum " "ARVRPositionalTracker.TrackerHand]." msgstr "" -"è¿”å›žæŒæœ‰æ¤æŽ§åˆ¶å™¨çš„æ‰‹ï¼Œå¦‚果知é“çš„è¯ã€‚å‚阅[enum ARVRPositionalTracker." +"è¿”å›žæŒæœ‰æ¤æŽ§åˆ¶å™¨çš„æ‰‹ï¼Œå¦‚果知é“çš„è¯ã€‚è§ [enum ARVRPositionalTracker." "TrackerHand]。" #: doc/classes/ARVRController.xml @@ -9514,10 +9527,10 @@ msgid "" "the AR/VR controllers. This ID is purely offered as information so you can " "link up the controller with its joystick entry." msgstr "" -"返回与æ¤ç»‘定的摇æ†å¯¹è±¡çš„ID。由[ARVRServer]跟踪的æ¯ä¸ªæŽ§åˆ¶å™¨ï¼Œå¦‚果有按钮和轴," -"也将被注册为Godotä¸çš„æ‘‡æ†ã€‚è¿™æ„å‘³ç€æ‰€æœ‰æ£å¸¸çš„æ‘‡æ†è·Ÿè¸ªå’Œè¾“å…¥æ˜ å°„å°†å¯¹AR/VR控制" -"器上的按钮和轴起作用。这个IDçº¯ç²¹æ˜¯ä½œä¸ºä¿¡æ¯æä¾›çš„ï¼Œè¿™æ ·ä½ å°±å¯ä»¥æŠŠæŽ§åˆ¶å™¨å’Œå®ƒçš„" -"æ‘‡æ†æ¡ç›®å…³è”èµ·æ¥ã€‚" +"返回与æ¤ç»‘定的摇æ†å¯¹è±¡çš„ ID。由 [ARVRServer] 跟踪的æ¯ä¸ªæŽ§åˆ¶å™¨ï¼Œå¦‚果有按钮和" +"轴,也将被注册为 Godot ä¸çš„æ‘‡æ†ã€‚è¿™æ„å‘³ç€æ‰€æœ‰æ£å¸¸çš„æ‘‡æ†è·Ÿè¸ªå’Œè¾“å…¥æ˜ å°„å°†å¯¹ AR/" +"VR 控制器上的按钮和轴起作用。这个 ID çº¯ç²¹æ˜¯ä½œä¸ºä¿¡æ¯æä¾›çš„ï¼Œè¿™æ ·ä½ å°±å¯ä»¥æŠŠæŽ§åˆ¶" +"å™¨å’Œå®ƒçš„æ‘‡æ†æ¡ç›®å…³è”èµ·æ¥ã€‚" #: doc/classes/ARVRController.xml msgid "" @@ -9532,8 +9545,8 @@ msgid "" "pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " "constants." msgstr "" -"如果索引 [code]button[/code] 处的按钮被按下,则返回 [code]true[/code]。请å‚" -"阅 [enum JoystickList] ä¸çš„ [code]JOY_VR_*[/code] 常é‡ã€‚" +"如果索引 [code]button[/code] 处的按钮被按下,则返回 [code]true[/code]ã€‚è§ " +"[enum JoystickList] ä¸çš„ [code]JOY_VR_*[/code] 常é‡ã€‚" #: doc/classes/ARVRController.xml msgid "" @@ -9563,8 +9576,9 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" -"控制器振动的程度。范围从[code]0.0[/code]到[code]1.0[/code],精度[code].01[/" -"code]。如果更改,会相应地更新[member ARVRPositionalTracker.rumble]。\n" +"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code],精度 " +"[code].01[/code]。如果更改,会相应地更新 [member ARVRPositionalTracker." +"rumble]。\n" "å¦‚æžœä½ æƒ³è®©æŽ§åˆ¶å™¨åœ¨é™å®šæ—¶é—´å†…振动,这是一个有用的属性,å¯ä»¥å°†å…¶åŠ¨ç”»åŒ–ã€‚" #: doc/classes/ARVRController.xml @@ -9581,12 +9595,12 @@ msgid "" "becomes available. Generally speaking this will be a static mesh after " "becoming available." msgstr "" -"当与控制器相关的Meshå‘生å˜åŒ–或å˜å¾—å¯ç”¨æ—¶è§¦å‘。一般æ¥è¯´ï¼Œè¿™å°†æ˜¯ä¸€ä¸ªå˜å¾—å¯ç”¨åŽ" -"çš„é™æ€ç½‘æ ¼ã€‚" +"当与控制器相关的 Mesh å‘生å˜åŒ–或å˜å¾—å¯ç”¨æ—¶è§¦å‘。一般æ¥è¯´ï¼Œè¿™å°†æ˜¯ä¸€ä¸ªå˜å¾—å¯ç”¨" +"åŽçš„陿€ç½‘æ ¼ã€‚" #: doc/classes/ARVRInterface.xml msgid "Base class for an AR/VR interface implementation." -msgstr "AR/VR接å£å®žçŽ°çš„åŸºç±»ã€‚" +msgstr "AR/VR 接å£å®žçŽ°çš„åŸºç±»ã€‚" #: doc/classes/ARVRInterface.xml msgid "" @@ -9611,18 +9625,18 @@ msgid "" "background, this method returns the feed ID in the [CameraServer] for this " "interface." msgstr "" -"å¦‚æžœè¿™æ˜¯ä¸€ä¸ªéœ€è¦æ˜¾ç¤ºç›¸æœºç”»é¢ä½œä¸ºèƒŒæ™¯çš„AR界é¢ï¼Œæ¤æ–¹æ³•返回该界é¢çš„" -"[CameraServer]ä¸çš„ç”»é¢ID。" +"å¦‚æžœè¿™æ˜¯ä¸€ä¸ªéœ€è¦æ˜¾ç¤ºç›¸æœºç”»é¢ä½œä¸ºèƒŒæ™¯çš„ AR 界é¢ï¼Œæ¤æ–¹æ³•返回该界é¢çš„ " +"[CameraServer] ä¸çš„ç”»é¢ ID。" #: doc/classes/ARVRInterface.xml msgid "" "Returns a combination of [enum Capabilities] flags providing information " "about the capabilities of this interface." -msgstr "返回[enum Capabilities]æ ‡ç¾çš„组åˆï¼Œæä¾›å…³äºŽè¿™ä¸ªæŽ¥å£åŠŸèƒ½çš„ä¿¡æ¯ã€‚" +msgstr "返回 [enum Capabilities] æ ‡ç¾çš„组åˆï¼Œæä¾›å…³äºŽè¿™ä¸ªæŽ¥å£åŠŸèƒ½çš„ä¿¡æ¯ã€‚" #: doc/classes/ARVRInterface.xml msgid "Returns the name of this interface (OpenVR, OpenHMD, ARKit, etc)." -msgstr "返回该接å£çš„å称,如OpenVRã€OpenHMDã€ARKitç‰ã€‚" +msgstr "返回该接å£çš„å称,如 OpenVRã€OpenHMDã€ARKit ç‰ã€‚" #: doc/classes/ARVRInterface.xml msgid "" @@ -9693,12 +9707,12 @@ msgstr "[code]true[/code] 如果这是个主接å£ã€‚" #: doc/classes/ARVRInterface.xml msgid "No ARVR capabilities." -msgstr "没有ARVR功能。" +msgstr "没有 ARVR 功能。" #: doc/classes/ARVRInterface.xml msgid "" "This interface can work with normal rendering output (non-HMD based AR)." -msgstr "æ¤æŽ¥å£å¯ä»¥ä¸Žæ£å¸¸çš„æ¸²æŸ“输出一起工作,éžåŸºäºŽHMDçš„AR。" +msgstr "æ¤æŽ¥å£å¯ä»¥ä¸Žæ£å¸¸çš„æ¸²æŸ“输出一起工作,éžåŸºäºŽ HMD çš„ AR。" #: doc/classes/ARVRInterface.xml msgid "This interface supports stereoscopic rendering." @@ -9726,7 +9740,7 @@ msgid "" "information for our camera node or when stereo scopic rendering is not " "supported." msgstr "" -"Monoè¾“å‡ºï¼Œè¿™ä¸»è¦æ˜¯åœ¨ç›¸æœºèŠ‚ç‚¹æ£€ç´¢å®šä½ä¿¡æ¯æ—¶ï¼Œæˆ–è€…åœ¨ä¸æ”¯æŒç«‹ä½“视景渲染时,内部" +"Mono è¾“å‡ºï¼Œè¿™ä¸»è¦æ˜¯åœ¨ç›¸æœºèŠ‚ç‚¹æ£€ç´¢å®šä½ä¿¡æ¯æ—¶ï¼Œæˆ–è€…åœ¨ä¸æ”¯æŒç«‹ä½“视景渲染时,内部" "使用。" #: doc/classes/ARVRInterface.xml @@ -9771,7 +9785,7 @@ msgstr "追踪功能失效,å³ç›¸æœºæœªæ’ç”µæˆ–è¢«é®æŒ¡ï¼Œç¯å¡”å…³é—ï¼Œç‰ #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "GDNative wrapper for an ARVR interface." -msgstr "ARVR接å£çš„GDNative包装器。" +msgstr "ARVR 接å£çš„ GDNative 包装器。" #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "" @@ -9784,7 +9798,7 @@ msgstr "" #: doc/classes/ARVROrigin.xml msgid "The origin point in AR/VR." -msgstr "AR/VR的原点。" +msgstr "AR/VR 的原点。" #: doc/classes/ARVROrigin.xml msgid "" @@ -9816,9 +9830,9 @@ msgid "" "assume a scale of 1 game world unit = 1 real world meter.\n" "[b]Note:[/b] This method is a passthrough to the [ARVRServer] itself." msgstr "" -"å…è®¸ä½ æ ¹æ®ä½ 的游æˆçš„å•使¥è°ƒæ•´æ¯”例。大多数AR/VRå¹³å°å‡å®š1个游æˆä¸–界的å•ä½=1个" -"现实世界的米的比例。\n" -"[b]注æ„:[/b]è¿™ç§æ–¹æ³•是通过[ARVRServer]本身的。" +"å…è®¸ä½ æ ¹æ®ä½ 的游æˆçš„å•使¥è°ƒæ•´æ¯”例。大多数 AR/VR å¹³å°å‡å®š 1 个游æˆä¸–界的å•ä½ " +"= 1 个现实世界的米的比例。\n" +"[b]注æ„:[/b]è¿™ç§æ–¹æ³•是通过 [ARVRServer] 本身的。" #: doc/classes/ARVRPositionalTracker.xml msgid "A tracked object." @@ -9849,14 +9863,14 @@ msgstr "" msgid "" "Returns the hand holding this tracker, if known. See [enum TrackerHand] " "constants." -msgstr "è¿”å›žæŒæœ‰æ¤è¿½è¸ªå™¨çš„æ‰‹ï¼Œå¦‚果知é“。å‚阅[enum TrackerHand]常é‡ã€‚" +msgstr "è¿”å›žæŒæœ‰æ¤è¿½è¸ªå™¨çš„æ‰‹ï¼Œå¦‚果知é“ã€‚è§ [enum TrackerHand] 常é‡ã€‚" #: doc/classes/ARVRPositionalTracker.xml msgid "" "If this is a controller that is being tracked, the controller will also be " "represented by a joystick entry with this ID." msgstr "" -"如果这是一个æ£åœ¨è¢«è¿½è¸ªçš„æŽ§åˆ¶å™¨ï¼Œè¯¥æŽ§åˆ¶å™¨å°†ç”±ä¸€ä¸ªå…·æœ‰æ¤IDçš„æ“çºµæ†æ¡ç›®è¡¨ç¤ºã€‚" +"如果这是一个æ£åœ¨è¢«è¿½è¸ªçš„æŽ§åˆ¶å™¨ï¼Œè¯¥æŽ§åˆ¶å™¨å°†ç”±ä¸€ä¸ªå…·æœ‰æ¤ ID çš„æ“çºµæ†æ¡ç›®è¡¨ç¤ºã€‚" #: doc/classes/ARVRPositionalTracker.xml msgid "" @@ -9962,7 +9976,7 @@ msgid "" "button on a controller for a short period of time, or when implementing a " "teleport mechanism." msgstr "" -"这是æ£ç¡®ç†è§£çš„é‡è¦åŠŸèƒ½ã€‚ AR å’Œ VR å¹³å°å¤„ç†å®šä½çš„æ–¹å¼ç•¥æœ‰ä¸åŒã€‚\n" +"这是æ£ç¡®ç†è§£çš„é‡è¦åŠŸèƒ½ã€‚AR å’Œ VR å¹³å°å¤„ç†å®šä½çš„æ–¹å¼ç•¥æœ‰ä¸åŒã€‚\n" "å¯¹äºŽä¸æä¾›ç©ºé—´è·Ÿè¸ªçš„å¹³å°ï¼Œæˆ‘们的原点 (0,0,0) 是 HMD çš„ä½ç½®ï¼Œä½†æ‚¨å‡ ä¹Žæ— æ³•æŽ§åˆ¶" "玩家在现实世界ä¸é¢å¯¹çš„æ–¹å‘。\n" "对于æä¾›ç©ºé—´è·Ÿè¸ªçš„å¹³å°ï¼Œæˆ‘们的原点在很大程度上å–决于系统。对于 OpenVR,原点通" @@ -10073,8 +10087,8 @@ msgid "" "Allows you to adjust the scale to your game's units. Most AR/VR platforms " "assume a scale of 1 game world unit = 1 real world meter." msgstr "" -"å…è®¸ä½ æ ¹æ®ä½ 的游æˆçš„å•使¥è°ƒæ•´ç¼©æ”¾ã€‚大多数AR/VRå¹³å°å‡å®š1个游æˆä¸–界å•ä½=1个现" -"实世界的米。" +"å…è®¸ä½ æ ¹æ®ä½ 的游æˆçš„å•使¥è°ƒæ•´ç¼©æ”¾ã€‚大多数 AR/VR å¹³å°å‡å®š 1 个游æˆä¸–界å•ä½ = " +"1 个现实世界的米。" #: doc/classes/ARVRServer.xml msgid "Emitted when a new interface has been added." @@ -10091,9 +10105,9 @@ msgid "" "important to react to this signal to add the appropriate [ARVRController] or " "[ARVRAnchor] nodes related to this new tracker." msgstr "" -"å½“æ–°çš„è¿½è¸ªå™¨è¢«æ·»åŠ æ—¶è§¦å‘ã€‚å¦‚æžœä½ ä¸ä½¿ç”¨å›ºå®šæ•°é‡çš„æŽ§åˆ¶å™¨ï¼Œæˆ–è€…ä½ åœ¨AR解决方案ä¸" -"使用[ARVRAnchor],那么对这个信å·åšå‡ºååº”ï¼Œä»¥æ·»åŠ ä¸Žè¿™ä¸ªæ–°è¿½è¸ªå™¨ç›¸å…³çš„é€‚å½“çš„" -"[ARVRController]或[ARVRAnchor]节点,将会很é‡è¦ã€‚" +"å½“æ–°çš„è¿½è¸ªå™¨è¢«æ·»åŠ æ—¶è§¦å‘ã€‚å¦‚æžœä½ ä¸ä½¿ç”¨å›ºå®šæ•°é‡çš„æŽ§åˆ¶å™¨ï¼Œæˆ–è€…ä½ åœ¨ AR 解决方案" +"ä¸ä½¿ç”¨ [ARVRAnchor],那么对这个信å·åšå‡ºååº”ï¼Œä»¥æ·»åŠ ä¸Žè¿™ä¸ªæ–°è¿½è¸ªå™¨ç›¸å…³çš„é€‚å½“" +"çš„ [ARVRController] 或 [ARVRAnchor] 节点,将会很é‡è¦ã€‚" #: doc/classes/ARVRServer.xml msgid "" @@ -10137,7 +10151,8 @@ msgid "" "user is looking to in the real world. The user will look dead ahead in the " "virtual world." msgstr "" -"完全é‡ç½®HMD的方å‘ã€‚æ— è®ºç”¨æˆ·åœ¨çŽ°å®žä¸–ç•Œä¸çœ‹å‘哪个方å‘。将在虚拟世界ä¸é”定视角。" +"完全é‡ç½® HMD 的方å‘ã€‚æ— è®ºç”¨æˆ·åœ¨çŽ°å®žä¸–ç•Œä¸çœ‹å‘哪个方å‘。将在虚拟世界ä¸é”定视" +"角。" #: doc/classes/ARVRServer.xml msgid "" @@ -10151,7 +10166,7 @@ msgstr "" msgid "" "Does not reset the orientation of the HMD, only the position of the player " "gets centered." -msgstr "ä¸é‡ç½®HMD的方å‘,åªè®©çŽ©å®¶çš„ä½ç½®å±…ä¸ã€‚" +msgstr "ä¸é‡ç½® HMD 的方å‘,åªè®©çŽ©å®¶çš„ä½ç½®å±…ä¸ã€‚" #: doc/classes/AspectRatioContainer.xml msgid "Container that preserves its child controls' aspect ratio." @@ -10190,7 +10205,7 @@ msgid "" "The aspect ratio to enforce on child controls. This is the width divided by " "the height. The ratio depends on the [member stretch_mode]." msgstr "" -"å¯¹åæŽ§ä»¶å¼ºåˆ¶å®žæ–½çš„长宽比。这是宽度除以高度。这个比例å–决于[member " +"å¯¹åæŽ§ä»¶å¼ºåˆ¶å®žæ–½çš„长宽比。这是宽度除以高度。这个比例å–决于 [member " "stretch_mode]。" #: doc/classes/AspectRatioContainer.xml @@ -10560,13 +10575,13 @@ msgstr "" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the position of the point associated with the given [code]id[/code]." -msgstr "返回与给定[code]id[/code]相关è”的点的ä½ç½®ã€‚" +msgstr "返回与给定 [code]id[/code] 相关è”的点的ä½ç½®ã€‚" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns the weight scale of the point associated with the given [code]id[/" "code]." -msgstr "返回与给定[code]id[/code]å…³è”的点的æƒé‡æ¯”例。" +msgstr "返回与给定 [code]id[/code] å…³è”的点的æƒé‡æ¯”例。" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "Returns an array of all points." @@ -10575,7 +10590,7 @@ msgstr "返回所有点的数组。" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Returns whether a point associated with the given [code]id[/code] exists." -msgstr "返回与给定[code]id[/code]相关è”的点是å¦å˜åœ¨ã€‚" +msgstr "返回与给定 [code]id[/code] 相关è”的点是å¦å˜åœ¨ã€‚" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10587,7 +10602,7 @@ msgstr "返回是å¦ç¦ç”¨ç‚¹ä»¥è¿›è¡Œå¯»è·¯ã€‚默认情况下,所有点å‡å¤„ msgid "" "Removes the point associated with the given [code]id[/code] from the points " "pool." -msgstr "ä»Žç§¯åˆ†æ± ä¸åˆ 除与给定[code]id[/code]å…³è”的积分。" +msgstr "ä»Žç‚¹æ± ä¸åˆ 除与给定 [code]id[/code] å…³è”的点。" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10595,8 +10610,8 @@ msgid "" "you're adding a known large number of points at once, for a grid for " "instance. New capacity must be greater or equals to old capacity." msgstr "" -"在内部为[code]num_nodes[/code]个点ä¿ç•™ç©ºé—´ï¼Œå¦‚æžœæ‚¨ä¸€æ¬¡è¦æ·»åŠ ä¸€ä¸ªå·²çŸ¥çš„å¤§é‡ç‚¹" -"ï¼ˆä¾‹å¦‚å¯¹äºŽä¸€ä¸ªç½‘æ ¼ï¼‰ï¼Œåˆ™å¾ˆæœ‰ç”¨ã€‚æ–°å®¹é‡å¿…须大于或ç‰äºŽæ—§å®¹é‡ã€‚" +"在内部为 [code]num_nodes[/code] 个点ä¿ç•™ç©ºé—´ï¼Œå¦‚æžœä½ æƒ³è¦ä¸€æ¬¡æ€§æ·»åР大é‡çš„点且" +"æ•°é‡å·²çŸ¥ï¼ˆä¾‹å¦‚ç½‘æ ¼ï¼‰ï¼Œé‚£ä¹ˆå°±ä¼šå¾ˆæœ‰ç”¨ã€‚æ–°å®¹é‡å¿…须大于或ç‰äºŽæ—§å®¹é‡ã€‚" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10607,7 +10622,7 @@ msgstr "ç¦ç”¨æˆ–å¯ç”¨æŒ‡å®šç‚¹çš„寻路功能。用于制作临时障ç¢ç‰©ã€‚ #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" "Sets the [code]position[/code] for the point with the given [code]id[/code]." -msgstr "为具有给定[code]id[/code]的点设置[code]position[/code]。" +msgstr "为具有给定 [code]id[/code] 的点设置ä½ç½® [code]position[/code]。" #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10616,13 +10631,13 @@ msgid "" "_compute_cost] when determining the overall cost of traveling across a " "segment from a neighboring point to this point." msgstr "" -"为给定的[code]id[/code]的点设置[code]weight_scale[/code]。在确定从邻接点到这" -"ä¸ªç‚¹çš„ä¸€æ®µè·¯ç¨‹çš„æ€»æˆæœ¬æ—¶ï¼Œ[code]weight_scale[/code]è¦ä¹˜ä»¥[method " -"_compute_cost]的结果。" +"为给定的 [code]id[/code] 的点设置 [code]weight_scale[/code]。在确定从邻接点到" +"è¿™ä¸ªç‚¹çš„ä¸€æ®µè·¯ç¨‹çš„æ€»æˆæœ¬æ—¶ï¼Œ[code]weight_scale[/code] è¦ä¹˜ä»¥ [method " +"_compute_cost] 的结果。" #: doc/classes/AStar2D.xml msgid "AStar class representation that uses 2D vectors as edges." -msgstr "使用二维å‘é‡ä½œä¸ºè¾¹ç¼˜çš„AStar类表示。" +msgstr "使用 2D å‘é‡ä½œä¸ºè¾¹ç¼˜çš„ AStar 类表示。" #: doc/classes/AStar2D.xml msgid "" @@ -10843,16 +10858,16 @@ msgid "" "FLAG_REPEAT] and [constant Texture.FLAG_MIRRORED_REPEAT] flags are ignored " "when using an AtlasTexture." msgstr "" -"[Texture]资æºï¼Œç”±[member region]定义,è£å‰ªå‡º[member atlas]纹ç†çš„一个部分。主" -"è¦çš„用例是从纹ç†å›¾é›†ä¸è£å‰ªå‡ºçº¹ç†ï¼Œä¸€ä¸ªå¤§çš„çº¹ç†æ–‡ä»¶ï¼ŒåŒ…å«äº†å¤šä¸ªè¾ƒå°çš„纹ç†ã€‚ç”± " -"[member atlas]çš„[Texture]ã€å®šä¹‰ä½¿ç”¨ [member atlas]区域的[member region]和定义" -"边界宽度的[member margin]组æˆã€‚\n" -"[AtlasTexture]ä¸èƒ½åœ¨[AnimatedTexture]ä¸ä½¿ç”¨ï¼Œä¸èƒ½åœ¨[TextureRect]ç‰èŠ‚ç‚¹ä¸å¹³" -"铺,如果在其他[AtlasTexture]资æºå†…部使用,将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚多个[AtlasTexture]" -"资æºå¯ä»¥ç”¨æ¥è£å‰ªå›¾é›†ä¸çš„多个纹ç†ã€‚ä¸Žä½¿ç”¨å¤šä¸ªå°æ–‡ä»¶ç›¸æ¯”,使用一个纹ç†å›¾é›†æœ‰åŠ©" -"äºŽä¼˜åŒ–è§†é¢‘å†…å˜æ¶ˆè€—和渲染调用。\n" -"[b]注æ„:[/b]AtlasTextures䏿”¯æŒé‡å¤ã€‚当使用AtlasTexture时,[constant " -"Texture.FLAG_REPEAT]å’Œ[constant Texture.FLAG_MIRRORED_REPEAT]æ ‡å¿—è¢«å¿½ç•¥ã€‚" +"[Texture] 资æºï¼Œç”± [member region] 定义,è£å‰ªå‡º [member atlas] 纹ç†çš„一个部" +"分。主è¦çš„用例是从纹ç†å›¾é›†ä¸è£å‰ªå‡ºçº¹ç†ï¼Œä¸€ä¸ªå¤§çš„çº¹ç†æ–‡ä»¶ï¼ŒåŒ…å«äº†å¤šä¸ªè¾ƒå°çš„纹" +"ç†ã€‚ç”± [member atlas] çš„ [Texture]ã€å®šä¹‰ä½¿ç”¨ [member atlas] 区域的 [member " +"region] 和定义边界宽度的 [member margin] 组æˆã€‚\n" +"[AtlasTexture] ä¸èƒ½åœ¨ [AnimatedTexture] ä¸ä½¿ç”¨ï¼Œä¸èƒ½åœ¨ [TextureRect] ç‰èŠ‚ç‚¹ä¸" +"平铺,如果在其他 [AtlasTexture] 资æºå†…部使用,将ä¸èƒ½æ£å¸¸å·¥ä½œã€‚多个" +"[AtlasTexture] 资æºå¯ä»¥ç”¨æ¥è£å‰ªå›¾é›†ä¸çš„多个纹ç†ã€‚ä¸Žä½¿ç”¨å¤šä¸ªå°æ–‡ä»¶ç›¸æ¯”,使用一" +"个纹ç†å›¾é›†æœ‰åŠ©äºŽä¼˜åŒ–è§†é¢‘å†…å˜æ¶ˆè€—和渲染调用。\n" +"[b]注æ„:[/b]AtlasTexture 䏿”¯æŒé‡å¤ã€‚当使用 AtlasTexture 时,[constant " +"Texture.FLAG_REPEAT] å’Œ [constant Texture.FLAG_MIRRORED_REPEAT] æ ‡å¿—è¢«å¿½ç•¥ã€‚" #: doc/classes/AtlasTexture.xml msgid "The texture that contains the atlas. Can be any [Texture] subtype." @@ -10923,7 +10938,8 @@ msgid "" "Amount of amplification in decibels. Positive values make the sound louder, " "negative values make it quieter. Value can range from -80 to 24." msgstr "" -"以分è´ä¸ºå•ä½çš„æ”¾å¤§é‡ã€‚æ£å€¼ä½¿å£°éŸ³æ›´å“亮,负值使声音更安é™ã€‚数值范围从-80到24。" +"以分è´ä¸ºå•ä½çš„æ”¾å¤§é‡ã€‚æ£å€¼ä½¿å£°éŸ³æ›´å“亮,负值使声音更安é™ã€‚数值范围从 -80 到 " +"24。" #: doc/classes/AudioEffectBandLimitFilter.xml msgid "Adds a band limit filter to the audio bus." @@ -10934,8 +10950,8 @@ msgid "" "Limits the frequencies in a range around the [member AudioEffectFilter." "cutoff_hz] and allows frequencies outside of this range to pass." msgstr "" -"é™åˆ¶[member AudioEffectFilter.cutoff_hz]周围范围内的频率,å…许这个范围外的频" -"率通过。" +"é™åˆ¶ [member AudioEffectFilter.cutoff_hz] 周围范围内的频率,å…许这个范围外的" +"频率通过。" #: doc/classes/AudioEffectBandPassFilter.xml msgid "Adds a band pass filter to the audio bus." @@ -10946,8 +10962,8 @@ msgid "" "Attenuates the frequencies inside of a range around the [member " "AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." msgstr "" -"è¡°å‡[member AudioEffectFilter.cutoff_hz]周围范围内的频率,并切æ–这个频段之外" -"的频率。" +"è¡°å‡ [member AudioEffectFilter.cutoff_hz] 周围范围内的频率,并切æ–这个频段之" +"外的频率。" #: doc/classes/AudioEffectCapture.xml msgid "Captures audio from an audio bus in real-time." @@ -11092,9 +11108,9 @@ msgid "" "punchy." msgstr "" "动æ€èŒƒå›´åŽ‹ç¼©å™¨åœ¨æŒ¯å¹…è¶…è¿‡ä¸€å®šçš„é˜ˆå€¼ï¼ˆä»¥åˆ†è´ä¸ºå•ä½ï¼‰æ—¶ï¼Œé™ä½Žå£°éŸ³çš„电平。压缩器" -"的主è¦ç”¨é€”之一是通过尽å¯èƒ½å°‘的削波(当声音超过0dB时)æ¥å¢žåŠ åŠ¨æ€èŒƒå›´ã€‚\n" +"的主è¦ç”¨é€”之一是通过尽å¯èƒ½å°‘的削波(当声音超过 0dB 时)æ¥å¢žåŠ åŠ¨æ€èŒƒå›´ã€‚\n" "压缩器在混音ä¸çš„用途很多。\n" -"- 在主总线上压缩整个输出(虽然[AudioEffectLimiter]å¯èƒ½æ›´å¥½äº›ï¼‰ã€‚\n" +"- 在主总线上压缩整个输出(虽然 [AudioEffectLimiter] å¯èƒ½æ›´å¥½äº›ï¼‰ã€‚\n" "- 在声音通é“ä¸ï¼Œä»¥ç¡®ä¿å®ƒä»¬å¬èµ·æ¥å°½å¯èƒ½çš„平衡。\n" "- 侧链。这å¯ä»¥é™ä½Žä¸Žå¦ä¸€æ¡éŸ³é¢‘æ€»çº¿ä¾§é“¾çš„å£°éŸ³çº§åˆ«ï¼Œä»¥è¿›è¡Œé˜ˆå€¼æ£€æµ‹ã€‚è¿™ç§æŠ€æœ¯åœ¨" "è§†é¢‘æ¸¸æˆæ··éŸ³ä¸å¾ˆå¸¸è§ï¼Œä»¥éŸ³ä¹å’ŒSFX的级别,从而声音被å¬åˆ°ã€‚\n" @@ -11104,7 +11120,8 @@ msgstr "" msgid "" "Compressor's reaction time when the signal exceeds the threshold, in " "microseconds. Value can range from 20 to 2000." -msgstr "当信å·è¶…过阈值时,压缩器的å应时间,以微秒为å•ä½ã€‚数值范围从20到2000。" +msgstr "" +"当信å·è¶…过阈值时,压缩器的å应时间,以微秒为å•ä½ã€‚数值范围从 20 到 2000。" #: doc/classes/AudioEffectCompressor.xml msgid "Gain applied to the output signal." @@ -11114,7 +11131,8 @@ msgstr "应用于输出信å·çš„增益。" msgid "" "Balance between original signal and effect signal. Value can range from 0 " "(totally dry) to 1 (totally wet)." -msgstr "原始信å·å’Œæ•ˆæžœä¿¡å·ä¹‹é—´çš„平衡。数值范围从0(完全干燥)到1(完全浸润)。" +msgstr "" +"原始信å·å’Œæ•ˆæžœä¿¡å·ä¹‹é—´çš„平衡。数值范围从 0(完全干燥)到 1(完全浸润)。" #: doc/classes/AudioEffectCompressor.xml msgid "" @@ -11123,7 +11141,7 @@ msgid "" "compressed. Value can range from 1 to 48." msgstr "" "音频通过阈值级别åŽï¼Œåº”用于音频的压缩é‡ã€‚比率越高,音频的大声部分将被压缩。数" -"值范围从1到48。" +"值范围从 1 到 48。" #: doc/classes/AudioEffectCompressor.xml msgid "" @@ -11141,7 +11159,7 @@ msgstr "使用å¦ä¸€æ¡éŸ³é¢‘总线进行阈值检测,é™ä½Žå£°éŸ³çº§åˆ«ã€‚" msgid "" "The level above which compression is applied to the audio. Value can range " "from -60 to 0." -msgstr "对音频进行压缩的级别。数值范围从-60到0。" +msgstr "对音频进行压缩的级别。数值范围从 -60 到 0。" #: doc/classes/AudioEffectDelay.xml msgid "" @@ -11170,7 +11188,7 @@ msgstr "原始声音的输出百分比。为 0 时,åªè¾“出延迟的声音。 #: doc/classes/AudioEffectDelay.xml msgid "If [code]true[/code], feedback is enabled." -msgstr "如果[code]true[/code],则å¯ç”¨å馈。" +msgstr "如果为 [code]true[/code],则å¯ç”¨å馈。" #: doc/classes/AudioEffectDelay.xml msgid "Feedback delay time in milliseconds." @@ -11203,7 +11221,7 @@ msgstr "" #: doc/classes/AudioEffectDelay.xml msgid "If [code]true[/code], [code]tap2[/code] will be enabled." -msgstr "如果[code]true[/code],将å¯ç”¨[code]tap2[/code]。" +msgstr "如果为 [code]true[/code],将å¯ç”¨[code]tap2[/code]。" #: doc/classes/AudioEffectDelay.xml msgid "[b]Tap2[/b] delay time in milliseconds." @@ -11256,7 +11274,7 @@ msgid "" "High-pass filter, in Hz. Frequencies higher than this value will not be " "affected by the distortion. Value can range from 1 to 20000." msgstr "" -"高通滤波器,å•ä½ä¸ºHz。高于æ¤å€¼çš„频率ä¸ä¼šå—到失真的影å“。该值的范围为1至" +"高通滤波器,å•ä½ä¸º Hz。高于æ¤å€¼çš„频率ä¸ä¼šå—到失真的影å“。该值的范围为 1 至 " "20000。" #: doc/classes/AudioEffectDistortion.xml @@ -11267,13 +11285,13 @@ msgstr "失真类型." msgid "" "Increases or decreases the volume after the effect. Value can range from -80 " "to 24." -msgstr "å¢žåŠ æˆ–å‡å°‘效果åŽçš„音é‡ã€‚数值范围从-80到24。" +msgstr "å¢žåŠ æˆ–å‡å°‘效果åŽçš„音é‡ã€‚数值范围从 -80 到 24。" #: doc/classes/AudioEffectDistortion.xml msgid "" "Increases or decreases the volume before the effect. Value can range from " "-60 to 60." -msgstr "å¢žåŠ æˆ–å‡å°‘效果å‰çš„音é‡ã€‚值的范围为-60至60。" +msgstr "å¢žåŠ æˆ–å‡å°‘效果å‰çš„音é‡ã€‚值的范围为 -60 至 60。" #: doc/classes/AudioEffectDistortion.xml msgid "" @@ -11306,7 +11324,7 @@ msgid "" "or [AudioEffectEQ21] don't fit your needs." msgstr "" "音频å‡è¡¡å™¨çš„åŸºç¡€ç±»ã€‚è®©ä½ å¯ä»¥æŽ§åˆ¶é¢‘率。\n" -"如果 [AudioEffectEQ6], [AudioEffectEQ10] 或 [AudioEffectEQ21]ä¸ç¬¦åˆæ‚¨çš„需求," +"如果 [AudioEffectEQ6]ã€[AudioEffectEQ10] 或 [AudioEffectEQ21]ä¸ç¬¦åˆæ‚¨çš„需求," "请使用它æ¥åˆ›å»ºä¸€ä¸ªè‡ªå®šä¹‰å‡è¡¡å™¨ã€‚" #: doc/classes/AudioEffectEQ.xml @@ -11328,11 +11346,11 @@ msgstr "返回å‡è¡¡å™¨çš„频段数。" #: doc/classes/AudioEffectEQ.xml msgid "Returns the band's gain at the specified index, in dB." -msgstr "返回指定索引处的波段增益,å•ä½ä¸ºdB。" +msgstr "返回指定索引处的波段增益,å•ä½ä¸º dB。" #: doc/classes/AudioEffectEQ.xml msgid "Sets band's gain at the specified index, in dB." -msgstr "设置指定索引处的波段增益,å•ä½ä¸ºdB。" +msgstr "设置指定索引处的波段增益,å•ä½ä¸º dB。" #: doc/classes/AudioEffectEQ10.xml msgid "" @@ -11465,11 +11483,11 @@ msgstr "ä¸ºéŸ³é¢‘æ€»çº¿æ·»åŠ ä¸€ä¸ªæ»¤æ³¢å™¨ã€‚" #: doc/classes/AudioEffectFilter.xml msgid "Allows frequencies other than the [member cutoff_hz] to pass." -msgstr "å…许通过[member cutoff_hz]以外的频率。" +msgstr "å…许通过 [member cutoff_hz] 以外的频率。" #: doc/classes/AudioEffectFilter.xml msgid "Threshold frequency for the filter, in Hz." -msgstr "滤波器的阈值频率,å•ä½ä¸ºHz。" +msgstr "滤波器的阈值频率,å•ä½ä¸º Hz。" #: doc/classes/AudioEffectFilter.xml msgid "Gain amount of the frequencies after the filter." @@ -11488,11 +11506,11 @@ msgid "" "Cuts frequencies lower than the [member AudioEffectFilter.cutoff_hz] and " "allows higher frequencies to pass." msgstr "" -"å‰Šå‡æ¯”[member AudioEffectFilter.cutoff_hz]更低的频率,å…许更高的频率通过。" +"å‰Šå‡æ¯” [member AudioEffectFilter.cutoff_hz] 更低的频率,å…许更高的频率通过。" #: doc/classes/AudioEffectHighShelfFilter.xml msgid "Reduces all frequencies above the [member AudioEffectFilter.cutoff_hz]." -msgstr "é™ä½Žæ‰€æœ‰é«˜äºŽ[member AudioEffectFilter.cutoff_hz]的频率。" +msgstr "é™ä½Žæ‰€æœ‰é«˜äºŽ [member AudioEffectFilter.cutoff_hz] 的频率。" #: doc/classes/AudioEffectLimiter.xml msgid "Adds a soft-clip limiter audio effect to an Audio bus." @@ -11507,8 +11525,8 @@ msgid "" "and progressively increases its effect as the input level increases such " "that the threshold is never exceeded." msgstr "" -"é™åˆ¶å™¨ç±»ä¼¼äºŽåŽ‹ç¼©å™¨ï¼Œä½†çµæ´»æ€§è¾ƒå·®ï¼Œå¹¶ä¸”设计为ä¸å…许声音超过给定的dB阈值。始终" -"å»ºè®®åœ¨ä¸»æ€»çº¿ä¸æ·»åŠ ä¸€ä¸ªä»¥å‡å°‘削波的影å“。\n" +"é™åˆ¶å™¨ç±»ä¼¼äºŽåŽ‹ç¼©å™¨ï¼Œä½†çµæ´»æ€§è¾ƒå·®ï¼Œå¹¶ä¸”设计为ä¸å…许声音超过给定的 dB 阈值。始" +"ç»ˆå»ºè®®åœ¨ä¸»æ€»çº¿ä¸æ·»åŠ ä¸€ä¸ªä»¥å‡å°‘削波的影å“。\n" "软削波开始将峰值é™ä½Žåˆ°ç•¥ä½ŽäºŽé˜ˆå€¼æ°´å¹³ï¼Œå¹¶éšç€è¾“å…¥æ°´å¹³çš„å¢žåŠ è€Œé€æ¸å¢žå¼ºå…¶æ•ˆæžœï¼Œ" "从而永ä¸è¶…过阈值。" @@ -11516,19 +11534,19 @@ msgstr "" msgid "" "The waveform's maximum allowed value, in decibels. Value can range from -20 " "to -0.1." -msgstr "波形的最大å…许值,å•使˜¯åˆ†è´ã€‚数值范围从-20到-0.1。" +msgstr "波形的最大å…许值,å•使˜¯åˆ†è´ã€‚数值范围从 -20 到 -0.1。" #: doc/classes/AudioEffectLimiter.xml msgid "" "Applies a gain to the limited waves, in decibels. Value can range from 0 to " "6." -msgstr "将增益应用于有é™çš„æ³¢ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚å–值范围是0到6。" +msgstr "将增益应用于有é™çš„æ³¢ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚å–值范围是 0 到 6。" #: doc/classes/AudioEffectLimiter.xml msgid "" "Threshold from which the limiter begins to be active, in decibels. Value can " "range from -30 to 0." -msgstr "é™åˆ¶å™¨å¼€å§‹ç”Ÿæ•ˆçš„阈值,以分è´ä¸ºå•ä½ã€‚值的范围å¯ä»¥ä»Ž-30到0。" +msgstr "é™åˆ¶å™¨å¼€å§‹ç”Ÿæ•ˆçš„阈值,以分è´ä¸ºå•ä½ã€‚值的范围å¯ä»¥ä»Ž -30 到 0。" #: doc/classes/AudioEffectLowPassFilter.xml msgid "Adds a low-pass filter to the Audio bus." @@ -11539,11 +11557,11 @@ msgid "" "Cuts frequencies higher than the [member AudioEffectFilter.cutoff_hz] and " "allows lower frequencies to pass." msgstr "" -"å‰Šå‡æ¯”[member AudioEffectFilter.cutoff_hz]更低的频率,å…许更高的频率通过。" +"å‰Šå‡æ¯” [member AudioEffectFilter.cutoff_hz] 更低的频率,å…许更高的频率通过。" #: doc/classes/AudioEffectLowShelfFilter.xml msgid "Reduces all frequencies below the [member AudioEffectFilter.cutoff_hz]." -msgstr "é™ä½Ž[member AudioEffectFilter.cutoff_hz]以下的所有频率。" +msgstr "é™ä½Ž [member AudioEffectFilter.cutoff_hz] 以下的所有频率。" #: doc/classes/AudioEffectNotchFilter.xml msgid "Adds a notch filter to the Audio bus." @@ -11554,8 +11572,8 @@ msgid "" "Attenuates frequencies in a narrow band around the [member AudioEffectFilter." "cutoff_hz] and cuts frequencies outside of this range." msgstr "" -"è¡°å‡[member AudioEffectFilter.cutoff_hz]周围窄带的频率,并切æ–这个范围以外的" -"频率。" +"è¡°å‡ [member AudioEffectFilter.cutoff_hz] 周围窄带的频率,并切æ–这个范围以外" +"的频率。" #: doc/classes/AudioEffectPanner.xml msgid "Adds a panner audio effect to an Audio bus. Pans sound left or right." @@ -11568,7 +11586,7 @@ msgstr "决定å‘左峿€»çº¿å‘é€çš„音频信å·é‡ã€‚" #: doc/classes/AudioEffectPanner.xml msgid "Pan position. Value can range from -1 (fully left) to 1 (fully right)." -msgstr "平移ä½ç½®ã€‚值的范围å¯ä»¥ä»Ž-1(完全左)到1(完全å³ï¼‰ã€‚" +msgstr "平移ä½ç½®ã€‚值的范围å¯ä»¥ä»Ž -1(完全左)到1(完全å³ï¼‰ã€‚" #: doc/classes/AudioEffectPhaser.xml msgid "" @@ -11592,29 +11610,29 @@ msgid "" "can range from 0.1 to 4." msgstr "" "控制滤波器频率扫æçš„频率。较低的值将主è¦å½±å“低音频率。高值å¯ä»¥æŽ¨é«˜é«˜éŸ³ã€‚值的" -"范围å¯ä»¥ä»Ž0.1到4。" +"范围å¯ä»¥ä»Ž 0.1 到 4。" #: doc/classes/AudioEffectPhaser.xml msgid "Output percent of modified sound. Value can range from 0.1 to 0.9." -msgstr "修改åŽå£°éŸ³çš„输出百分比。数值范围从0.1到0.9。" +msgstr "修改åŽå£°éŸ³çš„输出百分比。数值范围从 0.1 到 0.9。" #: doc/classes/AudioEffectPhaser.xml msgid "" "Determines the maximum frequency affected by the LFO modulations, in Hz. " "Value can range from 10 to 10000." -msgstr "å†³å®šå— LFO 调制影å“的最大频率,å•ä½ä¸º Hz。数值范围为10-10000。" +msgstr "å†³å®šå— LFO 调制影å“的最大频率,å•ä½ä¸º Hz。数值范围为 10-10000。" #: doc/classes/AudioEffectPhaser.xml msgid "" "Determines the minimum frequency affected by the LFO modulations, in Hz. " "Value can range from 10 to 10000." -msgstr "å†³å®šå— LFO 调制影å“的最å°é¢‘率,å•ä½ä¸º Hz。数值范围为10-10000。" +msgstr "å†³å®šå— LFO 调制影å“的最å°é¢‘率,å•ä½ä¸º Hz。数值范围为 10-10000。" #: doc/classes/AudioEffectPhaser.xml msgid "" "Adjusts the rate in Hz at which the effect sweeps up and down across the " "frequency range." -msgstr "以Hz为å•ä½è°ƒæ•´æ•ˆæžœåœ¨æ•´ä¸ªé¢‘率范围内上下扫æçš„速度。" +msgstr "以 Hz 为å•ä½è°ƒæ•´æ•ˆæžœåœ¨æ•´ä¸ªé¢‘率范围内上下扫æçš„速度。" #: doc/classes/AudioEffectPitchShift.xml msgid "" @@ -11648,8 +11666,8 @@ msgid "" "are more demanding on the CPU and may cause audio cracking if the CPU can't " "keep up." msgstr "" -"è¦ä½¿ç”¨çš„è¿‡é‡‡æ ·ç³»æ•°ã€‚æ›´é«˜çš„å€¼ä¼šå¸¦æ¥æ›´å¥½çš„è´¨é‡ï¼Œä½†å¯¹CPUçš„è¦æ±‚更高,如果CPUè·Ÿä¸" -"上,å¯èƒ½ä¼šå¯¼è‡´éŸ³é¢‘ç ´è£‚ã€‚" +"è¦ä½¿ç”¨çš„è¿‡é‡‡æ ·ç³»æ•°ã€‚æ›´é«˜çš„å€¼ä¼šå¸¦æ¥æ›´å¥½çš„è´¨é‡ï¼Œä½†å¯¹ CPU çš„è¦æ±‚更高,如果 CPU " +"è·Ÿä¸ä¸Šï¼Œå¯èƒ½ä¼šå¯¼è‡´éŸ³é¢‘ç ´è£‚ã€‚" #: doc/classes/AudioEffectPitchShift.xml msgid "" @@ -11708,7 +11726,7 @@ msgstr "" #: doc/classes/AudioEffectPitchShift.xml #: doc/classes/AudioEffectSpectrumAnalyzer.xml msgid "Represents the size of the [enum FFT_Size] enum." -msgstr "表示[enum FFT_Size]枚举的大å°ã€‚" +msgstr "表示 [enum FFT_Size] 枚举的大å°ã€‚" #: doc/classes/AudioEffectRecord.xml msgid "Audio effect used for recording the sound from an audio bus." @@ -11746,14 +11764,15 @@ msgid "" "If [code]true[/code], the sound will be recorded. Note that restarting the " "recording will remove the previously recorded sample." msgstr "" -"如果[code]true[/code],将录制声音。请注æ„ï¼Œé‡æ–°å¼€å§‹å½•éŸ³å°†åˆ é™¤å…ˆå‰å½•éŸ³çš„æ ·æœ¬ã€‚" +"如果为 [code]true[/code],将录制声音。请注æ„ï¼Œé‡æ–°å¼€å§‹å½•éŸ³å°†åˆ é™¤å…ˆå‰å½•éŸ³çš„æ ·" +"本。" #: doc/classes/AudioEffectRecord.xml msgid "" "Specifies the format in which the sample will be recorded. See [enum " "AudioStreamSample.Format] for available formats." msgstr "" -"æŒ‡å®šå½•éŸ³æ ·æœ¬çš„æ ¼å¼ã€‚请å‚阅[enum AudioStreamSample.Format]了解å¯ç”¨çš„æ ¼å¼ã€‚" +"æŒ‡å®šå½•éŸ³æ ·æœ¬çš„æ ¼å¼ã€‚请å‚阅 [enum AudioStreamSample.Format] 了解å¯ç”¨çš„æ ¼å¼ã€‚" #: doc/classes/AudioEffectReverb.xml msgid "" @@ -11774,7 +11793,7 @@ msgstr "模拟ä¸åŒå¤§å°çš„æˆ¿é—´ã€‚其傿•°å¯ä»¥è°ƒæ•´ï¼Œä»¥æ¨¡æ‹Ÿç‰¹å®šæˆ¿ msgid "" "Defines how reflective the imaginary room's walls are. Value can range from " "0 to 1." -msgstr "定义虚拟房间墙å£çš„å射程度。值的范围是0到1。" +msgstr "定义虚拟房间墙å£çš„å射程度。值的范围是 0 到 1。" #: doc/classes/AudioEffectReverb.xml msgid "" @@ -11789,11 +11808,11 @@ msgid "" "cutoff frequency. Value can range from 0 to 1." msgstr "" "高通滤波器通过频率高于æŸä¸€æˆªæ¢é¢‘率的信å·ï¼Œè¡°å‡é¢‘率低于截æ¢é¢‘率的信å·ã€‚数值范" -"围为0~1。" +"围为 0 到 1。" #: doc/classes/AudioEffectReverb.xml msgid "Output percent of predelay. Value can range from 0 to 1." -msgstr "预延迟的输出百分比。数值范围为0~1。" +msgstr "预延迟的输出百分比。数值范围为 0 到 1。" #: doc/classes/AudioEffectReverb.xml msgid "" @@ -11805,13 +11824,13 @@ msgstr "原始信å·ä¸Žæ··å“ä¿¡å·æ—©æœŸåå°„ä¹‹é—´çš„æ—¶é—´ï¼Œä»¥æ¯«ç§’ä¸ºå• msgid "" "Dimensions of simulated room. Bigger means more echoes. Value can range from " "0 to 1." -msgstr "模拟房间的尺寸。越大表示回声越多。值的范围å¯ä»¥ä»Ž0到1。" +msgstr "模拟房间的尺寸。越大表示回声越多。值的范围å¯ä»¥ä»Ž 0 到 1。" #: doc/classes/AudioEffectReverb.xml msgid "" "Widens or narrows the stereo image of the reverb tail. 1 means fully widens. " "Value can range from 0 to 1." -msgstr "æ‰©å¤§æˆ–ç¼©å°æ··å“尾音的立体声图åƒã€‚1表示完全扩大。值的范围是0到1。" +msgstr "æ‰©å¤§æˆ–ç¼©å°æ··å“尾音的立体声图åƒã€‚1 表示完全扩大。值的范围是 0 到 1。" #: doc/classes/AudioEffectReverb.xml msgid "" @@ -11842,7 +11861,7 @@ msgstr "音频频谱演示" #: doc/classes/AudioStreamGenerator.xml #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "Godot 3.2 will get new audio features" -msgstr "Godot 3.2将获得新的音频功能" +msgstr "Godot 3.2 将获得新的音频功能" #: doc/classes/AudioEffectSpectrumAnalyzer.xml msgid "" @@ -11882,7 +11901,7 @@ msgid "" "charge of creating sample data (playable audio) as well as its playback via " "a voice interface." msgstr "" -"[AudioServer]是一个音频访问的低级æœåŠ¡å™¨æŽ¥å£ã€‚å®ƒè´Ÿè´£åˆ›å»ºæ ·æœ¬æ•°æ®ï¼ˆå¯æ’放的音" +"[AudioServer] 是用于音频访问的底层æœåŠ¡å™¨æŽ¥å£ã€‚å®ƒè´Ÿè´£åˆ›å»ºæ ·æœ¬æ•°æ®ï¼ˆå¯æ’放的音" "频)以åŠé€šè¿‡è¯éŸ³æŽ¥å£è¿›è¡Œæ’放。" #: doc/classes/AudioServer.xml doc/classes/AudioStreamPlayer.xml @@ -11907,19 +11926,19 @@ msgstr "返回系统上检测到的所有音频输入设备的å称。" #: doc/classes/AudioServer.xml msgid "Generates an [AudioBusLayout] using the available buses and effects." -msgstr "使用å¯ç”¨çš„æ€»çº¿å’Œæ•ˆæžœç”Ÿæˆ[AudioBusLayout]。" +msgstr "使用å¯ç”¨çš„æ€»çº¿å’Œæ•ˆæžœæ¥ç”Ÿæˆ [AudioBusLayout]。" #: doc/classes/AudioServer.xml msgid "" "Returns the amount of channels of the bus at index [code]bus_idx[/code]." -msgstr "返回索引为[code]bus_idx[/code]çš„æ€»çº¿é€šé“æ•°ã€‚" +msgstr "返回索引为 [code]bus_idx[/code] çš„æ€»çº¿çš„é€šé“æ•°ã€‚" #: doc/classes/AudioServer.xml msgid "" "Returns the [AudioEffect] at position [code]effect_idx[/code] in bus " "[code]bus_idx[/code]." msgstr "" -"返回总线 [code]bus_idx[/code] in [code]effect_idx[/code] ä½ç½®çš„ " +"返回总线 [code]bus_idx[/code] ä¸ä½äºŽ [code]effect_idx[/code] çš„ " "[AudioEffect]。" #: doc/classes/AudioServer.xml @@ -11931,41 +11950,41 @@ msgid "" "Returns the [AudioEffectInstance] assigned to the given bus and effect " "indices (and optionally channel)." msgstr "" -"返回分é…给给定总线和效果指数(以åŠå¯é€‰çš„通é“)的[AudioEffectInstance]。" +"返回分é…给给定总线和效果指数(以åŠå¯é€‰çš„通é“)的 [AudioEffectInstance]。" #: doc/classes/AudioServer.xml msgid "Returns the index of the bus with the name [code]bus_name[/code]." -msgstr "返回å称为[code]bus_name[/code]的总线的索引。" +msgstr "返回å称为 [code]bus_name[/code] 的总线的索引。" #: doc/classes/AudioServer.xml msgid "Returns the name of the bus with the index [code]bus_idx[/code]." -msgstr "返回索引为 [code]bus_idx[/code] 的总线å称。" +msgstr "返回索引为 [code]bus_idx[/code] 的总线的å称。" #: doc/classes/AudioServer.xml msgid "" "Returns the peak volume of the left speaker at bus index [code]bus_idx[/" "code] and channel index [code]channel[/code]." msgstr "" -"返回总线索引[code]bus_idx[/code]和通é“索引[code]channel[/code]处左扬声器的峰" -"值音é‡ã€‚" +"返回总线索引 [code]bus_idx[/code] 和通é“索引 [code]channel[/code] 处左扬声器" +"的峰值音é‡ã€‚" #: doc/classes/AudioServer.xml msgid "" "Returns the peak volume of the right speaker at bus index [code]bus_idx[/" "code] and channel index [code]channel[/code]." msgstr "" -"返回总线索引[code]bus_idx[/code]和通é“索引[code]channel[/code]处峿‰¬å£°å™¨çš„å³°" -"值音é‡ã€‚" +"返回总线索引 [code]bus_idx[/code] 和通é“索引 [code]channel[/code] 处峿‰¬å£°å™¨" +"的峰值音é‡ã€‚" #: doc/classes/AudioServer.xml msgid "" "Returns the name of the bus that the bus at index [code]bus_idx[/code] sends " "to." -msgstr "返回ä½äºŽç´¢å¼•[code]bus_idx[/code]处的总线所å‘é€çš„æ€»çº¿å称。" +msgstr "返回ä½äºŽç´¢å¼• [code]bus_idx[/code] 处的总线所å‘é€çš„æ€»çº¿å称。" #: doc/classes/AudioServer.xml msgid "Returns the volume of the bus at index [code]bus_idx[/code] in dB." -msgstr "返回索引[code]bus_idx[/code]处总线的音é‡ï¼Œå•ä½ä¸ºdB。" +msgstr "返回索引 [code]bus_idx[/code] 处总线的音é‡ï¼Œå•ä½ä¸º dB。" #: doc/classes/AudioServer.xml msgid "Returns the names of all audio devices detected on the system." @@ -12008,13 +12027,13 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "If [code]true[/code], the bus at index [code]bus_idx[/code] is muted." -msgstr "如果为 [code]true[/code],则索引[code]bus_idx[/code]处的总线被é™éŸ³ã€‚" +msgstr "如果为 [code]true[/code],则索引 [code]bus_idx[/code] 处的总线被é™éŸ³ã€‚" #: doc/classes/AudioServer.xml msgid "" "If [code]true[/code], the bus at index [code]bus_idx[/code] is in solo mode." msgstr "" -"如果为 [code]true[/code],则索引[code]bus_idx[/code]处的总线处于solo模å¼ã€‚" +"如果为 [code]true[/code],则索引 [code]bus_idx[/code] å¤„çš„æ€»çº¿å¤„äºŽç‹¬å¥æ¨¡å¼ã€‚" #: doc/classes/AudioServer.xml msgid "" @@ -12027,11 +12046,11 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "" "Moves the bus from index [code]index[/code] to index [code]to_index[/code]." -msgstr "将总线从索引[code]index[/code]移动到索引[code]to_index[/code]。" +msgstr "将总线从索引 [code]index[/code] 移动到索引 [code]to_index[/code]。" #: doc/classes/AudioServer.xml msgid "Removes the bus at index [code]index[/code]." -msgstr "移除索引[code]index[/code]处的总线。" +msgstr "移除索引 [code]index[/code] 处的总线。" #: doc/classes/AudioServer.xml msgid "" @@ -12043,12 +12062,12 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "Overwrites the currently used [AudioBusLayout]." -msgstr "覆盖当å‰ä½¿ç”¨çš„[AudioBusLayout]。" +msgstr "覆盖当å‰ä½¿ç”¨çš„ [AudioBusLayout]。" #: doc/classes/AudioServer.xml msgid "" "Sets the name of the bus at index [code]bus_idx[/code] to [code]name[/code]." -msgstr "将索引[code]bus_idx[/code]处的总线å称设置为[code]name[/code]。" +msgstr "将索引 [code]bus_idx[/code] 处的总线å称设置为 [code]name[/code]。" #: doc/classes/AudioServer.xml msgid "" @@ -12066,7 +12085,7 @@ msgstr "" #: doc/classes/AudioServer.xml msgid "Swaps the position of two effects in bus [code]bus_idx[/code]." -msgstr "在[code]bus_idx[/code]ä¸äº¤æ¢ä¸¤ä¸ªæ•ˆæžœçš„ä½ç½®ã€‚" +msgstr "在 [code]bus_idx[/code] ä¸äº¤æ¢ä¸¤ä¸ªæ•ˆæžœçš„ä½ç½®ã€‚" #: doc/classes/AudioServer.xml msgid "" @@ -12111,11 +12130,12 @@ msgid "" "Scales the rate at which audio is played (i.e. setting it to [code]0.5[/" "code] will make the audio be played twice as fast)." msgstr "" -"ç¼©æ”¾æ’æ”¾éŸ³é¢‘的速率(å³å°†å…¶è®¾ç½®ä¸º[code]0.5[/code]å°†ä½¿éŸ³é¢‘æ’æ”¾é€Ÿåº¦æé«˜ä¸€å€ï¼‰ã€‚" +"ç¼©æ”¾æ’æ”¾éŸ³é¢‘的速率(å³å°†å…¶è®¾ç½®ä¸º [code]0.5[/code] å°†ä½¿éŸ³é¢‘æ’æ”¾é€Ÿåº¦æé«˜ä¸€" +"å€ï¼‰ã€‚" #: doc/classes/AudioServer.xml msgid "Emitted when the [AudioBusLayout] changes." -msgstr "当[AudioBusLayout]æ”¹å˜æ—¶å‘出。" +msgstr "当 [AudioBusLayout] æ”¹å˜æ—¶å‘出。" #: doc/classes/AudioServer.xml msgid "Two or fewer speakers were detected." @@ -12123,15 +12143,15 @@ msgstr "检测到两个或更少的扬声器。" #: doc/classes/AudioServer.xml msgid "A 3.1 channel surround setup was detected." -msgstr "检测到3.1声é“环绕声设置。" +msgstr "检测到 3.1 声é“环绕声设置。" #: doc/classes/AudioServer.xml msgid "A 5.1 channel surround setup was detected." -msgstr "检测到5.1声é“环绕声设置。" +msgstr "检测到 5.1 声é“环绕声设置。" #: doc/classes/AudioServer.xml msgid "A 7.1 channel surround setup was detected." -msgstr "检测到7.1声é“环绕声设置。" +msgstr "检测到 7.1 声é“环绕声设置。" #: doc/classes/AudioStream.xml msgid "Base class for audio streams." @@ -12143,8 +12163,8 @@ msgid "" "music playback, and support WAV (via [AudioStreamSample]) and OGG (via " "[AudioStreamOGGVorbis]) file formats." msgstr "" -"音频æµçš„基类。音频æµç”¨äºŽå£°éŸ³æ•ˆæžœå’ŒéŸ³ä¹æ’æ”¾ï¼Œæ”¯æŒ WAV(通过" -"[AudioStreamSample])和 OGG(通过[AudioStreamOGGVorbis]ï¼‰æ–‡ä»¶æ ¼å¼ã€‚" +"音频æµçš„基类。音频æµç”¨äºŽå£°éŸ³æ•ˆæžœå’ŒéŸ³ä¹æ’æ”¾ï¼Œæ”¯æŒ WAV(通过 " +"[AudioStreamSample])和 OGG(通过 [AudioStreamOGGVorbis]ï¼‰æ–‡ä»¶æ ¼å¼ã€‚" #: doc/classes/AudioStream.xml doc/classes/AudioStreamPlayer.xml msgid "Audio streams" @@ -12176,7 +12196,7 @@ msgid "" "class from GDScript, consider using a lower [member mix_rate] such as 11,025 " "Hz or 22,050 Hz." msgstr "" -"æ¤éŸ³é¢‘æµä¸æ’放声音,需è¦è„šæœ¬ä¸ºå…¶ç”ŸæˆéŸ³é¢‘æ•°æ®ã€‚å‚阅" +"æ¤éŸ³é¢‘æµä¸æ’放声音,需è¦è„šæœ¬ä¸ºå…¶ç”ŸæˆéŸ³é¢‘æ•°æ®ã€‚å¦è¯·å‚阅 " "[AudioStreamGeneratorPlayback]。\n" "å¦è¯·å‚阅 [AudioEffectSpectrumAnalyzer] 用于执行实时音频频谱分æžã€‚\n" "[b]注æ„:[/b]由于性能é™åˆ¶ï¼Œæœ€å¥½ä»Ž C# 或通过 GDNative 编译的è¯è¨€ä¸ä½¿ç”¨æ¤ç±»ã€‚如" @@ -12221,7 +12241,7 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "Plays back audio generated using [AudioStreamGenerator]." -msgstr "æ’æ”¾ä½¿ç”¨[AudioStreamGenerator]生æˆçš„音频。" +msgstr "æ’æ”¾ä½¿ç”¨ [AudioStreamGenerator] 生æˆçš„音频。" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -12287,7 +12307,7 @@ msgstr "包å«ä»¥å—节为å•ä½çš„音频数æ®ã€‚" msgid "" "If [code]true[/code], the stream will automatically loop when it reaches the " "end." -msgstr "如果[code]true[/code],当æµåˆ°è¾¾æœ«å°¾æ—¶å°†è‡ªåŠ¨å¾ªçŽ¯ã€‚" +msgstr "如果为 [code]true[/code],当æµåˆ°è¾¾æœ«å°¾æ—¶å°†è‡ªåŠ¨å¾ªçŽ¯ã€‚" #: modules/minimp3/doc_classes/AudioStreamMP3.xml #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml @@ -12321,8 +12341,8 @@ msgid "" "[AudioStreamPlayer3D] instead of [AudioStreamPlayer]." msgstr "" "以éžä½ç½®æ–¹å¼æ”¯æŒæ’放音频æµã€‚\n" -"è¦åœ¨ä½ç½®ä¸Šæ’放音频,请使用[AudioStreamPlayer2D]或[AudioStreamPlayer3D]è€Œä¸æ˜¯" -"[AudioStreamPlayer]。" +"è¦åœ¨ä½ç½®ä¸Šæ’放音频,请使用 [AudioStreamPlayer2D] 或 [AudioStreamPlayer3D] 而" +"䏿˜¯ [AudioStreamPlayer]。" #: doc/classes/AudioStreamPlayer.xml msgid "Returns the position in the [AudioStream] in seconds." @@ -12361,7 +12381,7 @@ msgid "" "If the audio configuration has more than two speakers, this sets the target " "channels. See [enum MixTarget] constants." msgstr "" -"如果音频é…ç½®æœ‰ä¸¤ä¸ªä»¥ä¸Šçš„æ‰¬å£°å™¨ï¼Œåˆ™è®¾ç½®ç›®æ ‡é€šé“。请å‚阅[enum MixTarget]常é‡ã€‚" +"如果音频é…ç½®æœ‰ä¸¤ä¸ªä»¥ä¸Šçš„æ‰¬å£°å™¨ï¼Œåˆ™è®¾ç½®ç›®æ ‡é€šé“ã€‚è§ [enum MixTarget] 常é‡ã€‚" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml #: doc/classes/AudioStreamPlayer3D.xml @@ -12373,19 +12393,19 @@ msgstr "音频的音高和节å¥ï¼Œä½œä¸ºéŸ³é¢‘æ ·æœ¬çš„é‡‡æ ·çŽ‡çš„å€æ•°ã€‚" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml #: doc/classes/AudioStreamPlayer3D.xml msgid "If [code]true[/code], audio is playing." -msgstr "如果[code]true[/code]ï¼Œåˆ™æ’æ”¾éŸ³é¢‘。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™æ’æ”¾éŸ³é¢‘。" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml msgid "The [AudioStream] object to be played." -msgstr "è¦æ’放的[AudioStream]对象。" +msgstr "è¦æ’放的 [AudioStream] 对象。" #: doc/classes/AudioStreamPlayer.xml doc/classes/AudioStreamPlayer2D.xml msgid "" "If [code]true[/code], the playback is paused. You can resume it by setting " "[code]stream_paused[/code] to [code]false[/code]." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™æš‚åœæ’放。您å¯ä»¥é€šè¿‡å°† [code]stream_paused[/code] " -"设置为 [code]false[/code] æ¥æ¢å¤æ’放。" +"如果为 [code]true[/code]ï¼Œåˆ™æš‚åœæ’放。您å¯ä»¥é€šè¿‡å°† [code]stream_paused[/" +"code] 设置为 [code]false[/code] æ¥æ¢å¤æ’放。" #: doc/classes/AudioStreamPlayer.xml msgid "Volume of sound, in dB." @@ -12423,10 +12443,10 @@ msgid "" "audible to human hearing)." msgstr "" "æ’æ”¾éŸ³é¢‘,éšç€ä¸Žå±å¹•ä¸å¿ƒçš„è·ç¦»è€Œå‡å¼±ã€‚\n" -"å‚阅[AudioStreamPlayer]æ¥æ’放éžä½ç½®æ€§çš„声音。\n" -"[b]注æ„:[/b]éšè—一个[AudioStreamPlayer2D]节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶ç¦" -"用[AudioStreamPlayer2D]的音频输出,请将[member volume_db]设置为一个éžå¸¸ä½Žçš„" -"值,如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" +"å‚阅 [AudioStreamPlayer] æ¥æ’放éžä½ç½®æ€§çš„声音。\n" +"[b]注æ„:[/b]éšè—一个 [AudioStreamPlayer2D] 节点并ä¸èƒ½ç¦ç”¨å…¶éŸ³é¢‘è¾“å‡ºã€‚è¦æš‚æ—¶" +"ç¦ç”¨ [AudioStreamPlayer2D] 的音频输出,请将 [member volume_db] 设置为一个éžå¸¸" +"低的值,如[code]-100[/code](人的å¬è§‰å¬ä¸åˆ°ï¼‰ã€‚" #: doc/classes/AudioStreamPlayer2D.xml doc/classes/AudioStreamPlayer3D.xml msgid "Returns the position in the [AudioStream]." @@ -12502,7 +12522,7 @@ msgstr "" msgid "" "Returns the [AudioStreamPlayback] object associated with this " "[AudioStreamPlayer3D]." -msgstr "返回与该[AudioStreamPlayer3D]相关è”çš„[AudioStreamPlayback]对象。" +msgstr "返回与这个 [AudioStreamPlayer3D] 相关è”çš„ [AudioStreamPlayback] 对象。" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12543,7 +12563,7 @@ msgid "" "If [code]true[/code], audio plays when the AudioStreamPlayer3D node is added " "to scene tree." msgstr "" -"如果 [code]true[/code],则在将 AudioStreamPlayer3D èŠ‚ç‚¹æ·»åŠ åˆ°åœºæ™¯æ ‘æ—¶æ’æ”¾éŸ³" +"如果为 [code]true[/code],则在将 AudioStreamPlayer3D èŠ‚ç‚¹æ·»åŠ åˆ°åœºæ™¯æ ‘æ—¶æ’æ”¾éŸ³" "频。" #: doc/classes/AudioStreamPlayer3D.xml @@ -12571,7 +12591,7 @@ msgstr "音频到达相机的角度,ä¸å—è¡°å‡ã€‚" msgid "" "If [code]true[/code], the audio should be dampened according to the " "direction of the sound." -msgstr "如果[code]true[/code]ï¼Œåˆ™åº”æ ¹æ®å£°éŸ³çš„æ–¹å‘对音频进行衰å‡ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™åº”æ ¹æ®å£°éŸ³çš„æ–¹å‘对音频进行衰å‡ã€‚" #: doc/classes/AudioStreamPlayer3D.xml msgid "" @@ -12599,15 +12619,15 @@ msgstr "决定当音æºè¶…出 [member max_distance] 范围时,是å¦åº”该暂å #: doc/classes/AudioStreamPlayer3D.xml msgid "The [AudioStream] resource to be played." -msgstr "è¦æ’放的[AudioStream]资æºã€‚" +msgstr "è¦æ’放的 [AudioStream] 资æºã€‚" #: doc/classes/AudioStreamPlayer3D.xml msgid "" "If [code]true[/code], the playback is paused. You can resume it by setting " "[member stream_paused] to [code]false[/code]." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™æ’æ”¾ä¼šæš‚åœã€‚ä½ å¯ä»¥é€šè¿‡è®¾ç½®[member stream_paused]为 " -"[code]false[/code]æ¥æ¢å¤å®ƒã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™æ’æ”¾ä¼šæš‚åœã€‚ä½ å¯ä»¥é€šè¿‡å°† [member stream_paused] " +"设置为 [code]false[/code]æ¥æ¢å¤å®ƒã€‚" #: doc/classes/AudioStreamPlayer3D.xml msgid "The base sound level unaffected by dampening, in decibels." @@ -12639,7 +12659,7 @@ msgid "" "greater than [code]0.0[/code] to achieve linear attenuation clamped to a " "sphere of a defined size." msgstr "" -"ä¸ä¼šæ ¹æ®è·ç¦»è¡°å‡å“度。与 [AudioStreamPlayer] ä¸åŒï¼Œå£°éŸ³ä»ä¼šåœ¨ä½ç½®ä¸Šè¢«å¬åˆ°ã€‚ " +"ä¸ä¼šæ ¹æ®è·ç¦»è¡°å‡å“度。与 [AudioStreamPlayer] ä¸åŒï¼Œå£°éŸ³ä»ä¼šåœ¨ä½ç½®ä¸Šè¢«å¬åˆ°ã€‚" "[constant ATTENUATION_DISABLED] å¯ä»¥ä¸Žå¤§äºŽ [code]0.0[/code] çš„ [member " "max_distance] 值结åˆä½¿ç”¨ï¼Œä»¥å®žçŽ°çº¿æ€§è¡°å‡ï¼Œé™åˆ¶åœ¨å®šä¹‰çš„çƒä½“大å°ã€‚" @@ -12685,7 +12705,7 @@ msgstr "æ¯æ¬¡å¼€å§‹æ—¶éšæœºå˜æ¢éŸ³é«˜ã€‚" #: doc/classes/AudioStreamRandomPitch.xml msgid "The current [AudioStream]." -msgstr "当å‰çš„[AudioStream]。" +msgstr "当å‰çš„ [AudioStream]。" #: doc/classes/AudioStreamRandomPitch.xml msgid "The intensity of random pitch variation." @@ -12693,7 +12713,7 @@ msgstr "éšæœºéŸ³é«˜å˜åŒ–的强度。" #: doc/classes/AudioStreamSample.xml msgid "Stores audio data loaded from WAV files." -msgstr "å˜å‚¨ä»ŽWAVæ–‡ä»¶åŠ è½½çš„éŸ³é¢‘æ•°æ®ã€‚" +msgstr "å˜å‚¨ä»Ž WAV æ–‡ä»¶åŠ è½½çš„éŸ³é¢‘æ•°æ®ã€‚" #: doc/classes/AudioStreamSample.xml msgid "" @@ -12717,10 +12737,10 @@ msgid "" "[b]Note:[/b] A [code].wav[/code] extension is automatically appended to " "[code]path[/code] if it is missing." msgstr "" -"å°†AudioStreamSample作为WAV文件ä¿å˜åˆ°[code]path[/code]ã€‚æ— æ³•ä¿å˜IMA ADPCMæ ¼å¼" -"çš„æ ·æœ¬ã€‚\n" -"[b]注æ„:[/b]如果缺少[code].wav[/code]扩展åï¼Œåˆ™ä¼šè‡ªåŠ¨å°†å…¶é™„åŠ åˆ°[code]path[/" -"code]。" +"å°† AudioStreamSample 作为 WAV 文件ä¿å˜åˆ° [code]path[/code]ã€‚æ— æ³•ä¿å˜ IMA " +"ADPCM æ ¼å¼çš„æ ·æœ¬ã€‚\n" +"[b]注æ„:[/b]如果缺少 [code].wav[/code] 扩展åï¼Œåˆ™ä¼šè‡ªåŠ¨å°†å…¶é™„åŠ åˆ° " +"[code]path[/code]。" #: doc/classes/AudioStreamSample.xml msgid "" @@ -12734,7 +12754,7 @@ msgstr "" #: doc/classes/AudioStreamSample.xml msgid "Audio format. See [enum Format] constants for values." -msgstr "éŸ³é¢‘æ ¼å¼ã€‚å‚阅[enum Format]常é‡çš„值。" +msgstr "éŸ³é¢‘æ ¼å¼ã€‚å‚阅 [enum Format] 常é‡çš„值。" #: doc/classes/AudioStreamSample.xml msgid "" @@ -12850,9 +12870,9 @@ msgid "" "derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " "adding them as children." msgstr "" -"用于对当å‰å±å¹•显示进行åŽå°ç¼“冲的节点。 BackBufferCopy 节点ä¸å®šä¹‰çš„区域与其覆" -"ç›–å±å¹•çš„å†…å®¹ä¸€èµ·ç¼“å†²ï¼Œæˆ–è€…æ ¹æ®æ‹·è´æ¨¡å¼è®¾ç½®çš„æ•´ä¸ªå±å¹•进行缓冲。在ç€è‰²å™¨è„šæœ¬ä¸" -"使用 [code]texture(SCREEN_TEXTURE, ...)[/code] 函数æ¥è®¿é—®ç¼“冲区。\n" +"用于对当å‰å±å¹•显示进行åŽå°ç¼“冲的节点。BackBufferCopy 节点ä¸å®šä¹‰çš„区域与其覆盖" +"å±å¹•çš„å†…å®¹ä¸€èµ·ç¼“å†²ï¼Œæˆ–è€…æ ¹æ®æ‹·è´æ¨¡å¼è®¾ç½®çš„æ•´ä¸ªå±å¹•进行缓冲。在ç€è‰²å™¨è„šæœ¬ä¸ä½¿" +"用 [code]texture(SCREEN_TEXTURE, ...)[/code] 函数æ¥è®¿é—®ç¼“冲区。\n" "[b]注æ„:[/b]由于该节点继承自 [Node2D] è€Œéž [Control],锚点和边è·å°†ä¸ä¼šåº”用于" "从 [Control] 派生的å节点。这在调整窗å£å¤§å°æ—¶å¯èƒ½ä¼šå‡ºçŽ°é—®é¢˜ã€‚ä¸ºé¿å…è¿™ç§æƒ…况," "请将 [Control] æ´¾ç”ŸèŠ‚ç‚¹æ·»åŠ ä¸º BackBufferCopy 节点的[i]åŒçº§[/i],ä¸è¦å°†å®ƒä»¬æ·»" @@ -12860,7 +12880,7 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "Buffer mode. See [enum CopyMode] constants." -msgstr "缓冲区模å¼ã€‚å‚阅 [enum CopyMode] 常é‡ã€‚" +msgstr "缓冲区模å¼ã€‚è§ [enum CopyMode] 常é‡ã€‚" #: doc/classes/BackBufferCopy.xml msgid "" @@ -12919,10 +12939,10 @@ msgid "" "If no save path is provided it will try to match the path from the current " "[member light_data]." msgstr "" -"烘焙光照贴图,从给定的[code]from_node[/code]æ ¹èŠ‚ç‚¹æ‰«æï¼Œå¹¶å°†äº§ç”Ÿçš„" -"[BakedLightmapData]ä¿å˜åœ¨[code]data_save_path[/code]ä¸ã€‚如果没有æä¾›æ ¹èŠ‚ç‚¹ï¼Œ" -"æ¤èŠ‚ç‚¹çš„çˆ¶èŠ‚ç‚¹å°†ä½œä¸ºæ ¹èŠ‚ç‚¹ã€‚å¦‚æžœæ²¡æœ‰æä¾›ä¿å˜è·¯å¾„,将å°è¯•匹é…当å‰[member " -"light_data]的路径。" +"烘焙光照贴图,从给定的 [code]from_node[/code] æ ¹èŠ‚ç‚¹æ‰«æï¼Œå¹¶å°†äº§ç”Ÿçš„ " +"[BakedLightmapData] ä¿å˜åœ¨ [code]data_save_path[/code] ä¸ã€‚如果没有æä¾›æ ¹èŠ‚" +"点,æ¤èŠ‚ç‚¹çš„çˆ¶èŠ‚ç‚¹å°†ä½œä¸ºæ ¹èŠ‚ç‚¹ã€‚å¦‚æžœæ²¡æœ‰æä¾›ä¿å˜è·¯å¾„,将å°è¯•匹é…å½“å‰ [member " +"light_data] 的路径。" #: doc/classes/BakedLightmap.xml msgid "" @@ -12969,11 +12989,11 @@ msgid "" "[b]Note:[/b] [member bounce_indirect_energy] only has an effect if [member " "bounces] is set to a value greater than or equal to [code]1[/code]." msgstr "" -"æ¯æ¬¡å弹的能é‡ä¹˜æ•°ã€‚较高的值将使间接照明更亮。 [code]1.0[/code] 的值表示与物" -"ç†ç›¸ä¸€è‡´çš„行为,但在使用少é‡å弹时,å¯ä»¥ä½¿ç”¨æ›´é«˜çš„å€¼ä½¿é—´æŽ¥ç…§æ˜Žä¼ æ’æ›´æ˜Žæ˜¾ã€‚è¿™" -"å¯ç”¨äºŽé€šè¿‡é™ä½Ž [member bounces] 的数é‡ç„¶åŽå¢žåŠ [member " -"bounce_indirect_energy] æ¥åŠ å¿«çƒ˜ç„™æ—¶é—´ã€‚ä¸Ž [member BakedLightmapData.energy] " -"ä¸åŒï¼Œæ¤å±žæ€§ä¸ä¼šå½±å“ç¯å…‰èŠ‚ç‚¹ã€å‘å…‰æè´¨å’ŒçŽ¯å¢ƒå‘出的直接光照。\n" +"æ¯æ¬¡å弹的能é‡ä¹˜æ•°ã€‚较高的值将使间接照明更亮。[code]1.0[/code] 的值表示与物ç†" +"相一致的行为,但在使用少é‡å弹时,å¯ä»¥ä½¿ç”¨æ›´é«˜çš„å€¼ä½¿é—´æŽ¥ç…§æ˜Žä¼ æ’æ›´æ˜Žæ˜¾ã€‚è¿™å¯" +"用于通过é™ä½Ž [member bounces] 的数é‡ç„¶åŽå¢žåŠ [member bounce_indirect_energy] " +"æ¥åŠ å¿«çƒ˜ç„™æ—¶é—´ã€‚ä¸Ž [member BakedLightmapData.energy] ä¸åŒï¼Œæ¤å±žæ€§ä¸ä¼šå½±å“ç¯å…‰" +"节点ã€å‘å…‰æè´¨å’ŒçŽ¯å¢ƒå‘出的直接光照。\n" "[b]注æ„:[/b][member bounce_indirect_energy] 仅在 [member bounces] 设置为大于" "ç‰äºŽ [code]1[/code] 的值时有效。" @@ -12981,7 +13001,8 @@ msgstr "" msgid "" "Number of light bounces that are taken into account during baking. See also " "[member bounce_indirect_energy]." -msgstr "烘焙过程ä¸è€ƒè™‘的光线å射次数。å‚阅 [member bounce_indirect_energy]。" +msgstr "" +"烘焙过程ä¸è€ƒè™‘的光线å射次数。å¦è¯·å‚阅 [member bounce_indirect_energy]。" #: doc/classes/BakedLightmap.xml msgid "Grid size used for real-time capture information on dynamic objects." @@ -13228,7 +13249,7 @@ msgid "" "directly (it doesn't display anything). Other types of buttons inherit from " "it." msgstr "" -"BaseButton是按钮的抽象基类,所以ä¸åº”è¯¥ç›´æŽ¥ä½¿ç”¨å®ƒï¼ˆå®ƒä¸æ˜¾ç¤ºä»»ä½•东西)。其他类" +"BaseButton 是按钮的抽象基类,所以ä¸åº”è¯¥ç›´æŽ¥ä½¿ç”¨å®ƒï¼ˆå®ƒä¸æ˜¾ç¤ºä»»ä½•东西)。其他类" "型的按钮都继承自它。" #: doc/classes/BaseButton.xml @@ -13242,7 +13263,7 @@ msgstr "" #: doc/classes/BaseButton.xml msgid "" "Called when the button is toggled (only if [member toggle_mode] is active)." -msgstr "å½“æŒ‰é’®è¢«åˆ‡æ¢æ—¶è°ƒç”¨(仅当 [member toggle_mode] å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶)。" +msgstr "å½“æŒ‰é’®è¢«åˆ‡æ¢æ—¶è°ƒç”¨ï¼ˆä»…当 [member toggle_mode] å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶ï¼‰ã€‚" #: doc/classes/BaseButton.xml msgid "" @@ -13269,10 +13290,10 @@ msgid "" "[b]Note:[/b] This method doesn't unpress other buttons in its button [member " "group]." msgstr "" -"æ”¹å˜æŒ‰é’®çš„[member pressed]状æ€ï¼Œä¸è§¦å‘[signal toggled]ã€‚å½“ä½ åªæƒ³æ”¹å˜æŒ‰é’®çš„状" -"æ€è€Œä¸å‘逿Œ‰ä¸‹äº‹ä»¶æ—¶ä½¿ç”¨ï¼ˆä¾‹å¦‚,在åˆå§‹åŒ–åœºæ™¯æ—¶ï¼‰ã€‚åªæœ‰å½“[member toggle_mode]" -"是[code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚\n" -"[b]注æ„:[/b]这个方法ä¸ä¼šé‡Šæ”¾å…¶æŒ‰é’®[member group] ä¸çš„其他按钮。" +"æ”¹å˜æŒ‰é’®çš„ [member pressed] 状æ€ï¼Œä¸è§¦å‘ [signal toggled]ã€‚å½“ä½ åªæƒ³æ”¹å˜æŒ‰é’®çš„" +"状æ€è€Œä¸å‘逿Œ‰ä¸‹äº‹ä»¶æ—¶ä½¿ç”¨ï¼ˆä¾‹å¦‚,在åˆå§‹åŒ–åœºæ™¯æ—¶ï¼‰ã€‚åªæœ‰å½“ [member " +"toggle_mode] 是 [code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚\n" +"[b]注æ„:[/b]这个方法ä¸ä¼šé‡Šæ”¾å…¶æŒ‰é’® [member group] ä¸çš„其他按钮。" #: doc/classes/BaseButton.xml msgid "" @@ -13294,7 +13315,7 @@ msgstr "" msgid "" "If [code]true[/code], the button is in disabled state and can't be clicked " "or toggled." -msgstr "如果[code]true[/code],则该按钮处于ç¦ç”¨çжæ€ï¼Œæ— 法点击或切æ¢ã€‚" +msgstr "如果为 [code]true[/code],则该按钮处于ç¦ç”¨çжæ€ï¼Œæ— 法点击或切æ¢ã€‚" #: doc/classes/BaseButton.xml msgid "" @@ -13302,12 +13323,12 @@ msgid "" "will be removed in Godot 4.0. This property no longer has any effect when " "set. Please use [member Control.focus_mode] instead." msgstr "" -"[i]已弃用。[/i] 由于冗余,æ¤å±žæ€§å·²å¼ƒç”¨ï¼Œå°†åœ¨ Godot 4.0 ä¸åˆ 除。æ¤å±žæ€§åœ¨è®¾ç½®åŽ" +"[i]已弃用。[/i]由于冗余,æ¤å±žæ€§å·²å¼ƒç”¨ï¼Œå°†åœ¨ Godot 4.0 ä¸åˆ 除。æ¤å±žæ€§åœ¨è®¾ç½®åŽ" "ä¸ä¼šæœ‰ä»»ä½•å½±å“。请改用 [member Control.focus_mode]。" #: doc/classes/BaseButton.xml msgid "[ButtonGroup] associated to the button." -msgstr "与按钮相关è”çš„[ButtonGroup]。" +msgstr "与按钮相关è”çš„ [ButtonGroup]。" #: doc/classes/BaseButton.xml msgid "" @@ -13317,7 +13338,8 @@ msgid "" "Signals will be emitted at the same moment regardless of this property's " "value." msgstr "" -"如果[code]true[/code]ï¼Œå½“æŒ‰ä¸‹æŒ‰é’®æ—¶å°†å…‰æ ‡ç§»åˆ°æŒ‰é’®å¤–æ—¶ï¼ŒæŒ‰é’®ä¼šä¿æŒæŒ‰ä¸‹çжæ€ã€‚\n" +"如果为 [code]true[/code]ï¼Œå½“æŒ‰ä¸‹æŒ‰é’®æ—¶å°†å…‰æ ‡ç§»åˆ°æŒ‰é’®å¤–æ—¶ï¼ŒæŒ‰é’®ä¼šä¿æŒæŒ‰ä¸‹çж" +"æ€ã€‚\n" "[b]注æ„:[/b]该属性åªå½±å“æŒ‰é’®çš„è§†è§‰è¡¨çŽ°ã€‚æ— è®ºè¯¥å±žæ€§çš„å€¼æ˜¯å¤šå°‘ï¼Œä¿¡å·éƒ½ä¼šåœ¨åŒä¸€" "时刻å‘出。" @@ -13330,7 +13352,7 @@ msgid "" "emitted. If you want to change the pressed state without emitting that " "signal, use [method set_pressed_no_signal]." msgstr "" -"如果 [code]true[/code],按钮为按下状æ€ã€‚表示按钮被按下或切æ¢ï¼ˆå¦‚æžœ [member " +"如果为 [code]true[/code],按钮为按下状æ€ã€‚表示按钮被按下或切æ¢ï¼ˆå¦‚æžœ [member " "toggle_mode] 处于激活状æ€ï¼‰ã€‚仅当 [member toggle_mode] 为 [code]true[/code] " "æ—¶æ‰æœ‰æ•ˆã€‚\n" "[b]注æ„:[/b]设置 [member pressed] 将导致 [signal toggled] 触å‘ã€‚å¦‚æžœä½ æƒ³åœ¨ä¸" @@ -13338,21 +13360,21 @@ msgstr "" #: doc/classes/BaseButton.xml msgid "[ShortCut] associated to the button." -msgstr "与按钮相关è”çš„[ShortCut]。" +msgstr "与按钮相关è”çš„ [ShortCut]。" #: doc/classes/BaseButton.xml msgid "" "If [code]true[/code], the button will add information about its shortcut in " "the tooltip." -msgstr "如果[code]true[/code],按钮将在工具æç¤ºä¸æ·»åŠ å…¶å¿«æ·æ–¹å¼çš„ä¿¡æ¯ã€‚" +msgstr "如果为 [code]true[/code],按钮将在工具æç¤ºä¸æ·»åŠ å…¶å¿«æ·æ–¹å¼çš„ä¿¡æ¯ã€‚" #: doc/classes/BaseButton.xml msgid "" "If [code]true[/code], the button is in toggle mode. Makes the button flip " "state between pressed and unpressed each time its area is clicked." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™æŒ‰é’®å¤„äºŽåˆ‡æ¢æ¨¡å¼ã€‚ä½¿æŒ‰é’®åœ¨æ¯æ¬¡ç‚¹å‡»å…¶åŒºåŸŸæ—¶ï¼Œåœ¨æŒ‰ä¸‹å’Œ" -"未按下之间转æ¢çжæ€ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™æŒ‰é’®å¤„äºŽåˆ‡æ¢æ¨¡å¼ã€‚ä½¿æŒ‰é’®åœ¨æ¯æ¬¡ç‚¹å‡»å…¶åŒºåŸŸæ—¶ï¼Œåœ¨æŒ‰" +"下和未按下之间转æ¢çжæ€ã€‚" #: doc/classes/BaseButton.xml msgid "Emitted when the button starts being held down." @@ -13382,14 +13404,14 @@ msgid "" "(only if [member toggle_mode] is active). The new state is contained in the " "[code]button_pressed[/code] argument." msgstr "" -"当按钮刚刚在按下和æ£å¸¸çжæ€ä¹‹é—´åˆ‡æ¢æ—¶å‘出(仅当[member toggle_mode]处于活动状æ€" -"æ—¶)。新状æ€åŒ…å«åœ¨[code]button_pressed[/code]傿•°ä¸ã€‚" +"当按钮刚刚在按下和æ£å¸¸çжæ€ä¹‹é—´åˆ‡æ¢æ—¶å‘出(仅当 [member toggle_mode] 处于活动" +"çŠ¶æ€æ—¶ï¼‰ã€‚新状æ€åŒ…å«åœ¨ [code]button_pressed[/code] 傿•°ä¸ã€‚" #: doc/classes/BaseButton.xml msgid "" "The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " "buttons." -msgstr "按钮的æ£å¸¸çжæ€(峿²¡æœ‰æŒ‰ä¸‹ã€æ²¡æœ‰æ‚¬åœã€æ²¡æœ‰åˆ‡æ¢å’Œå¯ç”¨)。" +msgstr "按钮的æ£å¸¸çжæ€ï¼ˆå³æœªæŒ‰ä¸‹ã€æœªæ‚¬åœã€æœªåˆ‡æ¢å’Œå¯ç”¨ï¼‰ã€‚" #: doc/classes/BaseButton.xml msgid "The state of buttons are pressed." @@ -13419,7 +13441,7 @@ msgstr "è¦æ±‚按下åŽå†é‡Šæ”¾ï¼Œæ‰ç®—点击了按钮。" #: doc/classes/Basis.xml msgid "3×3 matrix datatype." -msgstr "3×3矩阵数æ®ç±»åž‹ã€‚" +msgstr "3×3 矩阵数æ®ç±»åž‹ã€‚" #: doc/classes/Basis.xml msgid "" @@ -13436,7 +13458,7 @@ msgid "" msgstr "" "用于 3D 旋转和缩放的 3×3 çŸ©é˜µã€‚å‡ ä¹Žæ€»æ˜¯ç”¨ä½œå˜æ¢çš„æ£äº¤åŸºã€‚\n" "åŒ…å« 3 个å‘é‡å—段 Xã€Y å’Œ Z ä½œä¸ºå…¶åˆ—ï¼Œé€šå¸¸è¢«è§£é‡Šä¸ºå˜æ¢çš„局部基å‘é‡ã€‚对于这ç§" -"用途,它由一个缩放矩阵和一个旋转矩阵组æˆï¼Œä¾æ¬¡ä¸º (M=R.S)。\n" +"ç”¨é€”ï¼Œå®ƒä¾æ¬¡ç”±ä¸€ä¸ªç¼©æ”¾çŸ©é˜µå’Œä¸€ä¸ªæ—‹è½¬çŸ©é˜µç»„æˆï¼ˆM=R.S)。\n" "也å¯ä»¥ä½œä¸ºä¸‰ç»´å‘é‡çš„æ•°ç»„æ¥è®¿é—®ã€‚这些å‘é‡é€šå¸¸æ˜¯ç›¸äº’æ£äº¤çš„,但ä¸ä¸€å®šæ˜¯å½’一化的" "(由于缩放)。\n" "更多信æ¯è¯·é˜…读文档ä¸çš„ã€ŠçŸ©é˜µå’Œå˜æ¢ã€‹ä¸€æ–‡ã€‚" @@ -13588,14 +13610,14 @@ msgstr "" #: doc/classes/Basis.xml msgid "" "Introduce an additional scaling specified by the given 3D scaling factor." -msgstr "引入一个由给定的3Dç¼©æ”¾å› åæŒ‡å®šçš„é™„åŠ ç¼©æ”¾ã€‚" +msgstr "引入一个由给定的 3D ç¼©æ”¾å› åæŒ‡å®šçš„é™„åŠ ç¼©æ”¾ã€‚" #: doc/classes/Basis.xml msgid "" "Assuming that the matrix is a proper rotation matrix, slerp performs a " "spherical-linear interpolation with another rotation matrix." msgstr "" -"å‡è®¾è¯¥çŸ©é˜µæ˜¯ä¸€ä¸ªåˆé€‚的旋转矩阵,slerp与å¦ä¸€ä¸ªæ—‹è½¬çŸ©é˜µè¿›è¡Œçƒé¢ç›´çº¿æ’值。" +"å‡è®¾è¯¥çŸ©é˜µæ˜¯ä¸€ä¸ªåˆé€‚的旋转矩阵,slerp 与å¦ä¸€ä¸ªæ—‹è½¬çŸ©é˜µè¿›è¡Œçƒé¢ç›´çº¿æ’值。" #: doc/classes/Basis.xml msgid "Transposed dot product with the X axis of the matrix." @@ -13630,7 +13652,7 @@ msgstr "" msgid "" "The basis matrix's X vector (column 0). Equivalent to array index [code]0[/" "code]." -msgstr "基矩阵的 X å‘é‡ï¼ˆç¬¬ 0 åˆ—ï¼‰ã€‚ç‰æ•ˆäºŽæ•°ç»„索引 [code]0[/code]。" +msgstr "基矩阵的 X å‘é‡ï¼ˆç¬¬ 0 列)。相当于数组索引 [code]0[/code]。" #: doc/classes/Basis.xml doc/classes/Transform2D.xml msgid "" @@ -13779,10 +13801,10 @@ msgid "" "alignment for the character and [code]advance[/code] is the (optional) " "advance." msgstr "" -"æ·»åŠ ä¸€ä¸ªå—符到å—体ä¸ï¼Œå…¶ä¸[code]character[/code]是Unicode值,[code]texture[/" -"code]是纹ç†ç´¢å¼•,[code]rect[/code]是纹ç†ä¸çš„区域(以åƒç´ 为å•ä½ï¼ï¼‰ï¼Œ" -"[code]align[/code]是å—ç¬¦çš„å¯¹é½æ–¹å¼ï¼ˆå¯é€‰ï¼‰ï¼Œ[code]advance[/code]是å‰è¿›æ–¹å¼" -"(å¯é€‰ï¼‰ã€‚" +"æ·»åŠ ä¸€ä¸ªå—符到å—体ä¸ï¼Œå…¶ä¸ [code]character[/code] 是 Unicode值," +"[code]texture[/code] 是纹ç†ç´¢å¼•,[code]rect[/code] 是纹ç†ä¸çš„区域(以åƒç´ 为å•" +"ä½ï¼ï¼‰ï¼Œ[code]align[/code] 是å—ç¬¦çš„å¯¹é½æ–¹å¼ï¼ˆå¯é€‰ï¼‰ï¼Œ[code]advance[/code] 是" +"æ¥è¿›é•¿åº¦ï¼ˆå¯é€‰ï¼‰ã€‚" #: doc/classes/BitmapFont.xml msgid "" @@ -13794,7 +13816,7 @@ msgstr "" #: doc/classes/BitmapFont.xml msgid "Adds a texture to the [BitmapFont]." -msgstr "为[BitmapFont]æ·»åŠ ä¸€ä¸ªçº¹ç†ã€‚" +msgstr "为 [BitmapFont] æ·»åŠ ä¸€ä¸ªçº¹ç†ã€‚" #: doc/classes/BitmapFont.xml msgid "Clears all the font data and settings." @@ -13811,11 +13833,11 @@ msgstr "返回å—å¶çš„差值。" #: doc/classes/BitmapFont.xml msgid "Returns the font atlas texture at index [code]idx[/code]." -msgstr "返回ä½äºŽç´¢å¼•[code]idx[/code]处的å—体Atlas纹ç†ã€‚" +msgstr "返回ä½äºŽç´¢å¼• [code]idx[/code] 处的å—体 Atlas 纹ç†ã€‚" #: doc/classes/BitmapFont.xml msgid "Returns the number of textures in the BitmapFont atlas." -msgstr "返回BitmapFont图谱ä¸çº¹ç†çš„æ•°é‡ã€‚" +msgstr "返回 BitmapFont 图谱ä¸çº¹ç†çš„æ•°é‡ã€‚" #: doc/classes/BitmapFont.xml msgid "Ascent (number of pixels above the baseline)." @@ -13823,7 +13845,7 @@ msgstr "上å‡ï¼ˆåŸºçº¿ä»¥ä¸Šçš„åƒç´ 数)。" #: doc/classes/BitmapFont.xml msgid "If [code]true[/code], distance field hint is enabled." -msgstr "如果[code]true[/code],则å¯ç”¨è·ç¦»åœºæç¤ºã€‚" +msgstr "如果为 [code]true[/code],则å¯ç”¨è·ç¦»åœºæç¤ºã€‚" #: doc/classes/BitmapFont.xml msgid "The fallback font." @@ -13860,12 +13882,12 @@ msgstr "" #: doc/classes/Bone2D.xml msgid "Stores the node's current transforms in [member rest]." -msgstr "将节点当å‰çš„å˜æ¢å˜å‚¨åœ¨[member rest]ä¸ã€‚" +msgstr "将节点当å‰çš„å˜æ¢å˜å‚¨åœ¨ [member rest] ä¸ã€‚" #: doc/classes/Bone2D.xml msgid "" "Returns the node's index as part of the entire skeleton. See [Skeleton2D]." -msgstr "返回节点的索引,作为整个骨架的一部分。请å‚阅 [Skeleton2D]。" +msgstr "返回节点在整个骨架ä¸çš„索引å·ã€‚è§ [Skeleton2D]。" #: doc/classes/Bone2D.xml msgid "" @@ -13885,11 +13907,11 @@ msgid "" "Rest transform of the bone. You can reset the node's transforms to this " "value using [method apply_rest]." msgstr "" -"éª¨éª¼çš„é™æ¢å˜æ¢ã€‚您å¯ä»¥ä½¿ç”¨[method apply_rest]å°†èŠ‚ç‚¹çš„å˜æ¢é‡ç½®ä¸ºè¿™ä¸ªå€¼ã€‚" +"骨骼的放æ¾å˜æ¢ã€‚您å¯ä»¥ä½¿ç”¨ [method apply_rest] å°†èŠ‚ç‚¹çš„å˜æ¢é‡ç½®ä¸ºè¿™ä¸ªå€¼ã€‚" #: doc/classes/BoneAttachment.xml msgid "A node that will attach to a bone." -msgstr "一个会附ç€åœ¨éª¨éª¼ä¸Šçš„节点。" +msgstr "会附ç€åœ¨éª¨éª¼ä¸Šçš„节点。" #: doc/classes/BoneAttachment.xml msgid "" @@ -13897,7 +13919,7 @@ msgid "" "for this node to attach to. The BoneAttachment node will copy the transform " "of the selected bone." msgstr "" -"æ¤èŠ‚ç‚¹å¿…é¡»æ˜¯ [Skeleton] 节点的å节点。然åŽï¼Œä½ å¯ä»¥ä¸ºæ¤èŠ‚ç‚¹é€‰æ‹©è¦é™„åŠ çš„éª¨éª¼ã€‚ " +"æ¤èŠ‚ç‚¹å¿…é¡»æ˜¯ [Skeleton] 节点的å节点。然åŽï¼Œä½ å¯ä»¥ä¸ºæ¤èŠ‚ç‚¹é€‰æ‹©è¦é™„åŠ çš„éª¨éª¼ã€‚" "BoneAttachment èŠ‚ç‚¹å°†æ‹·è´æ‰€é€‰éª¨éª¼çš„å˜æ¢ã€‚" #: doc/classes/BoneAttachment.xml @@ -13957,13 +13979,13 @@ msgid "" " can_shoot = true\n" "[/codeblock]" msgstr "" -"布尔是内置类型。有两个布尔值。[code]true[/code]å’Œ[code]false[/code]ã€‚ä½ å¯ä»¥æŠŠ" -"å®ƒæƒ³è±¡æˆæœ‰å¼€æˆ–关状æ€çš„开关(1或0)。布尔在编程ä¸ç”¨äºŽæ¡ä»¶è¯å¥çš„逻辑,如" -"[code]if[/code]è¯å¥ã€‚\n" -"布尔å¯ä»¥ç›´æŽ¥ç”¨äºŽ[code]if[/code]è¯å¥ä¸ã€‚下é¢çš„代ç 在[code]if can_shoot:[/code]" -"è¡Œä¸æ¼”ç¤ºäº†è¿™ä¸€ç‚¹ã€‚ä½ ä¸éœ€è¦ä½¿ç”¨[code]==true[/code]ï¼Œä½ åªéœ€è¦[code]if " -"can_shoot:[/code]ã€‚åŒæ ·åœ°ï¼Œä½¿ç”¨[code]if not can_shoot:[/code]è€Œä¸æ˜¯[code]== " -"false[/code]。\n" +"布尔是内置类型。布尔值有两个:[code]true[/code] å’Œ [code]false[/code]ã€‚ä½ å¯ä»¥" +"把它想象æˆå¼€å…³ï¼ˆ1 或 0)。布尔在编程ä¸ç”¨äºŽæ¡ä»¶è¯å¥çš„逻辑,如 [code]if[/code] " +"è¯å¥ã€‚\n" +"布尔å¯ä»¥ç›´æŽ¥ç”¨äºŽ [code]if[/code] è¯å¥ä¸ã€‚下é¢çš„代ç 在 [code]if can_shoot:[/" +"code] 行ä¸å¯¹æ¤è¿›è¡Œäº†æ¼”ç¤ºã€‚ä½ ä¸éœ€è¦ä½¿ç”¨ [code]== true[/code]ï¼Œä½ åªéœ€è¦ " +"[code]if can_shoot:[/code]ã€‚åŒæ ·åœ°ï¼Œè¯·ä½¿ç”¨ [code]if not can_shoot:[/code] 而" +"䏿˜¯ [code]== false[/code]。\n" "[codeblock]\n" "var can_shoot = true\n" "\n" @@ -13972,8 +13994,8 @@ msgstr "" " pass # åœ¨æ¤æ‰§è¡Œå°„击。\n" "[/codeblock]\n" "下é¢çš„代ç åªæœ‰åœ¨ä¸¤ä¸ªæ¡ä»¶éƒ½æ»¡è¶³çš„æƒ…况下æ‰ä¼šäº§ç”Ÿå弹:动作“shootâ€è¢«æŒ‰ä¸‹ï¼Œå¹¶ä¸”如" -"æžœ[code]can_shoot[/code]是[code]true[/code]。\n" -"[b]注æ„:[/b][code]Input.is_action_pressed(\"shoot\")[/code]也是一个布尔值," +"æžœ [code]can_shoot[/code] 为 [code]true[/code]。\n" +"[b]注æ„:[/b][code]Input.is_action_pressed(\"shoot\")[/code] 也是一个布尔值," "当“shootâ€è¢«æŒ‰ä¸‹æ—¶ä¸º [code]true[/code],当“shootâ€æ²¡æœ‰è¢«æŒ‰ä¸‹æ—¶ä¸º [code]false[/" "code]。\n" "[codeblock]\n" @@ -13983,8 +14005,8 @@ msgstr "" " if can_shoot and Input.is_action_pressed(\"shoot\"):\n" " create_bullet()\n" "[/codeblock]\n" -"下é¢çš„代ç 将把[code]can_shoot[/code]设置为 [code]false[/code]å¹¶å¯åŠ¨ä¸€ä¸ªå®šæ—¶" -"器。这将阻æ¢çŽ©å®¶å°„å‡»ï¼Œç›´åˆ°å®šæ—¶å™¨ç”¨å®Œã€‚ç„¶åŽ[code]can_shoot[/code]设置为 " +"下é¢çš„代ç 将把 [code]can_shoot[/code] 设置为 [code]false[/code] å¹¶å¯åŠ¨ä¸€ä¸ªå®š" +"时器。这将阻æ¢çŽ©å®¶å°„å‡»ï¼Œç›´åˆ°å®šæ—¶å™¨ç”¨å®Œã€‚ç„¶åŽå°† [code]can_shoot[/code] 设置为 " "[code]true[/code]ï¼Œå†æ¬¡å…许玩家进行射击。\n" "[codeblock]\n" "var can_shoot = true\n" @@ -14217,11 +14239,11 @@ msgstr "将文本å‘å³å¯¹é½ã€‚" #: doc/classes/Button.xml msgid "Default text [Color] of the [Button]." -msgstr "[Button]的默认文本[Color]。" +msgstr "[Button] 的默认文本 [Color]。" #: doc/classes/Button.xml msgid "Text [Color] used when the [Button] is disabled." -msgstr "ç¦ç”¨[Button]时使用的文本[Color]。" +msgstr "ç¦ç”¨ [Button] 时使用的文本 [Color]。" #: doc/classes/Button.xml msgid "" @@ -14229,12 +14251,12 @@ msgid "" "text color of the button. Disabled, hovered, and pressed states take " "precedence over this color." msgstr "" -"当[Button]获得焦点时使用的文本[Color]。åªå–代按钮的æ£å¸¸æ–‡æœ¬é¢œè‰²ã€‚ç¦ç”¨ã€æ‚¬åœå’Œ" -"按下状æ€ä¼˜å…ˆäºŽè¿™ä¸ªé¢œè‰²ã€‚" +"当 [Button] 获得焦点时使用的文本 [Color]。åªå–代按钮的æ£å¸¸æ–‡æœ¬é¢œè‰²ã€‚ç¦ç”¨ã€æ‚¬" +"åœå’ŒæŒ‰ä¸‹çжæ€ä¼˜å…ˆäºŽè¿™ä¸ªé¢œè‰²ã€‚" #: doc/classes/Button.xml msgid "Text [Color] used when the [Button] is being hovered." -msgstr "悬åœ[Button]时使用的文本[Color]。" +msgstr "æ‚¬åœ [Button] 时使用的文本 [Color]。" #: doc/classes/Button.xml msgid "Text [Color] used when the [Button] is being pressed." @@ -14242,11 +14264,11 @@ msgstr "æ£åœ¨æŒ‰ä¸‹ [Button] 时使用的文本 [Color] 。" #: doc/classes/Button.xml msgid "The horizontal space between [Button]'s icon and text." -msgstr "[Button]çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" +msgstr "[Button] çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" #: doc/classes/Button.xml msgid "[Font] of the [Button]'s text." -msgstr "[Button]文本的[Font]。" +msgstr "[Button] 文本的 [Font]。" #: doc/classes/Button.xml msgid "[StyleBox] used when the [Button] is disabled." @@ -14258,20 +14280,20 @@ msgid "" "current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " "visual effect." msgstr "" -"当[Button]获得焦点时使用的[StyleBox]。它显示在当å‰çš„[StyleBox]之上,所以使用" -"[StyleBoxEmpty]åªæ˜¯ç¦ç”¨ç„¦ç‚¹è§†è§‰æ•ˆæžœã€‚" +"当 [Button] 获得焦点时使用的 [StyleBox]。它显示在当å‰çš„ [StyleBox] 之上,所以" +"使用 [StyleBoxEmpty] åªæ˜¯ç¦ç”¨ç„¦ç‚¹è§†è§‰æ•ˆæžœã€‚" #: doc/classes/Button.xml msgid "[StyleBox] used when the [Button] is being hovered." -msgstr "悬åœ[Button]时使用的[StyleBox]。" +msgstr "æ‚¬åœ [Button] 时使用的 [StyleBox]。" #: doc/classes/Button.xml msgid "Default [StyleBox] for the [Button]." -msgstr "[Button]的默认[StyleBox]。" +msgstr "[Button] 的默认 [StyleBox]。" #: doc/classes/Button.xml msgid "[StyleBox] used when the [Button] is being pressed." -msgstr "按下[Button]时使用的[StyleBox]。" +msgstr "按下 [Button] 时使用的 [StyleBox]。" #: doc/classes/ButtonGroup.xml msgid "Group of Buttons." @@ -14291,8 +14313,8 @@ msgid "" "Returns an [Array] of [Button]s who have this as their [ButtonGroup] (see " "[member BaseButton.group])." msgstr "" -"返回一个[Button]çš„[Array],这些[Button]çš„[ButtonGroup]都有这个功能(å‚阅" -"[member BaseButton.group])。" +"返回一个 [Button] çš„ [Array],这些 [Button] çš„ [ButtonGroup] 都有这个功能" +"ï¼ˆè§ [member BaseButton.group])。" #: doc/classes/ButtonGroup.xml msgid "Returns the current pressed button." @@ -14477,7 +14499,7 @@ msgid "" msgstr "" "通过在世界空间å•ä½ä¸æŒ‡å®š [code]size[/code] å’Œ [code]z_near[/code] å’Œ " "[code]z_far[/code] 剪è£å¹³é¢ï¼Œå°†ç›¸æœºæŠ•影设置为æ£äº¤æ¨¡å¼ï¼Œè¯·å‚阅 [constant " -"PROJECTION_ORTHOGONAL]。 (æç¤ºï¼š2D 游æˆç»å¸¸ä½¿ç”¨è¿™ç§æŠ•影,以åƒç´ 为å•使Œ‡å®š" +"PROJECTION_ORTHOGONAL]。(æç¤ºï¼š2D 游æˆç»å¸¸ä½¿ç”¨è¿™ç§æŠ•影,以åƒç´ 为å•使Œ‡å®š" "值。)" #: doc/classes/Camera.xml @@ -14528,7 +14550,8 @@ msgstr "æè¿°æ¤ç›¸æœºæ¸²æŸ“哪些 3D 渲染层的剔除掩ç 。" #: doc/classes/Camera.xml msgid "" "If [code]true[/code], the ancestor [Viewport] is currently using this camera." -msgstr "如果[code]true[/code],则说明祖级的[Viewport]当剿£åœ¨ä½¿ç”¨è¿™ä¸ªæ‘„åƒå¤´ã€‚" +msgstr "" +"如果为 [code]true[/code],则说明祖级的 [Viewport] 当剿£åœ¨ä½¿ç”¨è¿™ä¸ªæ‘„åƒå¤´ã€‚" #: doc/classes/Camera.xml msgid "" @@ -14552,7 +14575,7 @@ msgstr "" #: doc/classes/Camera.xml msgid "The [Environment] to use for this camera." -msgstr "æ¤ç›¸æœºè¦ä½¿ç”¨çš„[Environment]。" +msgstr "æ¤ç›¸æœºè¦ä½¿ç”¨çš„ [Environment]。" #: doc/classes/Camera.xml msgid "" @@ -14574,7 +14597,7 @@ msgid "" msgstr "" "相机的视野角度,以度为å•ä½ã€‚仅适用于é€è§†æ¨¡å¼ã€‚由于 [member keep_aspect] é”定" "ä¸€ä¸ªè½´ï¼Œå› æ¤ [code]fov[/code] 设置å¦ä¸€ä¸ªè½´çš„视角。\n" -"作为å‚考,默认的垂直视野值([code]70.0[/code]ï¼‰ç‰æ•ˆäºŽä»¥ä¸‹æ°´å¹³ FOV:\n" +"作为å‚考,默认的垂直视野值([code]70.0[/code])相当于以下水平 FOV:\n" "- 在 4:3 视窗ä¸çº¦86.07 度\n" "- 在 16:10 视窗ä¸çº¦ 96.50 度\n" "- 在 16:9 视窗ä¸çº¦102.45 度\n" @@ -14598,8 +14621,8 @@ msgid "" "The axis to lock during [member fov]/[member size] adjustments. Can be " "either [constant KEEP_WIDTH] or [constant KEEP_HEIGHT]." msgstr "" -"在[member fov]/[member size]调整时è¦é”定的轴。å¯ä»¥æ˜¯[constant KEEP_WIDTH]或" -"[constant KEEP_HEIGHT]。" +"在 [member fov]/[member size] 调整时è¦é”定的轴。å¯ä»¥æ˜¯ [constant KEEP_WIDTH] " +"或 [constant KEEP_HEIGHT]。" #: doc/classes/Camera.xml msgid "" @@ -14613,8 +14636,8 @@ msgid "" "objects' Z distance from the camera's local space scales their perceived " "size." msgstr "" -"相机的投影模å¼ã€‚在[constant PROJECTION_PERSPECTIVE]模å¼ä¸‹ï¼Œç‰©ä½“与相机局部空间" -"çš„Zè·ç¦»ä¼šå½±å“其感知的大å°ã€‚" +"相机的投影模å¼ã€‚在 [constant PROJECTION_PERSPECTIVE] 模å¼ä¸‹ï¼Œç‰©ä½“与相机局部空" +"é—´çš„Zè·ç¦»ä¼šå½±å“其感知的大å°ã€‚" #: doc/classes/Camera.xml msgid "" @@ -14646,8 +14669,8 @@ msgid "" "Frustum projection. This mode allows adjusting [member frustum_offset] to " "create \"tilted frustum\" effects." msgstr "" -"Frustum投影。通过该模å¼å¯ä»¥è°ƒæ•´[member frustum_offset]æ¥åˆ›å»º \"tilted " -"frustum \"效果。" +"Frustum 投影。通过该模å¼å¯ä»¥è°ƒæ•´ [member frustum_offset] æ¥åˆ›å»ºâ€œtilted " +"frustumâ€æ•ˆæžœã€‚" #: doc/classes/Camera.xml msgid "" @@ -14655,8 +14678,8 @@ msgid "" "usually the best option for projects running in portrait mode, as taller " "aspect ratios will benefit from a wider vertical FOV." msgstr "" -"ä¿ç•™æ°´å¹³é•¿å®½æ¯”,也称为Vert-ç¼©æ”¾ã€‚è¿™é€šå¸¸æ˜¯åœ¨çºµå‘æ¨¡å¼ä¸‹è¿è¡Œçš„é¡¹ç›®çš„æœ€ä½³é€‰æ‹©ï¼Œå› " -"为较高的纵横比将从更宽的垂直视场ä¸å—益。" +"ä¿ç•™æ°´å¹³é•¿å®½æ¯”,也称为 Vert- ç¼©æ”¾ã€‚è¿™é€šå¸¸æ˜¯åœ¨çºµå‘æ¨¡å¼ä¸‹è¿è¡Œçš„项目的最佳选择," +"å› ä¸ºè¾ƒé«˜çš„çºµæ¨ªæ¯”å°†ä»Žæ›´å®½çš„åž‚ç›´è§†åœºä¸å—益。" #: doc/classes/Camera.xml msgid "" @@ -14783,16 +14806,16 @@ msgid "" "Returns the specified margin. See also [member drag_margin_bottom], [member " "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" -"返回指定的边è·ã€‚å¦è¯·å‚阅[member drag_margin_bottom],[member " -"drag_margin_top],[member drag_margin_left]å’Œ[member drag_margin_right]。" +"返回指定的边è·ã€‚å¦è¯·å‚阅 [member drag_margin_bottom]ã€[member " +"drag_margin_top]ã€[member drag_margin_left] å’Œ [member drag_margin_right]。" #: doc/classes/Camera2D.xml msgid "" "Returns the specified camera limit. See also [member limit_bottom], [member " "limit_top], [member limit_left], and [member limit_right]." msgstr "" -"返回指定的相机é™åˆ¶ã€‚请å‚阅 [member limit_bottom]ã€[member limit_top]ã€" -"[member limit_left]å’Œ[member limit_right]。" +"返回指定的相机é™åˆ¶ã€‚å¦è¯·å‚阅 [member limit_bottom]ã€[member limit_top]ã€" +"[member limit_left] å’Œ [member limit_right]。" #: doc/classes/Camera2D.xml msgid "" @@ -14816,7 +14839,7 @@ msgid "" "drag_margin_top], [member drag_margin_left], and [member drag_margin_right]." msgstr "" "设置指定的边è·ã€‚å¦è¯·å‚阅 [member drag_margin_bottom]ã€[member " -"drag_margin_top]ã€[member drag_margin_left]å’Œ [member drag_margin_right]。" +"drag_margin_top]ã€[member drag_margin_left] å’Œ [member drag_margin_right]。" #: doc/classes/Camera2D.xml msgid "" @@ -14824,11 +14847,11 @@ msgid "" "limit_top], [member limit_left], and [member limit_right]." msgstr "" "设置指定的相机é™åˆ¶ã€‚å¦è¯·å‚阅 [member limit_bottom]ã€[member limit_top]ã€" -"[member limit_left]å’Œ[member limit_right]。" +"[member limit_left] å’Œ [member limit_right]。" #: doc/classes/Camera2D.xml msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." -msgstr "Camera2D的锚点。å‚阅[enum AnchorMode]常é‡ã€‚" +msgstr "Camera2D çš„é”šç‚¹ã€‚è§ [enum AnchorMode] 常é‡ã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -14836,8 +14859,8 @@ msgid "" "Only one camera can be current, so setting a different camera [code]current[/" "code] will disable this one." msgstr "" -"如果 [code]true[/code],相机是当å‰åœºæ™¯çš„æ´»åŠ¨ç›¸æœºã€‚å½“å‰åªèƒ½æœ‰ä¸€å°ç›¸æœºï¼Œæ‰€ä»¥è®¾" -"ç½®ä¸åŒçš„相机[code]current[/code]å°†ç¦ç”¨è¿™å°ç›¸æœºã€‚" +"如果为 [code]true[/code],相机是当å‰åœºæ™¯çš„æ´»åŠ¨ç›¸æœºã€‚å½“å‰åªèƒ½æœ‰ä¸€å°ç›¸æœºï¼Œæ‰€ä»¥" +"设置ä¸åŒçš„相机[code]current[/code]å°†ç¦ç”¨è¿™å°ç›¸æœºã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -14852,7 +14875,8 @@ msgid "" "Bottom margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"拖动相机所需的底边è·ã€‚值为[code]1[/code]时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»åŠ¨ã€‚" +"拖动相机所需的底边è·ã€‚值为 [code]1[/code] 时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»" +"动。" #: doc/classes/Camera2D.xml msgid "" @@ -14860,29 +14884,32 @@ msgid "" "drag margins. If [code]false[/code], the camera moves horizontally " "regardless of margins." msgstr "" -"如果 [code]true[/code]ï¼Œç›¸æœºä»…åœ¨è¾¾åˆ°æ°´å¹³æ‹–åŠ¨è¾¹è·æ—¶æ‰ç§»åŠ¨ã€‚å¦‚æžœ[code]false[/" -"code],相机会水平移动而ä¸ç®¡è¾¹è·ã€‚" +"如果为 [code]true[/code]ï¼Œç›¸æœºä»…åœ¨è¾¾åˆ°æ°´å¹³æ‹–åŠ¨è¾¹è·æ—¶æ‰ç§»åŠ¨ã€‚å¦‚æžœä¸º " +"[code]false[/code],相机会水平移动而ä¸ç®¡è¾¹è·ã€‚" #: doc/classes/Camera2D.xml msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"拖动相机所需的左边缘。值为[code]1[/code]时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»åŠ¨ã€‚" +"拖动相机所需的左边缘。值为 [code]1[/code] 时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»" +"动。" #: doc/classes/Camera2D.xml msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"拖动相机所需的å³è¾¹ç¼˜ã€‚值为[code]1[/code]时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»åŠ¨ã€‚" +"拖动相机所需的å³è¾¹ç¼˜ã€‚值为 [code]1[/code] 时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»" +"动。" #: doc/classes/Camera2D.xml msgid "" "Top margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"拖动相机所需的上边è·ã€‚值为[code]1[/code]时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»åŠ¨ã€‚" +"拖动相机所需的上边è·ã€‚值为 [code]1[/code] 时,相机仅在到达å±å¹•边缘时æ‰ä¼šç§»" +"动。" #: doc/classes/Camera2D.xml msgid "" @@ -14890,23 +14917,23 @@ msgid "" "margins. If [code]false[/code], the camera moves vertically regardless of " "margins." msgstr "" -"如果 [code]true[/code]ï¼Œç›¸æœºä»…åœ¨è¾¾åˆ°åž‚ç›´æ‹–åŠ¨è¾¹è·æ—¶æ‰ç§»åŠ¨ã€‚å¦‚æžœ[code]false[/" -"code],相机会垂直移动而ä¸ç®¡è¾¹è·ã€‚" +"如果为 [code]true[/code]ï¼Œç›¸æœºä»…åœ¨è¾¾åˆ°åž‚ç›´æ‹–åŠ¨è¾¹è·æ—¶æ‰ç§»åŠ¨ã€‚å¦‚æžœä¸º " +"[code]false[/code],相机会垂直移动而ä¸ç®¡è¾¹è·ã€‚" #: doc/classes/Camera2D.xml msgid "" "If [code]true[/code], draws the camera's drag margin rectangle in the editor." -msgstr "如果[code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„æ‹–动边è·çŸ©å½¢ã€‚" +msgstr "如果为 [code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„æ‹–动边è·çŸ©å½¢ã€‚" #: doc/classes/Camera2D.xml msgid "" "If [code]true[/code], draws the camera's limits rectangle in the editor." -msgstr "如果[code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„æžé™çŸ©å½¢ã€‚" +msgstr "如果为 [code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„æžé™çŸ©å½¢ã€‚" #: doc/classes/Camera2D.xml msgid "" "If [code]true[/code], draws the camera's screen rectangle in the editor." -msgstr "如果[code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„ç”»é¢çŸ©å½¢ã€‚" +msgstr "如果为 [code]true[/code],在编辑器ä¸ç»˜åˆ¶ç›¸æœºçš„ç”»é¢çŸ©å½¢ã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -14991,8 +15018,8 @@ msgid "" "Speed in pixels per second of the camera's smoothing effect when [member " "smoothing_enabled] is [code]true[/code]." msgstr "" -"当[member smoothing_enabled]为 [code]true[/code] 时,相机平滑效果的速度,以æ¯" -"ç§’åƒç´ 为å•ä½ã€‚" +"当 [member smoothing_enabled] 为 [code]true[/code] 时,相机平滑效果的速度,以" +"æ¯ç§’åƒç´ 为å•ä½ã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -15060,7 +15087,7 @@ msgstr "返回设备上的相机ä½ç½®ã€‚" #: doc/classes/CameraFeed.xml msgid "If [code]true[/code], the feed is active." -msgstr "如果[code]true[/code]ï¼Œåˆ™æºæ˜¯æ¿€æ´»çš„。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™æºæ˜¯æ¿€æ´»çš„。" #: doc/classes/CameraFeed.xml msgid "The transform applied to the camera's image." @@ -15171,7 +15198,7 @@ msgid "" "a shader." msgstr "" "该纹ç†å¯ä»¥è®¿é—® [CameraFeed] æä¾›çš„相机纹ç†ã€‚\n" -"[b]注æ„:[/b]许多相机æä¾›éœ€è¦åœ¨ç€è‰²å™¨ä¸è½¬æ¢çš„ YCbCr 图åƒã€‚" +"[b]注æ„:[/b]许多相机æä¾›çš„都是 YCbCr 图åƒï¼Œéœ€è¦åœ¨ç€è‰²å™¨ä¸è¿›è¡Œè½¬æ¢ã€‚" #: doc/classes/CameraTexture.xml msgid "The ID of the [CameraFeed] for which we want to display the image." @@ -15660,7 +15687,7 @@ msgid "" "Hide the [CanvasItem] if it's currently visible. This is equivalent to " "setting [member visible] to [code]false[/code]." msgstr "" -"如果该 [CanvasItem] ç›®å‰æ˜¯å¯è§çš„,则将其éšè—。ç‰ä»·äºŽå°† [member visible] 设为 " +"如果该 [CanvasItem] ç›®å‰æ˜¯å¯è§çš„,则将其éšè—。相当于将 [member visible] 设为 " "[code]false[/code]。" #: doc/classes/CanvasItem.xml @@ -15740,7 +15767,7 @@ msgid "" "[Popup], the correct way to make them visible is to call one of the multiple " "[code]popup*()[/code] functions instead." msgstr "" -"如果该 [CanvasItem] ç›®å‰æ˜¯éšè—的,则将其显示。ç‰ä»·äºŽå°† [member visible] 设为 " +"如果该 [CanvasItem] ç›®å‰æ˜¯éšè—的,则将其显示。相当于将 [member visible] 设为 " "[code]true[/code]。对于继承自 [Popup] 的控件,让它们å¯è§çš„æ£ç¡®åšæ³•æ˜¯æ¢æˆè°ƒç”¨" "å„ç§ [code]popup*()[/code] 函数的其ä¸ä¹‹ä¸€ã€‚" @@ -15749,17 +15776,17 @@ msgid "" "Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " "called on idle time to request redraw." msgstr "" -"å°†[CanvasItem]排队ç‰å¾…更新。在空闲时间将调用[constant NOTIFICATION_DRAW]以请" -"求é‡ç»˜ã€‚" +"å°† [CanvasItem] 排队ç‰å¾…更新。在空闲时间将调用 [constant NOTIFICATION_DRAW] " +"以请求é‡ç»˜ã€‚" #: doc/classes/CanvasItem.xml msgid "" "The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." -msgstr "æ¤[CanvasItem]在其ä¸å“应[Light2D]节点的渲染层。" +msgstr "æ¤ [CanvasItem] 在其ä¸å“应 [Light2D] 节点的渲染层。" #: doc/classes/CanvasItem.xml msgid "The material applied to textures on this [CanvasItem]." -msgstr "在æ¤[CanvasItem]上应用于纹ç†çš„æè´¨ã€‚" +msgstr "åœ¨æ¤ [CanvasItem] 上应用于纹ç†çš„æè´¨ã€‚" #: doc/classes/CanvasItem.xml msgid "The color applied to textures on this [CanvasItem]." @@ -15774,19 +15801,19 @@ msgstr "" #: doc/classes/CanvasItem.xml msgid "If [code]true[/code], the object draws behind its parent." -msgstr "如果[code]true[/code],则对象在其父对象åŽé¢ç»˜åˆ¶ã€‚" +msgstr "如果为 [code]true[/code],则对象在其父对象åŽé¢ç»˜åˆ¶ã€‚" #: doc/classes/CanvasItem.xml msgid "If [code]true[/code], the object draws on top of its parent." -msgstr "如果[code]true[/code],则对象在其父对象的顶部绘制。" +msgstr "如果为 [code]true[/code],则对象在其父对象的顶部绘制。" #: doc/classes/CanvasItem.xml msgid "" "If [code]true[/code], the parent [CanvasItem]'s [member material] property " "is used as this one's material." msgstr "" -"如果[code]true[/code],则将父级[CanvasItem]çš„[member material]属性用作æ¤é¡¹çš„" -"æè´¨ã€‚" +"如果为 [code]true[/code],则将父级[CanvasItem]çš„[member material]属性用作æ¤é¡¹" +"çš„æè´¨ã€‚" #: doc/classes/CanvasItem.xml msgid "" @@ -15797,9 +15824,9 @@ msgid "" "visible is to call one of the multiple [code]popup*()[/code] functions " "instead." msgstr "" -"如果[code]true[/code],这个[CanvasItem]è¢«ç»˜åˆ¶ã€‚åªæœ‰å½“它的所有父节点也å¯è§æ—¶ï¼Œ" -"è¯¥èŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree]必须返回 [code]true[/" -"code])。\n" +"如果为 [code]true[/code],这个[CanvasItem]è¢«ç»˜åˆ¶ã€‚åªæœ‰å½“它的所有父节点也å¯è§" +"æ—¶ï¼Œè¯¥èŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree]必须返回 " +"[code]true[/code])。\n" "[b]注æ„:[/b]对于继承了[Popup]的控件,使其å¯è§çš„æ£ç¡®æ–¹æ³•æ˜¯è°ƒç”¨å¤šä¸ª" "[code]popup*()[/code]函数之一。" @@ -15820,8 +15847,8 @@ msgid "" "or when an action is taking place that may have impacted these boundaries (e." "g. changing [member Sprite.texture])." msgstr "" -"在物体[Rect2]边缘(ä½ç½®æˆ–大å°ï¼‰æ”¹å˜ï¼Œæˆ–有影å“到边缘的æ“作(比如修改[member " -"Sprite.texture])时触å‘。" +"在物体 [Rect2] 边缘(ä½ç½®æˆ–大å°ï¼‰æ”¹å˜ï¼Œæˆ–有影å“到边缘的æ“作(比如修改 " +"[member Sprite.texture])时触å‘。" #: doc/classes/CanvasItem.xml msgid "Emitted when the visibility (hidden/visible) changes." @@ -15933,7 +15960,7 @@ msgid "" "[b]Note:[/b] This property is only used and visible in the editor if [member " "particles_animation] is [code]true[/code]." msgstr "" -"如果 [code]true[/code],粒ååŠ¨ç”»å°†å¾ªçŽ¯æ’æ”¾ã€‚\n" +"如果为 [code]true[/code],粒ååŠ¨ç”»å°†å¾ªçŽ¯æ’æ”¾ã€‚\n" "[b]注æ„:[/b]åªæœ‰å½“ [member particles_animation] 为 [code]true[/code] 时,该" "属性æ‰ä¼šåœ¨ç¼–辑器ä¸ä½¿ç”¨å¹¶å¯è§ã€‚" @@ -16008,7 +16035,7 @@ msgid "" "Hides any [CanvasItem] under this [CanvasLayer]. This is equivalent to " "setting [member visible] to [code]false[/code]." msgstr "" -"éšè—该 [CanvasLayer] 下的所有 [CanvasItem]。ç‰ä»·äºŽå°† [member visible] 设为 " +"éšè—该 [CanvasLayer] 下的所有 [CanvasItem]。相当于将 [member visible] 设为 " "[code]false[/code]。" #: doc/classes/CanvasLayer.xml @@ -16016,7 +16043,7 @@ msgid "" "Shows any [CanvasItem] under this [CanvasLayer]. This is equivalent to " "setting [member visible] to [code]true[/code]." msgstr "" -"显示该 [CanvasLayer] 下的所有 [CanvasItem]。ç‰ä»·äºŽå°† [member visible] 设为 " +"显示该 [CanvasLayer] 下的所有 [CanvasItem]。相当于将 [member visible] 设为 " "[code]true[/code]。" #: doc/classes/CanvasLayer.xml @@ -16256,8 +16283,8 @@ msgid "" "reflow to take the space of hidden characters. If this is not desired, set " "their [member color] to [code]Color(1, 1, 1, 0)[/code] instead." msgstr "" -"如果[code]true[/code],将绘制å—符。如果[code]false[/code],则éšè—å—符。éšè—å—" -"符周围的å—符将回æµä»¥å 用éšè—å—符的空间。如果ä¸å¸Œæœ›è¿™æ ·åšï¼Œå¯ä»¥å°†å®ƒä»¬çš„" +"如果为 [code]true[/code],将绘制å—符。如果为 [code]false[/code],则éšè—å—符。" +"éšè—å—符周围的å—符将回æµä»¥å 用éšè—å—符的空间。如果ä¸å¸Œæœ›è¿™æ ·åšï¼Œå¯ä»¥å°†å®ƒä»¬çš„" "[member color]设置为[code]Color(1, 1, 1, 0)[/code]。" #: doc/classes/CheckBox.xml @@ -16605,7 +16632,7 @@ msgid "" "usage)[/code]." msgstr "" "返回 [code]class[/code] 或其父级的[code]ä¿¡å·[/code]æ•°æ®ã€‚返回 [Dictionary] å¹¶" -"带有以下键: [code]args[/code], [code]default_args[/code], [code]flags[/" +"带有以下键:[code]args[/code], [code]default_args[/code], [code]flags[/" "code], [code]id[/code], [code]name[/code], [code]return:(class_name, hint, " "hint_string, name, type, usage)[/code]。" @@ -16791,7 +16818,7 @@ msgid "" "surface at that point. Connect to the [signal input_event] signal to easily " "pick up these events." msgstr "" -"接收未处ç†çš„事件 [InputEvent]。 [code]position[/code] æ˜¯é¼ æ ‡æŒ‡é’ˆåœ¨å…·æœ‰ç´¢å¼• " +"接收未处ç†çš„事件 [InputEvent]。[code]position[/code] æ˜¯é¼ æ ‡æŒ‡é’ˆåœ¨å…·æœ‰ç´¢å¼• " "[code]shape_idx[/code] 的形状表é¢åœ¨ä¸–界空间ä¸çš„ä½ç½®ï¼Œ[code]normal[/code] 是该" "点表é¢çš„æ³•å‘é‡ã€‚连接到 [signal input_event] ä¿¡å·ä»¥è½»æ¾èŽ·å–这些事件。" @@ -16832,7 +16859,7 @@ msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "If [code]true[/code], the shape owner and its shapes are disabled." -msgstr "如果[code]true[/code],则ç¦ç”¨å½¢çŠ¶æ‰€æœ‰è€…åŠå…¶å½¢çŠ¶ã€‚" +msgstr "如果为 [code]true[/code],则ç¦ç”¨å½¢çŠ¶æ‰€æœ‰è€…åŠå…¶å½¢çŠ¶ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "Removes the given shape owner." @@ -16902,7 +16929,7 @@ msgstr "从给定的形状所有者ä¸åˆ 除一个形状。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "If [code]true[/code], disables the given shape owner." -msgstr "如果[code]true[/code],则ç¦ç”¨ç»™å®šçš„形状所有者。" +msgstr "如果为 [code]true[/code],则ç¦ç”¨ç»™å®šçš„形状所有者。" #: doc/classes/CollisionObject.xml msgid "Sets the [Transform] of the given shape owner." @@ -16945,8 +16972,8 @@ msgid "" "If [code]true[/code], the [CollisionObject] will continue to receive input " "events as the mouse is dragged across its shapes." msgstr "" -"如果[code]true[/code],[CollisionObject] å°†åœ¨é¼ æ ‡æ‹–è¿‡å…¶å½¢çŠ¶æ—¶ç»§ç»æŽ¥æ”¶è¾“å…¥äº‹" -"件。" +"如果为 [code]true[/code],[CollisionObject] å°†åœ¨é¼ æ ‡æ‹–è¿‡å…¶å½¢çŠ¶æ—¶ç»§ç»æŽ¥æ”¶è¾“å…¥" +"事件。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "" @@ -16965,7 +16992,7 @@ msgid "" "the shape with index [code]shape_idx[/code] and [code]normal[/code] is the " "normal vector of the surface at that point." msgstr "" -"当对象收到未处ç†çš„ [InputEvent] æ—¶å‘出。 [code]position[/code] æ˜¯é¼ æ ‡æŒ‡é’ˆåœ¨å…·" +"当对象收到未处ç†çš„ [InputEvent] æ—¶å‘出。[code]position[/code] æ˜¯é¼ æ ‡æŒ‡é’ˆåœ¨å…·" "有索引 [code]shape_idx[/code] 的形状表é¢åœ¨ä¸–界空间ä¸çš„ä½ç½®ï¼Œ[code]normal[/" "code] 是该点表é¢çš„æ³•å‘é‡ã€‚" @@ -17006,9 +17033,9 @@ msgid "" "[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " "these events." msgstr "" -"æŽ¥å—æœªå¤„ç†çš„[InputEvent]ã€‚è¦æ±‚[member input_pickable]为 [code]true[/code]。 " -"[code]shape_idx[/code]被点击的[Shape2D]çš„å索引。连接到[code]input_event[/" -"code]ä¿¡å·å³å¯è½»æ¾æŽ¥æ”¶è¿™äº›äº‹ä»¶ã€‚" +"æŽ¥å—æœªå¤„ç†çš„ [InputEvent]ã€‚è¦æ±‚ [member input_pickable] 为 [code]true[/" +"code]。[code]shape_idx[/code] 是被点击的 [Shape2D] çš„å索引。连接到 " +"[code]input_event[/code] ä¿¡å·å³å¯è½»æ¾æŽ¥æ”¶è¿™äº›äº‹ä»¶ã€‚" #: doc/classes/CollisionObject2D.xml msgid "" @@ -17114,8 +17141,8 @@ msgid "" "[member input_pickable] to be [code]true[/code] and at least one " "[code]collision_layer[/code] bit to be set." msgstr "" -"å½“é¼ æ ‡æŒ‡é’ˆè¿›å…¥æ¤å¯¹è±¡çš„任何形状时触å‘ã€‚è¦æ±‚[member input_pickable]为 " -"[code]true[/code],并且至少è¦è®¾ç½®ä¸€ä¸ª[code]collision_layer[/code]ä½ã€‚" +"å½“é¼ æ ‡æŒ‡é’ˆè¿›å…¥æ¤å¯¹è±¡çš„任何形状时触å‘ã€‚è¦æ±‚ [member input_pickable] 为 " +"[code]true[/code],并且至少è¦è®¾ç½®ä¸€ä¸ª [code]collision_layer[/code] ä½ã€‚" #: doc/classes/CollisionObject2D.xml msgid "" @@ -17123,12 +17150,12 @@ msgid "" "[member input_pickable] to be [code]true[/code] and at least one " "[code]collision_layer[/code] bit to be set." msgstr "" -"å½“é¼ æ ‡æŒ‡é’ˆé€€å‡ºæ¤å¯¹è±¡çš„æ‰€æœ‰å½¢çŠ¶æ—¶å‘å‡ºã€‚è¦æ±‚[member input_pickable]为 " -"[code]true[/code],并且至少è¦è®¾ç½®ä¸€ä¸ª[code]collision_layer[/code]ä½ã€‚" +"å½“é¼ æ ‡æŒ‡é’ˆé€€å‡ºæ¤å¯¹è±¡çš„æ‰€æœ‰å½¢çŠ¶æ—¶å‘å‡ºã€‚è¦æ±‚ [member input_pickable] 为 " +"[code]true[/code],并且至少è¦è®¾ç½®ä¸€ä¸ª [code]collision_layer[/code] ä½ã€‚" #: doc/classes/CollisionPolygon.xml msgid "Editor-only class for defining a collision polygon in 3D space." -msgstr "ä»…é™ç¼–辑器的类,用于在3D空间ä¸å®šä¹‰ç¢°æ’žå¤šè¾¹å½¢ã€‚" +msgstr "ä»…é™ç¼–辑器的类,用于在 3D 空间ä¸å®šä¹‰ç¢°æ’žå¤šè¾¹å½¢ã€‚" #: doc/classes/CollisionPolygon.xml msgid "" @@ -17149,13 +17176,13 @@ msgstr "产生的碰撞在垂直于其多边形的任一方å‘上延伸的长度 #: doc/classes/CollisionPolygon.xml msgid "If [code]true[/code], no collision will be produced." -msgstr "如果[code]true[/code],将ä¸ä¼šäº§ç”Ÿç¢°æ’žã€‚" +msgstr "如果为 [code]true[/code],将ä¸ä¼šäº§ç”Ÿç¢°æ’žã€‚" #: doc/classes/CollisionPolygon.xml msgid "" "The collision margin for the generated [Shape]. See [member Shape.margin] " "for more details." -msgstr "生æˆçš„[Shape]的碰撞边。å‚阅[member Shape.margin]èŽ·å–æ›´å¤šç»†èŠ‚ã€‚" +msgstr "生æˆçš„ [Shape] 的碰撞边。详情请å‚阅 [member Shape.margin]。" #: doc/classes/CollisionPolygon.xml msgid "" @@ -17173,19 +17200,19 @@ msgstr "" #: doc/classes/CollisionPolygon2D.xml msgid "Defines a 2D collision polygon." -msgstr "定义2D碰撞多边形。" +msgstr "定义 2D 碰撞多边形。" #: doc/classes/CollisionPolygon2D.xml msgid "" "Provides a 2D collision polygon to a [CollisionObject2D] parent. Polygons " "can be drawn in the editor or specified by a list of vertices." msgstr "" -"为[CollisionObject2D]父级æä¾›2D碰撞多边形。多边形å¯ä»¥åœ¨ç¼–辑器ä¸ç»˜åˆ¶ï¼Œä¹Ÿå¯ä»¥ç”±" -"顶点列表指定。" +"为 [CollisionObject2D] 父级æä¾› 2D 碰撞多边形。多边形å¯ä»¥åœ¨ç¼–辑器ä¸ç»˜åˆ¶ï¼Œä¹Ÿå¯" +"以由顶点列表指定。" #: doc/classes/CollisionPolygon2D.xml msgid "Collision build mode. Use one of the [enum BuildMode] constants." -msgstr "碰撞构建模å¼ã€‚使用[enum BuildMode]常é‡ä¹‹ä¸€ã€‚" +msgstr "碰撞构建模å¼ã€‚使用 [enum BuildMode] 常é‡ä¹‹ä¸€ã€‚" #: doc/classes/CollisionPolygon2D.xml msgid "If [code]true[/code], no collisions will be detected." @@ -17231,7 +17258,7 @@ msgstr "碰撞将仅包括多边形边缘。" #: doc/classes/CollisionShape.xml msgid "Node that represents collision shape data in 3D space." -msgstr "表示3D空间ä¸çš„碰撞形状数æ®çš„节点。" +msgstr "表示 3D 空间ä¸çš„碰撞形状数æ®çš„节点。" #: doc/classes/CollisionShape.xml msgid "" @@ -17289,9 +17316,9 @@ msgid "" "shape_owner_get_shape] to get the actual shape." msgstr "" "编辑器功能,用于在2D空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状。您å¯ä»¥ä½¿ç”¨æ¤èŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢" -"çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ°[Area2D]以æä¾›æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ°[PhysicsBody2D]以创建" -"实体。 [b]é‡è¦äº‹é¡¹[/b]:这是创建形状的仅编辑器助手,请使用[method " -"CollisionObject2D.shape_owner_get_shape]获å–实际形状。" +"çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area2D] 以æä¾›æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ° [PhysicsBody2D] 以" +"创建实体。[b]é‡è¦äº‹é¡¹[/b]:这是创建形状的仅编辑器助手,请使用 [method " +"CollisionObject2D.shape_owner_get_shape] 获å–实际形状。" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml #: doc/classes/RectangleShape2D.xml doc/classes/TileMap.xml @@ -17432,8 +17459,7 @@ msgid "" msgstr "" "æ ¹æ® RGBA å€¼æž„é€ é¢œè‰²ï¼Œé€šå¸¸ä»‹äºŽ 0 å’Œ 1 之间。\n" "[codeblock]\n" -"var color = Color(0.2, 1.0, 0.7, 0.8) # Similar to Color8(51, 255, 178, " -"204)\n" +"var color = Color(0.2, 1.0, 0.7, 0.8) # 类似于 Color8(51, 255, 178, 204)\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17467,7 +17493,7 @@ msgstr "" "返回对比度最高的颜色。\n" "[codeblock]\n" "var color = Color(0.3, 0.4, 0.9)\n" -"var contrasted_color = color.contrasted() # ç‰ä»·äºŽ RGBA(204, 229, 102, 255)\n" +"var contrasted_color = color.contrasted() # 相当于 RGBA(204, 229, 102, 255)\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17479,7 +17505,7 @@ msgid "" "var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" "[/codeblock]" msgstr "" -"返回一个新的颜色,这个颜色按指定的百分比(比例从0到1ï¼‰å˜æš—。\n" +"返回一个新的颜色,这个颜色按指定的百分比(比例从0 到 1ï¼‰å˜æš—。\n" "[codeblock]\n" "var green = Color(0.0, 1.0, 0.0)\n" "var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" @@ -17497,7 +17523,7 @@ msgstr "" "从 HSV é…ç½®æ–‡ä»¶ä¸æž„建一个颜色。[code]h[/code]ã€[code]s[/code] å’Œ [code]v[/" "code] 是 0 å’Œ 1 之间的值。\n" "[codeblock]\n" -"var color = Color.from_hsv(0.58, 0.5, 0.79, 0.8) # ç‰ä»·äºŽ HSV(210, 50, 79, " +"var color = Color.from_hsv(0.58, 0.5, 0.79, 0.8) # 相当于 HSV(210, 50, 79, " "0.8) 或 Color8(100, 151, 201, 0.8)\n" "[/codeblock]" @@ -17537,7 +17563,7 @@ msgstr "" "返回å色 [code](1 - r, 1 - g, 1 - b, a)[/code]。\n" "[codeblock]\n" "var color = Color(0.3, 0.4, 0.9)\n" -"var inverted_color = color.inverted() # ç‰ä»·äºŽ Color(0.7, 0.6, 0.1)\n" +"var inverted_color = color.inverted() # 相当于 Color(0.7, 0.6, 0.1)\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17558,10 +17584,10 @@ msgid "" "var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" "[/codeblock]" msgstr "" -"返回将æ¤é¢œè‰²æŒ‰æŒ‡å®šç™¾åˆ†æ¯”(比例从0到1ï¼‰å˜æµ…åŽäº§ç”Ÿçš„æ–°é¢œè‰²ã€‚\n" +"返回将æ¤é¢œè‰²æŒ‰æŒ‡å®šç™¾åˆ†æ¯”(比例从 0 到 1ï¼‰å˜æµ…åŽäº§ç”Ÿçš„æ–°é¢œè‰²ã€‚\n" "[codeblock]\n" "var green = Color(0.0, 1.0, 0.0)\n" -"var lightgreen = green.lightened(0.2) # 20% lighter than regular green\n" +"var lightgreen = green.lightened(0.2) # æ¯”æ™®é€šçš„ç»¿è‰²è¦æ·¡ 20%\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17579,8 +17605,7 @@ msgstr "" "[codeblock]\n" "var c1 = Color(1.0, 0.0, 0.0)\n" "var c2 = Color(0.0, 1.0, 0.0)\n" -"var li_c = c1.linear_interpolate(c2, 0.5) # Equivalent to Color(0.5, 0.5, " -"0.0)\n" +"var li_c = c1.linear_interpolate(c2, 0.5) # 相当于 Color(0.5, 0.5, 0.0)\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17593,11 +17618,11 @@ msgid "" "print(color.to_abgr32()) # Prints 4281565439\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º ABGR æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。 ABGR 是默" -"è®¤æ ¼å¼çš„转置版本。\n" +"返回转æ¢ä¸º ABGR æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。ABGR 是默认" +"æ ¼å¼çš„转置版本。\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_abgr32()) # Prints 4281565439\n" +"print(color.to_abgr32()) # 输出 4281565439\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17610,11 +17635,11 @@ msgid "" "print(color.to_abgr64()) # Prints -225178692812801\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º ABGR æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。 ABGR 是默认" -"æ ¼å¼çš„转置版本。\n" +"返回转æ¢ä¸º ABGR æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。ABGR æ˜¯é»˜è®¤æ ¼" +"å¼çš„转置版本。\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_abgr64()) # Prints -225178692812801\n" +"print(color.to_abgr64()) # 输出 -225178692812801\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17626,11 +17651,11 @@ msgid "" "print(color.to_argb32()) # Prints 4294934323\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º ARGB æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。 ARGB 与 " +"返回转æ¢ä¸º ARGB æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。ARGB 与 " "DirectX æ›´åŠ å…¼å®¹ã€‚\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_argb32()) # Prints 4294934323\n" +"print(color.to_argb32()) # 输出 4294934323\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17642,11 +17667,11 @@ msgid "" "print(color.to_argb64()) # Prints -2147470541\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º ARGB æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。 ARGB 与 " +"返回转æ¢ä¸º ARGB æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。ARGB 与 " "DirectX æ›´åŠ å…¼å®¹ã€‚\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_argb64()) # Prints -2147470541\n" +"print(color.to_argb64()) # 输出 -2147470541\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17679,11 +17704,11 @@ msgid "" "print(color.to_rgba32()) # Prints 4286526463\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º RGBA æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。 RGBA 是 " +"返回转æ¢ä¸º RGBA æ ¼å¼çš„ 32 使•´æ•°çš„颜色,æ¯ä¸ªå—节代表一个颜色通é“。RGBA 是 " "Godot çš„é»˜è®¤æ ¼å¼ã€‚\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_rgba32()) # Prints 4286526463\n" +"print(color.to_rgba32()) # 输出 4286526463\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17695,11 +17720,11 @@ msgid "" "print(color.to_rgba64()) # Prints -140736629309441\n" "[/codeblock]" msgstr "" -"返回转æ¢ä¸º RGBA æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。 RGBA 是 " +"返回转æ¢ä¸º RGBA æ ¼å¼çš„ 64 使•´æ•°çš„颜色,æ¯ä¸ªå—代表一个颜色通é“。RGBA 是 " "Godot çš„é»˜è®¤æ ¼å¼ã€‚\n" "[codeblock]\n" "var color = Color(1, 0.5, 0.2)\n" -"print(color.to_rgba64()) # Prints -140736629309441\n" +"print(color.to_rgba64()) # 输出 -140736629309441\n" "[/codeblock]" #: doc/classes/Color.xml @@ -17713,7 +17738,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Wrapper for [member a] that uses the range 0 to 255 instead of 0 to 1." -msgstr "[member a]的包装程åºï¼Œä½¿ç”¨çš„范围是0到255ï¼Œè€Œä¸æ˜¯0到1。" +msgstr "[member a] çš„å°è£…器,使用的范围是 0 到 255ï¼Œè€Œä¸æ˜¯ 0 到 1。" #: doc/classes/Color.xml msgid "The color's blue component, typically on the range of 0 to 1." @@ -17721,7 +17746,7 @@ msgstr "颜色的è“色分é‡ï¼Œä¸€èˆ¬åœ¨ 0 到 1 的范围内。" #: doc/classes/Color.xml msgid "Wrapper for [member b] that uses the range 0 to 255 instead of 0 to 1." -msgstr "[member b]çš„å°è£…器,使用0到255çš„èŒƒå›´ï¼Œè€Œä¸æ˜¯0到1。" +msgstr "[member b] çš„å°è£…器,使用 0 到 255 çš„èŒƒå›´ï¼Œè€Œä¸æ˜¯ 0 到 1。" #: doc/classes/Color.xml msgid "The color's green component, typically on the range of 0 to 1." @@ -17729,27 +17754,27 @@ msgstr "颜色的绿色分é‡ï¼Œä¸€èˆ¬åœ¨ 0 到 1 的范围内。" #: doc/classes/Color.xml msgid "Wrapper for [member g] that uses the range 0 to 255 instead of 0 to 1." -msgstr "[member g]çš„å°è£…器,使用范围0到255è€Œä¸æ˜¯0到1。" +msgstr "[member g] çš„å°è£…器,使用范围 0 到 255 è€Œä¸æ˜¯ 0 到 1。" #: doc/classes/Color.xml msgid "The HSV hue of this color, on the range 0 to 1." -msgstr "这个颜色的HSV色相,范围是0到1。" +msgstr "这个颜色的 HSV 色相,范围是 0 到 1。" #: doc/classes/Color.xml msgid "The color's red component, typically on the range of 0 to 1." -msgstr "颜色的红色分é‡ï¼Œé€šå¸¸åœ¨0到1的范围内。" +msgstr "颜色的红色分é‡ï¼Œé€šå¸¸åœ¨ 0 到 1 的范围内。" #: doc/classes/Color.xml msgid "Wrapper for [member r] that uses the range 0 to 255 instead of 0 to 1." -msgstr "[member r]çš„å°è£…器,使用0到255çš„èŒƒå›´è€Œä¸æ˜¯0到1。" +msgstr "[member r] çš„å°è£…器,使用 0 到 255 çš„èŒƒå›´è€Œä¸æ˜¯ 0 到 1。" #: doc/classes/Color.xml msgid "The HSV saturation of this color, on the range 0 to 1." -msgstr "该颜色的HSV饱和度,范围为0到1。" +msgstr "这个颜色的 HSV 饱和度,范围为 0 到 1。" #: doc/classes/Color.xml msgid "The HSV value (brightness) of this color, on the range 0 to 1." -msgstr "该颜色的HSV值(亮度),范围为0至1。" +msgstr "这个颜色的 HSV 值(亮度),范围为 0 至 1。" #: doc/classes/Color.xml msgid "Alice blue color." @@ -17761,27 +17786,27 @@ msgstr "å¤è‘£ç™½ã€‚" #: doc/classes/Color.xml msgid "Aqua color." -msgstr "水色." +msgstr "水色。" #: doc/classes/Color.xml msgid "Aquamarine color." -msgstr "æµ·è“色." +msgstr "æµ·è“色。" #: doc/classes/Color.xml msgid "Azure color." -msgstr "天è“色." +msgstr "天è“色。" #: doc/classes/Color.xml msgid "Beige color." -msgstr "米黄色." +msgstr "米黄色。" #: doc/classes/Color.xml msgid "Bisque color." -msgstr "橘黄色." +msgstr "橘黄色。" #: doc/classes/Color.xml msgid "Black color." -msgstr "黑色." +msgstr "黑色。" #: doc/classes/Color.xml msgid "Blanche almond color." @@ -17789,7 +17814,7 @@ msgstr "布兰奇æä»è‰²ã€‚" #: doc/classes/Color.xml msgid "Blue color." -msgstr "è“色." +msgstr "è“色。" #: doc/classes/Color.xml msgid "Blue violet color." @@ -17797,7 +17822,7 @@ msgstr "è“紫色的颜色。" #: doc/classes/Color.xml msgid "Brown color." -msgstr "棕色." +msgstr "棕色。" #: doc/classes/Color.xml msgid "Burly wood color." @@ -17809,15 +17834,15 @@ msgstr "军æœè“。" #: doc/classes/Color.xml msgid "Chartreuse color." -msgstr "黄è¤è‰²." +msgstr "黄è¤è‰²ã€‚" #: doc/classes/Color.xml msgid "Chocolate color." -msgstr "巧克力色." +msgstr "巧克力色。" #: doc/classes/Color.xml msgid "Coral color." -msgstr "çŠç‘šè‰²." +msgstr "çŠç‘šè‰²ã€‚" #: doc/classes/Color.xml msgid "Cornflower color." @@ -18379,8 +18404,8 @@ msgid "" "mouse button, otherwise it will apply immediately even in mouse motion event " "(which can cause performance issues)." msgstr "" -"如果[code]true[/code]ï¼Œåªæœ‰åœ¨ç”¨æˆ·æ¾å¼€é¼ æ ‡æŒ‰é’®åŽæ‰ä¼šåº”用颜色,å¦åˆ™å³ä½¿åœ¨é¼ æ ‡ç§»" -"动事件ä¸ä¹Ÿä¼šç«‹å³åº”用(ä¼šé€ æˆæ€§èƒ½é—®é¢˜)。" +"如果为 [code]true[/code]ï¼Œåªæœ‰åœ¨ç”¨æˆ·æ¾å¼€é¼ æ ‡æŒ‰é’®åŽæ‰ä¼šåº”用颜色,å¦åˆ™å³ä½¿åœ¨é¼ " +"æ ‡ç§»åŠ¨äº‹ä»¶ä¸ä¹Ÿä¼šç«‹å³åº”ç”¨ï¼ˆä¼šé€ æˆæ€§èƒ½é—®é¢˜ï¼‰ã€‚" #: doc/classes/ColorPicker.xml msgid "If [code]true[/code], shows an alpha channel slider (opacity)." @@ -18509,7 +18534,8 @@ msgstr "" msgid "" "If [code]true[/code], the alpha channel in the displayed [ColorPicker] will " "be visible." -msgstr "如果 [code]true[/code],则显示的 [ColorPicker] ä¸çš„ Alpha 通é“å°†å¯è§ã€‚" +msgstr "" +"如果为 [code]true[/code],则显示的 [ColorPicker] ä¸çš„ Alpha 通é“å°†å¯è§ã€‚" #: doc/classes/ColorPickerButton.xml msgid "Emitted when the color changes." @@ -18608,7 +18634,7 @@ msgid "" msgstr "" "填充颜色。\n" "[codeblock]\n" -"$ColorRect.color = Color(1, 0, 0, 1) # Set ColorRect's color to red.\n" +"$ColorRect.color = Color(1, 0, 0, 1) # å°† ColorRect 设为红色。\n" "[/codeblock]" #: doc/classes/ConcavePolygonShape.xml @@ -18664,7 +18690,7 @@ msgstr "" #: doc/classes/ConcavePolygonShape2D.xml msgid "" "The array of points that make up the [ConcavePolygonShape2D]'s line segments." -msgstr "组æˆ[ConcavePolygonShape2D]线段的点的数组。" +msgstr "ç»„æˆ [ConcavePolygonShape2D] 线段的点的数组。" #: doc/classes/ConeTwistJoint.xml msgid "A twist joint between two 3D PhysicsBodies." @@ -18725,7 +18751,7 @@ msgid "" "Twist is locked if below 0.05." msgstr "" "æ‰æ›²æ˜¯ç»•æ‰æ›²è½´çš„æ—‹è½¬ï¼Œæ¤å€¼å®šä¹‰äº†å…³èŠ‚å¯ä»¥æ‰æ›²å¤šè¿œã€‚\n" -"如果低于0.05ï¼Œåˆ™æ‰æ›²è¢«é”定。" +"如果低于 0.05ï¼Œåˆ™æ‰æ›²è¢«é”定。" #: doc/classes/ConeTwistJoint.xml doc/classes/Generic6DOFJoint.xml #: doc/classes/HingeJoint.xml doc/classes/Light.xml doc/classes/SliderJoint.xml @@ -18895,9 +18921,9 @@ msgid "" "[code]default[/code] value. If [code]default[/code] is not specified or set " "to [code]null[/code], an error is also raised." msgstr "" -"返回指定部分和键的当å‰å€¼ã€‚如果节或键ä¸å˜åœ¨ï¼Œæœ¬æ–¹æ³•返回åŽå¤‡å€¼[code]default[/" -"code]。如果没有指定[code]default[/code]或者设置为[code]null[/code],也会引å‘" -"一个错误。" +"返回指定部分和键的当å‰å€¼ã€‚如果节或键ä¸å˜åœ¨ï¼Œæœ¬æ–¹æ³•返回åŽå¤‡å€¼ [code]default[/" +"code]。如果没有指定 [code]default[/code] 或者设置为 [code]null[/code],也会引" +"å‘一个错误。" #: doc/classes/ConfigFile.xml msgid "Returns [code]true[/code] if the specified section exists." @@ -18914,9 +18940,9 @@ msgid "" "on.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"åŠ è½½æŒ‡å®šä¸ºå‚æ•°çš„é…ç½®æ–‡ä»¶ã€‚è§£æžæ–‡ä»¶çš„å†…å®¹å¹¶å°†å…¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„[ConfigFile]" -"对象ä¸ã€‚\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"åŠ è½½æŒ‡å®šä¸ºå‚æ•°çš„é…ç½®æ–‡ä»¶ã€‚è§£æžæ–‡ä»¶çš„å†…å®¹å¹¶å°†å…¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„ " +"[ConfigFile] 对象ä¸ã€‚\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18925,9 +18951,9 @@ msgid "" "the [ConfigFile] object which the method was called on.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"åŠ è½½æŒ‡å®šä¸ºå‚æ•°çš„åŠ å¯†é…置文件,使用æä¾›çš„[code]key[/code]å¯¹å…¶è§£å¯†ã€‚è§£æžæ–‡ä»¶çš„" -"å†…å®¹å¹¶å°†å…¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„[ConfigFile]对象ä¸ã€‚\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"åŠ è½½æŒ‡å®šä¸ºå‚æ•°çš„åŠ å¯†é…置文件,使用æä¾›çš„ [code]key[/code] å¯¹å…¶è§£å¯†ã€‚è§£æžæ–‡ä»¶" +"çš„å†…å®¹å¹¶å°†å…¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„ [ConfigFile] 对象ä¸ã€‚\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18936,9 +18962,9 @@ msgid "" "loaded in the [ConfigFile] object which the method was called on.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"åŠ è½½ä½œä¸ºå‚æ•°çš„åŠ å¯†é…置文件,使用æä¾›çš„[code]password[/code]解密。该文件的内容" -"被解æžå¹¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„ [ConfigFile] 对象ä¸ã€‚\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"åŠ è½½ä½œä¸ºå‚æ•°çš„åŠ å¯†é…置文件,使用æä¾›çš„ [code]password[/code] 解密。该文件的内" +"容被解æžå¹¶åŠ è½½åˆ°è°ƒç”¨è¯¥æ–¹æ³•çš„ [ConfigFile] 对象ä¸ã€‚\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18956,9 +18982,9 @@ msgid "" "parameter. The output file uses an INI-style structure.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"å°†[ConfigFile]对象的内容ä¿å˜åˆ°æŒ‡å®šä¸ºå‚数的文件ä¸ã€‚输出文件使用INIæ ·å¼çš„结" +"å°† [ConfigFile] 对象的内容ä¿å˜åˆ°æŒ‡å®šä¸ºå‚数的文件ä¸ã€‚输出文件使用 INI æ ·å¼çš„结" "构。\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18967,9 +18993,9 @@ msgid "" "The output file uses an INI-style structure.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"使用æä¾›çš„[code]key[/code]å°†[ConfigFile]对象的内容ä¿å˜åˆ°ä½œä¸ºå‚数指定的AES-256" -"åŠ å¯†æ–‡ä»¶ä¸ã€‚输出文件使用INIæ ·å¼çš„结构。\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"使用æä¾›çš„ [code]key[/code] å°† [ConfigFile] 对象的内容ä¿å˜åˆ°ä½œä¸ºå‚数指定的 " +"AES-256 åŠ å¯†æ–‡ä»¶ä¸ã€‚输出文件使用 INI æ ·å¼çš„结构。\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18978,9 +19004,9 @@ msgid "" "encrypt it. The output file uses an INI-style structure.\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"å°†[ConfigFile]对象的内容ä¿å˜åˆ°ä½œä¸ºå‚数指定的AES-256åŠ å¯†æ–‡ä»¶ä¸ï¼Œä½¿ç”¨æä¾›çš„" -"[code]password[/code]è¿›è¡ŒåŠ å¯†ã€‚è¾“å‡ºæ–‡ä»¶ä½¿ç”¨ INI é£Žæ ¼çš„ç»“æž„ã€‚\n" -"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ (æˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"å°† [ConfigFile] 对象的内容ä¿å˜åˆ°ä½œä¸ºå‚数指定的 AES-256 åŠ å¯†æ–‡ä»¶ä¸ï¼Œä½¿ç”¨æä¾›" +"çš„ [code]password[/code]è¿›è¡ŒåŠ å¯†ã€‚è¾“å‡ºæ–‡ä»¶ä½¿ç”¨ INI é£Žæ ¼çš„ç»“æž„ã€‚\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/ConfigFile.xml msgid "" @@ -18989,9 +19015,9 @@ msgid "" "code] value deletes the specified key if it exists, and deletes the section " "if it ends up empty once the key has been removed." msgstr "" -"ä¸ºæŒ‡å®šç« èŠ‚çš„æŒ‡å®šé”®èµ‹å€¼ã€‚å¦‚æžœèŠ‚æˆ–é”®ä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºå®ƒä»¬ã€‚如果指定的键å˜åœ¨ï¼Œä¼ 递" -"一个[code]null[/code]çš„å€¼å°±ä¼šåˆ é™¤æŒ‡å®šçš„é”®ï¼Œå¦‚æžœé”®è¢«åˆ é™¤åŽï¼Œé”®æœ€ç»ˆæ˜¯ç©ºçš„,就会" -"åˆ é™¤èŠ‚ã€‚" +"ä¸ºæŒ‡å®šç« èŠ‚çš„æŒ‡å®šé”®èµ‹å€¼ã€‚å¦‚æžœèŠ‚æˆ–é”®ä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºå®ƒä»¬ã€‚如果指定的键å˜åœ¨ï¼Œä¼ 递 " +"[code]null[/code] å€¼å°±ä¼šåˆ é™¤æŒ‡å®šçš„é”®ï¼Œå¦‚æžœé”®è¢«åˆ é™¤åŽï¼Œé”®æœ€ç»ˆæ˜¯ç©ºçš„ï¼Œå°±ä¼šåˆ é™¤" +"节。" #: doc/classes/ConfirmationDialog.xml msgid "Dialog for confirmation of actions." @@ -19007,7 +19033,7 @@ msgid "" "get_cancel().connect(\"pressed\", self, \"cancelled\")\n" "[/codeblock]." msgstr "" -"用于确认æ“ä½œçš„å¯¹è¯æ¡†ã€‚è¿™ä¸ªå¯¹è¯æ¡†ç»§æ‰¿è‡ª[AcceptDialog]ï¼Œä½†é»˜è®¤æœ‰ä¸€ä¸ªç¡®å®šå’Œå–æ¶ˆ" +"用于确认æ“ä½œçš„å¯¹è¯æ¡†ã€‚è¿™ä¸ªå¯¹è¯æ¡†ç»§æ‰¿è‡ª [AcceptDialog]ï¼Œä½†é»˜è®¤æœ‰ä¸€ä¸ªç¡®å®šå’Œå–æ¶ˆ" "按钮(按主机æ“作系统顺åºï¼‰ã€‚\n" "è¦èŽ·å¾—å–æ¶ˆæ“ä½œï¼Œä½ å¯ä»¥ä½¿ç”¨\n" "[codeblock]\n" @@ -19103,26 +19129,26 @@ msgid "" "code] methods provided by this class." msgstr "" "所有 UI 相关节点的基类。[Control] 具有定义其范围的边界矩形ã€ç›¸å¯¹äºŽå…¶çˆ¶æŽ§ä»¶æˆ–" -"当å‰è§†çª—的锚点ä½ç½®ä»¥åŠè¡¨ç¤ºé”šç‚¹å移的边è·ã€‚ 当节点ã€å…¶ä»»ä½•父节点或å±å¹•尺寸å‘生" +"当å‰è§†çª—的锚点ä½ç½®ä»¥åŠè¡¨ç¤ºé”šç‚¹å移的边è·ã€‚当节点ã€å…¶ä»»ä½•父节点或å±å¹•尺寸å‘生" "å˜åŒ–时,边è·ä¼šè‡ªåŠ¨æ›´æ–°ã€‚\n" -"更多关于 Godot çš„ UI 系统ã€é”šç‚¹ã€è¾¹è·å’Œå®¹å™¨çš„ä¿¡æ¯ï¼Œè¯·å‚阅手册ä¸çš„相关教程。 " -"è¦æž„å»ºçµæ´»çš„ UIï¼Œæ‚¨éœ€è¦æ··åˆä½¿ç”¨ä»Ž [Control] å’Œ [Container] 节点继承的 UI å…ƒ" +"更多关于 Godot çš„ UI 系统ã€é”šç‚¹ã€è¾¹è·å’Œå®¹å™¨çš„ä¿¡æ¯ï¼Œè¯·å‚阅手册ä¸çš„相关教程。è¦" +"æž„å»ºçµæ´»çš„ UIï¼Œæ‚¨éœ€è¦æ··åˆä½¿ç”¨ä»Ž [Control] å’Œ [Container] 节点继承的 UI å…ƒ" "ç´ ã€‚\n" "[b]用户界é¢èŠ‚ç‚¹å’Œè¾“å…¥[/b]\n" -"Godot 首先通过调用 [method Node._input] 将输入事件å‘é€åˆ°åœºæ™¯çš„æ ¹èŠ‚ç‚¹ã€‚ " -"[method Node._input] å°†äº‹ä»¶æ²¿èŠ‚ç‚¹æ ‘å‘下转å‘åˆ°é¼ æ ‡å…‰æ ‡ä¸‹æˆ–é”®ç›˜ç„¦ç‚¹ä¸Šçš„èŠ‚ç‚¹ã€‚ " -"为æ¤ï¼Œå®ƒè°ƒç”¨ [method MainLoop._input_event]。 调用 [method accept_event] 以便" -"没有其他节点收到该事件。 ä¸€æ—¦ä½ æŽ¥å—一个输入,它就会被处ç†ï¼Œæ‰€ä»¥ [method Node." +"Godot 首先通过调用 [method Node._input] 将输入事件å‘é€åˆ°åœºæ™¯çš„æ ¹èŠ‚ç‚¹ã€‚" +"[method Node._input] å°†äº‹ä»¶æ²¿èŠ‚ç‚¹æ ‘å‘下转å‘åˆ°é¼ æ ‡å…‰æ ‡ä¸‹æˆ–é”®ç›˜ç„¦ç‚¹ä¸Šçš„èŠ‚ç‚¹ã€‚ä¸º" +"æ¤ï¼Œå®ƒè°ƒç”¨ [method MainLoop._input_event]。调用 [method accept_event] 以便没" +"æœ‰å…¶ä»–èŠ‚ç‚¹æ”¶åˆ°è¯¥äº‹ä»¶ã€‚ä¸€æ—¦ä½ æŽ¥å—一个输入,它就会被处ç†ï¼Œæ‰€ä»¥ [method Node." "_unhandled_input] ä¸ä¼šå¤„ç†å®ƒã€‚\n" -"åªæœ‰ä¸€ä¸ª [Control] 节点å¯ä»¥å¤„于键盘焦点。 åªæœ‰å¤„于焦点的节点æ‰ä¼šæŽ¥æ”¶é”®ç›˜äº‹" -"件。 è¦èŽ·å¾—ç„¦ç‚¹ï¼Œè¯·è°ƒç”¨ [method grab_focus]。在å¦ä¸€ä¸ªèŠ‚ç‚¹èŽ·å¾—èšç„¦æ—¶ " -"[Control] 节点会失去焦点,或者您éšè—焦点ä¸çš„节点。\n" +"åªæœ‰ä¸€ä¸ª [Control] 节点å¯ä»¥å¤„äºŽé”®ç›˜ç„¦ç‚¹ã€‚åªæœ‰å¤„于焦点的节点æ‰ä¼šæŽ¥æ”¶é”®ç›˜äº‹ä»¶ã€‚" +"è¦èŽ·å¾—ç„¦ç‚¹ï¼Œè¯·è°ƒç”¨ [method grab_focus]。在å¦ä¸€ä¸ªèŠ‚ç‚¹èŽ·å¾—èšç„¦æ—¶ [Control] 节点" +"会失去焦点,或者您éšè—焦点ä¸çš„节点。\n" "å°† [member mouse_filter] 设置为 [constant MOUSE_FILTER_IGNORE] 以告诉 " -"[Control] èŠ‚ç‚¹å¿½ç•¥é¼ æ ‡æˆ–è§¦æ‘¸äº‹ä»¶ã€‚ å¦‚æžœæ‚¨åœ¨æŒ‰é’®é¡¶éƒ¨æ”¾ç½®ä¸€ä¸ªå›¾æ ‡ï¼Œæ‚¨å°†éœ€è¦" +"[Control] èŠ‚ç‚¹å¿½ç•¥é¼ æ ‡æˆ–è§¦æ‘¸äº‹ä»¶ã€‚å¦‚æžœæ‚¨åœ¨æŒ‰é’®é¡¶éƒ¨æ”¾ç½®ä¸€ä¸ªå›¾æ ‡ï¼Œæ‚¨å°†éœ€è¦" "它。\n" -"[Theme] èµ„æºæ›´æ”¹æŽ§ä»¶çš„外观。 如果您更改 [Control] 节点上的 [Theme],则会影å“" -"其所有å节点。 è¦è¦†ç›–æŸäº›ä¸»é¢˜çš„傿•°ï¼Œè¯·è°ƒç”¨ [code]add_*_override[/code] 方法" -"之一,例如 [method add_font_override]。 您å¯ä»¥ä½¿ç”¨æ£€æŸ¥å™¨è¦†ç›–主题。\n" +"[Theme] èµ„æºæ›´æ”¹æŽ§ä»¶çš„外观。如果您更改 [Control] 节点上的 [Theme],则会影å“å…¶" +"所有å节点。è¦è¦†ç›–æŸäº›ä¸»é¢˜çš„傿•°ï¼Œè¯·è°ƒç”¨ [code]add_*_override[/code] 方法之" +"一,例如 [method add_font_override]。您å¯ä»¥ä½¿ç”¨æ£€æŸ¥å™¨è¦†ç›–主题。\n" "[b]注æ„:[/b]主题项目[i]䏿˜¯[/i] [Object] 的属性。这æ„味ç€ä½ æ— æ³•ä½¿ç”¨ [method " "Object.get] å’Œ [method Object.set] 访问它们的值。请æ¢ç”¨ [method get_color]ã€" "[method get_constant]ã€[method get_font]ã€[method get_icon]ã€[method " @@ -19249,7 +19275,7 @@ msgid "" "[/codeblock]" msgstr "" "由用户实现的虚方法。返回一个 [Control] 节点,该节点应用作工具æç¤ºè€Œä¸æ˜¯é»˜è®¤èŠ‚" -"点。 [code]for_text[/code] åŒ…å« [member hint_tooltip] 属性的内容。\n" +"点。[code]for_text[/code] åŒ…å« [member hint_tooltip] 属性的内容。\n" "返回的节点必须是 [Control] 或 Control-derived 类型。它å¯ä»¥æœ‰ä»»ä½•类型的å节" "点。当工具æç¤ºæ¶ˆå¤±æ—¶å®ƒä¼šè¢«é‡Šæ”¾ï¼Œå› æ¤è¯·ç¡®ä¿ä½ 始终æä¾›ä¸€ä¸ªæ–°å®žä¾‹ï¼ˆå¦‚æžœä½ æƒ³ä½¿ç”¨" "åœºæ™¯æ ‘ä¸é¢„å…ˆå˜åœ¨çš„节点,å¯ä»¥å¤åˆ¶å®ƒå¹¶ä¼ 递å¤åˆ¶çš„实例)。当返回 [code]null[/" @@ -19448,10 +19474,10 @@ msgid "" " color = data[\"color\"]\n" "[/codeblock]" msgstr "" -"Godotè°ƒç”¨æ¤æ–¹æ³•以将控件的[method get_drag_data]结果ä¸çš„[code]data[/code]ä¼ é€’" -"给您。 Godot首先调用[method can_drop_data]æ¥æµ‹è¯•是å¦å…许[code]data[/code]在" -"[code]position[/code]å¤„åˆ é™¤ï¼Œå…¶ä¸[code]position[/code]å¯¹äºŽæ¤æŽ§ä»¶è€Œè¨€æ˜¯æœ¬åœ°" -"的。\n" +"Godot è°ƒç”¨æ¤æ–¹æ³•以将控件的 [method get_drag_data] 结果ä¸çš„ [code]data[/code] " +"ä¼ é€’ç»™æ‚¨ã€‚Godot 首先调用 [method can_drop_data] æ¥æµ‹è¯•是å¦å…许 [code]data[/" +"code] 在 [code]position[/code] å¤„åˆ é™¤ï¼Œå…¶ä¸ [code]position[/code] å¯¹äºŽæ¤æŽ§ä»¶" +"而言是本地的。\n" "[codeblock]\n" "func can_drop_data(position, data):\n" " return typeof(data) == TYPE_DICTIONARY and data.has(\"color\")\n" @@ -19463,12 +19489,12 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Finds the next (below in the tree) [Control] that can receive the focus." -msgstr "找到下一个å¯ä»¥æŽ¥å—焦点的[Control]ï¼Œåœ¨æ ‘çš„ä¸‹æ–¹ã€‚" +msgstr "找到下一个å¯ä»¥æŽ¥å—焦点的 [Control]ï¼Œåœ¨æ ‘çš„ä¸‹æ–¹ã€‚" #: doc/classes/Control.xml msgid "" "Finds the previous (above in the tree) [Control] that can receive the focus." -msgstr "找到å¯ä»¥æŽ¥æ”¶ç„¦ç‚¹çš„上一个[Control]ï¼Œåœ¨æ ‘çš„ä¸Šæ–¹ã€‚" +msgstr "找到å¯ä»¥æŽ¥æ”¶ç„¦ç‚¹çš„上一个 [Control]ï¼Œåœ¨æ ‘çš„ä¸Šæ–¹ã€‚" #: doc/classes/Control.xml msgid "" @@ -19479,11 +19505,11 @@ msgid "" "The methods [method can_drop_data] and [method drop_data] must be " "implemented on controls that want to receive drop data." msgstr "" -"é€šè¿‡ä¼ é€’[code]data[/code]å’Œ[code]preview[/code]强制拖动并绕过[method " -"get_drag_data]å’Œ[method set_drag_preview]。å³ä½¿é¼ æ ‡æ—¢ä¸åœ¨è¯¥æŽ§ä»¶ä¸Šï¼Œä¹Ÿæœªåœ¨è¯¥æŽ§" -"件上按下,都将开始拖动。\n" -"方法[method can_drop_data]å’Œ[method drop_data]å¿…é¡»åœ¨è¦æŽ¥æ”¶æ”¾ç½®æ•°æ®çš„æŽ§ä»¶ä¸Šå®ž" -"现。" +"é€šè¿‡ä¼ é€’ [code]data[/code] å’Œ [code]preview[/code] 强制拖动并绕过 [method " +"get_drag_data] å’Œ [method set_drag_preview]。å³ä½¿é¼ æ ‡æ—¢ä¸åœ¨è¯¥æŽ§ä»¶ä¸Šï¼Œä¹Ÿæœªåœ¨è¯¥" +"控件上按下,都将开始拖动。\n" +"[method can_drop_data] å’Œ [method drop_data] æ–¹æ³•å¿…é¡»åœ¨è¦æŽ¥æ”¶æ”¾ç½®æ•°æ®çš„æŽ§ä»¶ä¸Š" +"实现。" #: doc/classes/Control.xml msgid "" @@ -19548,7 +19574,8 @@ msgstr "" msgid "" "Returns combined minimum size from [member rect_min_size] and [method " "get_minimum_size]." -msgstr "返回[member rect_min_size]å’Œ[method get_minimum_size]çš„ç»„åˆæœ€å°å¤§å°ã€‚" +msgstr "" +"返回 [member rect_min_size] å’Œ [method get_minimum_size] çš„ç»„åˆæœ€å°å¤§å°ã€‚" #: doc/classes/Control.xml msgid "" @@ -19584,12 +19611,12 @@ msgid "" " return mydata\n" "[/codeblock]" msgstr "" -"Godotè°ƒç”¨æ¤æ–¹æ³•æ¥èŽ·å–å¯ä»¥æ‹–放到期望放置数æ®çš„æŽ§ä»¶ä¸Šçš„æ•°æ®ã€‚å¦‚æžœæ²¡æœ‰è¦æ‹–动的数" -"æ®ï¼Œåˆ™è¿”回 [code]null[/code]ã€‚æƒ³è¦æŽ¥æ”¶æ”¾ç½®æ•°æ®çš„æŽ§ä»¶åº”实现[method " -"can_drop_data]å’Œ[method drop_data]。 [code]position[/code]åœ¨æ¤æŽ§ä»¶ä¸æ˜¯æœ¬åœ°" -"的。å¯ä»¥ä½¿ç”¨[method force_drag]强制拖动。\n" -"å¯ä»¥ä½¿ç”¨[method set_drag_preview]设置跟éšé¼ æ ‡çš„é¢„è§ˆï¼Œè¯¥é¢„è§ˆå°†ä»£è¡¨æ•°æ®ã€‚设置预" -"è§ˆçš„å¥½æ—¶æœºå°±æ˜¯è¿™ç§æ–¹æ³•。\n" +"Godot è°ƒç”¨æ¤æ–¹æ³•æ¥èŽ·å–å¯ä»¥æ‹–放到期望放置数æ®çš„æŽ§ä»¶ä¸Šçš„æ•°æ®ã€‚å¦‚æžœæ²¡æœ‰è¦æ‹–动的" +"æ•°æ®ï¼Œåˆ™è¿”回 [code]null[/code]ã€‚æƒ³è¦æŽ¥æ”¶æ”¾ç½®æ•°æ®çš„æŽ§ä»¶åº”实现 [method " +"can_drop_data] å’Œ [method drop_data]。[code]position[/code] åœ¨æ¤æŽ§ä»¶ä¸æ˜¯æœ¬åœ°" +"的。å¯ä»¥ä½¿ç”¨ [method force_drag] 强制拖动。\n" +"å¯ä»¥ä½¿ç”¨ [method set_drag_preview] 设置跟éšé¼ æ ‡çš„é¢„è§ˆï¼Œè¯¥é¢„è§ˆå°†ä»£è¡¨æ•°æ®ã€‚设置" +"é¢„è§ˆçš„å¥½æ—¶æœºå°±æ˜¯è¿™ç§æ–¹æ³•。\n" "[codeblock]\n" "func get_drag_data(position):\n" " var mydata = make_data()\n" @@ -19599,7 +19626,7 @@ msgstr "" #: doc/classes/Control.xml msgid "Returns [member margin_right] and [member margin_bottom]." -msgstr "返回[member margin_right]å’Œ[member margin_bottom]。" +msgstr "返回 [member margin_right] å’Œ [member margin_bottom]。" #: doc/classes/Control.xml msgid "" @@ -19608,9 +19635,9 @@ msgid "" "[member focus_neighbour_left], [member focus_neighbour_right] and [member " "focus_neighbour_top]." msgstr "" -"返回由[enum Margin]枚举的[code]margin[/code]叏釿 ‡è¯†çš„焦点邻居。 [member " -"focus_neighbour_bottom],[member focus_neighbour_left],[member " -"focus_neighbour_right]å’Œ[member focus_neighbour_top]çš„èŽ·å–æ–¹æ³•。" +"返回由 [enum Margin] 枚举的 [code]margin[/code] 叏釿 ‡è¯†çš„焦点邻居。[member " +"focus_neighbour_bottom]ã€[member focus_neighbour_left]ã€[member " +"focus_neighbour_right]ã€[member focus_neighbour_top] çš„èŽ·å–æ–¹æ³•。" #: doc/classes/Control.xml msgid "" @@ -19633,7 +19660,7 @@ msgid "" "Returns the position and size of the control relative to the top-left corner " "of the screen. See [member rect_position] and [member rect_size]." msgstr "" -"返回控件相对于å±å¹•左上角的ä½ç½®å’Œå¤§å°ã€‚请å‚阅[member rect_position]å’Œ[member " +"返回控件相对于å±å¹•左上角的ä½ç½®å’Œå¤§å°ã€‚è§ [member rect_position] å’Œ [member " "rect_size]。" #: doc/classes/Control.xml @@ -19659,7 +19686,7 @@ msgstr "" #: doc/classes/Control.xml msgid "Returns the minimum size for this control. See [member rect_min_size]." -msgstr "è¿”å›žæ¤æŽ§ä»¶çš„æœ€å°å°ºå¯¸ã€‚å‚阅[member rect_min_size]。" +msgstr "è¿”å›žæ¤æŽ§ä»¶çš„æœ€å°å°ºå¯¸ã€‚è§ [member rect_min_size]。" #: doc/classes/Control.xml msgid "Returns the width/height occupied in the parent control." @@ -19674,7 +19701,7 @@ msgid "" "Returns the position and size of the control relative to the top-left corner " "of the parent Control. See [member rect_position] and [member rect_size]." msgstr "" -"返回相对于父控件左上角的控件的ä½ç½®å’Œå¤§å°ã€‚请å‚阅[member rect_position]å’Œ" +"返回相对于父控件左上角的控件的ä½ç½®å’Œå¤§å°ã€‚è§ [member rect_position] å’Œ " "[member rect_size]。" #: doc/classes/Control.xml @@ -19975,7 +20002,7 @@ msgid "" "also be updated." msgstr "" "将锚点设置为预设 [code]preset[/code],å–值范围为 [enum Control.LayoutPreset] " -"æžšä¸¾ã€‚ç‰æ•ˆäºŽåœ¨ 2D 编辑器ä¸ä½¿ç”¨å¸ƒå±€èœå•。\n" +"枚举。相当于在 2D 编辑器ä¸ä½¿ç”¨å¸ƒå±€èœå•。\n" "如果 [code]keep_margins[/code] 是 [code]true[/code],控件的ä½ç½®ä¹Ÿä¼šæ›´æ–°ã€‚" #: doc/classes/Control.xml @@ -20106,9 +20133,9 @@ msgid "" "margin_bottom], [member margin_left], [member margin_right] and [member " "margin_top]." msgstr "" -"设置由[enum Margin]枚举到[code]offset[/code]çš„[code]margin[/code]叏釿‰€æ ‡è¯†çš„" -"è¾¹è·ã€‚用于[member margin_bottom],[member margin_left],[member margin_right]" -"å’Œ[member margin_top]的设置方法。" +"设置由 [enum Margin] 枚举到 [code]offset[/code] çš„ [code]margin[/code] 叏釿‰€" +"æ ‡è¯†çš„è¾¹è·ã€‚用于 [member margin_bottom]ã€[member margin_left]ã€[member " +"margin_right]ã€[member margin_top] 的设置方法。" #: doc/classes/Control.xml msgid "" @@ -20122,8 +20149,8 @@ msgid "" "Use parameter [code]margin[/code] to determine the gap between the [Control] " "and the edges." msgstr "" -"从 [enum Control.LayoutPreset] 枚举将边è·è®¾ç½®ä¸º [code]preset[/code]ã€‚è¿™æ˜¯ç‰æ•ˆ" -"于在 2D 编辑器ä¸ä½¿ç”¨å¸ƒå±€èœå•的编ç 。\n" +"从 [enum Control.LayoutPreset] 枚举将边è·è®¾ç½®ä¸º [code]preset[/code]。相当于" +"在 2D 编辑器ä¸ä½¿ç”¨å¸ƒå±€èœå•的编ç 。\n" "ä½¿ç”¨å‚æ•° [code]resize_mode[/code] å’Œ [enum Control.LayoutPresetMode] ä¸çš„常é‡" "æ¥æ›´å¥½åœ°ç¡®å®š [Control] 的最终大å°ã€‚如果与更改大å°çš„预设一起使用,则常规大å°å°†" "被忽略,例如[code]PRESET_LEFT_WIDE[/code]。\n" @@ -20149,8 +20176,8 @@ msgid "" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -"设置控件的大å°(å‚阅[member rect_size])。\n" -"如果[code]keep_margins[/code]是[code]true[/code]ï¼Œåˆ™ä¼šæ›´æ–°æŽ§ä»¶çš„é”šç‚¹è€Œä¸æ˜¯é¡µ" +"设置控件的大å°ï¼ˆè§ [member rect_size])。\n" +"如果 [code]keep_margins[/code] 为 [code]true[/code]ï¼Œåˆ™ä¼šæ›´æ–°æŽ§ä»¶çš„é”šç‚¹è€Œä¸æ˜¯" "è¾¹è·ã€‚" #: doc/classes/Control.xml @@ -20184,8 +20211,8 @@ msgid "" "moves or changes size. You can use one of the [enum Anchor] constants for " "convenience." msgstr "" -"将节点的底部边缘锚定到其父控件的原点,ä¸å¿ƒæˆ–æœ«ç«¯ã€‚å½“èŠ‚ç‚¹ç§»åŠ¨æˆ–æ›´æ”¹å¤§å°æ—¶ï¼Œå®ƒ" -"会更改底部边è·çš„æ›´æ–°æ–¹å¼ã€‚为了方便起è§ï¼Œå¯ä»¥ä½¿ç”¨ [enum Anchor] 常é‡ä¹‹ä¸€ã€‚" +"将节点的底边缘锚定到其父控件的原点,ä¸å¿ƒæˆ–æœ«ç«¯ã€‚å½“èŠ‚ç‚¹ç§»åŠ¨æˆ–æ›´æ”¹å¤§å°æ—¶ï¼Œå®ƒä¼š" +"更改底部边è·çš„æ›´æ–°æ–¹å¼ã€‚为了方便起è§ï¼Œå¯ä»¥ä½¿ç”¨ [enum Anchor] 常é‡ä¹‹ä¸€ã€‚" #: doc/classes/Control.xml msgid "" @@ -20376,7 +20403,7 @@ msgid "" "you should not modify them manually if your node is a direct child of a " "[Container]. Margins update automatically when you move or resize the node." msgstr "" -"节点底边与其父控件之间的è·ç¦»ï¼ŒåŸºäºŽ [member anchor_bottom]。\n" +"节点的底边缘与其父控件之间的è·ç¦»ï¼ŒåŸºäºŽ [member anchor_bottom]。\n" "è¾¹è·é€šå¸¸ç”±ä¸€ä¸ªæˆ–多个父 [Container] èŠ‚ç‚¹æŽ§åˆ¶ï¼Œå› æ¤ï¼Œå¦‚果您的节点是 " "[Container] 的直接å级,则ä¸åº”æ‰‹åŠ¨ä¿®æ”¹å®ƒä»¬ã€‚å½“æ‚¨ç§»åŠ¨æˆ–è°ƒæ•´èŠ‚ç‚¹å¤§å°æ—¶ï¼Œè¾¹è·ä¼š" "自动更新。" @@ -20415,7 +20442,7 @@ msgid "" "you should not modify them manually if your node is a direct child of a " "[Container]. Margins update automatically when you move or resize the node." msgstr "" -"节点的顶边与其父控件之间的è·ç¦»ï¼ŒåŸºäºŽ [member anchor_top]。\n" +"节点的顶边缘与其父控件之间的è·ç¦»ï¼ŒåŸºäºŽ [member anchor_top]。\n" "è¾¹è·é€šå¸¸ç”±ä¸€ä¸ªæˆ–多个父 [Container] 节点控制,所以如果您的节点是 [Container] " "的直接å节点,您ä¸åº”è¯¥æ‰‹åŠ¨ä¿®æ”¹å®ƒä»¬ã€‚å½“æ‚¨ç§»åŠ¨æˆ–è°ƒæ•´èŠ‚ç‚¹å¤§å°æ—¶ï¼Œè¾¹è·ä¼šè‡ªåŠ¨æ›´" "新。" @@ -20427,9 +20454,9 @@ msgid "" "[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the " "system." msgstr "" -"æ¤æŽ§ä»¶çš„é»˜è®¤å…‰æ ‡å½¢çŠ¶ã€‚å¯¹äºŽGodotæ’ä»¶å’Œä½¿ç”¨ç³»ç»Ÿé¼ æ ‡å…‰æ ‡çš„åº”ç”¨ç¨‹åºæˆ–游æˆå¾ˆæœ‰" +"æ¤æŽ§ä»¶çš„é»˜è®¤å…‰æ ‡å½¢çŠ¶ã€‚å¯¹äºŽ Godot æ’ä»¶å’Œä½¿ç”¨ç³»ç»Ÿé¼ æ ‡å…‰æ ‡çš„åº”ç”¨ç¨‹åºæˆ–游æˆå¾ˆæœ‰" "用。\n" -"[b]注æ„:[/b]在Linux上,形状å¯èƒ½ä¼šæœ‰æ‰€ä¸åŒï¼Œå…·ä½“å–å†³äºŽç³»ç»Ÿçš„å…‰æ ‡ä¸»é¢˜ã€‚" +"[b]注æ„:[/b]在 Linux 上,形状å¯èƒ½ä¼šæœ‰æ‰€ä¸åŒï¼Œå…·ä½“å–å†³äºŽç³»ç»Ÿçš„å…‰æ ‡ä¸»é¢˜ã€‚" #: doc/classes/Control.xml msgid "" @@ -20438,9 +20465,9 @@ msgid "" "Also controls whether the control can receive the [signal mouse_entered], " "and [signal mouse_exited] signals. See the constants to learn what each does." msgstr "" -"控制控件是å¦èƒ½å¤Ÿé€šè¿‡[method _gui_input]æŽ¥æ”¶é¼ æ ‡æŒ‰é’®è¾“å…¥äº‹ä»¶ï¼Œä»¥åŠå¦‚何处ç†è¿™äº›" -"事件。还控制控件是å¦èƒ½æŽ¥æ”¶[signal mouse_entered]å’Œ[signal mouse_exited]ä¿¡å·ã€‚" -"å‚é˜…å¸¸é‡æ¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" +"控制控件是å¦èƒ½å¤Ÿé€šè¿‡ [method _gui_input] æŽ¥æ”¶é¼ æ ‡æŒ‰é’®è¾“å…¥äº‹ä»¶ï¼Œä»¥åŠå¦‚何处ç†è¿™" +"些事件。还控制控件是å¦èƒ½æŽ¥æ”¶ [signal mouse_entered] å’Œ [signal mouse_exited] " +"ä¿¡å·ã€‚å‚é˜…å¸¸é‡æ¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" #: doc/classes/Control.xml msgid "" @@ -20448,8 +20475,8 @@ msgid "" "to this control's rectangle. If [code]true[/code], parts of a child which " "would be visibly outside of this control's rectangle will not be rendered." msgstr "" -"å¯ç”¨æ˜¯å¦åº”将基于[CanvasItem]çš„åæŽ§ä»¶æ¸²æŸ“到该控件的矩形上。如果[code]true[/" -"code],则ä¸ä¼šæ¸²æŸ“åæŽ§ä»¶ä¸æ˜Žæ˜¾åœ¨çŸ©å½¢ä¹‹å¤–的部分。" +"å¯ç”¨æ˜¯å¦åº”将基于 [CanvasItem] çš„åæŽ§ä»¶æ¸²æŸ“到该控件的矩形上。如果为 " +"[code]true[/code],则ä¸ä¼šæ¸²æŸ“åæŽ§ä»¶ä¸æ˜Žæ˜¾åœ¨çŸ©å½¢ä¹‹å¤–的部分。" #: doc/classes/Control.xml msgid "" @@ -20464,9 +20491,9 @@ msgid "" "this size, even if its content is smaller. If it's set to (0, 0), the node " "sizes automatically to fit its content, be it a texture or child nodes." msgstr "" -"节点的边界矩形的最å°å°ºå¯¸ã€‚å¦‚æžœä½ å°†å®ƒè®¾ç½®ä¸ºå¤§äºŽ(0,0)的值,节点的边界矩形将始" -"终至少有这个大å°ï¼Œå³ä½¿å®ƒçš„内容更å°ã€‚如果设置为(0,0),节点的大å°ä¼šè‡ªåŠ¨é€‚åº”å…¶" -"å†…å®¹ï¼Œæ— è®ºæ˜¯çº¹ç†è¿˜æ˜¯å节点。" +"节点的边界矩形的最å°å°ºå¯¸ã€‚å¦‚æžœä½ å°†å®ƒè®¾ç½®ä¸ºå¤§äºŽ (0,0) 的值,节点的边界矩形将" +"始终至少有这个大å°ï¼Œå³ä½¿å®ƒçš„内容更å°ã€‚如果设置为 (0,0),节点的大å°ä¼šè‡ªåŠ¨é€‚åº”" +"å…¶å†…å®¹ï¼Œæ— è®ºæ˜¯çº¹ç†è¿˜æ˜¯å节点。" #: doc/classes/Control.xml msgid "" @@ -20529,7 +20556,7 @@ msgstr "" msgid "" "The size of the node's bounding rectangle, in pixels. [Container] nodes " "update this property automatically." -msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚ [Container]节点会自动更新æ¤å±žæ€§ã€‚" +msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚[Container]节点会自动更新æ¤å±žæ€§ã€‚" #: doc/classes/Control.xml msgid "" @@ -20537,8 +20564,8 @@ msgid "" "on the X axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." msgstr "" -"告诉父[Container]节点应如何调整尺寸并将其放置在X轴上。使用[enum SizeFlags]常" -"é‡ä¹‹ä¸€æ›´æ”¹æ ‡å¿—。查看常é‡ä»¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" +"告诉父 [Container] 节点应如何调整尺寸并将其放置在 X 轴上。使用 [enum " +"SizeFlags] 常é‡ä¹‹ä¸€æ›´æ”¹æ ‡å¿—。查看常é‡ä»¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" #: doc/classes/Control.xml msgid "" @@ -20558,14 +20585,14 @@ msgid "" "on the Y axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." msgstr "" -"告诉父[Container]节点应如何调整尺寸并将其放置在X轴上。使用[enum SizeFlags]常" -"é‡ä¹‹ä¸€æ›´æ”¹æ ‡å¿—。查看常é‡ä»¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" +"告诉父 [Container] 节点应如何调整尺寸并将其放置在 X 轴上。使用 [enum " +"SizeFlags] 常é‡ä¹‹ä¸€æ›´æ”¹æ ‡å¿—。查看常é‡ä»¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" #: doc/classes/Control.xml msgid "" "Changing this property replaces the current [Theme] resource this node and " "all its [Control] children use." -msgstr "更改æ¤å±žæ€§å°†æ›¿æ¢è¯¥èŠ‚ç‚¹åŠå…¶æ‰€æœ‰[Control]å级使用的当å‰[Theme]资æºã€‚" +msgstr "更改æ¤å±žæ€§å°†æ›¿æ¢è¯¥èŠ‚ç‚¹åŠå…¶æ‰€æœ‰ [Control] åçº§ä½¿ç”¨çš„å½“å‰ [Theme] 资æºã€‚" #: doc/classes/Control.xml msgid "" @@ -20615,7 +20642,7 @@ msgstr "当节点的最å°å¤§å°æ›´æ”¹æ—¶å‘出。" #: doc/classes/Control.xml msgid "Emitted when a modal [Control] is closed. See [method show_modal]." -msgstr "å½“æ¨¡æ€æŽ§ä»¶[Control]è¢«å…³é—æ—¶è§¦å‘。å‚阅[method show_modal]。" +msgstr "å½“æ¨¡æ€æŽ§ä»¶ [Control] è¢«å…³é—æ—¶è§¦å‘ã€‚è§ [method show_modal]。" #: doc/classes/Control.xml msgid "" @@ -20669,7 +20696,7 @@ msgid "" "Emitted when one of the size flags changes. See [member " "size_flags_horizontal] and [member size_flags_vertical]." msgstr "" -"当大尿 ‡å¿—之一更改时å‘出。请å‚阅[member size_flags_horizontal]å’Œ[member " +"当大尿 ‡å¿—之一更改时å‘å‡ºã€‚è§ [member size_flags_horizontal] å’Œ [member " "size_flags_vertical]。" #: doc/classes/Control.xml @@ -20692,7 +20719,7 @@ msgstr "" #: doc/classes/Control.xml msgid "" "Sent when the node changes size. Use [member rect_size] to get the new size." -msgstr "å½“èŠ‚ç‚¹æ›´æ”¹å¤§å°æ—¶å‘é€ã€‚使用[member rect_size]èŽ·å–æ–°å¤§å°ã€‚" +msgstr "å½“èŠ‚ç‚¹æ›´æ”¹å¤§å°æ—¶å‘é€ã€‚使用 [member rect_size] èŽ·å–æ–°å¤§å°ã€‚" #: doc/classes/Control.xml msgid "Sent when the mouse pointer enters the node." @@ -20721,27 +20748,27 @@ msgstr "" #: doc/classes/Control.xml msgid "Sent when an open modal dialog closes. See [method show_modal]." -msgstr "当一个打开的模æ€å¯¹è¯æ¡†å…³é—æ—¶å‘é€ã€‚å‚阅[method show_modal]。" +msgstr "当一个打开的模æ€å¯¹è¯æ¡†å…³é—æ—¶å‘é€ã€‚è§ [method show_modal]。" #: doc/classes/Control.xml msgid "" "Sent when this node is inside a [ScrollContainer] which has begun being " "scrolled." -msgstr "当æ¤èŠ‚ç‚¹åœ¨å·²å¼€å§‹æ»šåŠ¨çš„[ScrollContainer]内部时å‘é€ã€‚" +msgstr "当æ¤èŠ‚ç‚¹åœ¨å·²å¼€å§‹æ»šåŠ¨çš„ [ScrollContainer] 内部时å‘é€ã€‚" #: doc/classes/Control.xml msgid "" "Sent when this node is inside a [ScrollContainer] which has stopped being " "scrolled." -msgstr "当æ¤èŠ‚ç‚¹åœ¨å·²åœæ¢æ»šåŠ¨çš„[ScrollContainer]内部时å‘é€ã€‚" +msgstr "当æ¤èŠ‚ç‚¹åœ¨å·²åœæ¢æ»šåŠ¨çš„ [ScrollContainer] 内部时å‘é€ã€‚" #: doc/classes/Control.xml msgid "" "Show the system's arrow mouse cursor when the user hovers the node. Use with " "[member mouse_default_cursor_shape]." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ç®å¤´é¼ æ ‡å…‰æ ‡ã€‚ä¸Ž[member " -"mouse_default_cursor_shape]æˆå‘˜ä¸€èµ·ä½¿ç”¨ã€‚" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ç®å¤´é¼ æ ‡å…‰æ ‡ã€‚ä¸Ž [member " +"mouse_default_cursor_shape] æˆå‘˜ä¸€èµ·ä½¿ç”¨ã€‚" #: doc/classes/Control.xml msgid "" @@ -20749,7 +20776,7 @@ msgid "" "beam pointer has a shape similar to \"I\". It tells the user they can " "highlight or insert text." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„I型光æŸé¼ æ ‡å…‰æ ‡ã€‚å·¥å—æ¢æŒ‡é’ˆçš„形状类似于“ Iâ€ã€‚它" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„I型光æŸé¼ æ ‡å…‰æ ‡ã€‚å·¥å—æ¢æŒ‡é’ˆçš„形状类似于“Iâ€ã€‚它" "告诉用户他们å¯ä»¥çªå‡ºæ˜¾ç¤ºæˆ–æ’入文本。" #: doc/classes/Control.xml @@ -20833,8 +20860,8 @@ msgid "" "they can resize the window or the panel both horizontally and vertically." msgstr "" "å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçª—å£è°ƒæ•´å¤§å°çš„é¼ æ ‡å…‰æ ‡ã€‚å…‰æ ‡æ˜¯ä¸€ä¸ªåŒå‘ç®å¤´ï¼Œä»Žå·¦" -"上角到å³ä¸‹è§’,与[constant CURSOR_BDIAGSIZE]相å。它告诉用户å¯ä»¥æ°´å¹³å’Œåž‚直调整" -"çª—å£æˆ–颿¿çš„大å°ã€‚" +"上角到å³ä¸‹è§’,与 [constant CURSOR_BDIAGSIZE] 相å。它告诉用户å¯ä»¥æ°´å¹³å’Œåž‚ç›´è°ƒ" +"æ•´çª—å£æˆ–颿¿çš„大å°ã€‚" #: doc/classes/Control.xml msgid "" @@ -20843,23 +20870,23 @@ msgid "" "a UI element freely." msgstr "" "å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ç§»åŠ¨é¼ æ ‡å…‰æ ‡ã€‚å®ƒä»¥90度角显示2个åŒå‘ç®å¤´ã€‚它告诉" -"用户他们å¯ä»¥è‡ªç”±ç§»åЍUIå…ƒç´ ã€‚" +"用户他们å¯ä»¥è‡ªç”±ç§»åЍ UI å…ƒç´ ã€‚" #: doc/classes/Control.xml msgid "" "Show the system's vertical split mouse cursor when the user hovers the node. " "On Windows, it's the same as [constant CURSOR_VSIZE]." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 " -"[constant CURSOR_VSIZE] 相åŒã€‚" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant " +"CURSOR_VSIZE] 相åŒã€‚" #: doc/classes/Control.xml msgid "" "Show the system's horizontal split mouse cursor when the user hovers the " "node. On Windows, it's the same as [constant CURSOR_HSIZE]." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„æ°´å¹³æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨Windows上,它与[constant " -"CURSOR_HSIZE]相åŒã€‚" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„æ°´å¹³æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上与 [constant " +"CURSOR_HSIZE] 相åŒã€‚" #: doc/classes/Control.xml msgid "" @@ -21004,7 +21031,7 @@ msgid "" "editor. Use with [method set_anchors_preset]." msgstr "" "将所有 4 个锚点对é½åˆ°çˆ¶æŽ§ä»¶çš„å„个角。应用æ¤é¢„设åŽï¼Œå°†æ‰€æœ‰ 4 个页边è·è®¾ç½®ä¸º " -"0,[Control] 将适åˆå…¶ä¸Šçº§æŽ§ä»¶ã€‚è¿™ç‰æ•ˆäºŽç¼–辑器ä¸çš„“整个矩形â€å¸ƒå±€é€‰é¡¹ã€‚与 " +"0,[Control] 将适åˆå…¶ä¸Šçº§æŽ§ä»¶ã€‚相当于编辑器ä¸çš„“整个矩形â€å¸ƒå±€é€‰é¡¹ã€‚与 " "[method set_anchors_preset] 一起使用。" #: doc/classes/Control.xml @@ -21070,9 +21097,9 @@ msgid "" "flags. Use with [member size_flags_horizontal] and [member " "size_flags_vertical]." msgstr "" -"告诉父级[Container]将节点与其末端(底部或å³ä¾§ï¼‰å¯¹é½ã€‚它ä¸é€‚用于fill或expand " -"sizeæ ‡å¿—ã€‚ä¸Ž[member size_flags_horizontal]å’Œ[member size_flags_vertical]一起" -"使用。" +"告诉父级 [Container] 将节点与其末端(底部或å³ä¾§ï¼‰å¯¹é½ã€‚它ä¸é€‚用于 fill 或 " +"expand size æ ‡å¿—ã€‚ä¸Ž [member size_flags_horizontal] å’Œ [member " +"size_flags_vertical] 一起使用。" #: doc/classes/Control.xml msgid "" @@ -21163,20 +21190,20 @@ msgstr "" #: doc/classes/ConvexPolygonShape.xml msgid "Convex polygon shape for 3D physics." -msgstr "用于3D物ç†çš„凸多边形形状。" +msgstr "用于 3D 物ç†çš„凸多边形形状。" #: doc/classes/ConvexPolygonShape.xml msgid "" "Convex polygon shape resource, which can be added to a [PhysicsBody] or area." -msgstr "凸多边形形状资æºï¼Œå¯ä»¥æ·»åŠ åˆ°[PhysicsBody]或area区域。" +msgstr "凸多边形形状资æºï¼Œå¯ä»¥æ·»åŠ åˆ° [PhysicsBody] 或区域。" #: doc/classes/ConvexPolygonShape.xml msgid "The list of 3D points forming the convex polygon shape." -msgstr "å½¢æˆå‡¸å¤šè¾¹å½¢çš„3D点列表。" +msgstr "å½¢æˆå‡¸å¤šè¾¹å½¢çš„ 3D 点列表。" #: doc/classes/ConvexPolygonShape2D.xml msgid "Convex polygon shape for 2D physics." -msgstr "用于2D物ç†çš„凸多边形形状。" +msgstr "用于 2D 物ç†çš„凸多边形形状。" #: doc/classes/ConvexPolygonShape2D.xml msgid "" @@ -21189,12 +21216,12 @@ msgid "" "uses a more complex method of collision detection, and a convex one forces " "itself to be convex in order to speed up collision detection." msgstr "" -"用于2D物ç†çš„å‡¸å¤šè¾¹å½¢å½¢çŠ¶ã€‚å‡¸å¤šè¾¹å½¢ï¼Œæ— è®ºå…¶å½¢çŠ¶å¦‚ä½•ï¼Œéƒ½å¯ä»¥åœ¨å†…部分解为所需数" -"é‡çš„凸多边形,以确ä¿å§‹ç»ˆå¯¹å‡¸å¤šè¾¹å½¢æ‰§è¡Œæ‰€æœ‰é’ˆå¯¹å®ƒçš„碰撞检查(检查速度更" +"用于 2D 物ç†çš„å‡¸å¤šè¾¹å½¢å½¢çŠ¶ã€‚å‡¸å¤šè¾¹å½¢ï¼Œæ— è®ºå…¶å½¢çŠ¶å¦‚ä½•ï¼Œéƒ½å¯ä»¥åœ¨å†…部分解为所需" +"æ•°é‡çš„凸多边形,以确ä¿å§‹ç»ˆå¯¹å‡¸å¤šè¾¹å½¢æ‰§è¡Œæ‰€æœ‰é’ˆå¯¹å®ƒçš„碰撞检查(检查速度更" "快)。\n" -"[ConvexPolygonShape2D]å’Œ[ConcavePolygonShape2D]之间的主è¦åŒºåˆ«åœ¨äºŽï¼Œå‡¹é¢å¤šè¾¹å½¢" -"å‡å®šå…¶ä¸ºå‡¹é¢ï¼Œå¹¶ä½¿ç”¨æ›´å¤æ‚的碰撞检测方法,而凸é¢å¤šè¾¹å½¢åˆ™å°†è‡ªèº«å¼ºåˆ¶å˜ä¸ºå‡¸é¢ï¼Œ" -"ä»¥åŠ å¿«ç¢°æ’žæ£€æµ‹çš„é€Ÿåº¦ã€‚" +"[ConvexPolygonShape2D] å’Œ [ConcavePolygonShape2D] 之间的主è¦åŒºåˆ«åœ¨äºŽï¼Œå‡¹é¢å¤š" +"边形å‡å®šå…¶ä¸ºå‡¹é¢ï¼Œå¹¶ä½¿ç”¨æ›´å¤æ‚的碰撞检测方法,而凸é¢å¤šè¾¹å½¢åˆ™å°†è‡ªèº«å¼ºåˆ¶å˜ä¸ºå‡¸" +"é¢ï¼Œä»¥åŠ å¿«ç¢°æ’žæ£€æµ‹çš„é€Ÿåº¦ã€‚" #: doc/classes/ConvexPolygonShape2D.xml msgid "" @@ -21203,7 +21230,7 @@ msgid "" "points. See [method Geometry.convex_hull_2d] for details." msgstr "" "基于所æä¾›ç‚¹çš„集åˆï¼Œä½¿ç”¨å‡¸åŒ…ç®—æ³•åˆ›å»ºå’Œåˆ†é… [member points]å±žæ€§ã€‚åˆ é™¤æ‰€æœ‰ä¸éœ€" -"è¦çš„点。å‚阅[method Geometry.convex_hull_2d]。" +"è¦çš„点。详情请å‚阅 [method Geometry.convex_hull_2d]。" #: doc/classes/ConvexPolygonShape2D.xml msgid "" @@ -21242,21 +21269,21 @@ msgstr "" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Returns the base value of the parameter specified by [enum Parameter]." -msgstr "返回由[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„基值。" +msgstr "返回由 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„基值。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Returns the [Curve] of the parameter specified by [enum Parameter]." -msgstr "返回由[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„[Curve]。" +msgstr "返回由 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„ [Curve]。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Returns the randomness factor of the parameter specified by [enum Parameter]." -msgstr "返回[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§ç³»æ•°ã€‚" +msgstr "返回由 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§ç³»æ•°ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Returns the enabled state of the given flag (see [enum Flags] for options)." -msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆæœ‰å…³é€‰é¡¹ï¼Œè¯·å‚阅[enum Flags])。" +msgstr "è¿”å›žç»™å®šæ ‡å¿—çš„å¯ç”¨çжæ€ï¼ˆæœ‰å…³é€‰é¡¹ï¼Œè¯·å‚阅 [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Restarts the particle emitter." @@ -21264,20 +21291,20 @@ msgstr "釿–°å¯åŠ¨ç²’åå‘射器。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Sets the base value of the parameter specified by [enum Parameter]." -msgstr "设置[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„基值。" +msgstr "设置 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„基值。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Sets the [Curve] of the parameter specified by [enum Parameter]." -msgstr "设置[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„[Curve]。" +msgstr "设置 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„ [Curve]。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Sets the randomness factor of the parameter specified by [enum Parameter]." -msgstr "设置[enum Parameter]æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§å› å。" +msgstr "设置 [enum Parameter] æŒ‡å®šçš„å‚æ•°çš„éšæœºæ€§å› å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Enables or disables the given flag (see [enum Flags] for options)." -msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(有关选项,请å‚阅[enum Flags])。" +msgstr "å¯ç”¨æˆ–ç¦ç”¨ç»™å®šæ ‡å¿—(有关选项,请å‚阅 [enum Flags])。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml @@ -21288,9 +21315,9 @@ msgid "" "therefore removing all particles that were already emitted before changing " "[member amount]." msgstr "" -"在一个å‘å°„å‘¨æœŸå†…æŽ’æ”¾çš„ç²’åæ•°ï¼ˆå¯¹åº”于[member lifetime])。\n" -"[b]注æ„:[/b]改å˜[member amount]å°†é‡ç½®ç²’åå‘å°„ï¼Œå› æ¤ï¼Œåœ¨æ”¹å˜[member amount]之" -"å‰å·²ç»æŽ’放的所有粒å将被移除。" +"在一个å‘å°„å‘¨æœŸå†…æŽ’æ”¾çš„ç²’åæ•°ï¼ˆå¯¹åº”于 [member lifetime])。\n" +"[b]注æ„:[/b]æ”¹å˜ [member amount] å°†é‡ç½®ç²’åå‘å°„ï¼Œå› æ¤ï¼Œåœ¨æ”¹å˜ [member " +"amount] 之å‰å·²ç»æŽ’放的所有粒å将被移除。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Initial rotation applied to each particle, in degrees." @@ -21298,7 +21325,7 @@ msgstr "应用于æ¯ä¸ªç²’åçš„åˆå§‹æ—‹è½¬ï¼ˆä»¥åº¦ä¸ºå•ä½ï¼‰ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's rotation will be animated along this [Curve]." -msgstr "æ¯ä¸ªç²’å的旋转将沿æ¤[Curve]进行动画处ç†ã€‚" +msgstr "æ¯ä¸ªç²’åçš„æ—‹è½¬å°†æ²¿æ¤ [Curve] 进行动画处ç†ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21313,7 +21340,7 @@ msgstr "应用于æ¯ä¸ªç²’åçš„åˆå§‹è§’速度,å•ä½ä¸º[i]度[/i]æ¯ç§’ã€‚è® #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's angular velocity will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的角速度将沿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’åçš„è§’é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21327,7 +21354,7 @@ msgstr "ç²’å动画åç§»é‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's animation offset will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的动画å移将沿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的动画åç§»å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21341,7 +21368,7 @@ msgstr "ç²’å动画速度。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's animation speed will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的动画速度将沿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’åçš„åŠ¨ç”»é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21380,7 +21407,7 @@ msgstr "ç²’å失去速度的速率。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Damping will vary along this [Curve]." -msgstr "阻尼将沿ç€è¿™æ¡[Gradient]å˜åŒ–。" +msgstr "阻尼将沿ç€è¿™æ¡ [Gradient] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21395,7 +21422,7 @@ msgstr "指定粒åå‘å°„æ–¹å‘çš„å•ä½å‘é‡ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "Particle draw order. Uses [enum DrawOrder] values." -msgstr "ç²’å绘制顺åºã€‚使用[enum DrawOrder]值。" +msgstr "ç²’å绘制顺åºã€‚使用 [enum DrawOrder] 值。" #: doc/classes/CPUParticles.xml msgid "" @@ -21410,65 +21437,65 @@ msgid "" "Sets the [Color]s to modulate particles by when using [constant " "EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." msgstr "" -"设置[Color]以使用[constant EMISSION_SHAPE_POINTS]或[constant " -"EMISSION_SHAPE_DIRECTED_POINTS]æ¥è°ƒåˆ¶ç²’å。" +"设置 [Color] 以使用 [constant EMISSION_SHAPE_POINTS] 或 [constant " +"EMISSION_SHAPE_DIRECTED_POINTS] æ¥è°ƒåˆ¶ç²’å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Sets the direction the particles will be emitted in when using [constant " "EMISSION_SHAPE_DIRECTED_POINTS]." -msgstr "设置使用[constant EMISSION_SHAPE_DIRECTED_POINTS]æ—¶ç²’åå‘射的方å‘。" +msgstr "设置使用 [constant EMISSION_SHAPE_DIRECTED_POINTS] æ—¶ç²’åå‘射的方å‘。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Sets the initial positions to spawn particles when using [constant " "EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." msgstr "" -"设置使用[constant EMISSION_SHAPE_POINTS]或[constant " -"EMISSION_SHAPE_DIRECTED_POINTS]时产生粒åçš„åˆå§‹ä½ç½®ã€‚" +"设置使用 [constant EMISSION_SHAPE_POINTS] 或 [constant " +"EMISSION_SHAPE_DIRECTED_POINTS] 时产生粒åçš„åˆå§‹ä½ç½®ã€‚" #: doc/classes/CPUParticles.xml msgid "" "The axis for the ring shaped emitter when using [constant " "EMISSION_SHAPE_RING]." -msgstr "使用[constant EMISSION_SHAPE_RING]时,环形å‘射器的轴。" +msgstr "使用 [constant EMISSION_SHAPE_RING] 时,环形å‘射器的轴。" #: doc/classes/CPUParticles.xml msgid "" "The height for the ring shaped emitter when using [constant " "EMISSION_SHAPE_RING]." -msgstr "使用[constant EMISSION_SHAPE_RING]时,环形å‘射器的高度。" +msgstr "使用 [constant EMISSION_SHAPE_RING] 时,环形å‘射器的高度。" #: doc/classes/CPUParticles.xml msgid "" "The inner radius for the ring shaped emitter when using [constant " "EMISSION_SHAPE_RING]." -msgstr "使用[constant EMISSION_SHAPE_RING]时,环形å‘射器的内åŠå¾„。" +msgstr "使用 [constant EMISSION_SHAPE_RING] 时,环形å‘射器的内åŠå¾„。" #: doc/classes/CPUParticles.xml msgid "" "The radius for the ring shaped emitter when using [constant " "EMISSION_SHAPE_RING]." -msgstr "使用[constant EMISSION_SHAPE_RING]时,环形å‘射器的åŠå¾„。" +msgstr "使用 [constant EMISSION_SHAPE_RING] 时,环形å‘射器的åŠå¾„。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" "Particles will be emitted inside this region. See [enum EmissionShape] for " "possible values." -msgstr "ç²’å将在æ¤åŒºåŸŸå†…å‘射。有关å¯èƒ½çš„值,请å‚阅[enum EmissionShape]。" +msgstr "ç²’å将在æ¤åŒºåŸŸå†…å‘射。å¯èƒ½çš„å–å€¼è§ [enum EmissionShape]。" #: doc/classes/CPUParticles.xml msgid "" "The sphere's radius if [enum EmissionShape] is set to [constant " "EMISSION_SHAPE_SPHERE]." msgstr "" -"如果[enum EmissionShape]设置为[constant EMISSION_SHAPE_SPHERE],则çƒä½“çš„åŠ" +"如果 [enum EmissionShape] 设置为 [constant EMISSION_SHAPE_SPHERE],则çƒä½“çš„åŠ" "径。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles.xml doc/classes/Particles2D.xml msgid "If [code]true[/code], particles are being emitted." -msgstr "如果[code]true[/code],则æ£åœ¨å‘å°„ç²’å。" +msgstr "如果为 [code]true[/code],则æ£åœ¨å‘å°„ç²’å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles2D.xml @@ -21486,8 +21513,8 @@ msgid "" "the value to 2 will make the particles render at 2 frames per second. Note " "this does not slow down the particle system itself." msgstr "" -"ç²’å系统的帧速率固定为一个值。例如,将值更改为2将使粒å以æ¯ç§’2帧的速度渲染。" -"请注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的速度。" +"ç²’å系统的帧速率固定为一个值。例如,将值更改为 2 将使粒å以æ¯ç§’ 2 帧的速度渲" +"染。请注æ„,这ä¸ä¼šå‡æ…¢ç²’å系统本身的速度。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21516,7 +21543,8 @@ msgid "" "If [code]true[/code], results in fractional delta calculation which has a " "smoother particles display effect." msgstr "" -"如果[code]true[/code],将导致分数增é‡è®¡ç®—ï¼Œè¯¥æ˜¾ç¤ºå…·æœ‰æ›´å¹³æ»‘çš„ç²’åæ˜¾ç¤ºæ•ˆæžœã€‚" +"如果为 [code]true[/code],将导致分数增é‡è®¡ç®—ï¼Œè¯¥æ˜¾ç¤ºå…·æœ‰æ›´å¹³æ»‘çš„ç²’åæ˜¾ç¤ºæ•ˆ" +"果。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21567,7 +21595,7 @@ msgstr "沿è¿åŠ¨æ–¹å‘æ–½åŠ åˆ°æ¯ä¸ªç²’åçš„çº¿æ€§åŠ é€Ÿåº¦ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's linear acceleration will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’åçš„çº¿æ€§åŠ é€Ÿåº¦å°†æ²¿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’åçš„çº¿æ€§åŠ é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21580,14 +21608,14 @@ msgid "" "If [code]true[/code], particles use the parent node's coordinate space. If " "[code]false[/code], they use global coordinates." msgstr "" -"如果[code]true[/code],则粒åå°†ä½¿ç”¨çˆ¶èŠ‚ç‚¹çš„åæ ‡ç©ºé—´ã€‚如果[code]false[/code]," -"åˆ™ä½¿ç”¨å…¨å±€åæ ‡ã€‚" +"如果为 [code]true[/code],则粒åå°†ä½¿ç”¨çˆ¶èŠ‚ç‚¹çš„åæ ‡ç©ºé—´ã€‚如果为 [code]false[/" +"code]ï¼Œåˆ™ä½¿ç”¨å…¨å±€åæ ‡ã€‚" #: doc/classes/CPUParticles.xml msgid "" "The [Mesh] used for each particle. If [code]null[/code], particles will be " "spheres." -msgstr "æ¯ä¸ªç²’å使用的[Mesh]。如果[code]null[/code],则粒å将是çƒå½¢ã€‚" +msgstr "æ¯ä¸ªç²’å使用的 [Mesh]。如果[code]null[/code],则粒å将是çƒå½¢ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/Particles2D.xml @@ -21595,7 +21623,7 @@ msgid "" "If [code]true[/code], only one emission cycle occurs. If set [code]true[/" "code] during a cycle, emission will stop at the cycle's end." msgstr "" -"如果 [code]true[/code],则åªå‘生一个排放周期。如果在周期内设置 [code]true[/" +"如果为 [code]true[/code],则åªå‘生一个排放周期。如果在周期内设置 [code]true[/" "code]ï¼Œåˆ™æŽ’æ”¾å°†åœ¨å‘¨æœŸç»“æŸæ—¶åœæ¢ã€‚" #: doc/classes/CPUParticles.xml @@ -21612,7 +21640,7 @@ msgstr "" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's orbital velocity will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的轨é“速度将沿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的轨é“é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21633,7 +21661,7 @@ msgstr "径å‘åŠ é€Ÿåº¦åº”ç”¨äºŽæ¯ä¸ªç²’å。使粒ååŠ é€Ÿè¿œç¦»åŽŸç‚¹ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's radial acceleration will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的径å‘åŠ é€Ÿåº¦å°†æ²¿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的径å‘åŠ é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21652,7 +21680,7 @@ msgstr "åˆå§‹æ¯”例应用于æ¯ä¸ªç²’å。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's scale will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的比例将éšç€[Curve]çš„å˜åŒ–而å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的比例将éšç€ [Curve] çš„å˜åŒ–而å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21685,7 +21713,7 @@ msgstr "" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Each particle's tangential acceleration will vary along this [Curve]." -msgstr "æ¯ä¸ªç²’å的切å‘åŠ é€Ÿåº¦å°†æ²¿æ¤[Curve]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的切å‘åŠ é€Ÿåº¦å°†æ²¿æ¤ [Curve] å˜åŒ–。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21805,7 +21833,7 @@ msgstr "" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml msgid "Represents the size of the [enum Parameter] enum." -msgstr "表示[enum Parameter]枚举的大å°ã€‚" +msgstr "表示 [enum Parameter] 枚举的大å°ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "Use with [method set_particle_flag] to set [member flag_align_y]." @@ -21823,7 +21851,7 @@ msgstr "用于在 [method set_particle_flag] ä¸è®¾ç½® [member flag_disable_z]〠#: doc/classes/GeometryInstance.xml doc/classes/ParticlesMaterial.xml #: doc/classes/SpatialMaterial.xml msgid "Represents the size of the [enum Flags] enum." -msgstr "表示[enum Flags]枚举的大å°ã€‚" +msgstr "表示 [enum Flags] 枚举的大å°ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml @@ -21844,8 +21872,8 @@ msgid "" "emission_points]. Particle color will be modulated by [member " "emission_colors]." msgstr "" -"ç²’å将在[member emission_points]ä¸éšæœºé€‰æ‹©çš„ä½ç½®å‘射。粒å颜色将通过[member " -"emission_colors]进行调制。" +"ç²’å将在 [member emission_points] ä¸éšæœºé€‰æ‹©çš„ä½ç½®å‘射。粒å颜色将通过 " +"[member emission_colors] 进行调制。" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml msgid "" @@ -21854,9 +21882,9 @@ msgid "" "[member emission_normals]. Particle color will be modulated by [member " "emission_colors]." msgstr "" -"ç²’å将在[member emission_points]ä¸éšæœºé€‰æ‹©çš„ä½ç½®å‘射。粒å的速度和旋转将基于" -"[member emission_normals]进行设置。粒å颜色将通过[member emission_colors]进行" -"调制。" +"ç²’å将在 [member emission_points] ä¸éšæœºé€‰æ‹©çš„ä½ç½®å‘射。粒å的速度和旋转将基" +"于 [member emission_normals] 进行设置。粒å颜色将通过 [member " +"emission_colors] 进行调制。" #: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml msgid "Particles will be emitted in a ring or cylinder." @@ -21865,7 +21893,7 @@ msgstr "ç²’å将以环形或圆柱的形å¼å‘射出æ¥ã€‚" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml msgid "Represents the size of the [enum EmissionShape] enum." -msgstr "表示[enum EmissionShape]枚举的大å°ã€‚" +msgstr "表示 [enum EmissionShape] 枚举的大å°ã€‚" #: doc/classes/CPUParticles2D.xml msgid "CPU-based 2D particle emitter." @@ -21881,7 +21909,7 @@ msgid "" "fly and doesn't need to be configured by the user." msgstr "" "基于 CPU çš„ 2D ç²’å节点,用于创建å„ç§ç²’å系统和效果。\n" -"å‚阅 [Particles2D]ï¼Œå®ƒé€šè¿‡ç¡¬ä»¶åŠ é€Ÿæä¾›ç›¸åŒçš„功能,但å¯èƒ½æ— 法在旧设备上è¿" +"å¦è¯·å‚阅 [Particles2D]ï¼Œå®ƒé€šè¿‡ç¡¬ä»¶åŠ é€Ÿæä¾›ç›¸åŒçš„功能,但å¯èƒ½æ— 法在旧设备上è¿" "行。\n" "[b]注æ„:[/b]其与 [Particles2D] ä¸åŒï¼Œå¯è§æ€§çŸ©å½¢æ˜¯å³æ—¶ç”Ÿæˆçš„,ä¸éœ€è¦ç”¨æˆ·é…" "置。" @@ -21904,7 +21932,7 @@ msgstr "æ¯ä¸ªç²’åçš„åˆå§‹é¢œè‰²ã€‚如果定义了 [member texture],它将ä msgid "" "Each particle's color will vary along this [Gradient] (multiplied with " "[member color])." -msgstr "æ¯ä¸ªç²’å的颜色将éšç€è¿™ä¸ª[Gradient]å˜åŒ–,å³ä¸Ž[member color]相乘。" +msgstr "æ¯ä¸ªç²’å的颜色将éšç€è¿™ä¸ª [Gradient] å˜åŒ–,å³ä¸Ž [member color] 相乘。" #: doc/classes/CPUParticles2D.xml msgid "" @@ -21958,15 +21986,15 @@ msgid "" "Each particle's initial direction range from [code]+spread[/code] to [code]-" "spread[/code] degrees." msgstr "" -"æ¯ä¸ªç²’åçš„åˆå§‹æ–¹å‘范围为[code]+spread[/code] 到 [code]-spread[/code]度。" +"æ¯ä¸ªç²’åçš„åˆå§‹æ–¹å‘范围为 [code]+spread[/code] 到 [code]-spread[/code] 度。" #: doc/classes/CPUParticles2D.xml doc/classes/Particles2D.xml msgid "Particle texture. If [code]null[/code], particles will be squares." -msgstr "ç²’å纹ç†ã€‚如果[code]null[/code],则粒åå°†ä¸ºæ£æ–¹å½¢ã€‚" +msgstr "ç²’å纹ç†ã€‚如果为 [code]null[/code],则粒åå°†ä¸ºæ£æ–¹å½¢ã€‚" #: doc/classes/CPUParticles2D.xml msgid "Present for consistency with 3D particle nodes, not used in 2D." -msgstr "为了与3Dç²’åèŠ‚ç‚¹ä¿æŒä¸€è‡´è€Œå˜åœ¨ï¼Œåœ¨2Dä¸ä¸ä½¿ç”¨ã€‚" +msgstr "为了与 3D ç²’åèŠ‚ç‚¹ä¿æŒä¸€è‡´è€Œå˜åœ¨ï¼Œåœ¨ 2D ä¸ä¸ä½¿ç”¨ã€‚" #: doc/classes/CPUParticles2D.xml msgid "" @@ -22022,9 +22050,9 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] Not available in HTML5 exports." msgstr "" -"Cryptoç±»å…许您访问Godotä¸çš„ä¸€äº›æ›´é«˜çº§çš„åŠ å¯†åŠŸèƒ½ã€‚\n" -"ç›®å‰ï¼Œè¿™åŒ…括生æˆåŠ å¯†å®‰å…¨çš„éšæœºå—节,RSA密钥和自ç¾åX509è¯ä¹¦ç”Ÿæˆï¼Œéžå¯¹ç§°å¯†é’¥åŠ " -"密/解密以åŠç¾å/验è¯ã€‚\n" +"Crypto ç±»å…许您访问 Godot ä¸çš„ä¸€äº›æ›´é«˜çº§çš„åŠ å¯†åŠŸèƒ½ã€‚\n" +"ç›®å‰ï¼Œè¿™åŒ…括生æˆåŠ å¯†å®‰å…¨çš„éšæœºå—节,RSA 密钥和自ç¾å X509 è¯ä¹¦ç”Ÿæˆï¼Œéžå¯¹ç§°å¯†" +"é’¥åŠ å¯†/解密以åŠç¾å/验è¯ã€‚\n" "[codeblock]\n" "extends Node\n" "\n" @@ -22033,30 +22061,30 @@ msgstr "" "var cert = X509Certificate.new()\n" "\n" "func _ready():\n" -" # Generate new RSA key.\n" +" # ç”Ÿæˆæ–°çš„ RSA 密钥。\n" " key = crypto.generate_rsa(4096)\n" -" # Generate new self-signed certificate with the given key.\n" +" # ä½¿ç”¨ç»™å®šçš„å¯†é’¥ç”Ÿæˆæ–°çš„自ç¾åè¯ä¹¦ã€‚\n" " cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," "O=My Game Company,C=IT\")\n" -" # Save key and certificate in the user folder.\n" +" # 将密钥和è¯ä¹¦ä¿å˜åˆ°ç”¨æˆ·æ–‡ä»¶å¤¹ä¸ã€‚\n" " key.save(\"user://generated.key\")\n" " cert.save(\"user://generated.crt\")\n" -" # Encryption\n" +" # åŠ å¯†\n" " var data = \"Some data\"\n" " var encrypted = crypto.encrypt(key, data.to_utf8())\n" -" # Decryption\n" +" # 解密\n" " var decrypted = crypto.decrypt(key, encrypted)\n" -" # Signing\n" +" # ç¾å\n" " var signature = crypto.sign(HashingContext.HASH_SHA256, data." "sha256_buffer(), key)\n" -" # Verifying\n" +" # 验è¯\n" " var verified = crypto.verify(HashingContext.HASH_SHA256, data." "sha256_buffer(), signature, key)\n" -" # Checks\n" +" # 检查\n" " assert(verified)\n" " assert(data.to_utf8() == decrypted)\n" "[/codeblock]\n" -"[b]注æ„:[/b]在HTML5导出ä¸ä¸å¯ç”¨ã€‚" +"[b]注æ„:[/b]在 HTML5 导出ä¸ä¸å¯ç”¨ã€‚" #: doc/classes/Crypto.xml msgid "" @@ -22066,7 +22094,7 @@ msgid "" "string-comparison-with-double-hmac-strategy]this blog post[/url] for more " "information." msgstr "" -"比较两个[PoolByteArray]是å¦ç›¸ç‰ï¼Œè€Œä¸æ³„露时间信æ¯ï¼Œä»¥é˜²æ¢è®¡æ—¶æ”»å‡»ã€‚\n" +"比较两个 [PoolByteArray] 是å¦ç›¸ç‰ï¼Œè€Œä¸æ³„露时间信æ¯ï¼Œä»¥é˜²æ¢è®¡æ—¶æ”»å‡»ã€‚\n" "更多信æ¯å‚阅[url=https://paragonie.com/blog/2015/11/preventing-timing-" "attacks-on-string-comparison-with-double-hmac-strategy]è¿™ç¯‡åšæ–‡[/url]。" @@ -22101,7 +22129,7 @@ msgid "" "Generates an RSA [CryptoKey] that can be used for creating self-signed " "certificates and passed to [method StreamPeerSSL.accept_stream]." msgstr "" -"生æˆå¯ç”¨äºŽåˆ›å»ºè‡ªç¾åè¯ä¹¦å¹¶ä¼ 递给[method StreamPeerSSL.accept_stream]çš„RSA " +"生æˆå¯ç”¨äºŽåˆ›å»ºè‡ªç¾åè¯ä¹¦å¹¶ä¼ 递给 [method StreamPeerSSL.accept_stream] çš„ RSA " "[CryptoKey]。" #: doc/classes/Crypto.xml @@ -22123,17 +22151,18 @@ msgid "" "Game Company,C=IT\")\n" "[/codeblock]" msgstr "" -"æ ¹æ®ç»™å®šçš„[CryptoKey]å’Œ[code]issuer_name[/code]生æˆè‡ªç¾åçš„" -"[X509Certificate]。è¯ä¹¦çš„æœ‰æ•ˆæ€§å°†ç”±[code]not_before[/code]å’Œ[code]not_after[/" -"code](第一个有效日期和最åŽä¸€ä¸ªæœ‰æ•ˆæ—¥æœŸï¼‰å®šä¹‰ã€‚ [code]issuer_name[/code]å¿…é¡»" -"至少包å«â€œ CN =“(通用å称,å³åŸŸå),“ O =â€ï¼ˆç»„ç»‡ï¼Œå³æ‚¨çš„å…¬å¸å称),“ C " -"=“(国家,å³2ä¸ªå—æ¯çš„ISO) -3166组织所在国家/地区的代ç )。\n" -"一个生æˆRSA密钥和X509自ç¾åè¯ä¹¦çš„å°ç¤ºä¾‹ã€‚\n" +"æ ¹æ®ç»™å®šçš„ [CryptoKey] å’Œ [code]issuer_name[/code] 生æˆè‡ªç¾åçš„ " +"[X509Certificate]。è¯ä¹¦çš„æœ‰æ•ˆæ€§å°†ç”± [code]not_before[/code] å’Œ " +"[code]not_after[/code](第一个有效日期和最åŽä¸€ä¸ªæœ‰æ•ˆæ—¥æœŸï¼‰å®šä¹‰ã€‚" +"[code]issuer_name[/code] 必须至少包å«â€œCN=â€ï¼ˆé€šç”¨å称,å³åŸŸå),“O=â€ï¼ˆç»„织," +"峿‚¨çš„å…¬å¸å称),“C=â€ï¼ˆå›½å®¶ï¼Œå³ 2 ä¸ªå—æ¯çš„ ISO-3166 组织所在国家/地区的代" +"ç )。\n" +"ç”Ÿæˆ RSA 密钥和 X509 自ç¾åè¯ä¹¦çš„å°ç¤ºä¾‹ã€‚\n" "[codeblock]\n" "var crypto = Crypto.new()\n" -"# Generate 4096 bits RSA key.\n" +"# ç”Ÿæˆ 4096 比特 RSA 密钥。\n" "var key = crypto.generate_rsa(4096)\n" -"# Generate self-signed certificate using the given key.\n" +"# 使用给定的密钥生æˆè‡ªç¾åè¯ä¹¦ã€‚\n" "var cert = crypto.generate_self_signed_certificate(key, \"CN=example.com,O=A " "Game Company,C=IT\")\n" "[/codeblock]" @@ -22148,7 +22177,7 @@ msgid "" "HashingContext.HASH_SHA1] are supported." msgstr "" "使用 [code]key[/code] ç”Ÿæˆ [code]msg[/code] çš„ [url=https://en.wikipedia.org/" -"wiki/HMAC]HMAC[/url] 摘è¦ã€‚ [code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈希的" +"wiki/HMAC]HMAC[/url] 摘è¦ã€‚[code]hash_type[/code] 傿•°æ˜¯ç”¨äºŽå†…部和外部哈希的" "哈希算法。\n" "ç›®å‰ä»…æ”¯æŒ [constant HashingContext.HASH_SHA256] å’Œ [constant HashingContext." "HASH_SHA1]。" @@ -22158,16 +22187,16 @@ msgid "" "Sign a given [code]hash[/code] of type [code]hash_type[/code] with the " "provided private [code]key[/code]." msgstr "" -"使用æä¾›çš„ç§æœ‰[code]key[/code]对类型为[code]hash_type[/code]的给定的" -"[code]hash[/code]进行ç¾å。" +"使用æä¾›çš„ç§é’¥ [code]key[/code] 对类型为 [code]hash_type[/code] 的给定的 " +"[code]hash[/code] 进行ç¾å。" #: doc/classes/Crypto.xml msgid "" "Verify that a given [code]signature[/code] for [code]hash[/code] of type " "[code]hash_type[/code] against the provided public [code]key[/code]." msgstr "" -"对照æä¾›çš„公共[code]key[/code]验è¯ç±»åž‹ä¸º[code]hash_type[/code]çš„" -"[code]hash_type[/code]的给定[code]ç¾å[/code]。" +"使用æä¾›çš„公钥 [code]key[/code] 验è¯ç±»åž‹ä¸º [code]hash_type[/code] çš„ " +"[code]hash_type[/code] 的给定ç¾å [code]signature[/code]。" #: doc/classes/CryptoKey.xml msgid "A cryptographic key (RSA)." @@ -22192,7 +22221,7 @@ msgid "" "Return [code]true[/code] if this CryptoKey only has the public part, and not " "the private one." msgstr "" -"如果æ¤CryptoKeyä»…å…·æœ‰å…¬å…±éƒ¨åˆ†ï¼Œè€Œæ²¡æœ‰ç§æœ‰éƒ¨åˆ†ï¼Œåˆ™è¿”回 [code]true[/code]。" +"å¦‚æžœæ¤ CryptoKey ä»…å…·æœ‰å…¬å…±éƒ¨åˆ†ï¼Œè€Œæ²¡æœ‰ç§æœ‰éƒ¨åˆ†ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/CryptoKey.xml msgid "" @@ -22201,8 +22230,8 @@ msgid "" "[b]Note:[/b] [code]path[/code] should be a \"*.pub\" file if " "[code]public_only[/code] is [code]true[/code], a \"*.key\" file otherwise." msgstr "" -"从[code]path[/code]åŠ è½½ä¸€ä¸ªå¯†é’¥ã€‚å¦‚æžœ[code]public_only[/code]是[code]true[/" -"code],将åªåŠ è½½å…¬é’¥ã€‚\n" +"从 [code]path[/code] åŠ è½½ä¸€ä¸ªå¯†é’¥ã€‚å¦‚æžœ [code]public_only[/code] 是 " +"[code]true[/code],将åªåŠ è½½å…¬é’¥ã€‚\n" "[b]注æ„:[/b]如果 [code]public_only[/code] 为 [code]true[/code],则 " "[code]path[/code] 应该是一个“*.pubâ€æ–‡ä»¶ï¼Œå¦åˆ™æ˜¯â€œ*.keyâ€æ–‡ä»¶ã€‚" @@ -22211,8 +22240,8 @@ msgid "" "Loads a key from the given [code]string[/code]. If [code]public_only[/code] " "is [code]true[/code], only the public key will be loaded." msgstr "" -"从给定的[code]string[/code]åŠ è½½å¯†é’¥ã€‚å¦‚æžœ[code]public_only[/code]为 " -"[code]true[/code]ï¼Œåˆ™ä»…ä¼šåŠ è½½å…¬å…±å¯†é’¥ã€‚" +"从给定的 [code]string[/code] åŠ è½½å¯†é’¥ã€‚å¦‚æžœ [code]public_only[/code] 为 " +"[code]true[/code]ï¼Œåˆ™ä»…ä¼šåŠ è½½å…¬é’¥ã€‚" #: doc/classes/CryptoKey.xml msgid "" @@ -22223,16 +22252,16 @@ msgid "" msgstr "" "将密钥ä¿å˜åˆ°ç»™å®šçš„ [code]path[/code]。如果 [code]public_only[/code] 为 " "[code]true[/code],则åªä¼šä¿å˜å…¬é’¥ã€‚\n" -"[b]注æ„:[/b]如果[code]public_only[/code]是[code]true[/code],则[code]path[/" -"code]应该是一个\"*.pub\"文件,å¦åˆ™æ˜¯\"*.key\"文件。" +"[b]注æ„:[/b]如果 [code]public_only[/code] 是 [code]true[/code],则 " +"[code]path[/code] 应该是一个“*.pubâ€æ–‡ä»¶ï¼Œå¦åˆ™æ˜¯â€œ*.keyâ€æ–‡ä»¶ã€‚" #: doc/classes/CryptoKey.xml msgid "" "Returns a string containing the key in PEM format. If [code]public_only[/" "code] is [code]true[/code], only the public key will be included." msgstr "" -"返回包å«PEMæ ¼å¼çš„密钥的å—符串。如果[code]public_only[/code]为 [code]true[/" -"code],则仅包å«å…¬å…±å¯†é’¥ã€‚" +"è¿”å›žåŒ…å« PEM æ ¼å¼çš„密钥的å—符串。如果 [code]public_only[/code] 为 " +"[code]true[/code],则仅包å«å…¬é’¥ã€‚" #: modules/csg/doc_classes/CSGBox.xml msgid "A CSG Box shape." @@ -22332,7 +22361,7 @@ msgstr "" msgid "" "If [code]true[/code] a cone is created, the [member radius] will only apply " "to one side." -msgstr "如果创建了[code]true[/code]圆锥,则[member radius]将仅应用于一侧。" +msgstr "如果为 [code]true[/code],则创建圆锥,仅在一侧应用 [member radius]。" #: modules/csg/doc_classes/CSGCylinder.xml msgid "The height of the cylinder." @@ -22358,12 +22387,12 @@ msgid "" "effect making the cylinder seem rounded. If [code]false[/code] the cylinder " "will have a flat shaded look." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™å°†åœ†æŸ±ä½“çš„æ³•çº¿è®¾ç½®ä¸ºå…·æœ‰å¹³æ»‘æ•ˆæžœï¼Œä½¿åœ†æŸ±ä½“çœ‹èµ·æ¥æ˜¯åœ†" -"形的。如果[code]false[/code],则圆柱体将具有平å¦çš„阴影表现。" +"如果为 [code]true[/code],则将圆柱体的法线设置为具有平滑效果,使圆柱体看起æ¥" +"是圆形的。如果为 [code]false[/code],则圆柱体将具有平å¦çš„阴影表现。" #: modules/csg/doc_classes/CSGMesh.xml msgid "A CSG Mesh shape that uses a mesh resource." -msgstr "ä½¿ç”¨ç½‘æ ¼èµ„æºçš„CSGç½‘æ ¼å½¢çŠ¶ã€‚" +msgstr "ä½¿ç”¨ç½‘æ ¼èµ„æºçš„ CSG ç½‘æ ¼å½¢çŠ¶ã€‚" #: modules/csg/doc_classes/CSGMesh.xml msgid "" @@ -22398,14 +22427,14 @@ msgid "" "If a flat shader is required, ensure that all faces' vertex normals are " "parallel." msgstr "" -"用æ¥ä½œä¸ºCSG形状的[Mesh]资æºã€‚\n" -"[b]注æ„:[/b]当使用[ArrayMesh]时,除éžéœ€è¦ä¸€ä¸ªå¹³é¢ç€è‰²å™¨ï¼Œå¦åˆ™è¦é¿å…使用顶点" -"æ³•çº¿çš„ç½‘æ ¼ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼ŒCSGMeshä¼šå¿½ç•¥ç½‘æ ¼çš„é¡¶ç‚¹æ³•çº¿ï¼Œå¹¶ä½¿ç”¨é¢çš„æ³•线计算平整的" -"ç€è‰²å™¨ã€‚如果需è¦ä½¿ç”¨å¹³é¢ç€è‰²å™¨ï¼Œè¯·ç¡®ä¿æ‰€æœ‰é¢çš„顶点法线是平行的。" +"用æ¥ä½œä¸º CSG 形状的 [Mesh] 资æºã€‚\n" +"[b]注æ„:[/b]当使用 [ArrayMesh] 时,除éžéœ€è¦ä¸€ä¸ªå¹³é¢ç€è‰²å™¨ï¼Œå¦åˆ™è¦é¿å…使用顶" +"ç‚¹æ³•çº¿çš„ç½‘æ ¼ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼ŒCSGMesh ä¼šå¿½ç•¥ç½‘æ ¼çš„é¡¶ç‚¹æ³•çº¿ï¼Œå¹¶ä½¿ç”¨é¢çš„æ³•线计算平" +"æ•´çš„ç€è‰²å™¨ã€‚如果需è¦ä½¿ç”¨å¹³é¢ç€è‰²å™¨ï¼Œè¯·ç¡®ä¿æ‰€æœ‰é¢çš„顶点法线是平行的。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "Extrudes a 2D polygon shape to create a 3D mesh." -msgstr "拉伸2D多边形形状以创建3Dç½‘æ ¼ã€‚" +msgstr "拉伸 2D 多边形形状以创建 3D ç½‘æ ¼ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22427,7 +22456,7 @@ msgstr "" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "When [member mode] is [constant MODE_DEPTH], the depth of the extrusion." -msgstr "当[member mode]为[constant MODE_DEPTH]时,挤出的深度。" +msgstr "当 [member mode] 为 [constant MODE_DEPTH] 时,挤出的深度。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22436,9 +22465,9 @@ msgid "" "V around the outline of the [member polygon]), the bottom-left quarter to " "the front end face, and the bottom-right quarter to the back end face." msgstr "" -"用于生æˆçš„ç½‘æ ¼çš„æè´¨ã€‚UVå°†æè´¨çš„上åŠéƒ¨åˆ†æ˜ 射到挤出的形状,å³U沿挤出物的长度," -"V围绕 [member polygon]çš„è½®å»“ï¼Œå·¦ä¸‹è§’çš„å››åˆ†ä¹‹ä¸€æ˜ å°„åˆ°å‰ç«¯é¢ï¼Œå³ä¸‹è§’的四分之一" -"æ˜ å°„åˆ°åŽç«¯é¢ã€‚" +"用于生æˆçš„ç½‘æ ¼çš„æè´¨ã€‚UV å°†æè´¨çš„上åŠéƒ¨åˆ†æ˜ 射到挤出的形状,å³U沿挤出物的长" +"度,V 围绕 [member polygon]çš„è½®å»“ï¼Œå·¦ä¸‹è§’çš„å››åˆ†ä¹‹ä¸€æ˜ å°„åˆ°å‰ç«¯é¢ï¼Œå³ä¸‹è§’的四分" +"ä¹‹ä¸€æ˜ å°„åˆ°åŽç«¯é¢ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "The [member mode] used to extrude the [member polygon]." @@ -22451,15 +22480,16 @@ msgid "" "shape. If [code]false[/code] the top half of the material is repeated every " "step of the extrusion." msgstr "" -"当 [member mode] 为[constant MODE_PATH]时,默认情况下, [member material]的上" -"åŠéƒ¨åˆ†ä¼šæ²¿ç€æŒ¤å‡ºå½¢çŠ¶çš„æ•´ä¸ªé•¿åº¦è¢«æ‹‰ä¼¸ã€‚å¦‚æžœ[code]false[/code],挤出的æ¯ä¸€æ¥éƒ½" -"会é‡å¤æè´¨çš„上åŠéƒ¨åˆ†ã€‚" +"当 [member mode] 为[constant MODE_PATH] 时,默认情况下,[member material] çš„" +"上åŠéƒ¨åˆ†ä¼šæ²¿ç€æŒ¤å‡ºå½¢çŠ¶çš„æ•´ä¸ªé•¿åº¦è¢«æ‹‰ä¼¸ã€‚å¦‚æžœä¸º [code]false[/code],挤出的æ¯ä¸€" +"æ¥éƒ½ä¼šé‡å¤æè´¨çš„上åŠéƒ¨åˆ†ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "When [member mode] is [constant MODE_PATH], the path interval or ratio of " "path points to extrusions." -msgstr "当[member mode] 为[constant MODE_PATH]时,路径间隔或路径点比例挤出。" +msgstr "" +"当 [member mode] 为 [constant MODE_PATH] 时,路径间隔或路径点比例挤出。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22485,8 +22515,8 @@ msgid "" "[Transform] of the [CSGPolygon] is used as the starting point for the " "extrusions, not the [Transform] of the [member path_node]." msgstr "" -"当[member mode]为[constant MODE_PATH]时,如果[code]true[/code],则使用" -"[CSGPolygon]çš„[Transform]ä½œä¸ºæŒ¤å‡ºçš„èµ·ç‚¹ï¼Œè€Œä¸æ˜¯[member path_node]çš„" +"当 [member mode] 为 [constant MODE_PATH] 时,如果为 [code]true[/code],则使" +"用 [CSGPolygon] çš„ [Transform] ä½œä¸ºæŒ¤å‡ºçš„èµ·ç‚¹ï¼Œè€Œä¸æ˜¯ [member path_node] çš„ " "[Transform]。" #: modules/csg/doc_classes/CSGPolygon.xml @@ -22494,8 +22524,8 @@ msgid "" "When [member mode] is [constant MODE_PATH], the location of the [Path] " "object used to extrude the [member polygon]." msgstr "" -"[member mode] 为[constant MODE_PATH]时,用于挤出 [member polygon] çš„ [Path] " -"å¯¹è±¡çš„åæ ‡ã€‚" +"当 [member mode] 为 [constant MODE_PATH] 时,用于挤出 [member polygon] çš„ " +"[Path] å¯¹è±¡çš„åæ ‡ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22519,8 +22549,8 @@ msgid "" "path, in meters, the texture coordinates will tile. When set to 0, texture " "coordinates will match geometry exactly with no tiling." msgstr "" -"当[member mode] 为[constant MODE_PATH] 时,这是纹ç†åæ ‡æ²¿ç€è·¯å¾„çš„è·ç¦»ï¼Œä»¥ç±³ä¸º" -"å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为0时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" +"当 [member mode] 为 [constant MODE_PATH] 时,这是纹ç†åæ ‡æ²¿ç€è·¯å¾„çš„è·ç¦»ï¼Œä»¥ç±³" +"为å•ä½ï¼Œå°†è¿›è¡Œå¹³é“ºã€‚当设置为0时,纹ç†åæ ‡å°†ä¸Žå‡ ä½•å›¾å½¢å®Œå…¨åŒ¹é…,没有平铺。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22539,14 +22569,15 @@ msgstr "" #: modules/csg/doc_classes/CSGPolygon.xml msgid "If [code]true[/code], applies smooth shading to the extrusions." -msgstr "如果[code]true[/code],则对挤出应用平滑ç€è‰²ã€‚" +msgstr "如果为 [code]true[/code],则对挤出应用平滑ç€è‰²ã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "When [member mode] is [constant MODE_SPIN], the total number of degrees the " "[member polygon] is rotated when extruding." msgstr "" -"当[member mode]为[constant MODE_SPIN],[member polygon]在挤出时旋转的总度数。" +"当 [member mode] 为 [constant MODE_SPIN],[member polygon] 在挤出时旋转的总度" +"数。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22560,7 +22591,7 @@ msgstr "[member polygon] 形状沿负 Z 轴挤出。" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" "The [member polygon] shape is extruded by rotating it around the Y axis." -msgstr "[member polygon]形状通过围绕Yè½´æ—‹è½¬æ¥æŒ¤å‡ºã€‚" +msgstr "[member polygon] 形状通过围绕 Y è½´æ—‹è½¬æ¥æŒ¤å‡ºã€‚" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -22638,7 +22669,7 @@ msgstr "åè½¬ç½‘æ ¼çš„é¢ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "The CSG base class." -msgstr "CSG基类。" +msgstr "CSG 基类。" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22667,7 +22698,7 @@ msgid "" "node and the second is the root [Mesh] of this node. Only works when this " "node is the root shape." msgstr "" -"è¿”å›žå¸¦æœ‰ä¸¤ä¸ªå…ƒç´ çš„[Array],第一个是æ¤èŠ‚ç‚¹çš„[Transform],第二个是æ¤èŠ‚ç‚¹çš„æ ¹" +"è¿”å›žå¸¦æœ‰ä¸¤ä¸ªå…ƒç´ çš„ [Array],第一个是æ¤èŠ‚ç‚¹çš„ [Transform],第二个是æ¤èŠ‚ç‚¹çš„æ ¹ " "[Mesh]。仅当æ¤èŠ‚ç‚¹ä¸ºæ ¹å½¢æ—¶æ‰æœ‰æ•ˆã€‚" #: modules/csg/doc_classes/CSGShape.xml @@ -22693,8 +22724,8 @@ msgid "" "Calculate tangents for the CSG shape which allows the use of normal maps. " "This is only applied on the root shape, this setting is ignored on any child." msgstr "" -"计算å…许使用法线贴图的CSGå½¢çŠ¶çš„åˆ‡çº¿ã€‚è¿™ä»…é€‚ç”¨äºŽæ ¹éƒ¨å½¢çŠ¶ï¼Œæ¤è®¾ç½®å°†åœ¨æ‰€æœ‰å级上" -"å‡è¢«å¿½ç•¥ã€‚" +"计算å…许使用法线贴图的 CSG å½¢çŠ¶çš„åˆ‡çº¿ã€‚è¿™ä»…é€‚ç”¨äºŽæ ¹éƒ¨å½¢çŠ¶ï¼Œæ¤è®¾ç½®å°†åœ¨æ‰€æœ‰å级" +"上å‡è¢«å¿½ç•¥ã€‚" #: modules/csg/doc_classes/CSGShape.xml msgid "" @@ -22752,7 +22783,7 @@ msgid "" "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden." msgstr "" -"为我们的CSG形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³ä½¿" +"为我们的 CSG 形状å‘物ç†å¼•æ“Žæ·»åŠ ç¢°æ’žå½¢çŠ¶ã€‚è¿™å°†å§‹ç»ˆåƒä¸€ä¸ªé™æ€ç‰©ä½“。请注æ„,å³ä½¿" "CSG形状本身被éšè—,碰撞形状ä»å¤„于活动状æ€ã€‚" #: modules/csg/doc_classes/CSGShape.xml @@ -22771,7 +22802,7 @@ msgstr "从第一个形状å‡åŽ»ç¬¬äºŒä¸ªå½¢çŠ¶ï¼Œç•™ä¸‹ä¸€ä¸ªå¸¦æœ‰å…¶å½¢çŠ¶çš„ #: modules/csg/doc_classes/CSGSphere.xml msgid "A CSG Sphere shape." -msgstr "CSGçƒå½¢å½¢çŠ¶ã€‚" +msgstr "CSG çƒå½¢å½¢çŠ¶ã€‚" #: modules/csg/doc_classes/CSGSphere.xml msgid "" @@ -22810,12 +22841,12 @@ msgid "" "effect making the sphere seem rounded. If [code]false[/code] the sphere will " "have a flat shaded look." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™å°†åœ†æŸ±ä½“çš„æ³•çº¿è®¾ç½®ä¸ºå…·æœ‰å¹³æ»‘æ•ˆæžœï¼Œä½¿åœ†æŸ±ä½“çœ‹èµ·æ¥æ˜¯åœ†" -"形的。如果[code]false[/code],则圆柱体将具有平å¦çš„阴影表现。" +"如果为 [code]true[/code],则将圆柱体的法线设置为具有平滑效果,使圆柱体看起æ¥" +"是圆形的。如果为 [code]false[/code],则圆柱体将具有平å¦çš„阴影表现。" #: modules/csg/doc_classes/CSGTorus.xml msgid "A CSG Torus shape." -msgstr "CSG圆环形状。" +msgstr "CSG 圆环形状。" #: modules/csg/doc_classes/CSGTorus.xml msgid "" @@ -22859,7 +22890,7 @@ msgid "" "have a flat shaded look." msgstr "" "如果[code]true[/code]设置圆环的法线以æä¾›å¹³æ»‘æ•ˆæžœï¼Œåˆ™ä½¿åœ†çŽ¯çœ‹èµ·æ¥æ˜¯åœ†å½¢çš„。如" -"æžœ[code]false[/code],则圆环将具有平å¦çš„阴影表现。" +"果为 [code]false[/code],则圆环将具有平å¦çš„阴影表现。" #: modules/mono/doc_classes/CSharpScript.xml msgid "" @@ -22921,7 +22952,7 @@ msgstr "" msgid "" "The render flags for the [CubeMap]. See the [enum Flags] constants for " "details." -msgstr "[CubeMap] çš„æ¸²æŸ“æ ‡å¿—ã€‚æœ‰å…³è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 [enum Flags] 常é‡ã€‚" +msgstr "[CubeMap] çš„æ¸²æŸ“æ ‡å¿—ã€‚æœ‰å…³è¯¦ç»†ä¿¡æ¯ï¼Œè¯¦æƒ…请å‚阅 [enum Flags] 常é‡ã€‚" #: doc/classes/CubeMap.xml msgid "" @@ -22933,11 +22964,11 @@ msgstr "" #: doc/classes/CubeMap.xml msgid "The [CubeMap]'s storage mode. See [enum Storage] constants." -msgstr "[CubeMap] çš„å˜å‚¨æ¨¡å¼ã€‚å‚阅 [enum Storage] 常é‡ã€‚" +msgstr "[CubeMap] çš„å˜å‚¨æ¨¡å¼ã€‚è§ [enum Storage] 常é‡ã€‚" #: doc/classes/CubeMap.xml msgid "Store the [CubeMap] without any compression." -msgstr "å˜å‚¨[CubeMap]而ä¸è¿›è¡Œä»»ä½•压缩。" +msgstr "å˜å‚¨ [CubeMap] 而ä¸è¿›è¡Œä»»ä½•压缩。" #: doc/classes/CubeMap.xml msgid "Store the [CubeMap] with strong compression that reduces image quality." @@ -23086,11 +23117,11 @@ msgid "" "This can be used to control autoplacement of building exteriors in an outer " "[RoomGroup]." msgstr "" -"当设置为[code]0[/code]时,[CullInstance]将被自动放置在具有最高优先级的[Room]" -"ä¸ã€‚\n" -"当设置为[code]0[/code]以外的值时,系统将å°è¯•在具有[code]autoplace_priority[/" -"code]çš„[Room]ä¸è‡ªåŠ¨æ”¾ç½®ï¼Œå¦‚æžœå®ƒå˜åœ¨çš„è¯ã€‚\n" -"è¿™å¯ä»¥ç”¨æ¥æŽ§åˆ¶å»ºç‘外é¢çš„在外部[RoomGroup]的自动放置。" +"当设置为 [code]0[/code] 时,[CullInstance] 将被自动放置在具有最高优先级的 " +"[Room] ä¸ã€‚\n" +"当设置为 [code]0[/code] 以外的值时,系统将å°è¯•在具有 " +"[code]autoplace_priority[/code] çš„ [Room] ä¸è‡ªåŠ¨æ”¾ç½®ï¼Œå¦‚æžœå®ƒå˜åœ¨çš„è¯ã€‚\n" +"è¿™å¯ä»¥ç”¨æ¥æŽ§åˆ¶å»ºç‘外é¢çš„在外部 [RoomGroup] 的自动放置。" #: doc/classes/CullInstance.xml msgid "" @@ -23153,7 +23184,7 @@ msgstr "用于在 [Room] [b]之间[/b]移动的实例——例如玩家。" msgid "" "Use for instances that will be frustum culled only - e.g. first person " "weapon, debug." -msgstr "用于åªä¼šè¢«è§†é”¥å‰”除的实例——例如第一人称æ¦å™¨ï¼Œè°ƒè¯•。" +msgstr "用于åªä¼šè¢«è§†é”¥å‰”除的实例——例如第一人称æ¦å™¨ã€è°ƒè¯•。" #: doc/classes/CullInstance.xml msgid "" @@ -23165,7 +23196,7 @@ msgstr "" #: doc/classes/Curve.xml msgid "A mathematic curve." -msgstr "ä¸€æ¡æ•°å¦æ›²çº¿ã€‚" +msgstr "æ•°å¦æ›²çº¿ã€‚" #: doc/classes/Curve.xml msgid "" @@ -23173,8 +23204,8 @@ msgid "" "ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " "points relative to the [code]0.5[/code] Y position." msgstr "" -"å¯ä»¥ä¿å˜å¹¶é‡æ–°ç”¨äºŽå…¶ä»–对象的曲线。默认情况下,它在Y轴上的范围在 [code]0[/" -"code] 到 [code]1[/code]之间,并且ä½ç½®ç‚¹ç›¸å¯¹äºŽ [code]0.5[/code] Y ä½ç½®ã€‚" +"å¯ä»¥ä¿å˜å¹¶é‡æ–°ç”¨äºŽå…¶ä»–对象的曲线。默认情况下,它在 Y 轴上的范围在 [code]0[/" +"code] 到 [code]1[/code] 之间,并且ä½ç½®ç‚¹ç›¸å¯¹äºŽ [code]0.5[/code] Y ä½ç½®ã€‚" #: doc/classes/Curve.xml msgid "" @@ -23184,10 +23215,10 @@ msgid "" "assignments to the [code]*_tangent[/code] angle if [code]*_mode[/code] is " "set to [constant TANGENT_FREE]." msgstr "" -"åœ¨æ›²çº¿ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ã€‚å¯¹äºŽæ¯ä¸€ä¾§ï¼Œå¦‚æžœ[code]*_mode[/code]为[constant " -"TANGENT_LINEAR],则[code]*_tangent[/code]角度(以度为å•ä½ï¼‰å°†ä½¿ç”¨æ›²çº¿åˆ°é‚»è¿‘点" -"的一åŠçš„æ–œçŽ‡ã€‚å¦‚æžœ[code]*_mode[/code]设置为[constant TANGENT_FREE],则å…许自" -"定义分é…ç»™[code]*_tangent[/code]角度。" +"åœ¨æ›²çº¿ä¸Šæ·»åŠ ä¸€ä¸ªç‚¹ã€‚å¯¹äºŽæ¯ä¸€ä¾§ï¼Œå¦‚æžœ [code]*_mode[/code] 为 [constant " +"TANGENT_LINEAR],则 [code]*_tangent[/code] 角度(以度为å•ä½ï¼‰å°†ä½¿ç”¨æ›²çº¿åˆ°é‚»è¿‘" +"点的一åŠçš„æ–œçŽ‡ã€‚å¦‚æžœ [code]*_mode[/code] 设置为 [constant TANGENT_FREE],则å…" +"许自定义分é…ç»™ [code]*_tangent[/code] 的角度。" #: doc/classes/Curve.xml msgid "Recomputes the baked cache of points for the curve." @@ -23237,7 +23268,7 @@ msgstr "返回 [code]index[/code]处的点的左切线角(以度为å•ä½ï¼‰ã€ msgid "" "Returns the Y value for the point that would exist at the X position " "[code]offset[/code] along the curve." -msgstr "返回沿曲线的Xä½ç½®[code]offset[/code]处将å˜åœ¨çš„点的Y值。" +msgstr "返回沿曲线的 X ä½ç½® [code]offset[/code] 处将å˜åœ¨çš„点的 Y 值。" #: doc/classes/Curve.xml msgid "" @@ -23245,19 +23276,20 @@ msgid "" "[code]offset[/code] along the curve using the baked cache. Bakes the curve's " "points if not already baked." msgstr "" -"使用烘焙的缓å˜è¿”回沿曲线的Xä½ç½®[code]offset[/code]处将å˜åœ¨çš„点的Y值。如果尚未" -"烘焙曲线的点,则将其烘焙。" +"使用烘焙的缓å˜è¿”回沿曲线的 X ä½ç½® [code]offset[/code] 处将å˜åœ¨çš„点的 Y 值。如" +"果尚未烘焙曲线的点,则将其烘焙。" #: doc/classes/Curve.xml msgid "Removes the point at [code]index[/code] from the curve." -msgstr "从曲线ä¸åˆ 除[code]index[/code]处的点。" +msgstr "从曲线ä¸åˆ 除 [code]index[/code] 处的点。" #: doc/classes/Curve.xml msgid "" "Sets the left [enum TangentMode] for the point at [code]index[/code] to " "[code]mode[/code]." msgstr "" -"å°†[code]index[/code]处的点的左侧[enum TangentMode]设置为[code]mode[/code]。" +"å°† [code]index[/code] 处的点的左侧 [enum TangentMode] 设置为 [code]mode[/" +"code]。" #: doc/classes/Curve.xml msgid "" @@ -23267,26 +23299,27 @@ msgstr "将点的左切线角度设置为 [code]index[/code] 至 [code]tangent[/ #: doc/classes/Curve.xml msgid "Sets the offset from [code]0.5[/code]." -msgstr "设置相对于[code]0.5[/code]çš„åç§»é‡ã€‚" +msgstr "设置相对于 [code]0.5[/code] çš„åç§»é‡ã€‚" #: doc/classes/Curve.xml msgid "" "Sets the right [enum TangentMode] for the point at [code]index[/code] to " "[code]mode[/code]." msgstr "" -"å°†[code]index[/code]上的点的å³ä¾§[enum TangentMode]设置为[code]mode[/code]。" +"å°† [code]index[/code] 上的点的å³ä¾§ [enum TangentMode] 设置为 [code]mode[/" +"code]。" #: doc/classes/Curve.xml msgid "" "Sets the right tangent angle for the point at [code]index[/code] to " "[code]tangent[/code]." -msgstr "设置[code]index[/code]至[code]tangent[/code]处的点的å³åˆ‡çº¿è§’。" +msgstr "设置 [code]index[/code] 至 [code]tangent[/code] 处的点的å³åˆ‡çº¿è§’。" #: doc/classes/Curve.xml msgid "" "Assigns the vertical position [code]y[/code] to the point at [code]index[/" "code]." -msgstr "将垂直ä½ç½®[code]y[/code]分é…ç»™[code]index[/code]处的点。" +msgstr "将垂直ä½ç½® [code]y[/code] 分é…ç»™ [code]index[/code] 处的点。" #: doc/classes/Curve.xml msgid "The number of points to include in the baked (i.e. cached) curve data." @@ -23357,12 +23390,12 @@ msgid "" "Returns the total length of the curve, based on the cached points. Given " "enough density (see [member bake_interval]), it should be approximate enough." msgstr "" -"æ ¹æ®ç¼“å˜çš„点,返回曲线的总长度。给予足够的密度(å‚阅[member bake_interval])," +"æ ¹æ®ç¼“å˜çš„ç‚¹ï¼Œè¿”å›žæ›²çº¿çš„æ€»é•¿åº¦ã€‚ç»™äºˆè¶³å¤Ÿçš„å¯†åº¦ï¼ˆè§ [member bake_interval])," "它应该是足够近似的。" #: doc/classes/Curve2D.xml msgid "Returns the cache of points as a [PoolVector2Array]." -msgstr "以[PoolVector2Array]的形å¼è¿”回缓å˜çš„点。" +msgstr "以 [PoolVector2Array] 的形å¼è¿”回缓å˜çš„点。" #: doc/classes/Curve2D.xml msgid "" @@ -23483,16 +23516,16 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console. The position is relative to the vertex." msgstr "" -"设置从顶点[code]idx[/code]引出的控制点ä½ç½®ã€‚å¦‚æžœç´¢å¼•è¶…å‡ºèŒƒå›´ï¼Œè¯¥å‡½æ•°ä¼šå‘æŽ§åˆ¶" -"å°å‘é€é”™è¯¯ã€‚ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹çš„。" +"设置从顶点 [code]idx[/code] 引出的控制点ä½ç½®ã€‚å¦‚æžœç´¢å¼•è¶…å‡ºèŒƒå›´ï¼Œè¯¥å‡½æ•°ä¼šå‘æŽ§" +"制å°å‘é€é”™è¯¯ã€‚ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹çš„。" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" "Sets the position for the vertex [code]idx[/code]. If the index is out of " "bounds, the function sends an error to the console." msgstr "" -"设置顶点[code]idx[/code]çš„ä½ç½®ã€‚å¦‚æžœç´¢å¼•è¶…å‡ºèŒƒå›´ï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€ä¸€ä¸ªé”™è¯¯" -"ä¿¡æ¯ã€‚" +"设置顶点 [code]idx[/code] çš„ä½ç½®ã€‚å¦‚æžœç´¢å¼•è¶…å‡ºèŒƒå›´ï¼Œå‡½æ•°ä¼šå‘æŽ§åˆ¶å°å‘é€ä¸€ä¸ªé”™" +"误信æ¯ã€‚" #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "" @@ -23527,9 +23560,9 @@ msgid "" "smaller the distance, the more points in the cache and the more memory it " "will consume, so use with care." msgstr "" -"相邻两个缓å˜ç‚¹ä¹‹é—´çš„è·ç¦»ï¼Œä»¥åƒç´ 为å•ä½ã€‚改å˜å®ƒå°†è¿«ä½¿ç¼“å˜åœ¨ä¸‹æ¬¡è°ƒç”¨[method " -"get_baked_points]或[method get_baked_length]å‡½æ•°æ—¶é‡æ–°è®¡ç®—。è·ç¦»è¶Šå°ï¼Œç¼“å˜ä¸" -"的点越多,å 用的内å˜ä¹Ÿè¶Šå¤šï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" +"相邻两个缓å˜ç‚¹ä¹‹é—´çš„è·ç¦»ï¼Œä»¥åƒç´ 为å•ä½ã€‚改å˜å®ƒå°†è¿«ä½¿ç¼“å˜åœ¨ä¸‹æ¬¡è°ƒç”¨ [method " +"get_baked_points] 或 [method get_baked_length] å‡½æ•°æ—¶é‡æ–°è®¡ç®—。è·ç¦»è¶Šå°ï¼Œç¼“å˜" +"ä¸çš„点越多,å 用的内å˜ä¹Ÿè¶Šå¤šï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" #: doc/classes/Curve3D.xml msgid "Describes a Bézier curve in 3D space." @@ -23709,9 +23742,9 @@ msgid "" "smaller the distance, the more points in the cache and the more memory it " "will consume, so use with care." msgstr "" -"相邻两个缓å˜ç‚¹ä¹‹é—´çš„è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚改å˜å®ƒå°†è¿«ä½¿ç¼“å˜åœ¨ä¸‹æ¬¡è°ƒç”¨[method " -"get_baked_points]或[method get_baked_length]å‡½æ•°æ—¶é‡æ–°è®¡ç®—。è·ç¦»è¶Šå°ï¼Œç¼“å˜ä¸" -"的点越多,å 用的内å˜ä¹Ÿè¶Šå¤šï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" +"相邻两个缓å˜ç‚¹ä¹‹é—´çš„è·ç¦»ï¼Œå•ä½ä¸ºç±³ã€‚改å˜å®ƒå°†è¿«ä½¿ç¼“å˜åœ¨ä¸‹æ¬¡è°ƒç”¨ [method " +"get_baked_points] 或 [method get_baked_length] å‡½æ•°æ—¶é‡æ–°è®¡ç®—。è·ç¦»è¶Šå°ï¼Œç¼“å˜" +"ä¸çš„点越多,å 用的内å˜ä¹Ÿè¶Šå¤šï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" #: doc/classes/Curve3D.xml msgid "" @@ -23719,7 +23752,7 @@ msgid "" "This is used when [member PathFollow.rotation_mode] is set to [constant " "PathFollow.ROTATION_ORIENTED]. Changing it forces the cache to be recomputed." msgstr "" -"如果[code]true[/code],曲线将烘焙出用于定å‘çš„å‘é‡ã€‚当[member PathFollow." +"如果为 [code]true[/code],曲线将烘焙出用于定å‘çš„å‘é‡ã€‚当[member PathFollow." "rotation_mode]被设置为[constant PathFollow.ROTATION_ORIENTED]时,就会使用这个" "功能。改å˜å®ƒå°†å¼ºåˆ¶é‡æ–°è®¡ç®—缓å˜ã€‚" @@ -23731,7 +23764,7 @@ msgstr "显示曲线的纹ç†ã€‚" msgid "" "Renders a given [Curve] provided to it. Simplifies the task of drawing " "curves and/or saving them as image files." -msgstr "渲染æä¾›ç»™å®ƒçš„[Curve]。简化了绘制曲线和/或ä¿å˜ä¸ºå›¾åƒæ–‡ä»¶çš„任务。" +msgstr "渲染æä¾›ç»™å®ƒçš„ [Curve]。简化了绘制曲线和/或ä¿å˜ä¸ºå›¾åƒæ–‡ä»¶çš„任务。" #: doc/classes/CurveTexture.xml msgid "The [Curve] that is rendered onto the texture." @@ -23764,7 +23797,7 @@ msgid "" "Bottom radius of the cylinder. If set to [code]0.0[/code], the bottom faces " "will not be generated, resulting in a conic shape." msgstr "" -"圆柱体的底部åŠå¾„。如果设置为[code]0.0[/code],而ä¸ä¼šç”Ÿæˆåº•é¢ï¼Œä»Žè€Œå½¢æˆåœ†é”¥" +"圆柱体的底部åŠå¾„。如果设置为 [code]0.0[/code],而ä¸ä¼šç”Ÿæˆåº•é¢ï¼Œä»Žè€Œå½¢æˆåœ†é”¥" "体。" #: doc/classes/CylinderMesh.xml @@ -24007,7 +24040,7 @@ msgstr "" " # 这里我们ä¸èƒ½ä½¿ç”¨ç‚¹ï¼Œå› 为‘my_color’是个å˜é‡ã€‚\n" " var points = points_dir[my_color]\n" "[/codeblock]\n" -"在上方的代ç ä¸ï¼Œ[code]points[/code] 会被赋值为 [code]my_color[/code]ä¸é€‰å–çš„" +"在上é¢çš„代ç ä¸ï¼Œ[code]points[/code] 会被赋值为 [code]my_color[/code] ä¸é€‰å–çš„" "颜色。\n" "å—å…¸å¯ä»¥å®¹çº³æ›´åР夿‚的数æ®ï¼š\n" "[codeblock]\n" @@ -24016,13 +24049,13 @@ msgstr "" "如果想è¦ç»™å—å…¸æ·»åŠ ä¸€ä¸ªé”®ï¼Œå¯ä»¥åƒè®¿é—®å·²æœ‰çš„é”®ä¸€æ ·ï¼š\n" "[codeblock]\n" "var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" -"points_dir[\"Blue\"] = 150 # æ·»åŠ é”®\"Blue\",并将其数值设定为150\n" +"points_dir[\"Blue\"] = 150 # æ·»åŠ é”® \"Blue\",并将其数值设定为 150\n" "[/codeblock]\n" "最终,åŒä¸€ä¸ªå—典内å¯ä»¥å®¹çº³ä¸åŒç±»åž‹çš„键和值:\n" "[codeblock]\n" "# è¿™æ˜¯ä¸€ä¸ªåˆæ³•çš„å—典。\n" -"# 使用`my_dir.sub_dir.sub_key`或`my_dir[\"sub_dir\"][\"sub_key\"]`æ¥è®¿é—®ä¸‹æ–¹" -"çš„å—符串\"Nested value\"。\n" +"# 使用 `my_dir.sub_dir.sub_key` 或 `my_dir[\"sub_dir\"][\"sub_key\"]` æ¥è®¿é—®" +"下方的å—符串 \"Nested value\"。\n" "# æ ¹æ®ä½ ä¸åŒçš„需求å¯ä»¥ä¿®æ”¹ç´¢å¼•æ ·å¼ã€‚\n" "var my_dir = {\n" " \"String Key\": 5,\n" @@ -24037,13 +24070,13 @@ msgstr "" "array2 = [1, 2, 3]\n" "\n" "func compare_arrays():\n" -" print(array1 == array2) # 会输出true。\n" +" print(array1 == array2) # 会输出 true。\n" "\n" "dir1 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" "dir2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" "\n" "func compare_dictionaries():\n" -" print(dir1 == dir2) # ä¸ä¼šè¾“出true。\n" +" print(dir1 == dir2) # ä¸ä¼šè¾“出 true。\n" "[/codeblock]\n" "想è¦å¯¹æ¯”å—典,首先需è¦ç”¨ [method hash] 计算å—典哈希。\n" "[codeblock]\n" @@ -24051,11 +24084,11 @@ msgstr "" "dir2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" "\n" "func compare_dictionaries():\n" -" print(dir1.hash() == dir2.hash()) # 会输出true。\n" +" print(dir1.hash() == dir2.hash()) # 会输出 true。\n" "[/codeblock]\n" "[b]注æ„:[/b]当使用 [code]const[/code] æ¥å£°æ˜Žå—典时,å—典本身ä¾ç„¶å¯ä»¥é€šè¿‡å®šä¹‰" -"键的数值æ¥è¿›è¡Œä¿®æ”¹ã€‚使用 [code]const[/code] åªèƒ½é˜²æ¢åœ¨å®ƒåˆå§‹åŒ–完æˆåŽè¢«ç»™äºˆå¦" -"一个数值。" +"键的数值æ¥è¿›è¡Œä¿®æ”¹ã€‚使用 [code]const[/code] åªèƒ½é˜²æ¢åœ¨å¸¸é‡åœ¨åˆå§‹åŒ–完æˆåŽè¢«èµ‹" +"为其他值。" #: doc/classes/Dictionary.xml msgid "GDScript basics: Dictionary" @@ -24113,7 +24146,7 @@ msgid "" "code]." msgstr "" "如果å—典有一个给定的键,返回 [code]true[/code]。\n" -"[b]注æ„:[/b]这相当于使用 [code]in[/code] è¿ç®—符,如下所示:\n" +"[b]注æ„:[/b]相当于使用 [code]in[/code] è¿ç®—符,如下所示:\n" "[codeblock]\n" "# 估值为 `true`。\n" "if \"godot\" in {\"godot\": \"engine\"}:\n" @@ -24160,7 +24193,7 @@ msgstr "" #: doc/classes/Dictionary.xml msgid "Returns the list of keys in the [Dictionary]." -msgstr "返回[Dictionary]ä¸çš„键列表。" +msgstr "返回 [Dictionary] ä¸çš„键列表。" #: doc/classes/Dictionary.xml msgid "" @@ -24177,7 +24210,7 @@ msgstr "返回å—å…¸ä¸é”®çš„æ•°é‡ã€‚" #: doc/classes/Dictionary.xml msgid "Returns the list of values in the [Dictionary]." -msgstr "返回[Dictionary]ä¸çš„值列表。" +msgstr "返回 [Dictionary] ä¸çš„值列表。" #: doc/classes/DirectionalLight.xml msgid "Directional light from a distance, as from the Sun." @@ -24208,13 +24241,13 @@ msgid "" "If [code]true[/code], shadow detail is sacrificed in exchange for smoother " "transitions between splits." msgstr "" -"如果[code]true[/code],则会牺牲阴影细节,以æ¢å–更平滑的分割之间的过渡。" +"如果为 [code]true[/code],则会牺牲阴影细节,以æ¢å–更平滑的分割之间的过渡。" #: doc/classes/DirectionalLight.xml msgid "" "Optimizes shadow rendering for detail versus movement. See [enum " "ShadowDepthRange]." -msgstr "优化阴影渲染的细节与è¿åŠ¨ã€‚å‚阅[enum ShadowDepthRange]。" +msgstr "优化阴影渲染的细节与è¿åŠ¨ã€‚è§ [enum ShadowDepthRange]。" #: doc/classes/DirectionalLight.xml msgid "The maximum distance for shadow splits." @@ -24222,7 +24255,7 @@ msgstr "阴影分割的最大è·ç¦»ã€‚" #: doc/classes/DirectionalLight.xml msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." -msgstr "ç¯å…‰çš„阴影渲染算法。å‚阅[enum ShadowMode]。" +msgstr "ç¯å…‰çš„é˜´å½±æ¸²æŸ“ç®—æ³•ã€‚è§ [enum ShadowMode]。" #: doc/classes/DirectionalLight.xml msgid "" @@ -24368,10 +24401,10 @@ msgid "" "code] or [code]res://somedir/newdir[/code]).\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"将当剿‰“å¼€çš„ç›®å½•æ”¹ä¸ºå‚æ•°ä¼ é€’çš„ç›®å½•ã€‚å‚æ•°å¯ä»¥æ˜¯ç›¸å¯¹äºŽå½“å‰ç›®å½•çš„(例如 " -"[code]newdir[/code] 或 [code].../newdir[/code]),也å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„(例如 " -"[code]/tmp/newdir[/code] 或 [code]res://somedir/newdir[/code])。\n" -"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ ([code]OK[/code] æˆåŠŸæ—¶)。" +"将当剿‰“å¼€çš„ç›®å½•æ”¹ä¸ºå‚æ•°ä¼ é€’çš„ç›®å½•ã€‚å‚æ•°å¯ä»¥æ˜¯ç›¸å¯¹äºŽå½“å‰ç›®å½•的(例如 " +"[code]newdir[/code] 或 [code].../newdir[/code]),也å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„(例如 " +"[code]/tmp/newdir[/code] 或 [code]res://somedir/newdir[/code])。\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆ[code]OK[/code] æˆåŠŸæ—¶ï¼‰ã€‚" #: doc/classes/Directory.xml msgid "" @@ -24383,7 +24416,7 @@ msgid "" msgstr "" "å°† [code]from[/code] 文件å¤åˆ¶åˆ° [code]to[/code] ç›®æ ‡ä½ç½®ã€‚ä¸¤ä¸ªå‚æ•°éƒ½åº”该是相" "对或ç»å¯¹æ–‡ä»¶çš„è·¯å¾„ã€‚å¦‚æžœç›®æ ‡æ–‡ä»¶å˜åœ¨ä¸”æ²¡æœ‰è®¿é—®ä¿æŠ¤ï¼Œåˆ™ä¼šè¢«è¦†ç›–ã€‚\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€(æˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/Directory.xml msgid "" @@ -24500,8 +24533,8 @@ msgid "" "Closes the current stream opened with [method list_dir_begin] (whether it " "has been fully processed with [method get_next] does not matter)." msgstr "" -"å…³é—用[method list_dir_begin]æ‰“å¼€çš„å½“å‰æµï¼Œå¹¶ä¸å…³æ³¨æ˜¯å¦å·²ç»ç”¨[method " -"get_next]完æˆå¤„ç†ã€‚" +"å…³é—用 [method list_dir_begin] æ‰“å¼€çš„å½“å‰æµï¼Œå¹¶ä¸å…³æ³¨æ˜¯å¦å·²ç»ç”¨ [method " +"get_next] 完æˆå¤„ç†ã€‚" #: doc/classes/Directory.xml msgid "" @@ -24525,7 +24558,7 @@ msgid "" msgstr "" "通过递归调用 [method make_dir]æ–¹æ³•ï¼Œåˆ›å»ºä¸€ä¸ªç›®æ ‡ç›®å½•å’Œå…¶è·¯å¾„ä¸æ‰€æœ‰å¿…è¦çš„ä¸é—´" "ç›®å½•ã€‚å‚æ•°å¯ä»¥æ˜¯ç›¸å¯¹äºŽå½“å‰ç›®å½•的,也å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„。\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€(æˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/Directory.xml msgid "" @@ -24535,11 +24568,11 @@ msgid "" "filesystem (e.g. [code]/tmp/folder[/code] or [code]C:\\tmp\\folder[/code]).\n" "Returns one of the [enum Error] code constants ([code]OK[/code] on success)." msgstr "" -"打开文件系统的现有目录。 [code]path[/code]傿•°å¯ä»¥ä½äºŽé¡¹ç›®æ ‘([code]res:// " -"folder[/code]),用户目录([code]user:// folder[/code])或以下ä½ç½®çš„ç»å¯¹è·¯å¾„" -"内:用户文件系统(例如[code]/ tmp / folder[/code]或[code]C:\\ tmp \\ " -"folder[/code])。\n" -"返回[enum Error]代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" +"打开文件系统的现有目录。[code]path[/code] 傿•°å¯ä»¥ä½äºŽé¡¹ç›®æ ‘([code]res:// " +"folder[/code]),用户目录([code]user:// folder[/code])或以下ä½ç½®çš„ç»å¯¹è·¯å¾„" +"内:用户文件系统(例如 [code]/tmp/folder[/code] 或 [code]C:\\tmp\\folder[/" +"code])。\n" +"返回 [enum Error] 代ç 常é‡ä¹‹ä¸€ï¼ˆæˆåŠŸæ—¶è¿”å›ž [code]OK[/code])。" #: doc/classes/Directory.xml msgid "" @@ -24570,7 +24603,7 @@ msgstr "" #: doc/classes/DTLSServer.xml msgid "Helper class to implement a DTLS server." -msgstr "实现DTLSæœåŠ¡å™¨çš„è¾…åŠ©ç±»ã€‚" +msgstr "实现 DTLS æœåŠ¡å™¨çš„è¾…åŠ©ç±»ã€‚" #: doc/classes/DTLSServer.xml msgid "" @@ -24786,7 +24819,7 @@ msgstr "" #: doc/classes/DynamicFont.xml msgid "Returns the fallback font at index [code]idx[/code]." -msgstr "返回ä½äºŽç´¢å¼•[code]idx[/code]处的åŽå¤‡å—体。" +msgstr "返回ä½äºŽç´¢å¼• [code]idx[/code] 处的åŽå¤‡å—体。" #: doc/classes/DynamicFont.xml msgid "Returns the number of fallback fonts." @@ -24795,7 +24828,7 @@ msgstr "返回åŽå¤‡å—体的数é‡ã€‚" #: doc/classes/DynamicFont.xml msgid "" "Returns the spacing for the given [code]type[/code] (see [enum SpacingType])." -msgstr "返回给定[code]type[/code]的间è·(å‚阅[enum SpacingType])。" +msgstr "返回给定 [code]type[/code] 的间è·ï¼ˆè§ [enum SpacingType])。" #: doc/classes/DynamicFont.xml msgid "Removes the fallback font at index [code]idx[/code]." @@ -24810,8 +24843,8 @@ msgid "" "Sets the spacing for [code]type[/code] (see [enum SpacingType]) to " "[code]value[/code] in pixels (not relative to the font size)." msgstr "" -"ç»™[code]type[/code]设置间è·(å‚阅[enum SpacingType])为[code]value[/code],å•ä½" -"为åƒç´ (与å—体大尿— å…³)。" +"ç»™ [code]type[/code] 设置间è·ï¼ˆè§ [enum SpacingType])为 [code]value[/code]," +"å•ä½ä¸ºåƒç´ (与å—体大尿— 关)。" #: doc/classes/DynamicFont.xml msgid "Extra spacing at the bottom in pixels." @@ -24832,7 +24865,7 @@ msgid "" "extra_spacing_char]) in pixels.\n" "This can be a negative number to make the distance between words smaller." msgstr "" -"ç©ºæ ¼å—符的é¢å¤–é—´è·ï¼Œå•使˜¯åƒç´ ,除了[member extra_spacing_char]。\n" +"ç©ºæ ¼å—符(在 [member extra_spacing_char] 之外)的é¢å¤–é—´è·ï¼Œå•ä½ä¸ºåƒç´ 。\n" "è¿™å¯ä»¥æ˜¯è´Ÿæ•°ï¼Œä½¿å—符之间的è·ç¦»æ›´å°ã€‚" #: doc/classes/DynamicFont.xml @@ -25267,7 +25300,7 @@ msgstr "å¯¼å…¥æ‰©å±•é¢æ¿ã€‚如果ç¦ç”¨æ¤åŠŸèƒ½ï¼Œåˆ™å¯¼å…¥æ‰©å±•é¢æ¿å°†ä¸ #: doc/classes/EditorFeatureProfile.xml doc/classes/SpatialMaterial.xml msgid "Represents the size of the [enum Feature] enum." -msgstr "表示[enum Feature]枚举的大å°ã€‚" +msgstr "表示 [enum Feature] 枚举的大å°ã€‚" #: doc/classes/EditorFileDialog.xml msgid "A modified version of [FileDialog] used by the editor." @@ -25305,15 +25338,15 @@ msgid "" "Notify the [EditorFileDialog] that its view of the data is no longer " "accurate. Updates the view contents on next view update." msgstr "" -"通知[EditorFileDialog]它的数æ®è§†å›¾ä¸å†å‡†ç¡®ã€‚在下次视图更新时更新视图内容。" +"通知 [EditorFileDialog] 它的数æ®è§†å›¾ä¸å†å‡†ç¡®ã€‚在下次视图更新时更新视图内容。" #: doc/classes/EditorFileDialog.xml msgid "" "The location from which the user may select a file, including [code]res://[/" "code], [code]user://[/code], and the local file system." msgstr "" -"用户å¯ä»¥é€‰æ‹©æ–‡ä»¶çš„ä½ç½®ï¼ŒåŒ…括[code]res://[/code]ã€[code]user://[/code]和本地文" -"件系统。" +"用户å¯ä»¥é€‰æ‹©æ–‡ä»¶çš„ä½ç½®ï¼ŒåŒ…括 [code]res://[/code]ã€[code]user://[/code] 和本地" +"文件系统。" #: doc/classes/EditorFileDialog.xml msgid "The currently occupied directory." @@ -25332,13 +25365,13 @@ msgid "" "If [code]true[/code], the [EditorFileDialog] will not warn the user before " "overwriting files." msgstr "" -"如果[code]true[/code],[EditorFileDialog]å°†ä¸ä¼šåœ¨è¦†ç›–文件之å‰è¦å‘Šç”¨æˆ·ã€‚" +"如果为 [code]true[/code],[EditorFileDialog] å°†ä¸ä¼šåœ¨è¦†ç›–文件之å‰è¦å‘Šç”¨æˆ·ã€‚" #: doc/classes/EditorFileDialog.xml msgid "" "The view format in which the [EditorFileDialog] displays resources to the " "user." -msgstr "[EditorFileDialog]å‘用户显示资æºçš„è§†å›¾æ ¼å¼ã€‚" +msgstr "[EditorFileDialog] å‘用户显示资æºçš„è§†å›¾æ ¼å¼ã€‚" #: doc/classes/EditorFileDialog.xml msgid "" @@ -25349,7 +25382,8 @@ msgstr "[EditorFileDialog] 的用途,它定义了å…许的行为。" msgid "" "If [code]true[/code], hidden files and directories will be visible in the " "[EditorFileDialog]." -msgstr "如果[code]true[/code],éšè—的文件和目录将在[EditorFileDialog]ä¸å¯è§ã€‚" +msgstr "" +"如果为 [code]true[/code],éšè—的文件和目录将在 [EditorFileDialog] ä¸å¯è§ã€‚" #: doc/classes/EditorFileDialog.xml msgid "Emitted when a directory is selected." @@ -25439,8 +25473,9 @@ msgid "" "string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/code], " "[i]not[/i] a file extension such as [code]\".gd\"[/code]." msgstr "" -"返回文件的资æºç±»åž‹ï¼Œç»™å®šå®Œæ•´è·¯å¾„。这将返回å—符串,如[code]\"Resource\"[/code]" -"或[code]\"GDScript\"[/code],[i]䏿˜¯[/i]文件扩展å,如[code]\".gd\"[/code]。" +"返回文件的资æºç±»åž‹ï¼Œç»™å®šå®Œæ•´è·¯å¾„。这将返回å—符串,如 [code]\"Resource\"[/" +"code] 或 [code]\"GDScript\"[/code],[i]䏿˜¯[/i]文件扩展å,如 [code]\".gd\"[/" +"code]。" #: doc/classes/EditorFileSystem.xml msgid "Gets the root directory object." @@ -25452,7 +25487,7 @@ msgstr "返回在 [code]path[/code] 文件系统的视图。" #: doc/classes/EditorFileSystem.xml msgid "Returns the scan progress for 0 to 1 if the FS is being scanned." -msgstr "如果文件系统æ£åœ¨è¢«æ‰«æï¼Œè¿”回扫æçš„进度,值为0-1。" +msgstr "如果文件系统æ£åœ¨è¢«æ‰«æï¼Œè¿”回扫æçš„进度,值为 0-1。" #: doc/classes/EditorFileSystem.xml msgid "Returns [code]true[/code] if the filesystem is being scanned." @@ -25470,7 +25505,7 @@ msgstr "æ£€æŸ¥æ˜¯å¦æ›´æ”¹äº†å·²å¯¼å…¥èµ„æºçš„æ¥æºã€‚" msgid "" "Update a file information. Call this if an external program (not Godot) " "modified the file." -msgstr "更新文件信æ¯ã€‚如果外部程åº(䏿˜¯Godot)修改了该文件,则调用æ¤å‡½æ•°ã€‚" +msgstr "更新文件信æ¯ã€‚如果外部程åºï¼ˆä¸æ˜¯ Godot)修改了该文件,则调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorFileSystem.xml msgid "Scans the script files and updates the list of custom class names." @@ -25534,7 +25569,7 @@ msgstr "" #: doc/classes/EditorFileSystemDirectory.xml msgid "Returns the path to the file at index [code]idx[/code]." -msgstr "返回索引为[code]idx[/code] 文件的路径。" +msgstr "返回索引为 [code]idx[/code] 文件的路径。" #: doc/classes/EditorFileSystemDirectory.xml msgid "" @@ -25542,9 +25577,8 @@ msgid "" "[code]idx[/code]. If the file doesn't define a script class using the " "[code]class_name[/code] syntax, this will return an empty string." msgstr "" -"返回这个文件ä¸è„šæœ¬ç±»ï¼ˆscript class)在索引处[code]idx[/code]定义的基类(base " -"class)。如果这个文件没有使用 [code]class_name[/code] 关键å—定义脚本类,将返回" -"一个空å—符串。" +"返回这个文件ä¸è„šæœ¬ç±»åœ¨ç´¢å¼• [code]idx[/code] 处定义的基类。如果这个文件没有使" +"用 [code]class_name[/code] 关键å—定义脚本类,将返回一个空å—符串。" #: doc/classes/EditorFileSystemDirectory.xml msgid "" @@ -25561,9 +25595,9 @@ msgid "" "returns a string such as [code]\"Resource\"[/code] or [code]\"GDScript\"[/" "code], [i]not[/i] a file extension such as [code]\".gd\"[/code]." msgstr "" -"返回索引[code]idx[/code]处文件的资æºç±»åž‹ã€‚这将返回å—符串,如" -"[code]\"Resource\"[/code]或[code]\"GDScript\"[/code],[i]䏿˜¯[/i]文件扩展å," -"如[code]\".gd\"[/code]。" +"返回索引 [code]idx[/code] 处文件的资æºç±»åž‹ã€‚这将返回å—符串,如 " +"[code]\"Resource\"[/code] 或 [code]\"GDScript\"[/code],[i]䏿˜¯[/i]文件扩展" +"å,如 [code]\".gd\"[/code]。" #: doc/classes/EditorFileSystemDirectory.xml msgid "Returns the name of this directory." @@ -25755,8 +25789,7 @@ msgstr "" "其他选项的选项,如果其ä¸ä¸€ä¸ªé€‰é¡¹è¢«ç¦ç”¨ã€‚例如:\n" "[codeblock]\n" "func get_option_visibility(option, options):\n" -" # Only show the lossy quality setting if the compression mode is set to " -"\"Lossy\".\n" +" # åªæœ‰åœ¨åŽ‹ç¼©æ¨¡å¼ä¸ºâ€œLossyâ€æ—¶æ˜¾ç¤º Lossy Quality 设置。\n" " if option == \"compress/lossy_quality\" and options.has(\"compress/" "mode\"):\n" " return int(options[\"compress/mode\"]) == COMPRESS_LOSSY\n" @@ -25771,8 +25804,8 @@ msgid "" "get_import_options] to get the default options for the preset and [method " "get_preset_name] to get the name of the preset." msgstr "" -"èŽ·å–æ’件定义的åˆå§‹é¢„置数é‡ã€‚使用[method get_import_options]获å–预设的默认选" -"项,使用[method get_preset_name]获å–预设的å称。" +"èŽ·å–æ’件定义的åˆå§‹é¢„置数é‡ã€‚使用 [method get_import_options] 获å–预设的默认选" +"项,使用 [method get_preset_name] 获å–预设的å称。" #: doc/classes/EditorImportPlugin.xml msgid "Gets the name of the options preset at this index." @@ -25783,7 +25816,7 @@ msgid "" "Gets the priority of this plugin for the recognized extension. Higher " "priority plugins will be preferred. The default priority is [code]1.0[/code]." msgstr "" -"获å–该æ’件对识别的扩展的优先级。优先级越高的æ’件会被优先选择。默认的优先级是" +"获å–该æ’件对识别的扩展的优先级。优先级越高的æ’件会被优先选择。默认的优先级是 " "[code]1.0[/code]。" #: doc/classes/EditorImportPlugin.xml @@ -25799,7 +25832,7 @@ msgid "" "Gets the Godot resource type associated with this loader. e.g. " "[code]\"Mesh\"[/code] or [code]\"Animation\"[/code]." msgstr "" -"获å–与æ¤åŠ è½½ç¨‹åºå…³è”çš„Godot资æºç±»åž‹ï¼Œä¾‹å¦‚ [code]\"Mesh\"[/code] 或 " +"获å–与æ¤åŠ è½½ç¨‹åºå…³è”çš„ Godot 资æºç±»åž‹ï¼Œä¾‹å¦‚ [code]\"Mesh\"[/code] 或 " "[code]\"Animation\"[/code]。" #: doc/classes/EditorImportPlugin.xml @@ -25808,8 +25841,8 @@ msgid "" "directory (see [member ProjectSettings.application/config/" "use_hidden_project_data_directory])." msgstr "" -"获å–用于在[code].import[/code]目录ä¸ä¿å˜æ¤èµ„æºçš„æ‰©å±•å,å‚阅[member " -"ProjectSettings.application/config/use_hidden_project_data_directory]。" +"获å–用于在 [code].import[/code] 目录ä¸ä¿å˜æ¤èµ„æºçš„æ‰©å±•åï¼ˆè§ [member " +"ProjectSettings.application/config/use_hidden_project_data_directory])。" #: doc/classes/EditorImportPlugin.xml msgid "" @@ -25928,8 +25961,9 @@ msgid "" "inspector, this signal is never emitted by the editor itself." msgstr "" "在检查器ä¸åˆ‡æ¢å¸ƒå°”属性时å‘出。\n" -"[b]注æ„:[/b]如果å¯ç”¨äº†å†…部[code]autoclear[/code]å±žæ€§ï¼Œåˆ™è¯¥ä¿¡å·æ°¸è¿œä¸ä¼šè§¦å‘。" -"由于该属性在编辑器检查器ä¸å§‹ç»ˆå¤„于å¯ç”¨çжæ€ï¼Œå› æ¤ç¼–辑器本身ç»ä¸ä¼šå‘出该信å·ã€‚" +"[b]注æ„:[/b]如果å¯ç”¨äº†å†…部 [code]autoclear[/code] å±žæ€§ï¼Œåˆ™è¯¥ä¿¡å·æ°¸è¿œä¸ä¼šè§¦" +"å‘。由于该属性在编辑器检查器ä¸å§‹ç»ˆå¤„于å¯ç”¨çжæ€ï¼Œå› æ¤ç¼–辑器本身ç»ä¸ä¼šå‘出该信" +"å·ã€‚" #: doc/classes/EditorInspector.xml msgid "Emitted when a resource is selected in the inspector." @@ -25987,14 +26021,15 @@ msgid "" "Adds a property editor for an individual property. The [code]editor[/code] " "control must extend [EditorProperty]." msgstr "" -"为å•ç‹¬çš„å±žæ€§æ·»åŠ å±žæ€§ç¼–è¾‘å™¨ã€‚[code]editor[/code]控件必须扩展[EditorProperty]。" +"为å•ç‹¬çš„å±žæ€§æ·»åŠ å±žæ€§ç¼–è¾‘å™¨ã€‚[code]editor[/code] 控件必须扩展 " +"[EditorProperty]。" #: doc/classes/EditorInspectorPlugin.xml msgid "" "Adds an editor that allows modifying multiple properties. The [code]editor[/" "code] control must extend [EditorProperty]." msgstr "" -"æ·»åŠ ä¸€ä¸ªç¼–è¾‘å™¨ï¼Œå…许修改多个属性。[code]editor[/code]控件必须扩展" +"æ·»åŠ ä¸€ä¸ªç¼–è¾‘å™¨ï¼Œå…许修改多个属性。[code]editor[/code] 控件必须扩展 " "[EditorProperty]。" #: doc/classes/EditorInspectorPlugin.xml @@ -26141,7 +26176,7 @@ msgstr "" #: doc/classes/EditorInterface.xml msgid "Returns an [Array] with the file paths of the currently opened scenes." -msgstr "返回包å«å½“剿‰“开的场景的文件路径的数组[Array]。" +msgstr "返回包å«å½“剿‰“开的场景的文件路径的数组 [Array]。" #: doc/classes/EditorInterface.xml msgid "" @@ -26151,11 +26186,11 @@ msgstr "返回æ£åœ¨æ’放的场景åç§°ã€‚å¦‚æžœå½“å‰æ²¡æœ‰åœºæ™¯æ£åœ¨æ’放 #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorFileSystem] instance." -msgstr "返回编辑器的[EditorFileSystem]实例。" +msgstr "返回编辑器的 [EditorFileSystem] 实例。" #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorResourcePreview] instance." -msgstr "返回编辑器的[EditorResourcePreview]实例。" +msgstr "返回编辑器的 [EditorResourcePreview] 实例。" #: doc/classes/EditorInterface.xml msgid "" @@ -26172,13 +26207,13 @@ msgid "" "[FileSystemDock]. If a file is selected, its base directory will be returned " "using [method String.get_base_dir] instead." msgstr "" -"返回当å‰åœ¨[FileSystemDock]ä¸é€‰æ‹©çš„目录的路径,如果选择了一个文件,将使用" -"[method String.get_base_dir]返回其基本目录。如果选择了一个文件,将使用" -"[method String.get_base_dir]返回它的基本目录。" +"返回当å‰åœ¨ [FileSystemDock] ä¸é€‰æ‹©çš„目录的路径,如果选择了一个文件,将使用 " +"[method String.get_base_dir] 返回其基本目录。如果选择了一个文件,将使用 " +"[method String.get_base_dir] 返回它的基本目录。" #: doc/classes/EditorInterface.xml msgid "Returns the editor's [EditorSelection] instance." -msgstr "返回编辑器的[EditorSelection]实例。" +msgstr "返回编辑器的 [EditorSelection] 实例。" #: doc/classes/EditorInterface.xml msgid "" @@ -26209,7 +26244,7 @@ msgstr "" #: doc/classes/EditorInterface.xml msgid "" "Returns mesh previews rendered at the given size as an [Array] of [Texture]s." -msgstr "返回 [Array] 数组包å«ç»™å®šå°ºå¯¸æ¸²æŸ“çš„ç½‘æ ¼é¢„è§ˆå›¾[Texture]。" +msgstr "返回 [Array] 数组包å«ç»™å®šå°ºå¯¸æ¸²æŸ“çš„ç½‘æ ¼é¢„è§ˆå›¾ [Texture]。" #: doc/classes/EditorInterface.xml msgid "Opens the scene at the given path." @@ -26236,12 +26271,12 @@ msgid "" "Saves the scene. Returns either [code]OK[/code] or [code]ERR_CANT_CREATE[/" "code] (see [@GlobalScope] constants)." msgstr "" -"ä¿å˜åœºæ™¯ã€‚返回 [code]OK[/code] 或 [code]ERR_CANT_CREATE[/code] (å‚阅 " -"[@GlobalScope] 常é‡)。" +"ä¿å˜åœºæ™¯ã€‚返回 [code]OK[/code] 或 [code]ERR_CANT_CREATE[/code]ï¼ˆè§ " +"[@GlobalScope] 常é‡ï¼‰ã€‚" #: doc/classes/EditorInterface.xml msgid "Saves the scene as a file at [code]path[/code]." -msgstr "将场景ä¿å˜ä¸º[code]path[/code]处的文件。" +msgstr "将场景ä¿å˜ä¸º [code]path[/code] 处的文件。" #: doc/classes/EditorInterface.xml msgid "" @@ -26256,9 +26291,9 @@ msgid "" "([code]2D[/code], [code]3D[/code], [code]Script[/code], [code]AssetLib[/" "code])." msgstr "" -"将编辑器的当å‰ä¸»ç•Œé¢è®¾ç½®ä¸º [code]name[/code] 䏿Œ‡å®šçš„界é¢ã€‚[code]name[/code]" -"必须与相关选项å¡çš„æ–‡æœ¬å®Œå…¨åŒ¹é…([code]2D[/code], [code]3D[/code], " -"[code]Script[/code], [code]AssetLib[/code])。" +"将编辑器的当å‰ä¸»ç•Œé¢è®¾ç½®ä¸º [code]name[/code] 䏿Œ‡å®šçš„界é¢ã€‚[code]name[/code] " +"必须与相关选项å¡çš„æ–‡æœ¬å®Œå…¨åŒ¹é…([code]2D[/code]ã€[code]3D[/code]ã€" +"[code]Script[/code]ã€[code]AssetLib[/code])。" #: doc/classes/EditorInterface.xml msgid "" @@ -26407,7 +26442,7 @@ msgid "" " remove_inspector_plugin(inspector_plugin)\n" "[/codeblock]" msgstr "" -"注册一个新的编辑器属性检查器æ’ä»¶[EditorInspectorPlugin]。检查器æ’件用于扩展 " +"注册一个新的编辑器属性检查器æ’ä»¶ [EditorInspectorPlugin]。检查器æ’件用于扩展 " "[EditorInspector] å¹¶ä¸ºä½ çš„å¯¹è±¡å±žæ€§æä¾›è‡ªå®šä¹‰é…置工具。\n" "[b]注æ„:[/b]å½“ä½ çš„ [EditorPlugin] 被ç¦ç”¨æ—¶ï¼Œä¸€å®šè¦ä½¿ç”¨ [method " "remove_inspector_plugin] æ¥åˆ 除注册的 [EditorInspectorPlugin]ï¼Œä»¥é˜²æ¢æ³„æ¼å’Œå‡º" @@ -26458,7 +26493,7 @@ msgid "" "[code]submenu[/code] should be an object of class [PopupMenu]. This submenu " "should be cleaned up using [code]remove_tool_menu_item(name)[/code]." msgstr "" -"在[b]项目 > 工具[/b]ä¸‹æ·»åŠ å为 [code]name[/code] 的自定义åèœå•。 " +"在[b]项目 > 工具[/b]ä¸‹æ·»åŠ å为 [code]name[/code] 的自定义åèœå•。" "[code]submenu[/code] 应该是 [PopupMenu] 类的对象。æ¤åèœå•应使用 " "[code]remove_tool_menu_item(name)[/code] 进行清ç†ã€‚" @@ -26707,14 +26742,14 @@ msgid "" "[code]res://path_to_script.gd:25[/code]." msgstr "" "这是为编辑基于脚本的对象的编辑器。您å¯ä»¥è¿”å›žæ ¼å¼ä¸çš„æ–ç‚¹åˆ—è¡¨ï¼ˆ[code]script:" -"line[/code]),例如:[code]res://path_to_script.gd:25[/code]。" +"line[/code]),例如:[code]res://path_to_script.gd:25[/code]。" #: doc/classes/EditorPlugin.xml msgid "" "Returns the [EditorInterface] object that gives you control over Godot " "editor's window and its functionalities." msgstr "" -"返回[EditorInterface]对象,该对象使您å¯ä»¥æŽ§åˆ¶Godot编辑器的窗å£åŠå…¶åŠŸèƒ½ã€‚" +"返回 [EditorInterface] 对象,该对象使您å¯ä»¥æŽ§åˆ¶ Godot 编辑器的窗å£åŠå…¶åŠŸèƒ½ã€‚" #: doc/classes/EditorPlugin.xml msgid "" @@ -26734,9 +26769,9 @@ msgid "" "[/codeblock]" msgstr "" "åœ¨ä½ çš„æ’ä»¶ä¸è¦†ç›–è¿™ä¸ªæ–¹æ³•ï¼Œè¿”å›žä¸€ä¸ªçº¹ç† [Texture]ï¼Œä»¥ä¾¿ç»™å®ƒä¸€ä¸ªå›¾æ ‡ã€‚\n" -"对于主界é¢çš„æ’ä»¶ï¼Œå®ƒå‡ºçŽ°åœ¨å±å¹•的顶部,在 \"2D\"ã€\"3D\"ã€\"Script \"å’Œ " -"\"AssetLib \"按钮的å³è¾¹ã€‚\n" -"ç†æƒ³æƒ…况下,æ’ä»¶çš„å›¾æ ‡åº”è¯¥æ˜¯é€æ˜ŽèƒŒæ™¯çš„白色,尺寸为16x16åƒç´ 。\n" +"对于主界é¢çš„æ’ä»¶ï¼Œå®ƒå‡ºçŽ°åœ¨å±å¹•的顶部,在“2Dâ€â€œ3Dâ€â€œScriptâ€â€œAssetLibâ€æŒ‰é’®çš„å³" +"边。\n" +"ç†æƒ³æƒ…况下,æ’ä»¶çš„å›¾æ ‡åº”è¯¥æ˜¯é€æ˜ŽèƒŒæ™¯çš„白色,尺寸为 16x16 åƒç´ 。\n" "[codeblock]\n" "func get_plugin_icon():\n" " # ä½ å¯ä»¥ä½¿ç”¨ä¸€ä¸ªè‡ªå®šä¹‰çš„å›¾æ ‡ã€‚\n" @@ -26753,9 +26788,8 @@ msgid "" "For main screen plugins, this appears at the top of the screen, to the right " "of the \"2D\", \"3D\", \"Script\", and \"AssetLib\" buttons." msgstr "" -"在Godotç¼–è¾‘å™¨ä¸æ˜¾ç¤ºæ—¶ï¼Œè¯·åœ¨æ’ä»¶ä¸è¦†ç›–æ¤æ–¹æ³•以æä¾›æ’ä»¶çš„å称。\n" -"对于主å±å¹•æ’件,它显示在å±å¹•顶部,在“ 2Dâ€ï¼Œâ€œ 3Dâ€ï¼Œâ€œè„šæœ¬â€å’Œâ€œ AssetLibâ€æŒ‰é’®çš„å³" -"侧。" +"在 Godot ç¼–è¾‘å™¨ä¸æ˜¾ç¤ºæ—¶ï¼Œè¯·åœ¨æ’ä»¶ä¸è¦†ç›–æ¤æ–¹æ³•以æä¾›æ’ä»¶çš„å称。\n" +"对于主å±å¹•æ’件,它显示在å±å¹•顶部,在“2Dâ€â€œ3Dâ€â€œè„šæœ¬â€â€œAssetLibâ€æŒ‰é’®çš„å³ä¾§ã€‚" #: doc/classes/EditorPlugin.xml msgid "" @@ -26858,8 +26892,8 @@ msgid "" "the workspace selector together with [b]2D[/b], [b]3D[/b], [b]Script[/b] and " "[b]AssetLib[/b])." msgstr "" -"如果这是一个主å±å¹•编辑æ’件,返回 [code]true[/code](它与[b]2D[/b]ã€[b]3D[/b]ã€" -"[b]Script[/b]å’Œ[b]AssetLib[/b]一起放在工作区选择器ä¸)。" +"如果这是一个主å±å¹•编辑æ’件,返回 [code]true[/code](它与 [b]2D[/b]ã€[b]3D[/" +"b]ã€[b]Script[/b]ã€[b]AssetLib[/b] 一起放在工作区选择器ä¸ï¼‰ã€‚" #: doc/classes/EditorPlugin.xml msgid "Minimizes the bottom panel." @@ -26885,25 +26919,25 @@ msgstr "排队ä¿å˜é¡¹ç›®çš„编辑器布局。" #: doc/classes/EditorPlugin.xml msgid "Removes an Autoload [code]name[/code] from the list." -msgstr "从列表ä¸åˆ é™¤è‡ªåŠ¨åŠ è½½[code]name[/code]。" +msgstr "从列表ä¸åˆ é™¤è‡ªåŠ¨åŠ è½½ [code]name[/code]。" #: doc/classes/EditorPlugin.xml msgid "" "Removes the control from the bottom panel. You have to manually [method Node." "queue_free] the control." -msgstr "ä»Žåº•éƒ¨é¢æ¿ä¸Šåˆ 除控件。您必须手动[method Node.queue_free]释放控件。" +msgstr "ä»Žåº•éƒ¨é¢æ¿ä¸Šåˆ 除控件。您必须手动 [method Node.queue_free] 释放控件。" #: doc/classes/EditorPlugin.xml msgid "" "Removes the control from the specified container. You have to manually " "[method Node.queue_free] the control." -msgstr "从指定的容器ä¸åˆ 除控件。您必须手动[method Node.queue_free]释放控件。" +msgstr "从指定的容器ä¸åˆ 除控件。您必须手动 [method Node.queue_free] 释放控件。" #: doc/classes/EditorPlugin.xml msgid "" "Removes the control from the dock. You have to manually [method Node." "queue_free] the control." -msgstr "ä»Žæ‰©å±•é¢æ¿ä¸åˆ 除控件。您必须手动[method Node.queue_free]释放控件。" +msgstr "ä»Žæ‰©å±•é¢æ¿ä¸åˆ 除控件。您必须手动 [method Node.queue_free] 释放控件。" #: doc/classes/EditorPlugin.xml msgid "Removes a custom type added by [method add_custom_type]." @@ -26932,7 +26966,7 @@ msgstr "åˆ é™¤ç”± [method add_spatial_gizmo_plugin] 注册的控制器æ’件。" #: doc/classes/EditorPlugin.xml msgid "Removes a menu [code]name[/code] from [b]Project > Tools[/b]." -msgstr "从[b]项目 > 工具[/b]ä¸åˆ 除èœå•[code]name[/code]。" +msgstr "从[b]项目 > 工具[/b]ä¸åˆ 除èœå• [code]name[/code]。" #: doc/classes/EditorPlugin.xml msgid "" @@ -26949,9 +26983,9 @@ msgid "" "editor when their viewports are updated. You need to call this method only " "once and it will work permanently for this plugin." msgstr "" -"å¯ç”¨2D编辑器的 [method forward_canvas_force_draw_over_viewport] å’Œ3D编辑器的 " -"[method forward_spatial_force_draw_over_viewport] åœ¨å…¶è§†çª—æ›´æ–°æ—¶çš„è°ƒç”¨ã€‚ä½ åª" -"需è¦è°ƒç”¨è¿™ä¸ªæ–¹æ³•一次,它就会对这个æ’件永久起作用。" +"å¯ç”¨ 2D 编辑器的 [method forward_canvas_force_draw_over_viewport] å’Œ 3D 编辑" +"器的 [method forward_spatial_force_draw_over_viewport] 在其视窗更新时的调用。" +"ä½ åªéœ€è¦è°ƒç”¨è¿™ä¸ªæ–¹æ³•一次,它就会对这个æ’件永久起作用。" #: doc/classes/EditorPlugin.xml msgid "" @@ -27028,8 +27062,8 @@ msgid "" "Emitted when user changes the workspace ([b]2D[/b], [b]3D[/b], [b]Script[/" "b], [b]AssetLib[/b]). Also works with custom screens defined by plugins." msgstr "" -"当用户改å˜å·¥ä½œç©ºé—´([b]2D[/b], [b]3D[/b], [b]Script[/b], [b]AssetLib[/b])时触" -"å‘。也适用于由æ’件定义的自定义å±å¹•。" +"当用户改å˜å·¥ä½œç©ºé—´ï¼ˆ[b]2D[/b]ã€[b]3D[/b]ã€[b]Script[/b]ã€[b]AssetLib[/b])时" +"触å‘。也适用于由æ’件定义的自定义å±å¹•。" #: doc/classes/EditorPlugin.xml msgid "" @@ -27048,7 +27082,7 @@ msgstr "当用户关é—场景时触å‘ã€‚å‚æ•°æ˜¯å…³é—场景的文件路径。 #: doc/classes/EditorPlugin.xml msgid "Represents the size of the [enum DockSlot] enum." -msgstr "表示[enum DockSlot]枚举的大å°ã€‚" +msgstr "表示 [enum DockSlot] 枚举的大å°ã€‚" #: doc/classes/EditorProperty.xml msgid "Custom control to edit properties for adding into the inspector." @@ -27078,9 +27112,10 @@ msgid "" "requesting this property to be refreshed (leave as [code]false[/code] if " "unsure)." msgstr "" -"å¦‚æžœä¸€ä¸ªæˆ–å‡ ä¸ªå±žæ€§å‘生了å˜åŒ–,必然会调用这个函数。[code]field[/code]æ˜¯åœ¨ä½ çš„" -"编辑器å¯ä»¥å•ç‹¬ä¿®æ”¹å—æ®µçš„æƒ…况下使用的(比如Vector3.x)。[code]changing[/code]" -"傿•°å¯ä»¥é¿å…ç¼–è¾‘å™¨è¦æ±‚刷新这个属性(如果ä¸ç¡®å®šçš„è¯ï¼Œå°±ç”¨[code]false[/code])。" +"å¦‚æžœä¸€ä¸ªæˆ–å‡ ä¸ªå±žæ€§å‘生了å˜åŒ–,必然会调用这个函数。[code]field[/code] æ˜¯åœ¨ä½ çš„" +"编辑器å¯ä»¥å•ç‹¬ä¿®æ”¹å—æ®µçš„æƒ…况下使用的(比如 Vector3.x)。[code]changing[/" +"code] 傿•°å¯ä»¥é¿å…ç¼–è¾‘å™¨è¦æ±‚刷新这个属性(如果ä¸ç¡®å®šçš„è¯ï¼Œè¯·ä¿æŒ " +"[code]false[/code])。" #: doc/classes/EditorProperty.xml msgid "Gets the edited object." @@ -27233,7 +27268,7 @@ msgid "" "This virtual method can be implemented to handle context menu items not " "handled by default. See [method set_create_options]." msgstr "" -"æ¤è™šæ‹Ÿæ³•å¯ä»¥å®žçް处ç†é»˜è®¤æœªå¤„ç†çš„上下文èœå•项目。å‚è§ [method " +"æ¤è™šæ‹Ÿæ³•å¯ä»¥å®žçް处ç†é»˜è®¤æœªå¤„ç†çš„上下文èœå•é¡¹ç›®ã€‚è§ [method " "set_create_options]。" #: doc/classes/EditorResourcePicker.xml @@ -27266,7 +27301,7 @@ msgstr "å…许资æºç±»åž‹çš„基本类型。å¯ä»¥æ˜¯å‡ 个选项的逗å·åˆ†ç¦» #: doc/classes/EditorResourcePicker.xml msgid "If [code]true[/code], the value can be selected and edited." -msgstr "如果 [code]true[/code],则å¯ä»¥é€‰æ‹©å’Œç¼–辑该值。" +msgstr "如果为 [code]true[/code],则å¯ä»¥é€‰æ‹©å’Œç¼–辑该值。" #: doc/classes/EditorResourcePicker.xml msgid "The edited resource value." @@ -27277,7 +27312,7 @@ msgid "" "If [code]true[/code], the main button with the resource preview works in the " "toggle mode. Use [method set_toggle_pressed] to manually set the state." msgstr "" -"如果 [code]true[/code],带有资æºé¢„è§ˆçš„ä¸»æŒ‰é’®åœ¨åˆ‡æ¢æ¨¡å¼ä¸‹å·¥ä½œã€‚使用 [method " +"如果为 [code]true[/code],带有资æºé¢„è§ˆçš„ä¸»æŒ‰é’®åœ¨åˆ‡æ¢æ¨¡å¼ä¸‹å·¥ä½œã€‚使用 [method " "set_toggle_pressed] æ¥æ‰‹åŠ¨è®¾ç½®çŠ¶æ€ã€‚" #: doc/classes/EditorResourcePicker.xml @@ -27367,7 +27402,7 @@ msgstr "移除自定义预览生æˆå™¨ã€‚" msgid "" "Emitted if a preview was invalidated (changed). [code]path[/code] " "corresponds to the path of the preview." -msgstr "é¢„è§ˆæ— æ•ˆï¼ˆæ›´æ”¹ï¼‰æ—¶è§¦å‘。[code]path[/code]对应的预览路径。" +msgstr "é¢„è§ˆæ— æ•ˆï¼ˆæ›´æ”¹ï¼‰æ—¶è§¦å‘。[code]path[/code] 对应的预览路径。" #: doc/classes/EditorResourcePreviewGenerator.xml msgid "Custom generator of previews." @@ -27379,7 +27414,7 @@ msgid "" "thumbnail_size[/code] in [EditorSettings] to find out the right size to do " "previews at." msgstr "" -"è‡ªå®šä¹‰ä»£ç æ¥ç”Ÿæˆé¢„览。请查看[EditorSettings]ä¸çš„[code]file_dialog/" +"è‡ªå®šä¹‰ä»£ç æ¥ç”Ÿæˆé¢„览。请查看 [EditorSettings] ä¸çš„ [code]file_dialog/" "thumbnail_size[/code],找出适åˆåšé¢„览的尺寸。" #: doc/classes/EditorResourcePreviewGenerator.xml @@ -27388,8 +27423,8 @@ msgid "" "generate] or [method generate_from_path] for small previews as well.\n" "By default, it returns [code]false[/code]." msgstr "" -"如果该函数返回 [code]true[/code],生æˆå™¨å°†è°ƒç”¨[method generate]或[method " -"generate_from_path]æ¥è¿›è¡Œå°åž‹é¢„览。\n" +"如果该函数返回 [code]true[/code],生æˆå™¨å°†è°ƒç”¨ [method generate] 或 [method " +"generate_from_path] æ¥è¿›è¡Œå°åž‹é¢„览。\n" "默认情况下,它会返回 [code]false[/code]。" #: doc/classes/EditorResourcePreviewGenerator.xml @@ -27440,7 +27475,7 @@ msgstr "" #: doc/classes/EditorSceneImporter.xml msgid "Imports scenes from third-parties' 3D files." -msgstr "从第三方的3D文件ä¸å¯¼å…¥åœºæ™¯ã€‚" +msgstr "从第三方的 3D 文件ä¸å¯¼å…¥åœºæ™¯ã€‚" #: doc/classes/EditorSceneImporter.xml msgid "" @@ -27555,16 +27590,16 @@ msgstr "" "[method post_import]å›žè°ƒæŽ¥æ”¶å¯¼å…¥åœºæ™¯çš„æ ¹èŠ‚ç‚¹ï¼Œå¹¶è¿”å›žåœºæ™¯çš„ä¿®æ”¹ç‰ˆæœ¬ã€‚ä½¿ç”¨ç¤º" "例。\n" "[codeblock]\n" -"tool # Needed so it runs in editor\n" +"tool # å› ä¸ºéœ€è¦åœ¨ç¼–辑器ä¸è¿è¡Œ\n" "extends EditorScenePostImport\n" "\n" -"# This sample changes all node names\n" +"# 这个实例会修改所有节点的åç§°\n" "\n" -"# Called right after the scene is imported and gets the root node\n" +"# 会在场景导入åŽç«‹å³è°ƒç”¨ï¼ŒèŽ·å–åˆ°çš„æ˜¯æ ¹èŠ‚ç‚¹\n" "func post_import(scene):\n" -" # Change all node names to \"modified_[oldnodename]\"\n" +" # 将所有节点的å称都改æˆâ€œmodified_[节点原å]â€\n" " iterate(scene)\n" -" return scene # Remember to return the imported scene\n" +" return scene # è®°å¾—è¦è¿”回导入的场景\n" "\n" "func iterate(node):\n" " if node != null:\n" @@ -27577,7 +27612,7 @@ msgstr "" msgid "" "Returns the source file path which got imported (e.g. [code]res://scene.dae[/" "code])." -msgstr "è¿”å›žå¯¼å…¥çš„æºæ–‡ä»¶è·¯å¾„(如[code]res://scene.dae[/code])。" +msgstr "è¿”å›žå¯¼å…¥çš„æºæ–‡ä»¶è·¯å¾„(如[code]res://scene.dae[/code])。" #: doc/classes/EditorScenePostImport.xml msgid "Returns the resource folder the imported scene file is located in." @@ -27613,9 +27648,9 @@ msgid "" "is visible in the console window started with the Editor (stdout) instead of " "the usual Godot [b]Output[/b] dock." msgstr "" -"扩展该类并实现其 [method _run] 方法的脚本å¯ä»¥åœ¨ç¼–辑器è¿è¡Œæ—¶é€šè¿‡è„šæœ¬ç¼–è¾‘å™¨çš„ " -"[b]File > Run[/b] èœå•选项(或按 [code]Ctrl+Shift+X[/code]ï¼‰æ‰§è¡Œã€‚è¿™å¯¹äºŽå‘ " -"Godotæ·»åŠ è‡ªå®šä¹‰çš„ç¼–è¾‘å†…åŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚å¯¹äºŽæ›´å¤æ‚çš„æ·»åŠ ï¼Œå¯ä»¥è€ƒè™‘使用 " +"扩展该类并实现其 [method _run] 方法的脚本å¯ä»¥åœ¨ç¼–辑器è¿è¡Œæ—¶é€šè¿‡è„šæœ¬ç¼–è¾‘å™¨çš„" +"[b]文件 > è¿è¡Œ[/b]èœå•选项(或按 [code]Ctrl+Shift+X[/code]ï¼‰æ‰§è¡Œã€‚è¿™å¯¹äºŽå‘ " +"Godot æ·»åŠ è‡ªå®šä¹‰çš„ç¼–è¾‘å†…åŠŸèƒ½å¾ˆæœ‰ç”¨ã€‚å¯¹äºŽæ›´å¤æ‚çš„æ·»åŠ ï¼Œå¯ä»¥è€ƒè™‘使用 " "[EditorPlugin] 代替。\n" "[b]注æ„:[/b]扩展脚本需è¦å¯ç”¨ [code]tool[/code] 工具模å¼ã€‚\n" "[b]示例脚本:[/b]\n" @@ -27638,12 +27673,12 @@ msgid "" "Adds [code]node[/code] as a child of the root node in the editor context.\n" "[b]Warning:[/b] The implementation of this method is currently disabled." msgstr "" -"å°†[code]node[/code]æ·»åŠ ä¸ºç¼–è¾‘å™¨ä¸Šä¸‹æ–‡ä¸æ ¹èŠ‚ç‚¹çš„å级。\n" +"å°† [code]node[/code] æ·»åŠ ä¸ºç¼–è¾‘å™¨ä¸Šä¸‹æ–‡ä¸æ ¹èŠ‚ç‚¹çš„å级。\n" "[b]è¦å‘Šï¼š[/b]æ¤æ–¹æ³•的实现å‰å¤„于ç¦ç”¨çжæ€ã€‚" #: doc/classes/EditorScript.xml msgid "Returns the [EditorInterface] singleton instance." -msgstr "返回[EditorInterface]å•例的实例。" +msgstr "返回 [EditorInterface] å•例的实例。" #: doc/classes/EditorScript.xml msgid "Returns the Editor's currently active scene." @@ -27680,7 +27715,7 @@ msgstr "æŒæœ‰è¢«ç¼–辑资æºçš„脚本属性的所有者 [Node]。" #: doc/classes/EditorSelection.xml msgid "Manages the SceneTree selection in the editor." -msgstr "管ç†ç¼–辑器ä¸çš„SceneTree选择。" +msgstr "管ç†ç¼–辑器ä¸çš„ SceneTree 选择。" #: doc/classes/EditorSelection.xml msgid "" @@ -27688,7 +27723,7 @@ msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_selection]." msgstr "" -"这个对象管ç†ç¼–辑器ä¸çš„SceneTree选择。\n" +"这个对象管ç†ç¼–辑器ä¸çš„ SceneTree 选择。\n" "[b]注æ„:[/b]这个类ä¸åº”该直接实例化。相å,使用[method EditorInterface." "get_selection]访问å•例。" @@ -27794,10 +27829,10 @@ msgid "" "editor_settings.add_property_info(property_info)\n" "[/codeblock]" msgstr "" -"å°†è‡ªå®šä¹‰å±žæ€§ä¿¡æ¯æ·»åŠ åˆ°å±žæ€§ã€‚è¯¥è¯å…¸å¿…须包å«ï¼š\n" -"-[code]åç§°[/code]:[String](属性å称)\n" -"-[code]类型[/code]:[int](请å‚阅[enum Variant.Type])\n" -"-(å¯é€‰ï¼‰[code]æç¤º[/code]:[int](请å‚阅[enum PropertyHint])和" +"å°†è‡ªå®šä¹‰å±žæ€§ä¿¡æ¯æ·»åŠ åˆ°å±žæ€§ã€‚è¯¥å—典必须包å«ï¼š\n" +"-[code]name[/code]:[String](该属性的å称)\n" +"-[code]type[/code]:[int]ï¼ˆè§ [enum Variant.Type])\n" +"-(å¯é€‰ï¼‰[code]hint[/code]:[int]ï¼ˆè§ [enum PropertyHint])和 " "[code]hint_string[/code]:[String]\n" "[b]示例:[/b]\n" "[codeblock]\n" @@ -27815,7 +27850,7 @@ msgstr "" #: doc/classes/EditorSettings.xml msgid "Erases the setting whose name is specified by [code]property[/code]." -msgstr "åˆ é™¤å称为指定[code]property[/code]的设置。" +msgstr "åˆ é™¤å称为指定 [code]property[/code] 的设置。" #: doc/classes/EditorSettings.xml msgid "Returns the list of favorite files and directories for this project." @@ -27827,8 +27862,9 @@ msgid "" "[code]key[/code] specified. If the metadata doesn't exist, [code]default[/" "code] will be returned instead. See also [method set_project_metadata]." msgstr "" -"返回指定的[code]section[/code]å’Œ[code]key[/code]的特定项目元数æ®ã€‚如果元数æ®" -"ä¸å˜åœ¨ï¼Œå°†è¿”回 [code]default[/code]。å¦è¯·å‚阅 [method set_project_metadata]。" +"返回指定的 [code]section[/code] å’Œ [code]key[/code] 的特定项目元数æ®ã€‚如果元" +"æ•°æ®ä¸å˜åœ¨ï¼Œå°†è¿”回 [code]default[/code]。å¦è¯·å‚阅 [method " +"set_project_metadata]。" #: doc/classes/EditorSettings.xml msgid "" @@ -27850,7 +27886,7 @@ msgid "" "Returns the value of the setting specified by [code]name[/code]. This is " "equivalent to using [method Object.get] on the EditorSettings instance." msgstr "" -"返回 [code]name[/code] 指定的设置的值。这相当于在EditorSettings实例上使用" +"返回 [code]name[/code] 指定的设置的值。相当于在 EditorSettings 实例上使用 " "[method Object.get]。" #: doc/classes/EditorSettings.xml @@ -27861,8 +27897,8 @@ msgid "" "[code]settings/templates[/code] - Where export templates are located" msgstr "" "获å–引擎的全局设置路径。在æ¤è·¯å¾„内,您å¯ä»¥æ‰¾åˆ°ä¸€äº›æ ‡å‡†è·¯å¾„,例如:\n" -"[code]settings / tmp[/code]-用于文件的临时å˜å‚¨\n" -"[code]settings/templates[/code]-å¯¼å‡ºæ¨¡æ¿æ‰€åœ¨çš„ä½ç½®" +"[code]settings/tmp[/code] - 用于文件的临时å˜å‚¨\n" +"[code]settings/templates[/code] - å¯¼å‡ºæ¨¡æ¿æ‰€åœ¨çš„ä½ç½®" #: doc/classes/EditorSettings.xml msgid "" @@ -27879,7 +27915,7 @@ msgid "" "When this method returns [code]true[/code], a Revert button will display " "next to the setting in the Editor Settings." msgstr "" -"如果[code]name[/code]指定的设置å¯ä»¥å°†å…¶å€¼è¿˜åŽŸä¸ºé»˜è®¤å€¼ï¼Œåˆ™è¿”å›ž [code]true[/" +"如果 [code]name[/code] 指定的设置å¯ä»¥å°†å…¶å€¼è¿˜åŽŸä¸ºé»˜è®¤å€¼ï¼Œåˆ™è¿”å›ž [code]true[/" "code],å¦åˆ™è¿”回 [code]false[/code]ã€‚å½“æ¤æ–¹æ³•返回 [code]true[/code] 时,编辑器" "设置ä¸çš„设置æ—边会显示一个还原按钮。" @@ -27889,8 +27925,8 @@ msgid "" "This is the value that would be applied when clicking the Revert button in " "the Editor Settings." msgstr "" -"返回 [code]name[/code] 指定的设置的默认值。当点击编辑器设置ä¸çš„ \"还原 \"按钮" -"时,该值将被应用。" +"返回 [code]name[/code] 指定的设置的默认值。当点击编辑器设置ä¸çš„â€œè¿˜åŽŸâ€æŒ‰é’®æ—¶ï¼Œ" +"该值将被应用。" #: doc/classes/EditorSettings.xml msgid "Sets the list of favorite files and directories for this project." @@ -27930,8 +27966,8 @@ msgid "" "This is equivalent to using [method Object.set] on the EditorSettings " "instance." msgstr "" -"设置 [code]name[/code] 指定的设置的 [code]value[/code]。这相当于在" -"EditorSettings实例上使用[method Object.set]。" +"å°† [code]name[/code] 指定的设置项设置为 [code]value[/code]。相当于在 " +"EditorSettings 实例上使用 [method Object.set]。" #: doc/classes/EditorSettings.xml msgid "Emitted after any editor setting has changed." @@ -27964,8 +28000,8 @@ msgid "" "Adds the specified [code]segments[/code] to the gizmo's collision shape for " "picking. Call this function during [method redraw]." msgstr "" -"将指定的[code]segments[/code]æ·»åŠ åˆ°gizmo的碰撞形状ä¸ï¼Œä»¥ä¾¿æŒ‘选。在[method " -"redraw]时调用æ¤å‡½æ•°ã€‚" +"将指定的 [code]segments[/code] æ·»åŠ åˆ° gizmo 的碰撞形状ä¸ï¼Œä»¥ä¾¿æŒ‘选。在 " +"[method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -27973,8 +28009,8 @@ msgid "" "generated from a regular [Mesh] too. Call this function during [method " "redraw]." msgstr "" -"å°†ç¢°æ’žä¸‰è§’å½¢æ·»åŠ åˆ°å°å·¥å…·ä¸ï¼Œä¾›æŒ‘选。也å¯ä»¥ä»Žæ™®é€šçš„[Mesh]生æˆ[TriangleMesh]。" -"在[method redraw]时调用æ¤å‡½æ•°ã€‚" +"å°†ç¢°æ’žä¸‰è§’å½¢æ·»åŠ åˆ°å°å·¥å…·ä¸ï¼Œä¾›æŒ‘选。也å¯ä»¥ä»Žæ™®é€šçš„ [Mesh] ç”Ÿæˆ " +"[TriangleMesh]。在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -27992,8 +28028,8 @@ msgid "" "lines are used for visualizing the gizmo. Call this function during [method " "redraw]." msgstr "" -"用给定的æè´¨åœ¨å°å·¥å…·ä¸Šæ·»åŠ çº¿æ¡åˆ°gizmo (作为2个点的集åˆï¼‰ã€‚线æ¡ç”¨äºŽå¯è§†åŒ–" -"gizmo。在[method redraw]时调用æ¤å‡½æ•°ã€‚" +"用给定的æè´¨åœ¨å°å·¥å…·ä¸Šæ·»åŠ çº¿æ¡åˆ° gizmo(作为 2 个点的集åˆï¼‰ã€‚线æ¡ç”¨äºŽå¯è§†åŒ– " +"gizmo。在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28011,7 +28047,7 @@ msgstr "" msgid "" "Adds an unscaled billboard for visualization. Call this function during " "[method redraw]." -msgstr "æ·»åŠ ä¸€ä¸ªæœªç¼©æ”¾çš„å¹¿å‘Šç‰Œä»¥å®žçŽ°å¯è§†åŒ–。在[method redraw]时调用æ¤å‡½æ•°ã€‚" +msgstr "æ·»åŠ ä¸€ä¸ªæœªç¼©æ”¾çš„å¹¿å‘Šç‰Œä»¥å®žçŽ°å¯è§†åŒ–。在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28090,15 +28126,14 @@ msgid "" "Sets the gizmo's hidden state. If [code]true[/code], the gizmo will be " "hidden. If [code]false[/code], it will be shown." msgstr "" -"设置工具的éšè—状æ€ã€‚如果[code]true[/code]ï¼Œåˆ™å°æŽ§ä»¶å°†è¢«éšè—。如果" +"设置工具的éšè—状æ€ã€‚如果为 [code]true[/code]ï¼Œåˆ™å°æŽ§ä»¶å°†è¢«éšè—。如果为 " "[code]false[/code],将显示它。" #: doc/classes/EditorSpatialGizmo.xml msgid "" "Sets the reference [Spatial] node for the gizmo. [code]node[/code] must " "inherit from [Spatial]." -msgstr "" -"设置工具的å‚考 [Spatial] 节点。 [code]node[/code]必须继承自 [Spatial]。" +msgstr "设置工具的å‚考 [Spatial] 节点。[code]node[/code]必须继承自 [Spatial]。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "Used by the editor to define Spatial gizmo types." @@ -28132,13 +28167,13 @@ msgid "" "Override this method to define whether the gizmo can be hidden or not. " "Returns [code]true[/code] if not overridden." msgstr "" -"é‡å†™æ¤æ–¹æ³•以定义是å¦å¯ä»¥éšè—Gizmo。如果未覆盖,则返回 [code]true[/code]。" +"é‡å†™æ¤æ–¹æ³•以定义是å¦å¯ä»¥éšè— Gizmo。如果未覆盖,则返回 [code]true[/code]。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Override this method to commit gizmo handles. Called for this plugin's " "active gizmos." -msgstr "é‡å†™æ¤æ–¹æ³•以æäº¤Gizmo奿Ÿ„ã€‚è°ƒç”¨æ¤æ’件的活动辅助工具。" +msgstr "é‡å†™æ¤æ–¹æ³•以æäº¤ Gizmo 奿Ÿ„ã€‚è°ƒç”¨æ¤æ’件的活动辅助工具。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28189,13 +28224,13 @@ msgstr "" msgid "" "Override this method to provide gizmo's handle names. Called for this " "plugin's active gizmos." -msgstr "é‡å†™æ¤æ–¹æ³•以æä¾›Gizmoçš„å¥æŸ„åç§°ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "é‡å†™æ¤æ–¹æ³•以æä¾› Gizmo çš„å¥æŸ„åç§°ã€‚è°ƒç”¨æ¤æ’件的活动工具。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Gets actual value of a handle from gizmo. Called for this plugin's active " "gizmos." -msgstr "从Gizmo获å–奿Ÿ„çš„å®žé™…å€¼ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "从 Gizmo 获å–奿Ÿ„çš„å®žé™…å€¼ã€‚è°ƒç”¨æ¤æ’件的活动工具。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28264,7 +28299,7 @@ msgstr "æ›´æ–°å¥æŸ„åŽæ›´æ–°å…¶å€¼ã€‚è°ƒç”¨æ¤æ’件的活动工具。" #: doc/classes/EditorSpinSlider.xml msgid "Godot editor's control for editing numeric values." -msgstr "Godot编辑器用于编辑数值的控件。" +msgstr "Godot 编辑器用于编辑数值的控件。" #: doc/classes/EditorSpinSlider.xml msgid "" @@ -28336,8 +28371,8 @@ msgid "" "Fetches new changes from the remote, but doesn't write changes to the " "current working directory. Equivalent to [code]git fetch[/code]." msgstr "" -"ä»Žè¿œç¨‹ä»“åº“ä¸æŠ“å–æ–°ä¿®æ”¹ï¼Œä½†ä¸å°†ä¿®æ”¹å†™å…¥å½“å‰å·¥ä½œç›®å½•。与 [code]git fetch[/" -"code] ç‰æ•ˆã€‚" +"ä»Žè¿œç¨‹ä»“åº“ä¸æŠ“å–æ–°ä¿®æ”¹ï¼Œä½†ä¸å°†ä¿®æ”¹å†™å…¥å½“å‰å·¥ä½œç›®å½•。相当于 [code]git fetch[/" +"code]。" #: doc/classes/EditorVCSInterface.xml msgid "" @@ -28358,7 +28393,7 @@ msgid "" "file path, returns a file diff, and if it is a commit identifier, then " "returns a commit diff." msgstr "" -"返回 [Dictionary] å—典项的 [Array] 数组(请å‚阅 [method create_diff_file]ã€" +"返回 [Dictionary] å—典项的 [Array] æ•°ç»„ï¼ˆè§ [method create_diff_file]ã€" "[method create_diff_hunk]ã€[method create_diff_line]ã€[method " "add_line_diffs_into_diff_hunk]ã€[method add_diff_hunks_into_diff_file]),æ¯" "一项都包å«ä¸€ä¸ªå·®å¼‚的信æ¯ã€‚如果 [code]identifier[/code] 是文件路径,则返回文件" @@ -28370,25 +28405,25 @@ msgid "" "each containing a line diff between a file at [code]file_path[/code] and the " "[code]text[/code] which is passed in." msgstr "" -"返回 [Dictionary] å—典项的 [Array] 数组(请å‚阅 [method create_diff_hunk])," -"æ¯ä¸€é¡¹éƒ½åŒ…å«ä½äºŽ [code]file_path[/code] çš„æ–‡ä»¶ä¸Žä¼ å…¥çš„ [code]text[/code] 之间" -"çš„å•行差异。" +"返回 [Dictionary] å—典项的 [Array] æ•°ç»„ï¼ˆè§ [method create_diff_hunk]),æ¯ä¸€" +"项都包å«ä½äºŽ [code]file_path[/code] çš„æ–‡ä»¶ä¸Žä¼ å…¥çš„ [code]text[/code] 之间的å•" +"行差异。" #: doc/classes/EditorVCSInterface.xml msgid "" "Returns an [Array] of [Dictionary] items (see [method create_status_file]), " "each containing the status data of every modified file in the project folder." msgstr "" -"返回 [Dictionary] å—典项的 [Array] 数组(请å‚阅 [method " -"create_status_file]),æ¯ä¸€é¡¹éƒ½åŒ…å«é¡¹ç›®æ–‡ä»¶å¤¹ä¸æ¯ä¸ªå·²ä¿®æ”¹çš„æ–‡ä»¶çš„çŠ¶æ€æ•°æ®ã€‚" +"返回 [Dictionary] å—典项的 [Array] æ•°ç»„ï¼ˆè§ [method create_status_file]),æ¯" +"一项都包å«é¡¹ç›®æ–‡ä»¶å¤¹ä¸æ¯ä¸ªå·²ä¿®æ”¹çš„æ–‡ä»¶çš„çŠ¶æ€æ•°æ®ã€‚" #: doc/classes/EditorVCSInterface.xml msgid "" "Returns an [Array] of [Dictionary] items (see [method create_commit]), each " "containing the data for a past commit." msgstr "" -"返回 [Dictionary] å—典项的 [Array] 数组(请å‚阅 [method create_commit]),æ¯" -"一项都包å«ä¸€ä¸ªè¿‡åŽ»æäº¤çš„æ•°æ®ã€‚" +"返回 [Dictionary] å—典项的 [Array] æ•°ç»„ï¼ˆè§ [method create_commit]),æ¯ä¸€é¡¹" +"都包å«ä¸€ä¸ªè¿‡åŽ»æäº¤çš„æ•°æ®ã€‚" #: doc/classes/EditorVCSInterface.xml msgid "" @@ -28590,19 +28625,19 @@ msgid "" "This class is used internally by the editor inspector and script debugger, " "but can also be used in plugins to pass and display objects as their IDs." msgstr "" -"实用类,它拥有对[Object]å®žä¾‹çš„å†…éƒ¨æ ‡è¯†ç¬¦çš„å¼•ç”¨ï¼Œè¯¥æ ‡è¯†ç¬¦ç”±[method Object." -"get_instance_id]给出。这个IDå¯ä»¥é€šè¿‡[method @GDScript.instance_from_id]æ¥æ£€ç´¢" -"对象实例。\n" +"实用类,它拥有对 [Object] å®žä¾‹çš„å†…éƒ¨æ ‡è¯†ç¬¦çš„å¼•ç”¨ï¼Œè¯¥æ ‡è¯†ç¬¦ç”± [method Object." +"get_instance_id] 给出。这个 ID å¯ä»¥é€šè¿‡ [method @GDScript.instance_from_id] " +"æ¥æ£€ç´¢å¯¹è±¡å®žä¾‹ã€‚\n" "这个类在内部被编辑器检查器和脚本调试器使用,但也å¯ä»¥åœ¨æ’ä»¶ä¸ä½¿ç”¨ï¼Œä»¥ä¼ 递和显" -"示对象作为它们的ID。" +"示对象作为它们的 ID。" #: doc/classes/EncodedObjectAsID.xml msgid "" "The [Object] identifier stored in this [EncodedObjectAsID] instance. The " "object instance can be retrieved with [method @GDScript.instance_from_id]." msgstr "" -"å˜å‚¨åœ¨è¿™ä¸ª[EncodedObjectAsID]实例ä¸çš„[Object]æ ‡è¯†ç¬¦ã€‚å¯¹è±¡å®žä¾‹å¯ä»¥ç”¨[method " -"@GDScript.instance_from_id]检索。" +"å˜å‚¨åœ¨è¿™ä¸ª [EncodedObjectAsID] 实例ä¸çš„ [Object] æ ‡è¯†ç¬¦ã€‚å¯¹è±¡å®žä¾‹å¯ä»¥ç”¨ " +"[method @GDScript.instance_from_id] 检索。" #: doc/classes/Engine.xml msgid "Access to engine properties." @@ -28613,7 +28648,7 @@ msgid "" "The [Engine] singleton allows you to query and modify the project's run-time " "parameters, such as frames per second, time scale, and others." msgstr "" -"[Engine]å•例使您å¯ä»¥æŸ¥è¯¢å’Œä¿®æ”¹é¡¹ç›®çš„è¿è¡Œæ—¶å‚数,例如æ¯ç§’帧数,时间范围ç‰ã€‚" +"[Engine] å•例使您å¯ä»¥æŸ¥è¯¢å’Œä¿®æ”¹é¡¹ç›®çš„è¿è¡Œæ—¶å‚数,例如æ¯ç§’帧数,时间范围ç‰ã€‚" #: doc/classes/Engine.xml msgid "" @@ -28809,7 +28844,8 @@ msgid "" "Returns [code]true[/code] if a singleton with given [code]name[/code] exists " "in global scope." msgstr "" -"如果全局范围内å˜åœ¨å…·æœ‰ç»™å®š[code]name[/code]çš„å•例,则返回 [code]true[/code]。" +"如果全局范围内å˜åœ¨å…·æœ‰ç»™å®š [code]name[/code] çš„å•例,则返回 [code]true[/" +"code]。" #: doc/classes/Engine.xml msgid "" @@ -28920,7 +28956,7 @@ msgid "" "running a project from the editor." msgstr "" "如果为 [code]false[/code]ï¼Œåˆ™åœæ¢æ‰“å°é”™è¯¯å’Œè¦å‘Šä¿¡æ¯åˆ°æŽ§åˆ¶å°å’Œç¼–辑器输出日志。" -"è¿™å¯ä»¥ç”¨æ¥åœ¨å•元测试套件è¿è¡ŒæœŸé—´éšè—错误和è¦å‘Šä¿¡æ¯ã€‚这个属性ç‰åŒäºŽ [member " +"è¿™å¯ä»¥ç”¨æ¥åœ¨å•元测试套件è¿è¡ŒæœŸé—´éšè—错误和è¦å‘Šä¿¡æ¯ã€‚这个属性相当于 [member " "ProjectSettings.application/run/disable_stderr] 项目设置。\n" "[b]è¦å‘Šï¼š[/b]å¦‚æžœä½ åœ¨é¡¹ç›®çš„ä»»æ„ä½ç½®å°†å…¶è®¾ç½®ä¸º [code]false[/code],é‡è¦çš„错误" "ä¿¡æ¯å¯èƒ½ä¼šè¢«éšè—,å³ä½¿å®ƒä»¬æ˜¯ç”±å…¶ä»–脚本触å‘。如果在 [code]tool[/code] è„šæœ¬ä¸æŠŠ" @@ -29055,17 +29091,17 @@ msgid "" "[code]adjustment_*[/code] properties will have no effect on the rendered " "scene." msgstr "" -"如果 [code]true[/code],则å¯ç”¨æ¤èµ„æºæä¾›çš„ [code]adjusting_*[/code] 属性。如" -"æžœ[code]false[/code],对[code]adjustment_*[/code]属性的修改将ä¸ä¼šå¯¹æ¸²æŸ“的场景" -"产生影å“。" +"如果为 [code]true[/code],则å¯ç”¨æ¤èµ„æºæä¾›çš„ [code]adjusting_*[/code] 属性。" +"如果为 [code]false[/code],对[code]adjustment_*[/code]属性的修改将ä¸ä¼šå¯¹æ¸²æŸ“" +"的场景产生影å“。" #: doc/classes/Environment.xml msgid "" "The global color saturation value of the rendered scene (default value is " "1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." msgstr "" -"渲染场景的全局色彩饱和度值,默认值为1ã€‚åªæœ‰åœ¨[code]adjustment_enabled[/code]" -"为 [code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚" +"渲染场景的全局色彩饱和度值,默认值为1ã€‚åªæœ‰åœ¨ [code]adjustment_enabled[/" +"code] 为 [code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚" #: doc/classes/Environment.xml msgid "The ambient light's [Color]." @@ -29100,8 +29136,8 @@ msgid "" "determine the exposure setting to adapt to the scene's illumination and the " "observed light." msgstr "" -"如果[code]true[/code],å¯ç”¨åœºæ™¯æ¸²æŸ“å™¨çš„è‰²è°ƒæ˜ å°„è‡ªåŠ¨æ›å…‰æ¨¡å¼ã€‚如果[code]true[/" -"code],渲染器将自动确定æ›å…‰è®¾ç½®ï¼Œä»¥é€‚应场景的照明和观察到的光线。" +"如果为 [code]true[/code],å¯ç”¨åœºæ™¯æ¸²æŸ“å™¨çš„è‰²è°ƒæ˜ å°„è‡ªåŠ¨æ›å…‰æ¨¡å¼ã€‚如果为 " +"[code]true[/code],渲染器将自动确定æ›å…‰è®¾ç½®ï¼Œä»¥é€‚应场景的照明和观察到的光线。" #: doc/classes/Environment.xml msgid "The maximum luminance value for the auto exposure." @@ -29125,21 +29161,21 @@ msgstr "自动æ›å…‰æ•ˆæžœçš„速度。影å“相机执行自动æ›å…‰æ‰€éœ€çš„æ—¶ #: doc/classes/Environment.xml msgid "The ID of the camera feed to show in the background." -msgstr "åœ¨èƒŒæ™¯ä¸æ˜¾ç¤ºçš„相机æºçš„ID。" +msgstr "åœ¨èƒŒæ™¯ä¸æ˜¾ç¤ºçš„相机æºçš„ ID。" #: doc/classes/Environment.xml msgid "" "The maximum layer ID to display. Only effective when using the [constant " "BG_CANVAS] background mode." -msgstr "è¦æ˜¾ç¤ºçš„æœ€å¤§å›¾å±‚IDã€‚åªæœ‰åœ¨ä½¿ç”¨ [constant BG_CANVAS] èƒŒæ™¯æ¨¡å¼æ—¶æœ‰æ•ˆã€‚" +msgstr "è¦æ˜¾ç¤ºçš„æœ€å¤§å›¾å±‚ IDã€‚åªæœ‰åœ¨ä½¿ç”¨ [constant BG_CANVAS] èƒŒæ™¯æ¨¡å¼æ—¶æœ‰æ•ˆã€‚" #: doc/classes/Environment.xml msgid "" "The [Color] displayed for clear areas of the scene. Only effective when " "using the [constant BG_COLOR] or [constant BG_COLOR_SKY] background modes)." msgstr "" -"åœºæ™¯ä¸æ¸…除区域显示的[Color]。仅在使用[constant BG_COLOR]或[constant " -"BG_COLOR_SKY]èƒŒæ™¯æ¨¡å¼æ—¶æœ‰æ•ˆã€‚" +"åœºæ™¯ä¸æ¸…除区域显示的 [Color]。仅在使用 [constant BG_COLOR] 或 [constant " +"BG_COLOR_SKY] èƒŒæ™¯æ¨¡å¼æ—¶æœ‰æ•ˆã€‚" #: doc/classes/Environment.xml msgid "The power of the light emitted by the background." @@ -29147,7 +29183,7 @@ msgstr "背景å‘出的光的功率。" #: doc/classes/Environment.xml msgid "The background mode. See [enum BGMode] for possible values." -msgstr "背景模å¼ã€‚请å‚阅[enum BGMode]了解å¯èƒ½çš„值。" +msgstr "背景模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum BGMode]。" #: doc/classes/Environment.xml msgid "The [Sky] resource defined as background." @@ -29180,7 +29216,7 @@ msgstr "è¿œæ™¯æ¨¡ç³Šæ•ˆæžœå½±å“æ¸²æŸ“çš„è·ç¦»ã€‚" #: doc/classes/Environment.xml msgid "If [code]true[/code], enables the depth-of-field far blur effect." -msgstr "如果[code]true[/code],å¯ç”¨æ™¯æ·±è¿œæ™¯æ¨¡ç³Šæ•ˆæžœã€‚" +msgstr "如果为 [code]true[/code],å¯ç”¨æ™¯æ·±è¿œæ™¯æ¨¡ç³Šæ•ˆæžœã€‚" #: doc/classes/Environment.xml msgid "" @@ -29205,7 +29241,7 @@ msgstr "è¿‘ä¼¼æ¨¡ç³Šæ•ˆæžœå½±å“æ¸²æŸ“的地方与相机的è·ç¦»ã€‚" #: doc/classes/Environment.xml msgid "If [code]true[/code], enables the depth-of-field near blur effect." -msgstr "如果[code]true[/code],å¯ç”¨æ™¯æ·±è¿‘模糊效果。" +msgstr "如果为 [code]true[/code],å¯ç”¨æ™¯æ·±è¿‘模糊效果。" #: doc/classes/Environment.xml msgid "" @@ -29221,7 +29257,7 @@ msgstr "è¿‘æ¨¡ç³Šå’Œæ— æ¨¡ç³ŠåŒºåŸŸä¹‹é—´çš„è¿‡æ¸¡é•¿åº¦ã€‚" #: doc/classes/Environment.xml msgid "The fog's [Color]." -msgstr "雾的[Color]。" +msgstr "雾的 [Color]。" #: doc/classes/Environment.xml msgid "The fog's depth starting distance from the camera." @@ -29247,8 +29283,8 @@ msgid "" "The fog's depth end distance from the camera. If this value is set to 0, it " "will be equal to the current camera's [member Camera.far] value." msgstr "" -"é›¾çš„æ·±åº¦ç»ˆç‚¹ä¸Žæ‘„åƒæœºçš„è·ç¦»ã€‚如果æ¤å€¼è¢«è®¾ç½®ä¸º0,则ç‰äºŽå½“剿‘„åƒæœºçš„[member " -"Camera.far]值。" +"é›¾çš„æ·±åº¦ç»ˆç‚¹ä¸Žæ‘„åƒæœºçš„è·ç¦»ã€‚如果æ¤å€¼è¢«è®¾ç½®ä¸º0,则ç‰äºŽå½“剿‘„åƒæœºçš„ [member " +"Camera.far] 值。" #: doc/classes/Environment.xml msgid "" @@ -29256,8 +29292,8 @@ msgid "" "and/or [member fog_depth_enabled] must be set to [code]true[/code] to " "actually display fog." msgstr "" -"如果[code]true[/code],则å¯ç”¨é›¾åŒ–效果。必须将[member fog_height_enabled]å’Œ/或" -"[member fog_depth_enabled]设置为 [code]true[/code],æ‰èƒ½å®žé™…显示雾气。" +"如果为 [code]true[/code],则å¯ç”¨é›¾åŒ–效果。必须将 [member fog_height_enabled] " +"å’Œ/或 [member fog_depth_enabled] 设置为 [code]true[/code],æ‰èƒ½å®žé™…显示雾气。" #: doc/classes/Environment.xml msgid "" @@ -29273,8 +29309,8 @@ msgid "" "performance cost compared to a dedicated shader." msgstr "" "如果为 [code]true[/code],则å¯ç”¨é«˜åº¦é›¾åŒ–效果。å¯ç”¨åŽï¼Œæ— 论与相机的è·ç¦»æœ‰å¤š" -"远,雾气都会出现在规定的高度范围内。这å¯ä»¥ç”¨æ¥æ¨¡æ‹Ÿ \"深水 \"效果,与专用ç€è‰²" -"å™¨ç›¸æ¯”ï¼Œæ€§èƒ½æˆæœ¬æ›´ä½Žã€‚" +"远,雾气都会出现在规定的高度范围内。这å¯ä»¥ç”¨æ¥æ¨¡æ‹Ÿâ€œæ·±æ°´â€æ•ˆæžœï¼Œä¸Žä¸“用ç€è‰²å™¨ç›¸" +"æ¯”ï¼Œæ€§èƒ½æˆæœ¬æ›´ä½Žã€‚" #: doc/classes/Environment.xml msgid "" @@ -29282,8 +29318,8 @@ msgid "" "value is greater than [member fog_height_min], fog will be displayed from " "bottom to top. Otherwise, it will be displayed from top to bottom." msgstr "" -"雾气高度最强的Yåæ ‡ã€‚如果这个值大于[member fog_height_min],雾气将从下往上显" -"示。å¦åˆ™ï¼Œå°†ä»Žä¸Šåˆ°ä¸‹æ˜¾ç¤ºã€‚" +"雾气高度最强的 Y åæ ‡ã€‚如果这个值大于 [member fog_height_min],雾气将从下往上" +"显示。å¦åˆ™ï¼Œå°†ä»Žä¸Šåˆ°ä¸‹æ˜¾ç¤ºã€‚" #: doc/classes/Environment.xml msgid "" @@ -29291,8 +29327,8 @@ msgid "" "value is greater than [member fog_height_max], fog will be displayed from " "top to bottom. Otherwise, it will be displayed from bottom to top." msgstr "" -"雾气高度最弱的Yåæ ‡ã€‚如果这个值大于[member fog_height_max],雾气将从上到下显" -"示。å¦åˆ™ï¼Œå°†ä»Žä¸‹å¾€ä¸Šæ˜¾ç¤ºã€‚" +"雾气高度最弱的 Y åæ ‡ã€‚如果这个值大于 [member fog_height_max],雾气将从上到下" +"显示。å¦åˆ™ï¼Œå°†ä»Žä¸‹å¾€ä¸Šæ˜¾ç¤ºã€‚" #: doc/classes/Environment.xml msgid "" @@ -29305,7 +29341,7 @@ msgstr "" #: doc/classes/Environment.xml msgid "The depth fog's [Color] when looking towards the sun." -msgstr "æœå¤ªé˜³çœ‹æ—¶ï¼Œæ·±é›¾çš„[Color]。" +msgstr "æœå¤ªé˜³çœ‹æ—¶ï¼Œæ·±é›¾çš„ [Color]。" #: doc/classes/Environment.xml msgid "" @@ -29318,8 +29354,8 @@ msgid "" "Enables fog's light transmission effect. If [code]true[/code], light will be " "more visible in the fog to simulate light scattering as in real life." msgstr "" -"å¯ç”¨é›¾çš„é€å…‰æ•ˆæžœã€‚如果[code]true[/code],光线在雾ä¸ä¼šæ›´åŠ æ˜Žæ˜¾ï¼Œä»¥æ¨¡æ‹ŸçŽ°å®žç”Ÿæ´»" -"ä¸çš„光散射。" +"å¯ç”¨é›¾çš„é€å…‰æ•ˆæžœã€‚如果为 [code]true[/code],光线在雾ä¸ä¼šæ›´åŠ æ˜Žæ˜¾ï¼Œä»¥æ¨¡æ‹ŸçŽ°å®ž" +"生活ä¸çš„光散射。" #: doc/classes/Environment.xml msgid "" @@ -29329,8 +29365,8 @@ msgid "" "GPU supports the [code]GL_EXT_gpu_shader4[/code] extension." msgstr "" "ä»¥ç‰ºç‰²æ€§èƒ½ä¸ºä»£ä»·ï¼Œæ¶ˆé™¤ç”±æ›´é«˜çº§åˆ«é‡‡æ ·äº§ç”Ÿçš„å—状效应。\n" -"[b]注æ„:[/b]使用 GLES2æ¸²æŸ“å™¨æ—¶ï¼Œåªæœ‰GPUæ”¯æŒ [code]GL_EXT_gpu_shader4[/code] " -"扩展时æ‰å¯ç”¨ã€‚" +"[b]注æ„:[/b]使用 GLES2 æ¸²æŸ“å™¨æ—¶ï¼Œåªæœ‰ GPU æ”¯æŒ [code]GL_EXT_gpu_shader4[/" +"code] 扩展时æ‰å¯ç”¨ã€‚" #: doc/classes/Environment.xml msgid "The glow blending mode." @@ -29491,7 +29527,7 @@ msgstr "å±å¹•空间åå°„çš„æœ€å¤§æ¥æ•°ã€‚数值越高,速度越慢。" msgid "" "If [code]true[/code], screen-space reflections will take the material " "roughness into account." -msgstr "如果 [code]true[/code],å±å¹•空间å射将考虑æè´¨ç²—糙度。" +msgstr "如果为 [code]true[/code],å±å¹•空间å射将考虑æè´¨ç²—糙度。" #: doc/classes/Environment.xml msgid "" @@ -29514,7 +29550,7 @@ msgstr "" msgid "" "The screen-space ambient occlusion blur quality. See [enum SSAOBlur] for " "possible values." -msgstr "å±å¹•空间环境光é®è”½è´¨é‡ã€‚å¯èƒ½çš„值请å‚阅 [enum SSAOBlur]。" +msgstr "å±å¹•空间环境光é®è”½è´¨é‡ã€‚å¯èƒ½çš„å–å€¼è§ [enum SSAOBlur]。" #: doc/classes/Environment.xml msgid "The screen-space ambient occlusion color." @@ -29534,8 +29570,8 @@ msgid "" "a costly effect and should be disabled first when running into performance " "issues." msgstr "" -"如果[code]true[/code],å¯ç”¨å±å¹•空间环境光é®è”½æ•ˆæžœã€‚这将使物体的角è½å’Œç©ºæ´žå˜" -"暗,以模拟现实生活ä¸çŽ¯å¢ƒå…‰æ— æ³•åˆ°è¾¾æ•´ä¸ªç‰©ä½“ã€‚è¿™å¯¹äºŽå°åž‹çš„动æ€ç‰©ä½“æ¥è¯´æ•ˆæžœå¾ˆ" +"如果为 [code]true[/code],å¯ç”¨å±å¹•空间环境光é®è”½æ•ˆæžœã€‚这将使物体的角è½å’Œç©ºæ´ž" +"å˜æš—,以模拟现实生活ä¸çŽ¯å¢ƒå…‰æ— æ³•åˆ°è¾¾æ•´ä¸ªç‰©ä½“ã€‚è¿™å¯¹äºŽå°åž‹çš„动æ€ç‰©ä½“æ¥è¯´æ•ˆæžœå¾ˆ" "å¥½ï¼Œä½†åœ¨å¤§åž‹é™æ€ç‰©ä½“上,烘焙的照明或环境光é®è”½çº¹ç†ä¼šæ›´å¥½åœ°æ˜¾ç¤ºçŽ¯å¢ƒå…‰é®è”½ã€‚è¿™" "是一个昂贵的效果,当é‡åˆ°æ€§èƒ½é—®é¢˜æ—¶ï¼Œåº”该首先ç¦ç”¨ã€‚" @@ -29626,8 +29662,8 @@ msgid "" "Clears the background using the clear color defined in [member " "ProjectSettings.rendering/environment/default_clear_color]." msgstr "" -"使用[member ProjectSettings.rendering/environment/default_clear_color]ä¸å®šä¹‰" -"的底色清除背景。" +"使用 [member ProjectSettings.rendering/environment/default_clear_color] ä¸å®š" +"义的底色清除背景。" #: doc/classes/Environment.xml msgid "Clears the background using a custom clear color." @@ -29644,13 +29680,13 @@ msgid "" "BG_SKY] and should be preferred in scenes where reflections can be visible, " "but the sky itself never is (e.g. top-down camera)." msgstr "" -"ä½¿ç”¨è‡ªå®šä¹‰çš„é€æ˜Žé¢œè‰²æ¸…除背景,并å…许定义天空的阴影和åå°„ã€‚è¿™ç§æ¨¡å¼æ¯”" -"[constant BG_SKY]ç¨å¿«ï¼Œåº”是在å¯ä»¥çœ‹åˆ°å射,但天空本身ä¸å¯è§çš„场景ä¸çš„首选,例" -"如,自上而下的相机。" +"ä½¿ç”¨è‡ªå®šä¹‰çš„é€æ˜Žé¢œè‰²æ¸…除背景,并å…许定义天空的阴影和åå°„ã€‚è¿™ç§æ¨¡å¼æ¯” " +"[constant BG_SKY] ç¨å¿«ï¼Œåº”是在å¯ä»¥çœ‹åˆ°å射,但天空本身ä¸å¯è§çš„场景ä¸çš„首选" +"(例如,自上而下的相机)。" #: doc/classes/Environment.xml msgid "Displays a [CanvasLayer] in the background." -msgstr "åœ¨èƒŒæ™¯ä¸æ˜¾ç¤º[CanvasLayer]。" +msgstr "åœ¨èƒŒæ™¯ä¸æ˜¾ç¤º [CanvasLayer]。" #: doc/classes/Environment.xml msgid "Displays a camera feed in the background." @@ -29658,7 +29694,7 @@ msgstr "åœ¨èƒŒæ™¯ä¸æ˜¾ç¤ºç›¸æœºæºã€‚" #: doc/classes/Environment.xml msgid "Represents the size of the [enum BGMode] enum." -msgstr "表示[enum BGMode]枚举的大å°ã€‚" +msgstr "表示 [enum BGMode] 枚举的大å°ã€‚" #: doc/classes/Environment.xml msgid "" @@ -29763,15 +29799,15 @@ msgstr "å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœä¸æ¨¡ç³Šï¼ˆæœ€å¿«ï¼‰ã€‚" #: doc/classes/Environment.xml msgid "1×1 blur for the screen-space ambient occlusion effect." -msgstr "1×1模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœã€‚" +msgstr "1×1 模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœã€‚" #: doc/classes/Environment.xml msgid "2×2 blur for the screen-space ambient occlusion effect." -msgstr "2×2模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœã€‚" +msgstr "2×2 模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœã€‚" #: doc/classes/Environment.xml msgid "3×3 blur for the screen-space ambient occlusion effect (slowest)." -msgstr "3×3模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœï¼ˆæœ€æ…¢ï¼‰ã€‚" +msgstr "3×3 模糊的å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœï¼ˆæœ€æ…¢ï¼‰ã€‚" #: doc/classes/Environment.xml msgid "Low quality for the screen-space ambient occlusion effect (fastest)." @@ -29787,7 +29823,7 @@ msgstr "高质é‡çš„å±å¹•ç©ºé—´çŽ¯å¢ƒé®æŒ¡æ•ˆæžœï¼ˆæœ€æ…¢ï¼‰ã€‚" #: doc/classes/Expression.xml msgid "A class that stores an expression you can execute." -msgstr "一个å˜å‚¨ä½ å¯ä»¥æ‰§è¡Œçš„表达å¼çš„类。" +msgstr "å˜å‚¨ä½ å¯ä»¥æ‰§è¡Œçš„表达å¼çš„类。" #: doc/classes/Expression.xml msgid "" @@ -29816,9 +29852,9 @@ msgid "" msgstr "" "表达å¼å¯ä»¥ç”±ä»»ä½•算术è¿ç®—ã€å†…置数å¦å‡½æ•°è°ƒç”¨ã€ä¼ é€’å®žä¾‹çš„æ–¹æ³•è°ƒç”¨æˆ–å†…ç½®ç±»åž‹æž„é€ " "调用组æˆã€‚\n" -"一个使用内置数å¦å‡½æ•°çš„è¡¨è¾¾å¼æ–‡æœ¬ç¤ºä¾‹å¯ä»¥æ˜¯[code]sqrt(pow(3,2)+pow(4,2))[/" +"一个使用内置数å¦å‡½æ•°çš„è¡¨è¾¾å¼æ–‡æœ¬ç¤ºä¾‹å¯ä»¥æ˜¯ [code]sqrt(pow(3,2)+pow(4,2))[/" "code]。\n" -"在下é¢çš„例åä¸ï¼Œæˆ‘们使用一个[LineEdit]节点æ¥å†™æˆ‘们的表达å¼å¹¶æ˜¾ç¤ºç»“果。\n" +"在下é¢çš„例åä¸ï¼Œæˆ‘们使用 [LineEdit] 节点æ¥å†™æˆ‘们的表达å¼å¹¶æ˜¾ç¤ºç»“果。\n" "[codeblock]\n" "onready var expression = Expression.new()\n" "\n" @@ -29843,18 +29879,18 @@ msgid "" "If you defined input variables in [method parse], you can specify their " "values in the inputs array, in the same order." msgstr "" -"执行之å‰ç”±[method parse]è§£æžçš„表达å¼ï¼Œå¹¶è¿”回结果。在使用返回的对象之å‰ï¼Œåº”该" -"通过调用 [method has_execute_failed] æ¥æ£€æŸ¥æ–¹æ³•是å¦å¤±è´¥ã€‚\n" +"执行之å‰ç”± [method parse] è§£æžçš„表达å¼ï¼Œå¹¶è¿”回结果。在使用返回的对象之å‰ï¼Œåº”" +"该通过调用 [method has_execute_failed] æ¥æ£€æŸ¥æ–¹æ³•是å¦å¤±è´¥ã€‚\n" "å¦‚æžœä½ åœ¨ [method parse] ä¸å®šä¹‰äº†è¾“å…¥å˜é‡ï¼Œä½ å¯ä»¥åœ¨è¾“入数组ä¸ä»¥åŒæ ·çš„é¡ºåºæŒ‡å®š" "它们的值。" #: doc/classes/Expression.xml msgid "Returns the error text if [method parse] has failed." -msgstr "如果[method parse]失败了,返回错误文本。" +msgstr "如果 [method parse] 失败了,返回错误文本。" #: doc/classes/Expression.xml msgid "Returns [code]true[/code] if [method execute] has failed." -msgstr "如果[method execute]失败,返回 [code]true[/code]。" +msgstr "如果 [method execute] 失败,返回 [code]true[/code]。" #: doc/classes/Expression.xml msgid "" @@ -29863,13 +29899,13 @@ msgid "" "expression with [code]input_names[/code], so that you can bind them when it " "gets executed." msgstr "" -"è§£æžè¡¨è¾¾å¼å¹¶è¿”回一个[enum Error]代ç 。\n" -"ä½ å¯ä»¥é€‰æ‹©ç”¨[code]input_names[/code]指定å¯èƒ½å‡ºçŽ°åœ¨è¡¨è¾¾å¼ä¸çš„å˜é‡åç§°ï¼Œè¿™æ ·ä½ " -"å°±å¯ä»¥åœ¨è¡¨è¾¾å¼è¢«æ‰§è¡Œæ—¶ç»‘定它们。" +"è§£æžè¡¨è¾¾å¼å¹¶è¿”回一个 [enum Error] 代ç 。\n" +"ä½ å¯ä»¥é€‰æ‹©ç”¨ [code]input_names[/code] 指定å¯èƒ½å‡ºçŽ°åœ¨è¡¨è¾¾å¼ä¸çš„å˜é‡åç§°ï¼Œè¿™æ ·" +"ä½ å°±å¯ä»¥åœ¨è¡¨è¾¾å¼è¢«æ‰§è¡Œæ—¶ç»‘定它们。" #: doc/classes/ExternalTexture.xml msgid "Enable OpenGL ES external texture extension." -msgstr "å¯ç”¨OpenGL ESå¤–éƒ¨çº¹ç†æ‰©å±•。" +msgstr "å¯ç”¨ OpenGL ES å¤–éƒ¨çº¹ç†æ‰©å±•。" #: doc/classes/ExternalTexture.xml msgid "" @@ -29878,10 +29914,10 @@ msgid "" "OES_EGL_image_external.txt]OES_EGL_image_external[/url].\n" "[b]Note:[/b] This is only supported for Android platforms." msgstr "" -"å¯ç”¨å¯¹OpenGL ESå¤–éƒ¨çº¹ç†æ‰©å±•的支æŒï¼Œå¦‚[url=https://www.khronos.org/registry/" -"OpenGL/extensions/OES/OES_EGL_image_external.txt]OES_EGL_image_external[/url]" -"所定义。\n" -"[b]注æ„:[/b]è¿™åªæ”¯æŒAndroidå¹³å°ã€‚" +"å¯ç”¨å¯¹ OpenGL ES å¤–éƒ¨çº¹ç†æ‰©å±•的支æŒï¼Œå¦‚ [url=https://www.khronos.org/" +"registry/OpenGL/extensions/OES/OES_EGL_image_external." +"txt]OES_EGL_image_external[/url] 所定义。\n" +"[b]注æ„:[/b]è¿™åªæ”¯æŒ Android å¹³å°ã€‚" #: doc/classes/ExternalTexture.xml msgid "Returns the external texture name." @@ -30131,7 +30167,7 @@ msgstr "" msgid "" "Returns an MD5 String representing the file at the given path or an empty " "[String] on failure." -msgstr "返回一个给定路径文件的MD5å—符串,如果失败则返回一个空的[String]。" +msgstr "返回一个给定路径文件的 MD5 å—符串,如果失败则返回一个空的 [String]。" #: doc/classes/File.xml msgid "" @@ -30140,9 +30176,9 @@ msgid "" "timestamp can be converted to datetime by using [method OS." "get_datetime_from_unix_time]." msgstr "" -"返回unixæ ¼å¼çš„æ—¶é—´æˆ³[code]file[/code]为文件的最åŽä¿®æ”¹æ—¶é—´ï¼Œæˆ–者返回一个" -"[String]\"ERROR IN [code]file[/code]\"。这个unix时间戳å¯ä»¥é€šè¿‡ä½¿ç”¨[method OS." -"get_datetime_from_unix_time]转æ¢ä¸ºæ•°æ®æ—¶é—´ã€‚" +"返回文件 [code]file[/code] 的最åŽä¿®æ”¹æ—¶é—´çš„ unix æ ¼å¼çš„æ—¶é—´æˆ³ï¼Œæˆ–者返回一个 " +"[String] \"ERROR IN [code]file[/code]\"。这个 unix 时间戳å¯ä»¥é€šè¿‡ä½¿ç”¨ " +"[method OS.get_datetime_from_unix_time] 转æ¢ä¸ºæ•°æ®æ—¶é—´ã€‚" #: doc/classes/File.xml msgid "" @@ -30368,8 +30404,8 @@ msgid "" "store the length of the string).\n" "Text will be encoded as UTF-8." msgstr "" -"将给定的[String]以Pascalæ ¼å¼å˜å‚¨åœ¨æ–‡ä»¶ä¸ï¼ˆä¾‹å¦‚,也将å—符串长度å˜å‚¨ï¼‰ã€‚\n" -"文本将被编ç 为UTF-8。" +"将给定的 [String] 以 Pascal æ ¼å¼å˜å‚¨åœ¨æ–‡ä»¶ä¸ï¼ˆå³åŒæ—¶å˜å‚¨å—符串的长度)。\n" +"将使用 UTF-8 ç¼–ç æ–‡æœ¬ã€‚" #: doc/classes/File.xml msgid "Stores a floating-point number in the file." @@ -30432,8 +30468,8 @@ msgstr "" "%E5%AD%97%E8%8A%82%E5%BA%8F]å—节åº[/url]读å–。为 [code]false[/code] 时文件以" "å°ç«¯å—节åºè¯»å–。如果ä¸ç¡®å®šï¼Œè¯·å°†å…¶ä¿ç•™ä¸º [code]false[/code]ï¼Œå› ä¸ºå¤§å¤šæ•°æ–‡ä»¶éƒ½" "是以å°ç«¯å—节åºç¼–写的。\n" -"[b]注æ„:[/b][member endian_swap] åªæ˜¯æ–‡ä»¶æ ¼å¼ï¼Œä¸Ž CPU ç±»åž‹æ— å…³ã€‚ CPU å—节åº" -"ä¸ä¼šå½±å“写入文件的默认å—节åºã€‚\n" +"[b]注æ„:[/b][member endian_swap] åªæ˜¯æ–‡ä»¶æ ¼å¼ï¼Œä¸Ž CPU ç±»åž‹æ— å…³ã€‚CPU å—节åºä¸" +"会影å“写入文件的默认å—节åºã€‚\n" "[b]注æ„:[/b]æ¯å½“您打开文件时,它总是é‡ç½®ä¸º [code]false[/code]ã€‚å› æ¤ï¼Œå¿…须在" "[i]打开文件之åŽ[/i]设置 [member endian_swap]ï¼Œè€Œä¸æ˜¯ä¹‹å‰ã€‚" @@ -30588,7 +30624,7 @@ msgid "" "Supported Images\"[/code] will show both PNG and JPEG files when selected." msgstr "" "å¯ç”¨çš„æ–‡ä»¶ç±»åž‹è¿‡æ»¤å™¨ã€‚例如,这仅显示 [code].png[/code] å’Œ [code].gd[/code] æ–‡" -"件: [code]set_filters(PoolStringArray([\"*.png ; PNG Images\", \"*.gd ; " +"件:[code]set_filters(PoolStringArray([\"*.png ; PNG Images\", \"*.gd ; " "GDScript Files\" ]))[/code]。å•个过滤器ä¸ä¹Ÿå¯ä»¥æŒ‡å®šå¤šä¸ªæ–‡ä»¶ç±»åž‹ã€‚é€‰ä¸ " "[code]\"*.png, *.jpg, *.jpeg ; Supported Images\"[/code] åŽä¼š PNG å’Œ JPEG æ–‡" "件都会显示。" @@ -30606,12 +30642,12 @@ msgid "" "window title accordingly (e.g. setting mode to [constant MODE_OPEN_FILE] " "will change the window title to \"Open a File\")." msgstr "" -"如果 [code]true[/code],更改 [code]Mode[/code] å±žæ€§å°†ç›¸åº”åœ°è®¾ç½®çª—å£æ ‡é¢˜ï¼ˆä¾‹" +"如果为 [code]true[/code],更改 [code]Mode[/code] å±žæ€§å°†ç›¸åº”åœ°è®¾ç½®çª—å£æ ‡é¢˜ï¼ˆä¾‹" "如,将模å¼è®¾ç½®ä¸º [constant MODE_OPEN_FILE] ä¼šå°†çª—å£æ ‡é¢˜æ›´æ”¹ä¸ºâ€œæ‰“开文件â€ï¼‰ã€‚" #: doc/classes/FileDialog.xml msgid "If [code]true[/code], the dialog will show hidden files." -msgstr "如果[code]true[/code]ï¼Œå¯¹è¯æ¡†å°†æ˜¾ç¤ºå‡ºéšè—文件。" +msgstr "如果为 [code]true[/code]ï¼Œå¯¹è¯æ¡†å°†æ˜¾ç¤ºå‡ºéšè—文件。" #: doc/classes/FileDialog.xml msgid "Emitted when the user selects a directory." @@ -30653,7 +30689,7 @@ msgstr "当文件å˜åœ¨æ—¶ï¼Œå¯¹è¯æ¡†ä¼šå‘出è¦å‘Šã€‚" msgid "" "The dialog only allows accessing files under the [Resource] path " "([code]res://[/code])." -msgstr "è¯¥å¯¹è¯æ¡†åªå…许访问[Resource]路径下的文件([code]res://[/code])。" +msgstr "è¯¥å¯¹è¯æ¡†åªå…许访问 [Resource] 路径下的文件([code]res://[/code])。" #: doc/classes/FileDialog.xml msgid "" @@ -30673,7 +30709,7 @@ msgstr "åº”ç”¨äºŽæ–‡ä»¶å›¾æ ‡çš„é¢œè‰²è°ƒåˆ¶ã€‚" msgid "" "The color tint for disabled files (when the [FileDialog] is used in open " "folder mode)." -msgstr "ç¦ç”¨æ–‡ä»¶çš„色调(当[FileDialog]在打开文件夹模å¼ä¸‹ä½¿ç”¨æ—¶ï¼‰ã€‚" +msgstr "ç¦ç”¨æ–‡ä»¶çš„色调(当 [FileDialog] 在打开文件夹模å¼ä¸‹ä½¿ç”¨æ—¶ï¼‰ã€‚" #: doc/classes/FileDialog.xml msgid "The color modulation applied to the folder icon." @@ -30832,8 +30868,8 @@ msgid "" "from the top, [i]ascent[/i] must be added to the Y axis.\n" "See also [method CanvasItem.draw_string]." msgstr "" -"在给定ä½ç½®ä½¿ç”¨å—体将[code]string[/code]绘制到画布项目ä¸ï¼Œå¹¶ä½¿ç”¨" -"[code]modulate[/code]颜色,并å¯ä»¥é€‰æ‹©è£å‰ªå®½åº¦ã€‚ [code]position[/code]指定基" +"在给定ä½ç½®ä½¿ç”¨å—体将 [code]string[/code] 绘制到画布项目ä¸ï¼Œå¹¶ä½¿ç”¨ " +"[code]modulate[/code] 颜色,并å¯ä»¥é€‰æ‹©è£å‰ªå®½åº¦ã€‚[code]position[/code] 指定基" "çº¿ï¼Œè€Œä¸æ˜¯é¡¶éƒ¨ã€‚è¦ä»Žé¡¶éƒ¨ç»˜åˆ¶ï¼Œå¿…须在 Y è½´ä¸Šæ·»åŠ [i]å‡éƒ¨[/i]。\n" "å¦è¯·å‚阅 [method CanvasItem.draw_string]。" @@ -30969,10 +31005,10 @@ msgid "" "function, a reference to a function in a given object can be created, passed " "around and called." msgstr "" -"在GDScriptä¸ï¼Œå‡½æ•°ä¸æ˜¯[i]第一类对象[/i]。这æ„味ç€ä¸å¯èƒ½å°†å®ƒä»¬ç›´æŽ¥ä½œä¸ºå˜é‡å˜" +"在 GDScript ä¸ï¼Œå‡½æ•°ä¸æ˜¯[i]第一类对象[/i]。这æ„味ç€ä¸å¯èƒ½å°†å®ƒä»¬ç›´æŽ¥ä½œä¸ºå˜é‡å˜" "储,从å¦ä¸€ä¸ªå‡½æ•°ä¸è¿”å›žï¼Œæˆ–å°†å®ƒä»¬ä½œä¸ºå‚æ•°ä¼ 递。\n" -"然而,通过使用[method @GDScript.funcref]函数创建一个[FuncRef],å¯ä»¥åˆ›å»ºã€ä¼ 递" -"和调用给定对象ä¸çš„一个函数的引用。" +"然而,通过使用 [method @GDScript.funcref] 函数创建一个 [FuncRef],å¯ä»¥åˆ›å»ºã€" +"ä¼ é€’å’Œè°ƒç”¨ç»™å®šå¯¹è±¡ä¸çš„一个函数的引用。" #: doc/classes/FuncRef.xml msgid "" @@ -31002,8 +31038,8 @@ msgid "" "actually inheriting from [Object], not a built-in type such as [int], " "[Vector2] or [Dictionary]." msgstr "" -"包å«è¢«å¼•用函数的对象。这个对象必须是实际继承自[Object]çš„ç±»åž‹ï¼Œè€Œä¸æ˜¯åƒ[int]ã€" -"[Vector2]或[Dictionary]è¿™æ ·çš„å†…ç½®ç±»åž‹ã€‚" +"包å«è¢«å¼•用函数的对象。这个对象必须是实际继承自 [Object] çš„ç±»åž‹ï¼Œè€Œä¸æ˜¯åƒ " +"[int]ã€[Vector2]ã€[Dictionary] è¿™æ ·çš„å†…ç½®ç±»åž‹ã€‚" #: doc/classes/FuncRef.xml msgid "The name of the referenced function." @@ -31012,7 +31048,7 @@ msgstr "被引用函数的å称。" #: modules/gdnative/doc_classes/GDNativeLibrary.xml msgid "" "An external library containing functions or script classes to use in Godot." -msgstr "一个包å«å‡½æ•°æˆ–脚本类的外部库,å¯ä»¥åœ¨Godotä¸ä½¿ç”¨ã€‚" +msgstr "包å«å‡½æ•°æˆ–脚本类的外部库,å¯ä»¥åœ¨ Godot ä¸ä½¿ç”¨ã€‚" #: modules/gdnative/doc_classes/GDNativeLibrary.xml msgid "" @@ -31066,8 +31102,8 @@ msgid "" "[code]reloadable[/code] must be [code]false[/code]. Otherwise, the editor " "will attempt to unload the tool scripts while they're in use and crash." msgstr "" -"如果[code]true[/code],æ¯å½“ç”¨æˆ·ç¦»å¼€ç¼–è¾‘å™¨çª—å£æ—¶ï¼Œç¼–辑器会暂时å¸è½½åº“,å…许用户" -"釿–°ç¼–译库,而ä¸éœ€è¦é‡æ–°å¯åЍGodot。\n" +"如果为 [code]true[/code],æ¯å½“ç”¨æˆ·ç¦»å¼€ç¼–è¾‘å™¨çª—å£æ—¶ï¼Œç¼–辑器会暂时å¸è½½åº“,å…许" +"ç”¨æˆ·é‡æ–°ç¼–译库,而ä¸éœ€è¦é‡æ–°å¯åЍGodot。\n" "[b]注æ„:[/b]如果库定义了在编辑器内è¿è¡Œçš„工具脚本,[code]reloadable[/code]å¿…" "须是[code]false[/code]。å¦åˆ™ï¼Œç¼–辑器会在工具脚本æ£åœ¨ä½¿ç”¨çš„æ—¶å€™å°è¯•å¸è½½å®ƒä»¬æ—¶" "而崩溃。" @@ -31081,8 +31117,8 @@ msgid "" "loaded as long as Godot is running.\n" "[b]Note:[/b] A singleton library cannot be [member reloadable]." msgstr "" -"如果[code]true[/code],Godot会在å¯åŠ¨æ—¶åŠ è½½åº“ï¼Œè€Œä¸æ˜¯åœ¨è„šæœ¬ç¬¬ä¸€æ¬¡ä½¿ç”¨åº“æ—¶ï¼Œåœ¨" -"åˆå§‹åŒ–库åŽè°ƒç”¨[code]{prefix}gdnative_singleton[/code](其ä¸[code]{prefix}[/" +"如果为 [code]true[/code],Godot会在å¯åŠ¨æ—¶åŠ è½½åº“ï¼Œè€Œä¸æ˜¯åœ¨è„šæœ¬ç¬¬ä¸€æ¬¡ä½¿ç”¨åº“æ—¶ï¼Œ" +"在åˆå§‹åŒ–库åŽè°ƒç”¨[code]{prefix}gdnative_singleton[/code](其ä¸[code]{prefix}[/" "code]是[member symbol_prefix]的值)。åªè¦Godot在è¿è¡Œï¼Œè¯¥åº“å°±ä¸€ç›´è¢«åŠ è½½ã€‚\n" "[b]注æ„:[/b]å•例库ä¸èƒ½æ˜¯[member reloadable]。" @@ -31101,7 +31137,7 @@ msgstr "" #: modules/gdscript/doc_classes/GDScript.xml msgid "A script implemented in the GDScript programming language." -msgstr "一个用 GDScript 编程è¯è¨€å®žçŽ°çš„è„šæœ¬ã€‚" +msgstr "用 GDScript 编程è¯è¨€å®žçŽ°çš„è„šæœ¬ã€‚" #: modules/gdscript/doc_classes/GDScript.xml msgid "" @@ -31140,7 +31176,7 @@ msgstr "" #: modules/gdscript/doc_classes/GDScriptFunctionState.xml msgid "State of a function call after yielding." -msgstr "一个函数在调用åŽå¤±æ•ˆçš„状æ€ã€‚" +msgstr "函数调用在 yield åŽæ‰€å¤„的状æ€ã€‚" #: modules/gdscript/doc_classes/GDScriptFunctionState.xml msgid "" @@ -31180,7 +31216,7 @@ msgid "" msgstr "" "ç»§ç»æ‰§è¡Œè®©æ¥çš„函数调用。\n" "å¦‚æžœä¼ é€’äº†ä¸€ä¸ªå‚æ•°ï¼Œåˆ™ä»Žäº§ç”Ÿçš„函数调用ä¸çš„ [method @GDScript.yield] 调用返回" -"傿•°ã€‚ä½ å¯ä»¥é€šè¿‡ä¾‹å¦‚一个 [Array] æ¥å¤„ç†å¤šä¸ªå‚数。 \n" +"傿•°ã€‚ä½ å¯ä»¥é€šè¿‡ä¾‹å¦‚一个 [Array] æ¥å¤„ç†å¤šä¸ªå‚数。\n" "æ¤å‡½æ•°è¿”回接ç»çš„函数调用åŽè¿”å›žçš„å†…å®¹ï¼Œå¦‚æžœå†æ¬¡æ¢å¤è°ƒç”¨ï¼Œå¯èƒ½æ˜¯å¦ä¸€ä¸ªå‡½æ•°çж" "æ€ã€‚" @@ -31188,7 +31224,8 @@ msgstr "" msgid "" "The generic 6-degrees-of-freedom joint can implement a variety of joint " "types by locking certain axes' rotation or translation." -msgstr "通用的6度自由度关节å¯ä»¥é€šè¿‡é”定æŸäº›è½´çš„æ—‹è½¬æˆ–平移æ¥å®žçްå„ç§å…³èŠ‚ç±»åž‹ã€‚" +msgstr "" +"通用的 6 度自由度关节å¯ä»¥é€šè¿‡é”定æŸäº›è½´çš„æ—‹è½¬æˆ–平移æ¥å®žçްå„ç§å…³èŠ‚ç±»åž‹ã€‚" #: doc/classes/Generic6DOFJoint.xml msgid "" @@ -31196,8 +31233,8 @@ msgid "" "and the latter 3 DOF axes represent the angular motion. Each axis can be " "either locked, or limited." msgstr "" -"å‰3个DOF轴是线性轴,代表物体的平移,åŽ3个DOF轴代表角è¿åŠ¨ã€‚æ¯ä¸ªè½´å¯ä»¥è¢«é”定," -"也å¯ä»¥è¢«é™åˆ¶ã€‚" +"å‰ 3 个 DOF è½´æ˜¯çº¿æ€§è½´ï¼Œä»£è¡¨ç‰©ä½“çš„å¹³ç§»ï¼ŒåŽ 3 个 DOF 轴代表角è¿åŠ¨ã€‚æ¯ä¸ªè½´å¯ä»¥" +"被é”定,也å¯ä»¥è¢«é™åˆ¶ã€‚" #: doc/classes/Generic6DOFJoint.xml msgid "" @@ -31634,8 +31671,8 @@ msgid "" "at the origin. The box size is defined by [code]extents[/code], which " "represents one (positive) corner of the box (i.e. half its actual size)." msgstr "" -"返回一个包å«6个[Plane]的数组,æè¿°ä»¥åŽŸç‚¹ä¸ºä¸å¿ƒçš„ç›’å的边。盒å的大å°ç”±" -"[code]extents[/code]定义,它代表盒å的一个(æ£ï¼‰è§’(å³å…¶å®žé™…大å°çš„一åŠï¼‰ã€‚" +"è¿”å›žä¸€ä¸ªåŒ…å« 6 个 [Plane] 的数组,æè¿°ä»¥åŽŸç‚¹ä¸ºä¸å¿ƒçš„ç›’å的边。盒å的大å°ç”± " +"[code]extents[/code] 定义,它代表盒å的一个(æ£ï¼‰è§’(å³å…¶å®žé™…大å°çš„一åŠï¼‰ã€‚" #: doc/classes/Geometry.xml msgid "" @@ -31647,10 +31684,11 @@ msgid "" "[code]axis[/code] describes the axis along which the capsule is oriented (0 " "for X, 1 for Y, 2 for Z)." msgstr "" -"返回一个[Plane]数组,该数组紧密地绑定ç€ä¸€ä¸ªä»¥åŽŸç‚¹ä¸ºä¸å¿ƒï¼ŒåŠå¾„为[code]radius[/" -"code],高度为[code]height[/code]çš„é¢çŠ¶èƒ¶å›Šã€‚å‚æ•°[code]side[/code]定义了将为胶" -"囊的侧é¢éƒ¨åˆ†ç”Ÿæˆå¤šå°‘个平é¢ï¼Œè€Œ[code]lats[/code]则给出了胶囊底部和顶部的纬å‘阶" -"æ¢¯æ•°ã€‚å‚æ•°[code]axis[/code]æè¿°äº†èƒ¶å›Šçš„æ–¹å‘轴(0为X,1为Y,2为Z)。" +"返回一个 [Plane] 数组,该数组紧密地绑定ç€ä¸€ä¸ªä»¥åŽŸç‚¹ä¸ºä¸å¿ƒï¼ŒåŠå¾„为 " +"[code]radius[/code],高度为 [code]height[/code] çš„é¢çŠ¶èƒ¶å›Šã€‚å‚æ•° [code]side[/" +"code] 定义了将为胶囊的侧é¢éƒ¨åˆ†ç”Ÿæˆå¤šå°‘个平é¢ï¼Œè€Œ [code]lats[/code] 则给出了胶" +"囊底部和顶部的纬å‘é˜¶æ¢¯æ•°ã€‚å‚æ•° [code]axis[/code] æè¿°äº†èƒ¶å›Šçš„æ–¹å‘轴(0 代表 " +"Xã€1 代表 Yã€2 代表 Z)。" #: doc/classes/Geometry.xml msgid "" @@ -31661,18 +31699,18 @@ msgid "" "describes the axis along which the cylinder is oriented (0 for X, 1 for Y, 2 " "for Z)." msgstr "" -"返回一个[Plane]数组,该数组紧密绑定以原点为ä¸å¿ƒçš„切é¢åœ†æŸ±ä½“,其åŠå¾„为" -"[code]radius[/code],高度为[code]height[/code]ã€‚å‚æ•°[code]side[/code]定义了将" -"为圆柱体的圆形部分生æˆå¤šå°‘个平é¢ã€‚傿•°[code]axis[/code]æè¿°äº†åœ†æŸ±ä½“的方å‘è½´" -"(0代表X,1代表Y,2代表Z)。" +"返回一个 [Plane] 数组,该数组紧密绑定以原点为ä¸å¿ƒçš„切é¢åœ†æŸ±ä½“,其åŠå¾„为 " +"[code]radius[/code],高度为 [code]height[/code]ã€‚å‚æ•° [code]side[/code] 定义" +"了将为圆柱体的圆形部分生æˆå¤šå°‘个平é¢ã€‚傿•° [code]axis[/code] æè¿°äº†åœ†æŸ±ä½“的方" +"å‘轴(0 代表 Xã€1 代表 Yã€2 代表 Z)。" #: doc/classes/Geometry.xml msgid "" "Clips the polygon defined by the points in [code]points[/code] against the " "[code]plane[/code] and returns the points of the clipped polygon." msgstr "" -"å°†[code]point[/code]ä¸çš„点所定义的多边形与[code]plane[/code]进行对比,并返回" -"被剪切的多边形的点。" +"å°† [code]point[/code] ä¸çš„点所定义的多边形与 [code]plane[/code] 进行对比,并" +"返回被剪切的多边形的点。" #: doc/classes/Geometry.xml msgid "" @@ -31684,11 +31722,13 @@ msgid "" "outer polygon (boundary) and inner polygon (hole) which could be " "distinguished by calling [method is_polygon_clockwise]." msgstr "" -"å°†[code]polygon_a[/code]与[code]polygon_b[/code]进行对比,并返回一个被剪切的" -"多边形数组。这在多边形之间执行[constant OPERATION_DIFFERENCE]。如果" -"[code]polygon_b[/code]与[code]polygon_a[/code]完全é‡åˆï¼Œåˆ™è¿”回一个空数组。\n" -"如果[code]polygon_b[/code]被[code]polygon_a[/code]包围,返回一个外部多边形" -"(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨[method is_polygon_clockwise]æ¥åŒºåˆ†ã€‚" +"å°† [code]polygon_a[/code] 与 [code]polygon_b[/code] 进行对比,并返回一个被剪" +"切的多边形数组。这在多边形之间执行 [constant OPERATION_DIFFERENCE]。如果 " +"[code]polygon_b[/code] 与 [code]polygon_a[/code] 完全é‡åˆï¼Œåˆ™è¿”回一个空数" +"组。\n" +"如果 [code]polygon_b[/code] 被 [code]polygon_a[/code] 包围,返回一个外部多边" +"形(边界)和内部多边形(å”),å¯ä»¥é€šè¿‡è°ƒç”¨ [method is_polygon_clockwise] æ¥åŒº" +"分。" #: doc/classes/Geometry.xml msgid "" @@ -31697,16 +31737,16 @@ msgid "" "between the polyline and the polygon. This operation can be thought of as " "cutting a line with a closed shape." msgstr "" -"å°†[code]polyline[/code]与[code]polygon[/code]相对应,并返回一个折线数组。在折" -"线和多边形之间执行[constant OPERATION_DIFFERENCE]。这个æ“作å¯ä»¥è¢«è®¤ä¸ºæ˜¯ç”¨ä¸€ä¸ª" -"å°é—的形状切割一æ¡çº¿ã€‚" +"å°† [code]polyline[/code] 与 [code]polygon[/code] 相对应,并返回一个折线数组。" +"在折线和多边形之间执行 [constant OPERATION_DIFFERENCE]。这个æ“作å¯ä»¥è¢«è®¤ä¸ºæ˜¯" +"用一个å°é—的形状切割一æ¡çº¿ã€‚" #: doc/classes/Geometry.xml msgid "" "Given an array of [Vector2]s, returns the convex hull as a list of points in " "counterclockwise order. The last point is the same as the first one." msgstr "" -"给出一个[Vector2]s的数组,以逆时针的顺åºè¿”回凸é¢çš„点的列表。最åŽä¸€ä¸ªç‚¹ä¸Žç¬¬ä¸€" +"给出一个 [Vector2] 的数组,以逆时针的顺åºè¿”回凸é¢çš„点的列表。最åŽä¸€ä¸ªç‚¹ä¸Žç¬¬ä¸€" "个点相åŒã€‚" #: doc/classes/Geometry.xml @@ -31733,8 +31773,8 @@ msgid "" "that is closest to [code]point[/code]. The returned point will always be " "inside the specified segment." msgstr "" -"返回3D部份([code]s1[/code], [code]s2[/code])上离[code]point[/code]最近的3D" -"点。返回的点将总是在指定的部份内。" +"返回 3D 线段([code]s1[/code], [code]s2[/code])上离 [code]point[/code] 最近" +"çš„ 3D 点。返回的点将总是在指定的部份内。" #: doc/classes/Geometry.xml msgid "" @@ -31742,8 +31782,8 @@ msgid "" "that is closest to [code]point[/code]. The returned point will always be " "inside the specified segment." msgstr "" -"返回2D段([code]s1[/code], [code]s2[/code])上最接近[code]point[/code]çš„2D" -"点。返回的点将总是在指定的线段内。" +"返回 2D 线段 ([code]s1[/code], [code]s2[/code]) 上离 [code]point[/code] 最近" +"çš„ 2D 点。返回的点将总是在指定的线段内。" #: doc/classes/Geometry.xml msgid "" @@ -31988,8 +32028,8 @@ msgid "" msgstr "" "给出2D线段([code]segment_from[/code],[code]segment_to[/code]),返回线段上" "与圆心为 [code]circle_position[/code] ã€åŠå¾„为 [code]circle_radius[/code] 圆" -"的相交ä½ç½®ï¼ˆä»¥0到1之间的数å—)。如果线段没有与圆相交,则返回-1(如果延伸线段" -"çš„çº¿æ®µä¸Žåœ†ç›¸äº¤ï¼Œä½†çº¿æ®µæ²¡æœ‰ç›¸äº¤ï¼Œä¹Ÿæ˜¯è¿™ç§æƒ…况)。" +"的相交ä½ç½®ï¼ˆä»¥0 到 1之间的数å—)。如果线段没有与圆相交,则返回-1(如果延伸线" +"æ®µçš„çº¿æ®µä¸Žåœ†ç›¸äº¤ï¼Œä½†çº¿æ®µæ²¡æœ‰ç›¸äº¤ï¼Œä¹Ÿæ˜¯è¿™ç§æƒ…况)。" #: doc/classes/Geometry.xml msgid "" @@ -32109,7 +32149,7 @@ msgstr "åˆ›å»ºä¸»ä½“æˆ–å‰ªè¾‘å¤šè¾¹å½¢è¢«å¡«å……çš„åŒºåŸŸï¼Œä½†ä¸æ˜¯ä¸¤è€…都被 msgid "" "Squaring is applied uniformally at all convex edge joins at [code]1 * delta[/" "code]." -msgstr "在[code]1 * delta[/code]的所有凸边连接处å‡åŒ€åœ°åº”用平方。" +msgstr "在 [code]1 * delta[/code] 的所有凸边连接处å‡åŒ€åœ°åº”用平方。" #: doc/classes/Geometry.xml msgid "" @@ -32133,13 +32173,13 @@ msgstr "" msgid "" "Endpoints are joined using the [enum PolyJoinType] value and the path filled " "as a polygon." -msgstr "端点使用[enum PolyJoinType]值连接,路径被填充为多边形。" +msgstr "端点使用 [enum PolyJoinType] 值连接,路径被填充为多边形。" #: doc/classes/Geometry.xml msgid "" "Endpoints are joined using the [enum PolyJoinType] value and the path filled " "as a polyline." -msgstr "端点使用[enum PolyJoinType]值连接,路径被填充为多边形线。" +msgstr "端点使用 [enum PolyJoinType] 值连接,路径被填充为多边形线。" #: doc/classes/Geometry.xml msgid "Endpoints are squared off with no extension." @@ -32147,11 +32187,11 @@ msgstr "端点是方形的,没有延伸。" #: doc/classes/Geometry.xml msgid "Endpoints are squared off and extended by [code]delta[/code] units." -msgstr "端点被平方化并扩展了[code]delta[/code]å•ä½ã€‚" +msgstr "端点被平方化并扩展了 [code]delta[/code] å•ä½ã€‚" #: doc/classes/Geometry.xml msgid "Endpoints are rounded off and extended by [code]delta[/code] units." -msgstr "端点被四èˆäº”入,并以[code]delta[/code]为å•ä½è¿›è¡Œæ‰©å±•。" +msgstr "端点被四èˆäº”入,并以 [code]delta[/code] 为å•ä½è¿›è¡Œæ‰©å±•。" #: doc/classes/GeometryInstance.xml msgid "Base node for geometry-based visual instances." @@ -32167,7 +32207,7 @@ msgstr "" #: doc/classes/GeometryInstance.xml msgid "" "Returns the [enum GeometryInstance.Flags] that have been set for this object." -msgstr "返回为æ¤å¯¹è±¡è®¾ç½®çš„[enum GeometryInstance.Flags] 。" +msgstr "返回为æ¤å¯¹è±¡è®¾ç½®çš„ [enum GeometryInstance.Flags] 。" #: doc/classes/GeometryInstance.xml msgid "" @@ -32189,8 +32229,7 @@ msgstr "" msgid "" "The selected shadow casting flag. See [enum ShadowCastingSetting] for " "possible values." -msgstr "" -"é€‰æ‹©çš„é˜´å½±æŠ•å°„æ ‡å¿—ã€‚è½¬åˆ° [enum ShadowCastingSetting] æ¥æŸ¥çœ‹è¯¥å±žæ€§å¯èƒ½çš„值。" +msgstr "é€‰æ‹©çš„é˜´å½±æŠ•å°„æ ‡å¿—ã€‚å¯èƒ½çš„å–å€¼è§ [enum ShadowCastingSetting]。" #: doc/classes/GeometryInstance.xml msgid "" @@ -32269,8 +32308,8 @@ msgid "" "If [code]true[/code], this GeometryInstance will be used when baking lights " "using a [GIProbe] or [BakedLightmap]." msgstr "" -"如果 [code]true[/code],则在使用 [GIProbe] 或 [BakedLightmap] 烘焙ç¯å…‰æ—¶å°†ä½¿" -"ç”¨æ¤ GeometryInstance。" +"如果为 [code]true[/code],则在使用 [GIProbe] 或 [BakedLightmap] 烘焙ç¯å…‰æ—¶å°†" +"ä½¿ç”¨æ¤ GeometryInstance。" #: doc/classes/GeometryInstance.xml msgid "The generated lightmap texture will have the original size." @@ -32324,8 +32363,8 @@ msgid "" "Will allow the GeometryInstance to be used when baking lights using a " "[GIProbe] or [BakedLightmap]." msgstr "" -"å°†å…许在使用[GIProbe]或[BakedLightmap]进行ç¯å…‰çƒ˜ç„™æ—¶ä½¿ç”¨GeometryInstanceå‡ ä½•" -"实例。" +"å°†å…许在使用 [GIProbe] 或 [BakedLightmap] 进行ç¯å…‰çƒ˜ç„™æ—¶ä½¿ç”¨ " +"GeometryInstance å‡ ä½•å®žä¾‹ã€‚" #: doc/classes/GeometryInstance.xml msgid "" @@ -32503,16 +32542,16 @@ msgid "" "Use 64 subdivisions. This is the lowest quality setting, but the fastest. " "Use it if you can, but especially use it on lower-end hardware." msgstr "" -"使用64分区,这是最低的质é‡è®¾ç½®ï¼Œä½†ä¹Ÿæ˜¯æœ€å¿«çš„ã€‚å¦‚æžœä½ èƒ½ä½¿ç”¨å®ƒï¼Œç‰¹åˆ«æ˜¯åœ¨ä½Žç«¯ç¡¬" -"件上使用它。" +"使用 64 分区,这是最低的质é‡è®¾ç½®ï¼Œä½†ä¹Ÿæ˜¯æœ€å¿«çš„ã€‚å¦‚æžœä½ èƒ½ä½¿ç”¨å®ƒï¼Œç‰¹åˆ«æ˜¯åœ¨ä½Žç«¯" +"硬件上使用它。" #: doc/classes/GIProbe.xml msgid "Use 128 subdivisions. This is the default quality setting." -msgstr "使用128个分区。这是默认的质é‡è®¾ç½®ã€‚" +msgstr "使用 128 个分区。这是默认的质é‡è®¾ç½®ã€‚" #: doc/classes/GIProbe.xml msgid "Use 256 subdivisions." -msgstr "使用256个分区。" +msgstr "使用 256 个分区。" #: doc/classes/GIProbe.xml msgid "" @@ -32592,7 +32631,7 @@ msgstr "" msgid "" "The [Color] of the light. Defaults to white. A black color causes the light " "to have no effect." -msgstr "ç¯çš„[Color]。默认为白色。黑色会导致ç¯å…‰æ— 效。" +msgstr "ç¯çš„ [Color]。默认为白色。黑色会导致ç¯å…‰æ— 效。" #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32638,8 +32677,8 @@ msgid "" "with no range defined behave like physical lights (which have infinite " "range). When creating a Godot light, the range is clamped to 4096." msgstr "" -"ç¯å…‰çš„范围,超过这个范围ç¯å…‰æ— 效。没有定义范围的GLTFç¯å…‰çš„è¡Œä¸ºä¸Žæ— é™èŒƒå›´çš„物" -"ç†ç¯å…‰ä¸€æ ·ã€‚当创建Godotç¯å…‰æ—¶ï¼ŒèŒƒå›´é™åˆ¶åœ¨4096。" +"ç¯å…‰çš„范围,超过这个范围ç¯å…‰æ— 效。没有定义范围的 GLTF ç¯å…‰çš„è¡Œä¸ºä¸Žæ— é™èŒƒå›´çš„" +"物ç†ç¯å…‰ä¸€æ ·ã€‚当创建 Godot ç¯å…‰æ—¶ï¼ŒèŒƒå›´é™åˆ¶åœ¨ 4096。" #: modules/gltf/doc_classes/GLTFLight.xml msgid "" @@ -32647,8 +32686,8 @@ msgid "" "and \"directional\", which correspond to Godot's [OmniLight], [SpotLight], " "and [DirectionalLight] respectively." msgstr "" -"ç¯å…‰çš„类型。Godot接å—的值是 \"point\"ã€\"spot\"å’Œ \"directional\",分别对应于" -"Godotçš„[OmniLight]ã€[SpotLight]å’Œ[DirectionalLight]。" +"ç¯å…‰çš„类型。Godot 接å—的值是“pointâ€â€œspotâ€â€œdirectionalâ€ï¼Œåˆ†åˆ«å¯¹åº”于 Godot çš„ " +"[OmniLight]ã€[SpotLight]ã€[DirectionalLight]。" #: modules/gltf/doc_classes/GLTFMesh.xml msgid "" @@ -32711,7 +32750,7 @@ msgstr "" #: modules/mono/doc_classes/GodotSharp.xml msgid "Bridge between Godot and the Mono runtime (Mono-enabled builds only)." -msgstr "Godotå’ŒMonoè¿è¡Œæ—¶ä¹‹é—´çš„æ¡¥æ¢ï¼ˆä»…支æŒMono的构建)。" +msgstr "Godot å’Œ Mono è¿è¡Œæ—¶ä¹‹é—´çš„æ¡¥æ¢ï¼ˆä»…æ”¯æŒ Mono 的构建)。" #: modules/mono/doc_classes/GodotSharp.xml msgid "" @@ -32720,17 +32759,17 @@ msgid "" "builds.\n" "See also [CSharpScript]." msgstr "" -"该类是连接Godotå’ŒMonoè¿è¡Œæ—¶çš„æ¡¥æ¢ã€‚它暴露了一些低级别的æ“作,åªåœ¨æ”¯æŒMonoçš„" -"Godot构建ä¸å¯ç”¨ã€‚\n" -"å‚阅[CSharpScript] 。" +"该类是连接 Godot å’Œ Mono è¿è¡Œæ—¶çš„æ¡¥æ¢ã€‚它暴露了一些低级别的æ“作,åªåœ¨æ”¯æŒ " +"Mono çš„ Godot 构建ä¸å¯ç”¨ã€‚\n" +"å‚阅 [CSharpScript] 。" #: modules/mono/doc_classes/GodotSharp.xml msgid "Attaches the current thread to the Mono runtime." -msgstr "将当å‰çº¿ç¨‹è¿žæŽ¥åˆ°Monoè¿è¡Œæ—¶ã€‚" +msgstr "将当å‰çº¿ç¨‹è¿žæŽ¥åˆ° Mono è¿è¡Œæ—¶ã€‚" #: modules/mono/doc_classes/GodotSharp.xml msgid "Detaches the current thread from the Mono runtime." -msgstr "将当å‰çº¿ç¨‹ä»ŽMonoè¿è¡Œæ—¶ä¸åˆ†ç¦»å‡ºæ¥ã€‚" +msgstr "将当å‰çº¿ç¨‹ä»Ž Mono è¿è¡Œæ—¶ä¸åˆ†ç¦»å‡ºæ¥ã€‚" #: modules/mono/doc_classes/GodotSharp.xml msgid "" @@ -32739,9 +32778,9 @@ msgid "" "(use [method is_runtime_initialized] to check). If the Mono runtime isn't " "initialized at the time this method is called, the engine will crash." msgstr "" -"返回当å‰çš„MonoDomain ID。\n" -"[b]注æ„:[/b]Monoè¿è¡Œæ—¶å¿…须被åˆå§‹åŒ–,这个方法æ‰èƒ½å·¥ä½œï¼ˆä½¿ç”¨ [method " -"is_runtime_initialized] æ¥æ£€æŸ¥ï¼‰ã€‚如果在调用这个方法的时候,Monoè¿è¡Œæ—¶æ²¡æœ‰è¢«" +"返回当å‰çš„ MonoDomain ID。\n" +"[b]注æ„:[/b]Mono è¿è¡Œæ—¶å¿…须被åˆå§‹åŒ–,这个方法æ‰èƒ½å·¥ä½œï¼ˆä½¿ç”¨ [method " +"is_runtime_initialized] æ¥æ£€æŸ¥ï¼‰ã€‚如果在调用这个方法的时候,Mono è¿è¡Œæ—¶æ²¡æœ‰è¢«" "åˆå§‹åŒ–,引擎将崩溃。" #: modules/mono/doc_classes/GodotSharp.xml @@ -32752,10 +32791,10 @@ msgid "" "(use [method is_runtime_initialized] to check). If the Mono runtime isn't " "initialized at the time this method is called, the engine will crash." msgstr "" -"返回scripts MonoDomainçš„ID。这将是与 [method get_domain_id] 相åŒçš„MonoDomain " -"ID,除éžscripts domainæ²¡æœ‰è¢«åŠ è½½ã€‚\n" -"[b]注æ„:[/b]Monoè¿è¡Œæ—¶å¿…须被åˆå§‹åŒ–,这个方法æ‰èƒ½å·¥ä½œï¼ˆä½¿ç”¨ [method " -"is_runtime_initialized] æ¥æ£€æŸ¥ï¼‰ã€‚如果在调用这个方法的时候,Monoè¿è¡Œæ—¶æ²¡æœ‰è¢«" +"返回脚本 MonoDomain çš„ ID。这将是与 [method get_domain_id] 相åŒçš„ MonoDomain " +"ID,除éžè„šæœ¬åŸŸæ²¡æœ‰è¢«åŠ è½½ã€‚\n" +"[b]注æ„:[/b]Mono è¿è¡Œæ—¶å¿…须被åˆå§‹åŒ–,这个方法æ‰èƒ½å·¥ä½œï¼ˆä½¿ç”¨ [method " +"is_runtime_initialized] æ¥æ£€æŸ¥ï¼‰ã€‚如果在调用这个方法的时候,Mono è¿è¡Œæ—¶æ²¡æœ‰è¢«" "åˆå§‹åŒ–,引擎将会崩溃。" #: modules/mono/doc_classes/GodotSharp.xml @@ -32770,7 +32809,7 @@ msgid "" "Returns [code]true[/code] if the Mono runtime is initialized, [code]false[/" "code] otherwise." msgstr "" -"如果Monoè¿è¡Œæ—¶è¢«åˆå§‹åŒ–,返回 [code]true[/code] ,å¦åˆ™è¿”回 [code]false[/" +"如果 Mono è¿è¡Œæ—¶è¢«åˆå§‹åŒ–,返回 [code]true[/code] ,å¦åˆ™è¿”回 [code]false[/" "code] 。" #: modules/mono/doc_classes/GodotSharp.xml @@ -32778,7 +32817,7 @@ msgid "" "Returns [code]true[/code] if the Mono runtime is shutting down, [code]false[/" "code] otherwise." msgstr "" -"如果Monoè¿è¡Œæ—¶æ£åœ¨å…³é—,返回 [code]true[/code] ,å¦åˆ™è¿”回 [code]false[/" +"如果 Mono è¿è¡Œæ—¶æ£åœ¨å…³é—,返回 [code]true[/code] ,å¦åˆ™è¿”回 [code]false[/" "code] 。" #: modules/mono/doc_classes/GodotSharp.xml @@ -32884,11 +32923,11 @@ msgstr "" #: doc/classes/GradientTexture.xml msgid "The [Gradient] that will be used to fill the texture." -msgstr "将用于填充纹ç†çš„[Gradient]。" +msgstr "将用于填充纹ç†çš„ [Gradient]。" #: doc/classes/GradientTexture.xml msgid "The number of color samples that will be obtained from the [Gradient]." -msgstr "将从[Gradient]ä¸èŽ·å¾—çš„é¢œè‰²æ ·æœ¬çš„æ•°é‡ã€‚" +msgstr "将从 [Gradient] ä¸èŽ·å¾—çš„é¢œè‰²æ ·æœ¬çš„æ•°é‡ã€‚" #: doc/classes/GradientTexture2D.xml msgid "Gradient-filled 2D texture." @@ -33127,17 +33166,17 @@ msgid "" "[code]from_port[/code] and [code]to[/code]'s [code]to_port[/code] with the " "color provided in the [code]activity[/code] theme property." msgstr "" -"å°†[code]from[/code]çš„[code]from_port[/code]å’Œ[code]to[/code]çš„[code]to_port[/" -"code]之间的连接的颜色纹ç†è®¾ç½®ä¸ºå½“剿£åœ¨ä½¿ç”¨[code]activity[/code]的主题ä¸çš„颜" -"色。" +"å°† [code]from[/code] çš„ [code]from_port[/code] å’Œ [code]to[/code] çš„ " +"[code]to_port[/code] 之间的连接的颜色纹ç†è®¾ç½®ä¸ºå½“剿£åœ¨ä½¿ç”¨ [code]activity[/" +"code] 的主题ä¸çš„颜色。" #: doc/classes/GraphEdit.xml msgid "Sets the specified [code]node[/code] as the one selected." -msgstr "选ä¸ä¸€ä¸ªç‰¹å®šçš„节点[code]node[/code]." +msgstr "选ä¸ä¸€ä¸ªç‰¹å®šçš„节点 [code]node[/code]." #: doc/classes/GraphEdit.xml msgid "If [code]true[/code], the minimap is visible." -msgstr "如果[code]true[/code],å°å›¾æ˜¯å¯è§çš„。" +msgstr "如果为 [code]true[/code],å°å›¾æ˜¯å¯è§çš„。" #: doc/classes/GraphEdit.xml msgid "The opacity of the minimap rectangle." @@ -33154,7 +33193,8 @@ msgid "" "If [code]true[/code], enables disconnection of existing connections in the " "GraphEdit by dragging the right end." msgstr "" -"如果[code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–开图形编辑GraphEditä¸çŽ°æœ‰çš„è¿žæŽ¥ã€‚" +"如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–开图形编辑GraphEditä¸çŽ°æœ‰çš„è¿ž" +"接。" #: doc/classes/GraphEdit.xml msgid "The scroll offset." @@ -33165,11 +33205,11 @@ msgid "" "If [code]true[/code], makes a label with the current zoom level visible. The " "zoom value is displayed in percents." msgstr "" -"如果[code]true[/code],则使当å‰ç¼©æ”¾çº§åˆ«çš„æ ‡ç¾å¯è§ã€‚缩放值以百分比显示。" +"如果为 [code]true[/code],则使当å‰ç¼©æ”¾çº§åˆ«çš„æ ‡ç¾å¯è§ã€‚缩放值以百分比显示。" #: doc/classes/GraphEdit.xml msgid "The snapping distance in pixels." -msgstr "å¸é™„è·ç¦»(以åƒç´ 为å•ä½)。" +msgstr "å¸é™„è·ç¦»ï¼Œå•ä½ä¸ºåƒç´ 。" #: doc/classes/GraphEdit.xml msgid "If [code]true[/code], enables snapping." @@ -33193,11 +33233,11 @@ msgstr "æ¯ä¸ªç¼©æ”¾çº§åˆ«çš„æ¥é•¿ã€‚" #: doc/classes/GraphEdit.xml msgid "Emitted at the beginning of a GraphNode movement." -msgstr "在图形节点GraphNode移动开始时å‘出。" +msgstr "在 GraphNode 移动开始时å‘出。" #: doc/classes/GraphEdit.xml msgid "Emitted at the end of a GraphNode movement." -msgstr "在图形节点GraphNodeç§»åŠ¨ç»“æŸæ—¶å‘出。" +msgstr "在 GraphNode ç§»åŠ¨ç»“æŸæ—¶å‘出。" #: doc/classes/GraphEdit.xml msgid "" @@ -33223,7 +33263,7 @@ msgstr "当用户将输出端å£è¿žæŽ¥åˆ°å›¾å½¢çš„ç©ºä½æ—¶å‘出。" #: doc/classes/GraphEdit.xml msgid "Emitted when the user presses [code]Ctrl + C[/code]." -msgstr "当用户按[code]Ctrl + C[/code]时触å‘。" +msgstr "当用户按 [code]Ctrl + C[/code] 时触å‘。" #: doc/classes/GraphEdit.xml msgid "" @@ -33247,15 +33287,15 @@ msgstr "" #: doc/classes/GraphEdit.xml msgid "" "Emitted when a GraphNode is attempted to be duplicated in the GraphEdit." -msgstr "当图形节点GraphNode试图在图形编辑GraphEditä¸è¢«å¤åˆ¶æ—¶å‘出的。" +msgstr "当 GraphNode 试图在 GraphEdit ä¸è¢«å¤åˆ¶æ—¶å‘出的。" #: doc/classes/GraphEdit.xml msgid "Emitted when a GraphNode is selected." -msgstr "当图形节点GraphNode被选择时å‘出。" +msgstr "当 GraphNode 被选择时å‘出。" #: doc/classes/GraphEdit.xml msgid "Emitted when the user presses [code]Ctrl + V[/code]." -msgstr "当用户按下[code]Ctrl + V[/code]时触å‘。" +msgstr "当用户按下 [code]Ctrl + V[/code] 时触å‘。" #: doc/classes/GraphEdit.xml msgid "" @@ -33263,8 +33303,8 @@ msgid "" "GraphEdit. [code]position[/code] is the position of the mouse pointer when " "the signal is sent." msgstr "" -"å½“è¯·æ±‚å¼¹å‡ºçª—å£æ—¶å‘出。在图形编辑GraphEditä¸å³é”®å•击时å‘ç”Ÿã€‚åæ ‡" -"[code]position[/code] 是å‘é€ä¿¡å·æ—¶é¼ æ ‡æŒ‡é’ˆçš„ä½ç½®ã€‚" +"å½“è¯·æ±‚å¼¹å‡ºçª—å£æ—¶å‘出。在 GraphEdit ä¸å³é”®å•击时å‘ç”Ÿã€‚åæ ‡ [code]position[/" +"code] 是å‘é€ä¿¡å·æ—¶é¼ æ ‡æŒ‡é’ˆçš„ä½ç½®ã€‚" #: doc/classes/GraphEdit.xml msgid "" @@ -33291,11 +33331,11 @@ msgstr "选择的矩形的轮廓颜色。" #: doc/classes/GraphEdit.xml msgid "" "The horizontal range within which a port can be grabbed (on both sides)." -msgstr "一个端å£å¯ä»¥è¢«æŠ“å–的水平范围(两侧)。" +msgstr "端å£å¯ä»¥è¢«æŠ“å–的水平范围(两侧)。" #: doc/classes/GraphEdit.xml msgid "The vertical range within which a port can be grabbed (on both sides)." -msgstr "一个端å£å¯ä»¥è¢«æŠ“å–的垂直范围(两侧)。" +msgstr "端å£å¯ä»¥è¢«æŠ“å–的垂直范围(两侧)。" #: doc/classes/GraphEdit.xml msgid "The icon for the zoom out button." @@ -33492,17 +33532,19 @@ msgstr "" msgid "" "Sets the left (input) type of the slot [code]idx[/code] to [code]type_left[/" "code]." -msgstr "å°†æ’æ§½[code]idx[/code]的左侧(输入)类型设置为[code]type_left[/code]。" +msgstr "" +"å°†æ’æ§½ [code]idx[/code] 的左侧(输入)类型设置为 [code]type_left[/code]。" #: doc/classes/GraphNode.xml msgid "" "Sets the right (output) type of the slot [code]idx[/code] to " "[code]type_right[/code]." -msgstr "å°†æ’æ§½[code]idx[/code]çš„å³ï¼ˆè¾“出)类型设置为[code]type_right[/code]。" +msgstr "" +"å°†æ’æ§½ [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)类型设置为 [code]type_right[/code]。" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is a comment node." -msgstr "如果å¯ç”¨[code]true[/code],则GraphNode就是一个注释节点。" +msgstr "如果为 [code]true[/code],则 GraphNode 是注释节点。" #: doc/classes/GraphNode.xml msgid "" @@ -33511,12 +33553,12 @@ msgid "" "[b]Note:[/b] You cannot use position directly, as [GraphEdit] is a " "[Container]." msgstr "" -"图形节点 GraphNode çš„åç§»é‡ï¼Œä¸Ž [GraphEdit] 的滚动åç§»é‡ç›¸å…³ã€‚\n" +"GraphNode çš„åç§»é‡ï¼Œä¸Ž [GraphEdit] 的滚动åç§»é‡ç›¸å…³ã€‚\n" "[b]注æ„:[/b]由于 [GraphEdit] 是 [Container]ï¼Œå› æ¤ä¸èƒ½ç›´æŽ¥ä½¿ç”¨ä½ç½®ã€‚" #: doc/classes/GraphNode.xml msgid "Sets the overlay shown above the GraphNode. See [enum Overlay]." -msgstr "设置在图形节点GraphNode上方显示的å åŠ å±‚ã€‚å‚阅[enum Overlay]。" +msgstr "设置在 GraphNode 上方显示的å åŠ å±‚ã€‚è§ [enum Overlay]。" #: doc/classes/GraphNode.xml msgid "" @@ -33524,13 +33566,13 @@ msgid "" "[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " "signal, the GraphNode needs to be resized manually." msgstr "" -"如果[code]true[/code],用户å¯ä»¥è°ƒæ•´å›¾å½¢èŠ‚ç‚¹GraphNode的大å°ã€‚\n" +"如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´å›¾å½¢èŠ‚ç‚¹GraphNode的大å°ã€‚\n" "[b]注æ„:[/b]拖动手柄åªä¼šå‘出 [signal resize_request] ä¿¡å·ï¼Œå›¾å½¢èŠ‚ç‚¹GraphNode" "éœ€è¦æ‰‹åŠ¨è°ƒæ•´å¤§å°ã€‚" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is selected." -msgstr "如果[code]true[/code],图形节点GraphNode被选ä¸ã€‚" +msgstr "如果为 [code]true[/code],图形节点GraphNode被选ä¸ã€‚" #: doc/classes/GraphNode.xml msgid "" @@ -33538,44 +33580,44 @@ msgid "" "[b]Note:[/b] Pressing it will only emit the [signal close_request] signal, " "the GraphNode needs to be removed manually." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™å…³é—æŒ‰é’®å°†å¯è§ã€‚\n" +"如果为 [code]true[/code]ï¼Œåˆ™å…³é—æŒ‰é’®å°†å¯è§ã€‚\n" "[b]注æ„:[/b]按下它åªä¼šå‘出[signal close_request]ä¿¡å·ï¼Œéœ€è¦æ‰‹åŠ¨åˆ é™¤å›¾å½¢èŠ‚ç‚¹" "GraphNode。" #: doc/classes/GraphNode.xml msgid "The text displayed in the GraphNode's title bar." -msgstr "显示在图形节点GraphNodeæ ‡é¢˜æ ä¸çš„æ–‡æœ¬ã€‚" +msgstr "显示在 GraphNode æ ‡é¢˜æ ä¸çš„æ–‡æœ¬ã€‚" #: doc/classes/GraphNode.xml msgid "" "Emitted when the GraphNode is requested to be closed. Happens on clicking " "the close button (see [member show_close])." msgstr "" -"当图形节点GraphNodeè¢«è¯·æ±‚å…³é—æ—¶å‘å‡ºã€‚åœ¨ç‚¹å‡»å…³é—æŒ‰é’®æ—¶å‘生(è§[member " +"当 GraphNode è¢«è¯·æ±‚å…³é—æ—¶å‘å‡ºã€‚åœ¨ç‚¹å‡»å…³é—æŒ‰é’®æ—¶å‘ç”Ÿï¼ˆè§ [member " "show_close])。" #: doc/classes/GraphNode.xml msgid "Emitted when the GraphNode is dragged." -msgstr "当图形节点GraphNode被拖动时å‘出。" +msgstr "当 GraphNode 被拖动时å‘出。" #: doc/classes/GraphNode.xml msgid "Emitted when the GraphNode is moved." -msgstr "当图形节点GraphNode被移动时触å‘。" +msgstr "当 GraphNode 被移动时触å‘。" #: doc/classes/GraphNode.xml msgid "" "Emitted when the GraphNode is requested to be displayed over other ones. " "Happens on focusing (clicking into) the GraphNode." msgstr "" -"当图形节点GraphNodeè¢«è¦æ±‚显示在其他节点之上时触å‘。在GraphNode获得焦点时触" -"å‘,å³é¼ æ ‡ç‚¹å‡»è¿›å…¥ã€‚" +"当 GraphNode è¢«è¦æ±‚显示在其他节点之上时触å‘。在 GraphNode 获得焦点时触å‘,å³" +"é¼ æ ‡ç‚¹å‡»è¿›å…¥ã€‚" #: doc/classes/GraphNode.xml msgid "" "Emitted when the GraphNode is requested to be resized. Happens on dragging " "the resizer handle (see [member resizable])." msgstr "" -"当图形节点GraphNodeè¢«è¦æ±‚è°ƒæ•´å¤§å°æ—¶å‘出。在拖动调整器手柄时å‘生(è§[member " +"当 GraphNode è¢«è¦æ±‚è°ƒæ•´å¤§å°æ—¶å‘出。在拖动调整器手柄时å‘ç”Ÿï¼ˆè§ [member " "resizable])。" #: doc/classes/GraphNode.xml @@ -33588,15 +33630,15 @@ msgstr "没有显示覆盖层。" #: doc/classes/GraphNode.xml msgid "Show overlay set in the [code]breakpoint[/code] theme property." -msgstr "显示在[code]breakpoint[/code]主题属性ä¸è®¾ç½®çš„覆盖层。" +msgstr "显示在主题属性 [code]breakpoint[/code] ä¸è®¾ç½®çš„覆盖层。" #: doc/classes/GraphNode.xml msgid "Show overlay set in the [code]position[/code] theme property." -msgstr "æ˜¾ç¤ºåœ¨ä¸»é¢˜åæ ‡[code]position[/code]属性ä¸è®¾ç½®çš„å åŠ å±‚ã€‚" +msgstr "显示在主题属性 [code]position[/code] ä¸è®¾ç½®çš„覆盖层。" #: doc/classes/GraphNode.xml msgid "The color modulation applied to the close button icon." -msgstr "åº”ç”¨äºŽå…³é—æŒ‰é’®å›¾æ ‡çš„颜色调制(modulation)。" +msgstr "åº”ç”¨äºŽå…³é—æŒ‰é’®å›¾æ ‡çš„颜色调制。" #: doc/classes/GraphNode.xml msgid "The color modulation applied to the resizer icon." @@ -33629,7 +33671,7 @@ msgstr "å¯¹æ ‡é¢˜æ–‡æœ¬åº”ç”¨çš„å—体。" #: doc/classes/GraphNode.xml msgid "" "The icon for the close button, visible when [member show_close] is enabled." -msgstr "关闿Œ‰é’®çš„å›¾æ ‡ä¼šåœ¨å¯ç”¨[member show_close]æ—¶å¯è§ã€‚" +msgstr "关闿Œ‰é’®çš„å›¾æ ‡ä¼šåœ¨å¯ç”¨ [member show_close] æ—¶å¯è§ã€‚" #: doc/classes/GraphNode.xml msgid "The icon used for representing ports." @@ -33637,23 +33679,25 @@ msgstr "è¯¥å›¾æ ‡ç”¨äºŽè¡¨ç¤ºç«¯å£ã€‚" #: doc/classes/GraphNode.xml msgid "The icon used for resizer, visible when [member resizable] is enabled." -msgstr "用于调整大å°çš„å›¾æ ‡ï¼Œåœ¨ [member resizable]被å¯ç”¨æ—¶å¯è§ã€‚" +msgstr "用于调整大å°çš„å›¾æ ‡ï¼Œåœ¨ [member resizable] 被å¯ç”¨æ—¶å¯è§ã€‚" #: doc/classes/GraphNode.xml msgid "" "The background used when [member overlay] is set to [constant " "OVERLAY_BREAKPOINT]." -msgstr "当[member overlay]被设置为[constant OVERLAY_BREAKPOINT]时使用的背景。" +msgstr "" +"当 [member overlay] 被设置为 [constant OVERLAY_BREAKPOINT] 时使用的背景。" #: doc/classes/GraphNode.xml msgid "The [StyleBox] used when [member comment] is enabled." -msgstr "当å¯ç”¨[member comment]时使用的[StyleBox]。" +msgstr "当å¯ç”¨ [member comment] 时使用的 [StyleBox]。" #: doc/classes/GraphNode.xml msgid "" "The [StyleBox] used when [member comment] is enabled and the [GraphNode] is " "focused." -msgstr "当[member comment]被å¯ç”¨ï¼Œä¸”[GraphNode]获得焦点时使用的[StyleBox]。" +msgstr "" +"当 [member comment] 被å¯ç”¨ï¼Œä¸” [GraphNode] 获得焦点时使用的 [StyleBox]。" #: doc/classes/GraphNode.xml msgid "The default background for [GraphNode]." @@ -33882,7 +33926,7 @@ msgid "" "This does not affect the size of the meshes. See [member cell_scale]." msgstr "" "ç½‘æ ¼å•元的尺寸。\n" -"这并ä¸å½±å“ç½‘æ ¼çš„å°ºå¯¸å¤§å°ã€‚å‚阅 [member cell_scale]。" +"这并ä¸å½±å“ç½‘æ ¼çš„å°ºå¯¸å¤§å°ã€‚è§ [member cell_scale]。" #: modules/gridmap/doc_classes/GridMap.xml msgid "" @@ -34031,7 +34075,7 @@ msgid "" "HASH_SHA256] to start computation of a SHA-256)." msgstr "" "开始对给定的 [code]type[/code] (例如 [constant HASH_SHA256] 进行新的哈希计" -"算, 以开始计算 SHA-256) 。" +"算,以开始计算 SHA-256) 。" #: doc/classes/HashingContext.xml msgid "Updates the computation with the given [code]chunk[/code] of data." @@ -34055,7 +34099,7 @@ msgstr "水平盒å¼å®¹å™¨ã€‚" #: doc/classes/HBoxContainer.xml msgid "Horizontal box container. See [BoxContainer]." -msgstr "水平盒å¼å®¹å™¨ã€‚请å‚阅 [BoxContainer]。" +msgstr "水平盒å¼å®¹å™¨ã€‚è§ [BoxContainer]。" #: doc/classes/HBoxContainer.xml msgid "The horizontal space between the [HBoxContainer]'s elements." @@ -34108,7 +34152,7 @@ msgid "" "[Generic6DOFJoint]." msgstr "" "HingeJoint(铰链关节)通常使用物体 A çš„ Z è½´ä½œä¸ºé“°é“¾è½´ï¼Œä½†æ‰‹åŠ¨æ·»åŠ æ—¶å¯ä»¥æŒ‡å®š" -"å¦ä¸€ä¸ªè½´ã€‚请å‚阅 [Generic6DOFJoint]。" +"å¦ä¸€ä¸ªè½´ã€‚å¦è¯·å‚阅 [Generic6DOFJoint]。" #: doc/classes/HingeJoint.xml doc/classes/Label3D.xml #: doc/classes/SpriteBase3D.xml @@ -34702,12 +34746,12 @@ msgid "" "Sends the body data raw, as a byte array and does not encode it in any way." msgstr "" "å‘连接的主机å‘é€åŽŸå§‹è¯·æ±‚ã€‚\n" -"URL傿•°é€šå¸¸åªæ˜¯ä¸»æœºåŽé¢çš„部分,所以对于[code]http://somehost.com/index.php[/" -"code],它是[code]/index.php[/code]。当å‘HTTPä»£ç†æœåС噍å‘é€è¯·æ±‚时,它应该是一" -"个ç»å¯¹çš„URL。对于[constant HTTPClient.METHOD_OPTIONS]请求,å…许[code]*[/" -"code]。对于[constant HTTPClient.METHOD_CONNECT]è¯·æ±‚ï¼Œåº”è¯¥æ˜¯æ ‡å‡†ç»„ä»¶ï¼Œ" -"[code]host:port[/code]。\n" -"å¤´ä¿¡æ¯æ˜¯HTTP请求头信æ¯ã€‚关于å¯ç”¨çš„HTTP方法,å‚阅[enum Method]。\n" +"URL 傿•°é€šå¸¸åªæ˜¯ä¸»æœºåŽé¢çš„部分,所以对于 [code]http://somehost.com/index." +"php[/code],它是 [code]/index.php[/code]ã€‚å½“å‘ HTTP ä»£ç†æœåС噍å‘é€è¯·æ±‚时,它" +"应该是一个ç»å¯¹çš„ URL。对于[constant HTTPClient.METHOD_OPTIONS] 请求,å…许 " +"[code]*[/code]。对于 [constant HTTPClient.METHOD_CONNECT] è¯·æ±‚ï¼Œåº”è¯¥æ˜¯æ ‡å‡†ç»„" +"件,[code]host:port[/code]。\n" +"å¤´ä¿¡æ¯æ˜¯ HTTP 请求头信æ¯ã€‚å¯ç”¨çš„ HTTP æ–¹æ³•è§ [enum Method]。\n" "以å—节数组的形å¼å‘é€åŽŸå§‹æ£æ–‡æ•°æ®ï¼Œä¸ä»¥ä»»ä½•æ–¹å¼è¿›è¡Œç¼–ç 。" #: doc/classes/HTTPClient.xml doc/classes/HTTPRequest.xml @@ -35448,6 +35492,7 @@ msgid "A node with the ability to send HTTP(S) requests." msgstr "具有å‘é€ HTTP(S) 请求能力的节点。" #: doc/classes/HTTPRequest.xml +#, fuzzy msgid "" "A node with the ability to send HTTP requests. Uses [HTTPClient] " "internally.\n" @@ -35474,7 +35519,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -35634,7 +35679,7 @@ msgstr "" "在底层的 [HTTPClient] 上创建请求。如果没有é…置错误,它会å°è¯•使用 [method " "HTTPClient.connect_to_host] è¿žæŽ¥å¹¶å°†å‚æ•°ä¼ 递给 [method HTTPClient." "request]。\n" -"如果请求创建æˆåŠŸï¼Œåˆ™è¿”å›ž [constant OK]。 ï¼ˆå¹¶ä¸æ„å‘³ç€æœåС噍已å“应)," +"如果请求创建æˆåŠŸï¼Œåˆ™è¿”å›ž [constant OK]ã€‚ï¼ˆå¹¶ä¸æ„å‘³ç€æœåС噍已å“应)," "[constant ERR_UNCONFIGURED] 如果ä¸åœ¨æ ‘ä¸ï¼Œ[constant ERR_BUSY] 如果ä»åœ¨å¤„ç†å…ˆ" "å‰çš„请求,[constant ERR_INVALID_PARAMETER] 如果给定的å—ç¬¦ä¸²ä¸æ˜¯æœ‰æ•ˆçš„ URL æ ¼" "å¼ï¼Œæˆ– [constant ERR_CANT_CONNECT]如果ä¸ä½¿ç”¨çº¿ç¨‹å¹¶ä¸” [HTTPClient] æ— æ³•è¿žæŽ¥åˆ°" @@ -35662,7 +35707,7 @@ msgstr "" "在底层的[HTTPClient]上创建请求,使用一个原始å—节数组作为请求主体。如果没有é…" "置错误,它会å°è¯•使用 [method HTTPClient.connect_to_host] è¿žæŽ¥å¹¶å°†å‚æ•°ä¼ 递给 " "[method HTTPClient.request]。\n" -"如果请求创建æˆåŠŸï¼Œåˆ™è¿”å›ž [constant OK]。 ï¼ˆå¹¶ä¸æ„å‘³ç€æœåС噍已å“应)," +"如果请求创建æˆåŠŸï¼Œåˆ™è¿”å›ž [constant OK]ã€‚ï¼ˆå¹¶ä¸æ„å‘³ç€æœåС噍已å“应)," "[constant ERR_UNCONFIGURED] 如果ä¸åœ¨æ ‘ä¸ï¼Œ[constant ERR_BUSY] 如果ä»åœ¨å¤„ç†å…ˆ" "å‰çš„请求,[constant ERR_INVALID_PARAMETER] 如果给定的å—ç¬¦ä¸²ä¸æ˜¯æœ‰æ•ˆçš„ URL æ ¼" "å¼ï¼Œæˆ– [constant ERR_CANT_CONNECT]如果ä¸ä½¿ç”¨çº¿ç¨‹å¹¶ä¸” [HTTPClient] æ— æ³•è¿žæŽ¥åˆ°" @@ -35798,7 +35843,7 @@ msgid "" "hardware limitations. Larger images may fail to import." msgstr "" "æœ¬åœ°å›¾åƒæ•°æ®ç±»åž‹ã€‚包å«å¯è½¬æ¢ä¸º [ImageTexture] çš„å›¾åƒæ•°æ®ï¼Œå¹¶æä¾›å¸¸ç”¨çš„[i]图åƒ" -"处ç†[/i]方法。 [Image] 的最大宽度和高度是 [constant MAX_WIDTH] å’Œ [constant " +"处ç†[/i]方法。[Image] 的最大宽度和高度是 [constant MAX_WIDTH] å’Œ [constant " "MAX_HEIGHT]。\n" "[Image] ä¸èƒ½ç›´æŽ¥åˆ†é…给对象的 [code]texture[/code] 属性,例如 [Sprite],必须先" "手动转æ¢ä¸º [ImageTexture]。\n" @@ -36208,14 +36253,14 @@ msgid "" "img.set_pixel(x, y, color) # Does not have an effect\n" "[/codeblock]" msgstr "" -"如果图åƒè¢«é”定,设置[code](x, y)[/code]处åƒç´ çš„[Color]。例å:\n" +"如果图åƒè¢«é”定,设置 [code](x, y)[/code] 处åƒç´ çš„ [Color]。例å:\n" "[codeblock]\n" "var img = Image.new()\n" "img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" "img.lock()\n" -"img.set_pixel(x, y, color) # Works\n" +"img.set_pixel(x, y, color) # 有效\n" "img.unlock()\n" -"img.set_pixel(x, y, color) # Does not have an effect\n" +"img.set_pixel(x, y, color) # æ— æ•ˆ\n" "[/codeblock]" #: doc/classes/Image.xml @@ -36231,15 +36276,15 @@ msgid "" "img.set_pixelv(Vector2(x, y), color) # Does not have an effect\n" "[/codeblock]" msgstr "" -"如果图åƒè¢«é”定,设置[code](dst.x, dst.y)[/code]处的åƒç´ çš„[Color]。注æ„," -"[code]dst[/code]值必须是整数。例:\n" +"如果图åƒè¢«é”定,设置 [code](dst.x, dst.y)[/code] 处的åƒç´ çš„ [Color]。注æ„," +"[code]dst[/code] 值必须是整数。示例:\n" "[codeblock]\n" "var img = Image.new()\n" "img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" "img.lock()\n" -"img.set_pixelv(Vector2(x, y), color) # Works\n" +"img.set_pixelv(Vector2(x, y), color) # 有效\n" "img.unlock()\n" -"img.set_pixelv(Vector2(x, y), color) # Does not have an effect\n" +"img.set_pixelv(Vector2(x, y), color) # æ— æ•ˆ\n" "[/codeblock]" #: doc/classes/Image.xml @@ -36796,7 +36841,7 @@ msgid "" "hardware limitations." msgstr "" "基于图片的纹ç†ï¼Œè¦æ˜¾ç¤ºä¸€ä¸ªå›¾ç‰‡ï¼Œå¿…须使用 [method create_from_image] 方法æ¥åˆ›" -"建一个 [ImageTexture] å›¾ç‰‡çº¹ç†æ•°æ®:\n" +"建一个 [ImageTexture] å›¾ç‰‡çº¹ç†æ•°æ®ï¼š\n" "[codeblock]\n" "var texture = ImageTexture.new()\n" "var image = Image.new()\n" @@ -36901,7 +36946,7 @@ msgid "" "[Image] data is compressed with a lossy algorithm. You can set the storage " "quality with [member lossy_quality]." msgstr "" -"[Image] æ•°æ®æ˜¯ç”¨æœ‰æŸç®—法压缩的。 ä½ å¯ä»¥ç”¨ [member lossy_quality] 设置å˜å‚¨è´¨" +"[Image] æ•°æ®æ˜¯ç”¨æœ‰æŸç®—æ³•åŽ‹ç¼©çš„ã€‚ä½ å¯ä»¥ç”¨ [member lossy_quality] 设置å˜å‚¨è´¨" "é‡ã€‚" #: doc/classes/ImageTexture.xml @@ -37019,7 +37064,7 @@ msgid "" "[method parse_input_event] instead." msgstr "" "这将模拟按下指定的按键动作。\n" -"强度å¯ä»¥ç”¨äºŽéžå¸ƒå°”è¿ç®—的动作,它的范围在0到1之间,代表给定动作的力度。\n" +"强度å¯ä»¥ç”¨äºŽéžå¸ƒå°”è¿ç®—的动作,它的范围在0 到 1之间,代表给定动作的力度。\n" "[b]注æ„:[/b]这个方法ä¸ä¼šå¼•起任何[method Node._input]调用。它旨在与[method " "is_action_pressed]å’Œ[method is_action_just_pressed]ä¸€èµ·ä½¿ç”¨ã€‚å¦‚æžœä½ æƒ³æ¨¡æ‹Ÿ" "[code]_input[/code],请使用[method parse_input_event]代替。" @@ -37454,15 +37499,15 @@ msgid "" "[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " "compression mode can't be used for custom cursors." msgstr "" -"è®¾ç½®ä¸€ä¸ªè‡ªå®šä¹‰é¼ æ ‡å…‰æ ‡å›¾åƒï¼Œè¯¥å›¾åƒä»…当游æˆçª—å£å†…å¯è§ã€‚还å¯ä»¥æŒ‡å®šçƒç‚¹ã€‚å°†" -"[code]null[/code]ä¼ é€’ç»™image傿•°å°†é‡ç½®ä¸ºç³»ç»Ÿå…‰æ ‡ã€‚有关详细信æ¯ï¼Œè¯·å‚阅 [enum " -"CursorShape] 形状列表。\n" -"[code]image[/code]的大å°å¿…é¡»å°äºŽ256×256。\n" -"[code]hotspot[/code]的大å°å¿…须在[code]image[/code]的范围内。\n" -"[b]注æ„:[/b]䏿”¯æŒAnimatedTextureä½œä¸ºè‡ªå®šä¹‰é¼ æ ‡å…‰æ ‡ã€‚å¦‚æžœä½¿ç”¨" +"è®¾ç½®ä¸€ä¸ªè‡ªå®šä¹‰é¼ æ ‡å…‰æ ‡å›¾åƒï¼Œè¯¥å›¾åƒä»…当游æˆçª—å£å†…å¯è§ã€‚还å¯ä»¥æŒ‡å®šçƒç‚¹ã€‚å°† " +"[code]null[/code] ä¼ é€’ç»™ image 傿•°å°†é‡ç½®ä¸ºç³»ç»Ÿå…‰æ ‡ã€‚有关详细信æ¯ï¼Œè¯·å‚阅 " +"[enum CursorShape] 形状列表。\n" +"[code]image[/code] 的大å°å¿…é¡»å°äºŽ 256×256。\n" +"[code]hotspot[/code] 的大å°å¿…须在 [code]image[/code] 的范围内。\n" +"[b]注æ„:[/b]䏿”¯æŒ AnimatedTexture ä½œä¸ºè‡ªå®šä¹‰é¼ æ ‡å…‰æ ‡ã€‚å¦‚æžœä½¿ç”¨ " "[AnimatedTexture],将仅显示第一帧。\n" "[b]注æ„:[/b]仅支æŒä»¥[b]æ— æŸ[/b],[b]有æŸ[/b]或[b]未压缩[/b]压缩模å¼å¯¼å…¥çš„图" -"åƒã€‚[b]Video RAM[/b]压缩模å¼ä¸èƒ½ç”¨äºŽè‡ªå®šä¹‰å…‰æ ‡ã€‚" +"åƒã€‚[b]Video RAM[/b] 压缩模å¼ä¸èƒ½ç”¨äºŽè‡ªå®šä¹‰å…‰æ ‡ã€‚" #: doc/classes/Input.xml msgid "" @@ -37526,9 +37571,9 @@ msgid "" "is recommended to restart an effect if it has to be played for more than a " "few seconds." msgstr "" -"å¼€å§‹æŒ¯åŠ¨æ¸¸æˆæ‰‹æŸ„。手柄通常带有两个隆隆声电机,一强一弱。 " +"å¼€å§‹æŒ¯åŠ¨æ¸¸æˆæ‰‹æŸ„。手柄通常带有两个隆隆声电机,一强一弱。" "[code]weak_magnitude[/code] 弱震级是弱电机的强度(0 到 1 之间)," -"[code]strong_magnitude[/code] 强震级是强电机的强度(0 到 1 之间)。 " +"[code]strong_magnitude[/code] 强震级是强电机的强度(0 到 1 之间)。" "[code]duration[/code] 是效果的æŒç»æ—¶é—´ï¼ˆä»¥ç§’为å•ä½ï¼‰ï¼ˆæŒç»æ—¶é—´ä¸º 0 å°†å°è¯•æ— é™" "æœŸåœ°æ’æ”¾æŒ¯åŠ¨ï¼‰ã€‚\n" "[b]注æ„:[/b]å¹¶éžæ‰€æœ‰ç¡¬ä»¶éƒ½å…¼å®¹é•¿æ•ˆæžœæŒç»æ—¶é—´ï¼›å¦‚æžœå¿…é¡»æ’æ”¾è¶…è¿‡å‡ ç§’é’Ÿçš„æ•ˆæžœï¼Œ" @@ -37547,8 +37592,8 @@ msgid "" "later." msgstr "" "振动 Android å’Œ iOS 设备。\n" -"[b]注æ„:[/b]Android 需è¦å¯¼å‡ºè®¾ç½®ä¸çš„ [code]VIBRATE[/code] æƒé™ã€‚ iOS 䏿”¯æŒ" -"æŒç»æ—¶é—´ã€‚\n" +"[b]注æ„:[/b]Android 需è¦å¯¼å‡ºè®¾ç½®ä¸çš„ [code]VIBRATE[/code] æƒé™ã€‚iOS 䏿”¯æŒæŒ" +"ç»æ—¶é—´ã€‚\n" "[b]注æ„:[/b]在 iOS å¹³å°ä¸Šï¼ŒiOS 13 åŠä¹‹åŽçš„ç‰ˆæœ¬æ‰æ”¯æŒæŒ‡å®šæŒç»æ—¶é—´ã€‚" #: doc/classes/Input.xml @@ -37705,9 +37750,9 @@ msgid "" "CURSOR_BDIAGSIZE]. It tells the user they can resize the window or the panel " "both horizontally and vertically." msgstr "" -"窗å£è°ƒæ•´å¤§å°çš„å…‰æ ‡ã€‚æ˜¯ä¸€ä¸ªåŒå¤´çš„ç®å¤´ï¼Œä»Žå·¦ä¸Šè§’到å³ä¸‹è§’,与[constant " -"CURSOR_BDIAGSIZE]相å。它告诉用户他们å¯ä»¥åœ¨æ°´å¹³å’Œåž‚ç›´æ–¹å‘ä¸Šè°ƒæ•´çª—å£æˆ–颿¿çš„大" -"å°ã€‚" +"窗å£è°ƒæ•´å¤§å°çš„å…‰æ ‡ã€‚æ˜¯ä¸€ä¸ªåŒå¤´çš„ç®å¤´ï¼Œä»Žå·¦ä¸Šè§’到å³ä¸‹è§’,与 [constant " +"CURSOR_BDIAGSIZE] 相å。它告诉用户他们å¯ä»¥åœ¨æ°´å¹³å’Œåž‚ç›´æ–¹å‘ä¸Šè°ƒæ•´çª—å£æˆ–颿¿çš„" +"大å°ã€‚" #: doc/classes/Input.xml msgid "Move cursor. Indicates that something can be moved." @@ -37723,7 +37768,7 @@ msgstr "åž‚ç›´æ‹†åˆ†é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_VSI msgid "" "Horizontal split mouse cursor. On Windows, it's the same as [constant " "CURSOR_HSIZE]." -msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨Windows上,它与[constant CURSOR_HSIZE]相åŒã€‚" +msgstr "æ°´å¹³åˆ†å‰²çš„é¼ æ ‡å…‰æ ‡ã€‚åœ¨ Windows 上,它与 [constant CURSOR_HSIZE] 相åŒã€‚" #: doc/classes/Input.xml msgid "Help cursor. Usually a question mark." @@ -37735,7 +37780,7 @@ msgstr "通用输入事件。" #: doc/classes/InputEvent.xml msgid "Base class of all sort of input event. See [method Node._input]." -msgstr "å„ç§è¾“入事件的基类。请å‚阅 [method Node._input]。" +msgstr "å„ç§è¾“å…¥äº‹ä»¶çš„åŸºç±»ã€‚è§ [method Node._input]。" #: doc/classes/InputEvent.xml msgid "InputEvent" @@ -37963,18 +38008,17 @@ msgstr "" #: doc/classes/InputEventJoypadButton.xml msgid "Button identifier. One of the [enum JoystickList] button constants." -msgstr "æŒ‰é’®æ ‡è¯†ç¬¦ã€‚ [enum JoystickList] 按钮常é‡ä¹‹ä¸€ã€‚" +msgstr "æŒ‰é’®æ ‡è¯†ç¬¦ã€‚[enum JoystickList] 按钮常é‡ä¹‹ä¸€ã€‚" #: doc/classes/InputEventJoypadButton.xml msgid "" "If [code]true[/code], the button's state is pressed. If [code]false[/code], " "the button's state is released." msgstr "" -"如果 [code]true[/code],按钮的状æ€è¢«æŒ‰ä¸‹ã€‚如果[code]false[/code],按钮的状æ€" -"被释放。" +"如果为 [code]true[/code],按钮的状æ€è¢«æŒ‰ä¸‹ã€‚如果为 [code]false[/code],按钮的" +"状æ€è¢«é‡Šæ”¾ã€‚" #: doc/classes/InputEventJoypadButton.xml -#, fuzzy msgid "" "Represents the pressure the user puts on the button with their finger, if " "the controller supports it. Ranges from [code]0[/code] to [code]1[/code]." @@ -38006,8 +38050,8 @@ msgid "" "[code]-1.0[/code] to [code]1.0[/code]. A value of [code]0[/code] means the " "axis is in its resting position." msgstr "" -"æ“纵æ†åœ¨ç»™å®šè½´ä¸Šçš„当å‰ä½ç½®ã€‚该值范围从[code]-1.0[/code]到[code]1.0[/code]。值" -"为[code]0[/code]æ„味ç€è½´å¤„äºŽé™æ¢ä½ç½®ã€‚" +"æ“纵æ†åœ¨ç»™å®šè½´ä¸Šçš„当å‰ä½ç½®ã€‚该值范围从 [code]-1.0[/code] 到 [code]1.0[/" +"code]。值为 [code]0[/code] æ„味ç€è½´å¤„äºŽé™æ¢ä½ç½®ã€‚" #: doc/classes/InputEventKey.xml msgid "Input event type for keyboard events." @@ -38028,8 +38072,8 @@ msgid "" "get_physical_scancode_with_modifiers())[/code] where [code]event[/code] is " "the [InputEventKey]." msgstr "" -"返回与修改键组åˆçš„ç‰©ç†æ‰«æç ,例如 [code]Shift[/code] 或 [code]Alt[/code]。请" -"å‚阅 [InputEventWithModifiers]。\n" +"返回与修改键组åˆçš„ç‰©ç†æ‰«æç ,例如 [code]Shift[/code] 或 [code]Alt[/code]。å¦" +"请å‚阅 [InputEventWithModifiers]。\n" "è¦èŽ·å¾—å¸¦æœ‰ä¿®é¥°ç¬¦çš„ [InputEventKey] 的人类å¯è¯»è¡¨ç¤ºï¼Œè¯·ä½¿ç”¨ [code]OS." "get_scancode_string(event.get_physical_scancode_with_modifiers())[/code] å…¶" "ä¸ [code]event[/code] 是 [InputEventKey]。" @@ -38043,7 +38087,7 @@ msgid "" "get_scancode_with_modifiers())[/code] where [code]event[/code] is the " "[InputEventKey]." msgstr "" -"返回与 [code]Shift[/code] 或 [code]Alt[/code] ç‰ä¿®é¥°é”®ç»„åˆçš„æ‰«æç 。请å‚阅 " +"返回与 [code]Shift[/code] 或 [code]Alt[/code] ç‰ä¿®é¥°é”®ç»„åˆçš„æ‰«æç 。å¦è¯·å‚阅 " "[InputEventWithModifiers]。\n" "è¦èŽ·å¾—å¸¦æœ‰ä¿®é¥°ç¬¦çš„ [InputEventKey] 的人类å¯è¯»è¡¨ç¤ºï¼Œè¯·ä½¿ç”¨ [code]OS." "get_scancode_string(event.get_scancode_with_modifiers())[/code] å…¶ä¸ " @@ -38054,7 +38098,7 @@ msgid "" "If [code]true[/code], the key was already pressed before this event. It " "means the user is holding the key down." msgstr "" -"如果 [code]true[/code],则该键在æ¤äº‹ä»¶ä¹‹å‰å·²è¢«æŒ‰ä¸‹ã€‚è¿™æ„味ç€ç”¨æˆ·æ£åœ¨æŒ‰ä½è¯¥" +"如果为 [code]true[/code],则该键在æ¤äº‹ä»¶ä¹‹å‰å·²è¢«æŒ‰ä¸‹ã€‚è¿™æ„味ç€ç”¨æˆ·æ£åœ¨æŒ‰ä½è¯¥" "键。" #: doc/classes/InputEventKey.xml @@ -38077,8 +38121,8 @@ msgid "" "If [code]true[/code], the key's state is pressed. If [code]false[/code], the " "key's state is released." msgstr "" -"如果[code]true[/code]ï¼ŒæŒ‰é”®çš„çŠ¶æ€æ˜¯è¢«æŒ‰ä¸‹ã€‚如果[code]false[/code],该键的状æ€" -"被释放。" +"如果为 [code]true[/code]ï¼ŒæŒ‰é”®çš„çŠ¶æ€æ˜¯è¢«æŒ‰ä¸‹ã€‚如果为 [code]false[/code],该键" +"的状æ€è¢«é‡Šæ”¾ã€‚" #: doc/classes/InputEventKey.xml msgid "" @@ -38275,17 +38319,17 @@ msgstr "é¼ æ ‡æŒ‰é’®äº‹ä»¶çš„è¾“å…¥äº‹ä»¶ç±»åž‹ã€‚" #: doc/classes/InputEventMouseButton.xml msgid "Contains mouse click information. See [method Node._input]." -msgstr "包å«é¼ æ ‡ç‚¹å‡»ä¿¡æ¯ã€‚è§[method Node._input]。" +msgstr "包å«é¼ æ ‡ç‚¹å‡»ä¿¡æ¯ã€‚è§ [method Node._input]。" #: doc/classes/InputEventMouseButton.xml msgid "" "The mouse button identifier, one of the [enum ButtonList] button or button " "wheel constants." -msgstr "é¼ æ ‡æŒ‰é’®æ ‡è¯†ç¬¦ï¼Œæ˜¯[enum ButtonList] 按钮或按钮滚轮常é‡ä¹‹ä¸€ã€‚" +msgstr "é¼ æ ‡æŒ‰é’®æ ‡è¯†ç¬¦ï¼Œæ˜¯ [enum ButtonList] 按钮或按钮滚轮常é‡ä¹‹ä¸€ã€‚" #: doc/classes/InputEventMouseButton.xml msgid "If [code]true[/code], the mouse button's state is a double-click." -msgstr "如果[code]true[/code]ï¼Œé¼ æ ‡æŒ‰é’®çš„çŠ¶æ€æ˜¯åŒå‡»ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œé¼ æ ‡æŒ‰é’®çš„çŠ¶æ€æ˜¯åŒå‡»ã€‚" #: doc/classes/InputEventMouseButton.xml msgid "" @@ -38294,8 +38338,8 @@ msgid "" "only supported on some platforms; the reported sensitivity varies depending " "on the platform. May be [code]0[/code] if not supported." msgstr "" -"事件的数é‡ï¼ˆæˆ–delta)。当用于高精度滚动事件时,这表示滚动é‡ï¼ˆåž‚直或水平)。这" -"åªåœ¨ä¸€äº›å¹³å°ä¸Šè¢«æ”¯æŒï¼›æŠ¥å‘Šçš„çµæ•åº¦å› å¹³å°ä¸åŒè€Œä¸åŒã€‚å¦‚æžœä¸æ”¯æŒï¼Œå¯èƒ½æ˜¯" +"事件的数é‡ï¼ˆæˆ– delta)。当用于高精度滚动事件时,这表示滚动é‡ï¼ˆåž‚直或水平)。" +"è¿™åªåœ¨ä¸€äº›å¹³å°ä¸Šè¢«æ”¯æŒï¼›æŠ¥å‘Šçš„çµæ•åº¦å› å¹³å°ä¸åŒè€Œä¸åŒã€‚å¦‚æžœä¸æ”¯æŒï¼Œå¯èƒ½æ˜¯" "[code]0[/code]。" #: doc/classes/InputEventMouseButton.xml @@ -38303,8 +38347,8 @@ msgid "" "If [code]true[/code], the mouse button's state is pressed. If [code]false[/" "code], the mouse button's state is released." msgstr "" -"如果[code]true[/code]ï¼Œé¼ æ ‡æŒ‰é”®çš„çŠ¶æ€ä¸ºæŒ‰ä¸‹ã€‚如果[code]false[/code]ï¼Œé¼ æ ‡æŒ‰é’®" -"的状æ€è¢«é‡Šæ”¾ã€‚" +"如果为 [code]true[/code]ï¼Œé¼ æ ‡æŒ‰é”®çš„çŠ¶æ€ä¸ºæŒ‰ä¸‹ã€‚如果为 [code]false[/code]ï¼Œé¼ " +"æ ‡æŒ‰é’®çš„çŠ¶æ€è¢«é‡Šæ”¾ã€‚" #: doc/classes/InputEventMouseMotion.xml msgid "Input event type for mouse motion events." @@ -38322,8 +38366,7 @@ msgid "" "Bresenham%27s_line_algorithm]Bresenham's line algorithm[/url] as well to " "avoid visible gaps in lines if the user is moving the mouse quickly." msgstr "" -"包å«é¼ æ ‡å’Œç¬”çš„è¿åŠ¨ä¿¡æ¯ã€‚支æŒç›¸å¯¹ã€ç»å¯¹ä½ç½®å’Œé€Ÿåº¦ã€‚请å‚阅 [method Node." -"_input]。\n" +"包å«é¼ æ ‡å’Œç¬”çš„è¿åŠ¨ä¿¡æ¯ã€‚支æŒç›¸å¯¹ã€ç»å¯¹ä½ç½®å’Œé€Ÿåº¦ã€‚è§ [method Node._input]。\n" "[b]注æ„:[/b]默认情况下,这个事件最多åªèƒ½åœ¨æ¯ä¸€å¸§æ¸²æŸ“ä¸å‘å‡ºä¸€æ¬¡ã€‚å¦‚æžœä½ éœ€è¦æ›´" "精确的输入报告,请将 [member Input.use_accumulated_input] 设为 [code]false[/" "code],让事件尽å¯èƒ½é¢‘ç¹åœ°å‘å°„ã€‚å¦‚æžœä½ ä½¿ç”¨ InputEventMouseMotion æ¥ç”»çº¿ï¼Œè¯·è€ƒ" @@ -38350,8 +38393,8 @@ msgid "" "code] when the user stops moving the mouse." msgstr "" "é¼ æ ‡ç›¸å¯¹äºŽå‰ä¸€ä¸ªä½ç½®çš„ä½ç½®ï¼ˆä¸Šä¸€å¸§çš„ä½ç½®ï¼‰ã€‚\n" -"[b]注æ„:[/b]å› ä¸º[InputEventMouseMotion]åªåœ¨é¼ æ ‡ç§»åŠ¨æ—¶å‘å‡ºï¼Œå½“ç”¨æˆ·åœæ¢ç§»åŠ¨é¼ " -"æ ‡æ—¶ï¼Œæœ€åŽä¸€ä¸ªäº‹ä»¶çš„相对ä½ç½®ä¸ä¼šæ˜¯[code]Vector2(0, 0)[/code]。" +"[b]注æ„:[/b]å› ä¸º [InputEventMouseMotion] åªåœ¨é¼ æ ‡ç§»åŠ¨æ—¶å‘å‡ºï¼Œå½“ç”¨æˆ·åœæ¢ç§»åЍ" +"é¼ æ ‡æ—¶ï¼Œæœ€åŽä¸€ä¸ªäº‹ä»¶çš„相对ä½ç½®ä¸ä¼šæ˜¯ [code]Vector2(0, 0)[/code]。" #: doc/classes/InputEventMouseMotion.xml msgid "The mouse speed in pixels per second." @@ -38364,8 +38407,8 @@ msgid "" "toward the user. Ranges from [code]-1.0[/code] to [code]1.0[/code] for both " "axes." msgstr "" -"代表笔的倾斜角度。æ£çš„Xåæ ‡å€¼è¡¨ç¤ºå‘å³å€¾æ–œã€‚æ£çš„Yåæ ‡å€¼è¡¨ç¤ºå‘用户自身倾斜。两" -"个轴的范围是[code]-1.0[/code]到[code]1.0[/code]。" +"代表笔的倾斜角度。æ£çš„ X åæ ‡å€¼è¡¨ç¤ºå‘å³å€¾æ–œã€‚æ£çš„Yåæ ‡å€¼è¡¨ç¤ºå‘用户自身倾斜。" +"两个轴的范围是 [code]-1.0[/code] 到 [code]1.0[/code]。" #: doc/classes/InputEventScreenDrag.xml msgid "" @@ -38374,7 +38417,7 @@ msgstr "å±å¹•拖动事件的输入事件类型。仅适用于移动设备。" #: doc/classes/InputEventScreenDrag.xml msgid "Contains screen drag information. See [method Node._input]." -msgstr "包å«å±å¹•拖动信æ¯ã€‚è§[method Node._input]。" +msgstr "包å«å±å¹•拖动信æ¯ã€‚è§ [method Node._input]。" #: doc/classes/InputEventScreenDrag.xml msgid "The drag event index in the case of a multi-drag event." @@ -38407,13 +38450,13 @@ msgid "" "Stores multi-touch press/release information. Supports touch press, touch " "release and [member index] for multi-touch count and order." msgstr "" -"å˜å‚¨å¤šç‚¹è§¦æ‘¸çš„æŒ‰åŽ‹/释放信æ¯ã€‚支æŒè§¦æ‘¸æŒ‰åŽ‹ã€è§¦æ‘¸é‡Šæ”¾å’Œ[member index]的多点触摸" -"计数和顺åºã€‚" +"å˜å‚¨å¤šç‚¹è§¦æ‘¸çš„æŒ‰åŽ‹/释放信æ¯ã€‚支æŒè§¦æ‘¸æŒ‰åŽ‹ã€è§¦æ‘¸é‡Šæ”¾å’Œ [member index] 的多点触" +"摸计数和顺åºã€‚" #: doc/classes/InputEventScreenTouch.xml msgid "" "The touch index in the case of a multi-touch event. One index = one finger." -msgstr "在多点触摸事件ä¸çš„触摸指数。一个索引=一个手指。" +msgstr "在多点触摸事件ä¸çš„触摸指数。一个索引 = 一个手指。" #: doc/classes/InputEventScreenTouch.xml msgid "The touch position." @@ -38424,8 +38467,8 @@ msgid "" "If [code]true[/code], the touch's state is pressed. If [code]false[/code], " "the touch's state is released." msgstr "" -"如果[code]true[/code],触摸的状æ€ä¸ºæŒ‰ä¸‹ã€‚如果[code]false[/code],触摸的状æ€è¢«" -"释放。" +"如果为 [code]true[/code],触摸的状æ€ä¸ºæŒ‰ä¸‹ã€‚如果为 [code]false[/code],触摸的" +"状æ€è¢«é‡Šæ”¾ã€‚" #: doc/classes/InputEventWithModifiers.xml msgid "Base class for keys events with modifiers." @@ -38687,14 +38730,14 @@ msgid "" "method will ignore all non-number characters, so calling [code]int('1e3')[/" "code] will return 13." msgstr "" -"将一个[String]å—ç¬¦ä¸²å€¼è½¬æ¢æˆä¸€ä¸ªæ•´æ•°å€¼ï¼Œè¿™ä¸ªæ–¹æ³•是一个æ¥è‡ªå—符串的整数解æž" -"å™¨ï¼Œæ‰€ä»¥ç”¨ä¸€ä¸ªæ— æ•ˆçš„æ•´æ•°å—符串调用这个方法将返回0,一个有效的å—符串将是åƒ" -"[code]'1.7'[/code]è¿™æ ·ã€‚è¿™ä¸ªæ–¹æ³•å°†å¿½ç•¥æ‰€æœ‰éžæ•°å—å—符,所以调用" -"[code]int('1e3')[/code]将返回13。" +"å°† [String] å—ç¬¦ä¸²å€¼è½¬æ¢æˆæ•´æ•°å€¼ï¼Œè¿™ä¸ªæ–¹æ³•是å—符串的整数解æžå™¨ï¼Œæ‰€ä»¥ç”¨æ— 效的" +"æ•´æ•°å—符串调用这个方法将返回 0,有效的å—ç¬¦ä¸²å°†æ˜¯åƒ [code]'1.7'[/code] è¿™æ ·" +"çš„ã€‚è¿™ä¸ªæ–¹æ³•ä¼šå¿½ç•¥æ‰€æœ‰éžæ•°å—å—符,所以调用 [code]int('1e3')[/code] 会返回 " +"13。" #: doc/classes/InterpolatedCamera.xml msgid "[i]Deprecated.[/i] Camera which moves toward another node." -msgstr "[i] 已弃用。 [/i] å‘å¦ä¸€ä¸ªèŠ‚ç‚¹ç§»åŠ¨çš„ç›¸æœºã€‚" +msgstr "[i] 已弃用。[/i] å‘å¦ä¸€ä¸ªèŠ‚ç‚¹ç§»åŠ¨çš„ç›¸æœºã€‚" #: doc/classes/InterpolatedCamera.xml msgid "" @@ -38717,7 +38760,7 @@ msgstr "设置è¦ç§»åŠ¨å’Œå®šå‘的节点。" msgid "" "If [code]true[/code], and a target is set, the camera will move " "automatically." -msgstr "如果[code]true[/code]ï¼Œå¹¶ä¸”è®¾ç½®äº†ç›®æ ‡ï¼Œç›¸æœºå°†è‡ªåŠ¨ç§»åŠ¨ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œå¹¶ä¸”è®¾ç½®äº†ç›®æ ‡ï¼Œç›¸æœºå°†è‡ªåŠ¨ç§»åŠ¨ã€‚" #: doc/classes/InterpolatedCamera.xml msgid "" @@ -38794,14 +38837,14 @@ msgid "" "}\n" "[/codeblock]" msgstr "" -"以数组形å¼è¿”回所有网络适é…器(network adapters)。\n" -"æ¯ä¸ªé€‚é…器是一个形å¼çš„å—典。\n" +"以数组形å¼è¿”回所有网络适é…器。\n" +"æ¯ä¸ªé€‚é…器都是一个以下形å¼çš„å—典:\n" "[codeblock]\n" "{\n" " \"index\":\"1\", # 接å£ç´¢å¼•。\n" " \"name\":\"eth0\", # 接å£å称。\n" -" \"friendly\":\"Ethernet One\", # 一个å‹å¥½çš„åå—(å¯èƒ½æ˜¯ç©ºçš„)。\n" -" \"address\":[\"192.168.1.101\"], # ä¸€ä¸ªä¸Žæ¤æŽ¥å£ç›¸å…³çš„IPåœ°å€æ•°ç»„。\n" +" \"friendly\":\"Ethernet One\", # å‹å¥½çš„åå—(å¯èƒ½æ˜¯ç©ºçš„)。\n" +" \"address\":[\"192.168.1.101\"], # ä¸Žæ¤æŽ¥å£ç›¸å…³çš„ IP åœ°å€æ•°ç»„。\n" "}\n" "[/codeblock]" @@ -38909,6 +38952,7 @@ msgid "" msgstr "æä¾›å¯é€‰ä¸é¡¹ç›®ï¼ˆå’Œ/æˆ–å›¾æ ‡ï¼‰åˆ—è¡¨çš„æŽ§ä»¶ï¼Œæ—¢å¯ä»¥æ˜¯å•列,也å¯ä»¥æ˜¯å¤šåˆ—。" #: doc/classes/ItemList.xml +#, fuzzy msgid "" "This control provides a selectable list of items that may be in a single (or " "multiple columns) with option of text, icons, or both text and icon. " @@ -38921,7 +38965,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" "æ¤æŽ§ä»¶æä¾›äº†ä¸€ä¸ªå¯é€‰æ‹©çš„项目列表,该列表å¯ä»¥æ˜¯å•列(或多列),å¯ä»¥å•独选择文" "本ã€å›¾æ ‡æˆ–åŒæ—¶é€‰æ‹©æ–‡æœ¬å’Œå›¾æ ‡ã€‚支æŒå·¥å…·æç¤ºï¼Œåˆ—表ä¸çš„æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æ˜¯ä¸åŒ" @@ -39109,7 +39164,7 @@ msgstr "设置与指定索引相关的项目的调制颜色[Color]。" msgid "" "Sets the region of item's icon used. The whole icon will be used if the " "region has no area." -msgstr "è®¾ç½®é¡¹ç›®å›¾æ ‡çš„ä½¿ç”¨åŒºåŸŸã€‚å¦‚æžœè¯¥åŒºåŸŸå¤§å°ä¸º 0, å°†ä½¿ç”¨æ•´ä¸ªå›¾æ ‡ã€‚" +msgstr "è®¾ç½®é¡¹ç›®å›¾æ ‡çš„ä½¿ç”¨åŒºåŸŸã€‚å¦‚æžœè¯¥åŒºåŸŸå¤§å°ä¸º 0ï¼Œå°†ä½¿ç”¨æ•´ä¸ªå›¾æ ‡ã€‚" #: doc/classes/ItemList.xml msgid "Sets whether the item icon will be drawn transposed." @@ -39526,41 +39581,41 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] Only available in the HTML5 platform." msgstr "" -"JavaScriptObject用于与通过[method JavaScript.get_interface]ã€[method " -"JavaScript.create_object]或[method JavaScript.create_callback]检索或创建的" -"JavaScript对象交互。\n" +"JavaScriptObject 用于与通过 [method JavaScript.get_interface]ã€[method " +"JavaScript.create_object] 或 [method JavaScript.create_callback] 检索或创建" +"çš„ JavaScript 对象交互。\n" "例:\n" "[codeblock]\n" "extends Node\n" "\n" -"var _my_js_callback = JavaScript.create_callback(self, \"myCallback\") # " -"This reference must be kept\n" +"var _my_js_callback = JavaScript.create_callback(self, \"myCallback\") # å¿…é¡»" +"ä¿ç•™è¿™ä¸ªå¼•用\n" "var console = JavaScript.get_interface(\"console\")\n" "\n" "func _init():\n" " var buf = JavaScript.create_object(\"ArrayBuffer\", 10) # new " "ArrayBuffer(10)\n" -" print(buf) # prints [JavaScriptObject:OBJECT_ID]\n" +" print(buf) # 输出 [JavaScriptObject:OBJECT_ID]\n" " var uint8arr = JavaScript.create_object(\"Uint8Array\", buf) # new " "Uint8Array(buf)\n" " uint8arr[1] = 255\n" -" prints(uint8arr[1], uint8arr.byteLength) # prints 255 10\n" +" prints(uint8arr[1], uint8arr.byteLength) # 输出 255 10\n" " console.log(uint8arr) # prints in browser console \"Uint8Array(10) [ 0, " "255, 0, 0, 0, 0, 0, 0, 0, 0 ]\"\n" "\n" -" # Equivalent of JavaScript: Array.from(uint8arr).forEach(myCallback)\n" +" # 相当于 JavaScript: Array.from(uint8arr).forEach(myCallback)\n" " JavaScript.get_interface(\"Array\").from(uint8arr)." "forEach(_my_js_callback)\n" "\n" "func myCallback(args):\n" -" # Will be called with the parameters passed to the \"forEach\" callback\n" +" # ä¼šä½¿ç”¨ä¼ ç»™â€œforEachâ€å›žè°ƒçš„傿•°æ¥è°ƒç”¨\n" " # [0, 0, [JavaScriptObject:1173]]\n" " # [255, 1, [JavaScriptObject:1173]]\n" " # ...\n" " # [0, 9, [JavaScriptObject:1180]]\n" " print(args)\n" "[/codeblock]\n" -"[b]注æ„:[/b]åªåœ¨HTML5å¹³å°ä¸Šå¯ç”¨ã€‚" +"[b]注æ„:[/b]åªåœ¨ HTML5 å¹³å°ä¸Šå¯ç”¨ã€‚" #: doc/classes/JNISingleton.xml msgid "" @@ -39609,7 +39664,7 @@ msgstr "3D 货车镇演示" msgid "" "If [code]true[/code], the two bodies of the nodes are not able to collide " "with each other." -msgstr "如果 [code]true[/code]ï¼Œåˆ™èŠ‚ç‚¹çš„ä¸¤ä¸ªä¸»ä½“æ— æ³•ç›¸äº’ç¢°æ’žã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™èŠ‚ç‚¹çš„ä¸¤ä¸ªä¸»ä½“æ— æ³•ç›¸äº’ç¢°æ’žã€‚" #: doc/classes/Joint.xml msgid "The node attached to the first side (A) of the joint." @@ -39644,7 +39699,7 @@ msgid "" "can pull on the joint." msgstr "" "当 [member node_a] å’Œ [member node_b] å‘ä¸åŒæ–¹å‘移动时,[code]bias[/code] 控" -"制关节将它们拉回原始ä½ç½®çš„æ‰€éœ€æ—¶é—´ã€‚ [code]bias[/code] 越低,两个物体在关节上" +"制关节将它们拉回原始ä½ç½®çš„æ‰€éœ€æ—¶é—´ã€‚[code]bias[/code] 越低,两个物体在关节上" "å—到的拉力越大。" #: doc/classes/Joint2D.xml @@ -40200,15 +40255,15 @@ msgstr "" #: doc/classes/KinematicBody.xml msgid "Lock the body's X axis movement." -msgstr "é”定物体的Xè½´è¿åŠ¨ã€‚" +msgstr "é”定物体的 X è½´è¿åŠ¨ã€‚" #: doc/classes/KinematicBody.xml msgid "Lock the body's Y axis movement." -msgstr "é”定物体的Yè½´è¿åŠ¨ã€‚" +msgstr "é”定物体的 Y è½´è¿åŠ¨ã€‚" #: doc/classes/KinematicBody.xml msgid "Lock the body's Z axis movement." -msgstr "é”定物体的Zè½´è¿åŠ¨ã€‚" +msgstr "é”定物体的 Z è½´è¿åŠ¨ã€‚" #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml msgid "" @@ -40247,19 +40302,19 @@ msgstr "" msgid "" "Lock the body's X axis movement. Deprecated alias for [member " "axis_lock_motion_x]." -msgstr "é”定物体的Xè½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„[member axis_lock_motion_x]的别å。" +msgstr "é”定物体的 X è½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„ [member axis_lock_motion_x] 的别å。" #: doc/classes/KinematicBody.xml msgid "" "Lock the body's Y axis movement. Deprecated alias for [member " "axis_lock_motion_y]." -msgstr "é”定物体的Yè½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„[member axis_lock_motion_y]的别å。" +msgstr "é”定物体的 Y è½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„ [member axis_lock_motion_y] 的别å。" #: doc/classes/KinematicBody.xml msgid "" "Lock the body's Z axis movement. Deprecated alias for [member " "axis_lock_motion_z]." -msgstr "é”定物体的Zè½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„[member axis_lock_motion_z]的别å。" +msgstr "é”定物体的 Z è½´è¿åŠ¨ã€‚å·²è¢«åºŸå¼ƒçš„ [member axis_lock_motion_z] 的别å。" #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml msgid "" @@ -40510,11 +40565,11 @@ msgstr "碰撞体。" #: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml msgid "" "The colliding body's unique instance ID. See [method Object.get_instance_id]." -msgstr "碰撞体的唯一实例ID。å‚阅[method Object.get_instance_id]。" +msgstr "碰撞体的唯一实例 IDã€‚è§ [method Object.get_instance_id]。" #: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml msgid "The colliding body's metadata. See [Object]." -msgstr "碰撞体的元数æ®ã€‚å‚阅[Object]。" +msgstr "碰撞体的元数æ®ã€‚è§ [Object]。" #: doc/classes/KinematicCollision.xml msgid "The colliding body's [RID] used by the [PhysicsServer]." @@ -40526,7 +40581,7 @@ msgstr "碰撞体的形状。" #: doc/classes/KinematicCollision.xml msgid "The colliding shape's index. See [CollisionObject]." -msgstr "碰撞形状的索引。å‚阅[CollisionObject]。" +msgstr "ç¢°æ’žå½¢çŠ¶çš„ç´¢å¼•ã€‚è§ [CollisionObject]。" #: doc/classes/KinematicCollision.xml doc/classes/KinematicCollision2D.xml msgid "The colliding object's velocity." @@ -40566,9 +40621,9 @@ msgid "" "colliding object, the remaining motion, and the collision position. This " "information can be used to calculate a collision response." msgstr "" -"包å«[KinematicBody2D]碰撞的碰撞数æ®ã€‚当使用 [method KinematicBody2D." -"move_and_collide] 移动[KinematicBody2D]时,如果检测到与å¦ä¸€ä¸ªç‰©ä½“的碰撞,它将" -"åœæ¢ã€‚如果检测到碰撞,则返回KinematicCollision2D对象。\n" +"åŒ…å« [KinematicBody2D] 碰撞的碰撞数æ®ã€‚当使用 [method KinematicBody2D." +"move_and_collide] 移动 [KinematicBody2D] 时,如果检测到与å¦ä¸€ä¸ªç‰©ä½“的碰撞,它" +"å°†åœæ¢ã€‚如果检测到碰撞,则返回 KinematicCollision2D 对象。\n" "è¯¥å¯¹è±¡åŒ…å«æœ‰å…³ç¢°æ’žçš„ä¿¡æ¯ï¼ŒåŒ…括碰撞对象,剩余è¿åŠ¨å’Œç¢°æ’žåæ ‡ã€‚该信æ¯å¯ç”¨äºŽè®¡ç®—" "碰撞å“应。" @@ -40593,7 +40648,7 @@ msgid "" "Displays plain text in a line or wrapped inside a rectangle. For formatted " "text, use [RichTextLabel]." msgstr "" -"åœ¨ä¸€è¡Œä¸æ˜¾ç¤ºçº¯æ–‡æœ¬ï¼Œæˆ–åœ¨ä¸€ä¸ªçŸ©å½¢å†…åŒ…è£¹ã€‚å¯¹äºŽæ ¼å¼åŒ–的文本,使用" +"åœ¨ä¸€è¡Œä¸æ˜¾ç¤ºçº¯æ–‡æœ¬ï¼Œæˆ–åœ¨ä¸€ä¸ªçŸ©å½¢å†…åŒ…è£¹ã€‚å¯¹äºŽæ ¼å¼åŒ–的文本,使用 " "[RichTextLabel]。" #: doc/classes/Label.xml @@ -40756,7 +40811,8 @@ msgstr "多行[Label]ä¸å„行之间的垂直空间。" msgid "" "Boolean value. If set to 1 ([code]true[/code]), the shadow will be displayed " "around the whole text as an outline." -msgstr "布尔值。如果设置为1,å³[code]true[/code],整个文本周围显示阴影轮廓。" +msgstr "" +"布尔值。如果设置为 1([code]true[/code]),则整个文本周围显示阴影轮廓。" #: doc/classes/Label.xml msgid "The horizontal offset of the text's shadow." @@ -40768,11 +40824,11 @@ msgstr "文本阴影的垂直å移。" #: doc/classes/Label.xml msgid "[Font] used for the [Label]'s text." -msgstr "ç”¨äºŽæ ‡ç¾[Label]文本的å—体[Font]。" +msgstr "ç”¨äºŽæ ‡ç¾ [Label] 文本的å—体 [Font]。" #: doc/classes/Label.xml msgid "Background [StyleBox] for the [Label]." -msgstr "为[Label]è®¾ç½®èƒŒæ™¯æ ·å¼[StyleBox]。" +msgstr "为 [Label] è®¾ç½®èƒŒæ™¯æ ·å¼ç›’ [StyleBox]。" #: doc/classes/Label3D.xml msgid "Displays plain text in a 3D world." @@ -40804,11 +40860,11 @@ msgstr "" msgid "" "The alpha cutting mode to use for the sprite. See [enum AlphaCutMode] for " "possible values." -msgstr "该精çµçš„ Alpha è£å‰ªæ¨¡å¼ã€‚å¯èƒ½çš„å–值请å‚阅 [enum AlphaCutMode]。" +msgstr "该精çµçš„ Alpha è£å‰ªæ¨¡å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum AlphaCutMode]。" #: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml msgid "Threshold at which the alpha scissor will discard values." -msgstr "alpha scissor 会丢弃数值的阈值。" +msgstr "Alpha è£å‰ªä¸¢å¼ƒæ•°å€¼çš„阈值。" #: doc/classes/Label3D.xml msgid "If [code]true[/code], wraps the text to the [member width]." @@ -40819,8 +40875,7 @@ msgid "" "The billboard mode to use for the label. See [enum SpatialMaterial." "BillboardMode] for possible values." msgstr "" -"è¯¥æ ‡ç¾æ‰€ä½¿ç”¨çš„å…¬å‘Šæ¿æ¨¡å¼ã€‚å¯èƒ½çš„å–值请å‚阅 [enum SpatialMaterial." -"BillboardMode]。" +"è¯¥æ ‡ç¾æ‰€ä½¿ç”¨çš„å…¬å‘Šæ¿æ¨¡å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum SpatialMaterial.BillboardMode]。" #: doc/classes/Label3D.xml msgid "" @@ -40861,7 +40916,7 @@ msgstr "该 [Label3D] 的文本颜色 [Color]。" msgid "" "If [code]true[/code], depth testing is disabled and the object will be drawn " "in render order." -msgstr "如果[code]true[/code],深度测试被ç¦ç”¨ï¼Œå¯¹è±¡å°†æŒ‰æ¸²æŸ“顺åºç»˜åˆ¶ã€‚" +msgstr "如果为 [code]true[/code],深度测试被ç¦ç”¨ï¼Œå¯¹è±¡å°†æŒ‰æ¸²æŸ“顺åºç»˜åˆ¶ã€‚" #: doc/classes/Label3D.xml msgid "The text drawing offset (in pixels)." @@ -40976,7 +41031,7 @@ msgstr "" "这个模å¼åªå…è®¸å®Œå…¨é€æ˜Žæˆ–者完全ä¸é€æ˜Žçš„åƒç´ 。这个模å¼ä¹Ÿå« [i]Alpha 测试[/i]或" "者[i]1ä½é€æ˜Žåº¦[/i]。\n" "[b]注æ„:[/b]使用抗锯齿å—体和轮廓时,这个模å¼å¯èƒ½ä¼šå‡ºçŽ°é—®é¢˜ï¼Œè¯·å°è¯•调整 " -"[member alpha_scissor_threshold] 或使用 SDF å—体。 \n" +"[member alpha_scissor_threshold] 或使用 SDF å—体。\n" "[b]注æ„:[/b]文本ä¸å˜åœ¨é‡å çš„å—形时(例如手写体),这个模å¼å¯èƒ½ä¼šé€ æˆä¸»æ–‡æœ¬å’Œ" "è½®å»“çš„é€æ˜Žåº¦æŽ’åºé—®é¢˜ã€‚" @@ -41009,29 +41064,29 @@ msgid "" "You can dynamically add pieces ([Texture]s) to this [LargeTexture] using " "different offsets." msgstr "" -"[i] 已弃用(将在 Godot 4.0 ä¸ç§»é™¤ï¼‰ã€‚ [/i] 一ç§èƒ½å¤Ÿå˜å‚¨è®¸å¤šå…·æœ‰åç§»é‡çš„较å°çº¹" -"ç†çš„ [Texture]。\n" -"ä½ å¯ä»¥ä½¿ç”¨ä¸åŒçš„åç§»é‡å‘æ¤ [LargeTexture] åŠ¨æ€æ·»åŠ [Texture]片段。" +"[i]已弃用(将在 Godot 4.0 ä¸ç§»é™¤ï¼‰ã€‚[/i] 一ç§èƒ½å¤Ÿå˜å‚¨è®¸å¤šå…·æœ‰åç§»é‡çš„较å°çº¹ç†" +"çš„ [Texture]。\n" +"ä½ å¯ä»¥ä½¿ç”¨ä¸åŒçš„åç§»é‡å‘æ¤ [LargeTexture] åŠ¨æ€æ·»åŠ [Texture] 片段。" #: doc/classes/LargeTexture.xml msgid "" "Adds [code]texture[/code] to this [LargeTexture], starting on offset " "[code]ofs[/code]." msgstr "" -"å°†[code]texture[/code]æ·»åŠ åˆ°è¿™ä¸ª[LargeTexture],从åç§»é‡[code]ofs[/code]å¼€" -"始。" +"å°† [code]texture[/code] æ·»åŠ åˆ°è¿™ä¸ª [LargeTexture],从åç§»é‡ [code]ofs[/code] " +"开始。" #: doc/classes/LargeTexture.xml msgid "Clears the [LargeTexture]." -msgstr "清除[LargeTexture]。" +msgstr "清除 [LargeTexture]。" #: doc/classes/LargeTexture.xml msgid "Returns the number of pieces currently in this [LargeTexture]." -msgstr "返回æ¤[LargeTexture]ä¸çš„片段数。" +msgstr "返回这个 [LargeTexture] ä¸çš„片段数。" #: doc/classes/LargeTexture.xml msgid "Returns the offset of the piece with the index [code]idx[/code]." -msgstr "返回索引为[code]idx[/code]的片段的åç§»é‡ã€‚" +msgstr "返回索引为 [code]idx[/code] 的片段的åç§»é‡ã€‚" #: doc/classes/LargeTexture.xml msgid "Returns the [Texture] of the piece with the index [code]idx[/code]." @@ -41041,7 +41096,7 @@ msgstr "返回索引为 [code]idx[/code] 的片段的 [Texture]。" msgid "" "Sets the offset of the piece with the index [code]idx[/code] to [code]ofs[/" "code]." -msgstr "将索引为[code]idx[/code]的片段的åç§»é‡è®¾ç½®ä¸º[code]ofs[/code]。" +msgstr "将索引为 [code]idx[/code] 的片段的åç§»é‡è®¾ç½®ä¸º [code]ofs[/code]。" #: doc/classes/LargeTexture.xml msgid "" @@ -41052,7 +41107,7 @@ msgstr "" #: doc/classes/LargeTexture.xml msgid "Sets the size of this [LargeTexture]." -msgstr "设置æ¤[LargeTexture]的大å°ã€‚" +msgstr "è®¾ç½®æ¤ [LargeTexture] 的大å°ã€‚" #: doc/classes/Light.xml msgid "Provides a base class for different kinds of light nodes." @@ -41084,7 +41139,7 @@ msgstr "设置指定的 [enum Light.Param] 傿•°çš„值。" msgid "" "If [code]true[/code], the light only appears in the editor and will not be " "visible at runtime." -msgstr "如果 [code]true[/code],ç¯å…‰åªåœ¨ç¼–辑器ä¸å‡ºçŽ°ï¼Œåœ¨è¿è¡Œæ—¶å°†ä¸å¯è§ã€‚" +msgstr "如果为 [code]true[/code],ç¯å…‰åªåœ¨ç¼–辑器ä¸å‡ºçŽ°ï¼Œåœ¨è¿è¡Œæ—¶å°†ä¸å¯è§ã€‚" #: doc/classes/Light.xml msgid "The light's bake mode. See [enum BakeMode]." @@ -41095,8 +41150,8 @@ msgid "" "The light's color. An [i]overbright[/i] color can be used to achieve a " "result equivalent to increasing the light's [member light_energy]." msgstr "" -"光的颜色。一个过亮[i]overbright[/i]颜色å¯ç”¨äºŽå®žçŽ°ç‰æ•ˆäºŽå¢žåŠ å…‰çš„èƒ½é‡ [member " -"light_energy] 的结果。" +"光的颜色。[i]过亮[/i]的颜色å¯ç”¨äºŽå®žçŽ°ä¸Žå¢žåŠ å…‰çš„ [member light_energy] 相ç‰ä»·" +"的结果。" #: doc/classes/Light.xml msgid "The light will affect objects in the selected layers." @@ -41108,8 +41163,8 @@ msgid "" "[OmniLight] and [SpotLight], changing this value will only change the light " "color's intensity, not the light's radius." msgstr "" -"å…‰çš„å¼ºåº¦ä¹˜æ•°ï¼Œæ³¨ï¼Œè¿™ä¸æ˜¯ç‰©ç†å•ä½ã€‚对于 [OmniLight] å’Œ [SpotLight],更改æ¤å€¼åª" -"会更改ç¯å…‰é¢œè‰²çš„强度,而ä¸ä¼šæ›´æ”¹ç¯å…‰çš„åŠå¾„。" +"å…‰çš„å¼ºåº¦ä¹˜æ•°ï¼ˆè¿™ä¸æ˜¯ç‰©ç†å•ä½ï¼‰ã€‚对于 [OmniLight] å’Œ [SpotLight],更改æ¤å€¼åªä¼š" +"更改ç¯å…‰é¢œè‰²çš„强度,而ä¸ä¼šæ›´æ”¹ç¯å…‰çš„åŠå¾„。" #: doc/classes/Light.xml msgid "" @@ -41153,8 +41208,8 @@ msgid "" "shadowing (\"shadow acne\"), while too large a value causes shadows to " "separate from casters (\"peter-panning\"). Adjust as needed." msgstr "" -"用于调整阴影表现。值太å°ä¼šå¯¼è‡´è‡ªé˜´å½±ï¼ˆâ€œé˜´å½±æš—ç–®â€ï¼‰ï¼Œè€Œå€¼å¤ªå¤§ä¼šå¯¼è‡´é˜´å½±ä¸Žä¹‹åˆ†" -"离(“彼得平移â€ï¼‰ã€‚æ ¹æ®éœ€è¦è¿›è¡Œè°ƒæ•´ã€‚" +"用于调整阴影表现。值太å°ä¼šå¯¼è‡´è‡ªé˜´å½±ï¼ˆâ€œé˜´å½±å¤±çœŸâ€ï¼‰ï¼Œè€Œå€¼å¤ªå¤§ä¼šå¯¼è‡´é˜´å½±ä¸Žä¹‹åˆ†" +"离(“阴影悬浮â€ï¼‰ã€‚æ ¹æ®éœ€è¦è¿›è¡Œè°ƒæ•´ã€‚" #: doc/classes/Light.xml msgid "The color of shadows cast by this light." @@ -41184,7 +41239,7 @@ msgid "" "cast a shadow on both sides of the mesh, set the mesh to use double-sided " "shadows with [constant GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED]." msgstr "" -"如果 [code]true[/code],则åè½¬ç½‘æ ¼çš„èƒŒé¢å‰”é™¤ã€‚å½“ä½ æœ‰ä¸€ä¸ªåŽé¢æœ‰ç¯çš„å¹³é¢ç½‘æ ¼" +"如果为 [code]true[/code],则åè½¬ç½‘æ ¼çš„èƒŒé¢å‰”é™¤ã€‚å½“ä½ æœ‰ä¸€ä¸ªåŽé¢æœ‰ç¯çš„å¹³é¢ç½‘æ ¼" "时,这会很有用。如果需è¦åœ¨ç½‘æ ¼çš„ä¸¤ä¾§æŠ•å°„é˜´å½±ï¼Œè¯·ä½¿ç”¨ [constant " "GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED] å°†ç½‘æ ¼è®¾ç½®ä¸ºä½¿ç”¨åŒé¢é˜´" "影。" @@ -41312,20 +41367,20 @@ msgstr "" #: doc/classes/Light2D.xml msgid "The Light2D's [Color]." -msgstr "Light2D光的颜色 [Color]。" +msgstr "该 Light2D 的颜色 [Color]。" #: doc/classes/Light2D.xml msgid "If [code]true[/code], Light2D will only appear when editing the scene." -msgstr "如果[code]true[/code],Light2Då°†åªåœ¨ç¼–辑场景时出现。" +msgstr "如果为 [code]true[/code],Light2D å°†åªåœ¨ç¼–辑场景时出现。" #: doc/classes/Light2D.xml msgid "If [code]true[/code], Light2D will emit light." -msgstr "如果 [code]true[/code],Light2D 会å‘光。" +msgstr "如果为 [code]true[/code],Light2D 会å‘光。" #: doc/classes/Light2D.xml msgid "" "The Light2D's energy value. The larger the value, the stronger the light." -msgstr "Light2D的能é‡å€¼ã€‚该值越大,光线就越强。" +msgstr "Light2D 的能é‡å€¼ã€‚该值越大,光线就越强。" #: doc/classes/Light2D.xml msgid "The Light2D's mode. See [enum Mode] constants for values." @@ -41337,7 +41392,7 @@ msgstr "Light2D çš„ [code]texture[/code] çš„åç§»é‡ã€‚" #: doc/classes/Light2D.xml msgid "The height of the Light2D. Used with 2D normal mapping." -msgstr "Light2D的高度。与2D法线贴图(normal mapping)一起使用。" +msgstr "Light2D 的高度。与 2D 法线贴图一起使用。" #: doc/classes/Light2D.xml msgid "" @@ -41347,7 +41402,7 @@ msgstr "图层é®ç½©ã€‚åªæœ‰å…·æœ‰åŒ¹é…é®ç½©çš„对象æ‰ä¼šå—到Light2Dçš„å½ #: doc/classes/Light2D.xml msgid "Maximum layer value of objects that are affected by the Light2D." -msgstr "å—Light2Då½±å“的对象的最大层数值。" +msgstr "å— Light2D å½±å“的对象的最大层数值。" #: doc/classes/Light2D.xml msgid "Minimum layer value of objects that are affected by the Light2D." @@ -41356,12 +41411,12 @@ msgstr "å— Light2D å½±å“的对象的最å°å±‚数值。" #: doc/classes/Light2D.xml msgid "" "Maximum [code]z[/code] value of objects that are affected by the Light2D." -msgstr "å—Light2Då½±å“的物体的最大[code]z[/code]值。" +msgstr "å— Light2D å½±å“的物体的最大 [code]z[/code] 值。" #: doc/classes/Light2D.xml msgid "" "Minimum [code]z[/code] value of objects that are affected by the Light2D." -msgstr "å—Light2Då½±å“的物体的最å°[code]z[/code]值。" +msgstr "å— Light2D å½±å“çš„ç‰©ä½“çš„æœ€å° [code]z[/code] 值。" #: doc/classes/Light2D.xml msgid "Shadow buffer size." @@ -41369,15 +41424,15 @@ msgstr "阴影缓冲区大å°ã€‚" #: doc/classes/Light2D.xml msgid "[Color] of shadows cast by the Light2D." -msgstr "Light2D投下的影å的颜色[Color]。" +msgstr "该 Light2D 投下的影å的颜色 [Color]。" #: doc/classes/Light2D.xml msgid "If [code]true[/code], the Light2D will cast shadows." -msgstr "如果[code]true[/code],Light2D将投下阴影。" +msgstr "如果为 [code]true[/code],则该 Light2D 将投下阴影。" #: doc/classes/Light2D.xml msgid "Shadow filter type. See [enum ShadowFilter] for possible values." -msgstr "阴影过滤器类型。相关å¯èƒ½çš„值,å‚阅[enum ShadowFilter] 阴影过滤器。" +msgstr "阴影过滤器类型。å¯èƒ½çš„å–å€¼è§ [enum ShadowFilter]。" #: doc/classes/Light2D.xml msgid "Smoothing value for shadows." @@ -41392,12 +41447,12 @@ msgid "" "The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders " "with a matching light mask will cast shadows." msgstr "" -"阴影é®ç½©ã€‚与[LightOccluder2D]ä¸€èµ·ä½¿ç”¨æ¥æŠ•å°„é˜´å½±ã€‚åªæœ‰å…·æœ‰åŒ¹é…的光线é®ç½©çš„鮿Œ¡" -"物æ‰ä¼šæŠ•射阴影。" +"阴影é®ç½©ã€‚与 [LightOccluder2D] ä¸€èµ·ä½¿ç”¨æ¥æŠ•å°„é˜´å½±ã€‚åªæœ‰å…·æœ‰åŒ¹é…的光线é®ç½©çš„é®" +"挡物æ‰ä¼šæŠ•射阴影。" #: doc/classes/Light2D.xml msgid "[Texture] used for the Light2D's appearance." -msgstr "用于Light2D外观的[Texture]。" +msgstr "用于 Light2D 外观的 [Texture]。" #: doc/classes/Light2D.xml msgid "The [code]texture[/code]'s scale factor." @@ -41413,13 +41468,13 @@ msgstr "å°† Light2D 对应的åƒç´ 值与其下方的åƒç´ å€¼ç›¸åŠ ã€‚è¿™æ˜¯ç¯ msgid "" "Subtracts the value of pixels corresponding to the Light2D to the values of " "pixels under it, resulting in inversed light effect." -msgstr "å°†Light2D对应的åƒç´ 值å‡åŽ»å…¶ä¸‹æ–¹çš„åƒç´ 值,产生å光效果。" +msgstr "å°† Light2D 对应的åƒç´ 值å‡åŽ»å…¶ä¸‹æ–¹çš„åƒç´ 值,产生å光效果。" #: doc/classes/Light2D.xml msgid "" "Mix the value of pixels corresponding to the Light2D to the values of pixels " "under it by linear interpolation." -msgstr "通过线性æ’值将Light2D对应的åƒç´ 值与其下方的åƒç´ 值混åˆã€‚" +msgstr "通过线性æ’值将 Light2D 对应的åƒç´ 值与其下方的åƒç´ 值混åˆã€‚" #: doc/classes/Light2D.xml msgid "" @@ -41427,46 +41482,46 @@ msgid "" "parts of the screen underneath depending on the value of each pixel of the " "light (mask) texture." msgstr "" -"Light2D的光线纹ç†è¢«ç”¨ä½œé®ç½©ï¼Œæ ¹æ®å…‰çº¿é®ç½©çº¹ç†çš„æ¯ä¸ªåƒç´ 的值,éšè—或显示å±å¹•下" -"方的部分。" +"Light2D 的光线纹ç†è¢«ç”¨ä½œé®ç½©ï¼Œæ ¹æ®å…‰çº¿é®ç½©çº¹ç†çš„æ¯ä¸ªåƒç´ 的值,éšè—或显示å±å¹•" +"下方的部分。" #: doc/classes/Light2D.xml msgid "No filter applies to the shadow map. See [member shadow_filter]." -msgstr "没有过滤器适用于阴影贴图。å‚阅[member shadow_filter]。" +msgstr "æ²¡æœ‰è¿‡æ»¤å™¨é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/Light2D.xml msgid "" "Percentage closer filtering (3 samples) applies to the shadow map. See " "[member shadow_filter]." -msgstr "百分比接近过滤(3ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚å‚阅[member shadow_filter]。" +msgstr "百分比接近过滤(3 ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/Light2D.xml msgid "" "Percentage closer filtering (5 samples) applies to the shadow map. See " "[member shadow_filter]." -msgstr "百分比接近过滤(5ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚å‚阅[member shadow_filter]。" +msgstr "百分比接近过滤(5 ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/Light2D.xml msgid "" "Percentage closer filtering (7 samples) applies to the shadow map. See " "[member shadow_filter]." -msgstr "百分比接近过滤(7ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚å‚阅[member shadow_filter]。" +msgstr "百分比接近过滤(7 ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/Light2D.xml msgid "" "Percentage closer filtering (9 samples) applies to the shadow map. See " "[member shadow_filter]." -msgstr "百分比接近过滤(9ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚å‚阅[member shadow_filter]。" +msgstr "百分比接近过滤(9 ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/Light2D.xml msgid "" "Percentage closer filtering (13 samples) applies to the shadow map. See " "[member shadow_filter]." -msgstr "百分比接近过滤(13ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚å‚阅[member shadow_filter]。" +msgstr "百分比接近过滤(13 ä¸ªæ ·æœ¬ï¼‰é€‚ç”¨äºŽé˜´å½±è´´å›¾ã€‚è§ [member shadow_filter]。" #: doc/classes/LightOccluder2D.xml msgid "Occludes light cast by a Light2D, casting shadows." -msgstr "鮿Œ¡ç”±Light2D投射的光线,投射阴影。" +msgstr "鮿Œ¡ç”± Light2D 投射的光线,投射阴影。" #: doc/classes/LightOccluder2D.xml msgid "" @@ -41474,7 +41529,7 @@ msgid "" "be provided with an [OccluderPolygon2D] in order for the shadow to be " "computed." msgstr "" -"鮿Œ¡Light2D投射的ç¯å…‰ï¼ŒæŠ•射阴影。为了计算阴影,必须为LightOccluder2Dæä¾›" +"鮿Œ¡ Light2D 投射的ç¯å…‰ï¼ŒæŠ•射阴影。为了计算阴影,必须为 LightOccluder2D æä¾› " "[OccluderPolygon2D]。" #: doc/classes/LightOccluder2D.xml @@ -41482,12 +41537,12 @@ msgid "" "The LightOccluder2D's light mask. The LightOccluder2D will cast shadows only " "from Light2D(s) that have the same light mask(s)." msgstr "" -"LightOccluder2Dçš„ç¯å…‰é®ç½©ã€‚LightOccluder2D将仅从具有相åŒç¯å…‰é®ç½©çš„Light2D投射" -"阴影。" +"LightOccluder2D çš„ç¯å…‰é®ç½©ã€‚LightOccluder2D 将仅从具有相åŒç¯å…‰é®ç½©çš„ Light2D " +"投射阴影。" #: doc/classes/LightOccluder2D.xml msgid "The [OccluderPolygon2D] used to compute the shadow." -msgstr "用于计算阴影的[OccluderPolygon2D]。" +msgstr "用于计算阴影的 [OccluderPolygon2D]。" #: doc/classes/Line2D.xml msgid "A 2D line." @@ -41538,17 +41593,18 @@ msgstr "返回该 Line2D 上点的数é‡ã€‚" #: doc/classes/Line2D.xml msgid "Returns point [code]i[/code]'s position." -msgstr "返回点[code]i[/code]çš„ä½ç½®ã€‚" +msgstr "返回点 [code]i[/code] çš„ä½ç½®ã€‚" #: doc/classes/Line2D.xml msgid "Removes the point at index [code]i[/code] from the line." -msgstr "将索引[code]i[/code]处的点从直线ä¸ç§»é™¤ã€‚" +msgstr "将索引 [code]i[/code] 处的点从直线ä¸ç§»é™¤ã€‚" #: doc/classes/Line2D.xml msgid "" "Overwrites the position in point [code]i[/code] with the supplied " "[code]position[/code]." -msgstr "用æä¾›çš„[code]position[/code]ä½ç½®è¦†ç›–索引[code]i[/code]处点的ä½ç½®ã€‚" +msgstr "" +"用æä¾›çš„ [code]position[/code] ä½ç½®è¦†ç›–索引 [code]i[/code] 处点的ä½ç½®ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -41632,7 +41688,7 @@ msgstr "" msgid "" "The texture used for the line's texture. Uses [code]texture_mode[/code] for " "drawing style." -msgstr "用于线æ¡çº¹ç†çš„纹ç†ã€‚使用[code]texture_mode[/code]ä½œä¸ºç»˜å›¾æ ·å¼ã€‚" +msgstr "用于线æ¡çº¹ç†çš„纹ç†ã€‚使用 [code]texture_mode[/code] ä½œä¸ºç»˜å›¾æ ·å¼ã€‚" #: doc/classes/Line2D.xml msgid "" @@ -42087,7 +42143,7 @@ msgstr "按下清除按钮时使用的颜色。" #: doc/classes/LineEdit.xml msgid "Color of the [LineEdit]'s visual cursor (caret)." -msgstr "[LineEdit]å¯è§†å…‰æ ‡(æ’入符å·)的颜色。" +msgstr "[LineEdit] å¯è§†å…‰æ ‡ï¼ˆæ’入符å·ï¼‰çš„颜色。" #: doc/classes/LineEdit.xml msgid "Default font color." @@ -42095,7 +42151,7 @@ msgstr "默认å—体颜色。" #: doc/classes/LineEdit.xml msgid "Font color for selected text (inside the selection rectangle)." -msgstr "选定文本的å—体颜色(在选择矩形内)。" +msgstr "选定文本的å—体颜色(在选择矩形内)。" #: doc/classes/LineEdit.xml msgid "Font color when editing is disabled." @@ -42111,8 +42167,8 @@ msgid "" "content margins). This value is measured in count of space characters (i.e. " "this amount of space characters can be displayed without scrolling)." msgstr "" -"æ–‡æœ¬çš„æœ€å°æ°´å¹³ç©ºé—´(ä¸åŒ…括清除按钮和内容边è·)ã€‚è¯¥å€¼ä»¥ç©ºæ ¼å—符的计数æ¥è¡¡é‡(峿— " -"需滚动å³å¯æ˜¾ç¤ºç©ºæ ¼å—符的数é‡)。" +"æ–‡æœ¬çš„æœ€å°æ°´å¹³ç©ºé—´ï¼ˆä¸åŒ…括清除按钮和内容边è·ï¼‰ã€‚è¯¥å€¼ä»¥ç©ºæ ¼å—符的计数æ¥è¡¡é‡" +"ï¼ˆå³æ— 需滚动å³å¯æ˜¾ç¤ºç©ºæ ¼å—符的数é‡ï¼‰ã€‚" #: doc/classes/LineEdit.xml msgid "Font used for the text." @@ -42120,7 +42176,7 @@ msgstr "文本使用的å—体。" #: doc/classes/LineEdit.xml msgid "Texture for the clear button. See [member clear_button_enabled]." -msgstr "â€œæ¸…é™¤â€æŒ‰é’®çš„纹ç†ã€‚请å‚阅 [member clear_button_enabled]。" +msgstr "â€œæ¸…é™¤â€æŒ‰é’®çš„纹ç†ã€‚è§ [member clear_button_enabled]。" #: doc/classes/LineEdit.xml msgid "Background used when [LineEdit] has GUI focus." @@ -42413,7 +42469,7 @@ msgstr "在程åºé€€å‡ºå‰è°ƒç”¨ã€‚" msgid "" "Called when the user performs an action in the system global menu (e.g. the " "Mac OS menu bar)." -msgstr "当用户在系统全局èœå•(如 Mac OSçš„èœå•æ ï¼‰ä¸æ‰§è¡ŒåŠ¨ä½œæ—¶è¢«è°ƒç”¨ã€‚" +msgstr "当用户在系统全局èœå•(如 Mac OS çš„èœå•æ ï¼‰ä¸æ‰§è¡ŒåŠ¨ä½œæ—¶è¢«è°ƒç”¨ã€‚" #: doc/classes/MainLoop.xml msgid "" @@ -42723,8 +42779,9 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" -"返回一个对应于Base64ç¼–ç çš„å—符串[code]base64_str[/code]的解ç [Variant]。如果" -"[code]allow_objects[/code]是[code]true[/code],则å…许对对象进行解ç 。\n" +"返回一个对应于 Base64 ç¼–ç çš„å—符串 [code]base64_str[/code] 的解ç [Variant]。" +"如果 [code]allow_objects[/code] 是 [code]true[/code],则å…许对对象进行解" +"ç 。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化的对象å¯èƒ½åŒ…å«ä¼šè¢«æ‰§è¡Œçš„代ç 。如果åºåˆ—化的对象æ¥è‡ªä¸å—ä¿¡" "ä»»çš„æ¥æºï¼Œè¯·ä¸è¦ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼Œå¦‚è¿œç¨‹ä»£ç æ‰§è¡Œã€‚" @@ -42899,11 +42956,11 @@ msgstr "å½“é¼ æ ‡åœ¨ [MenuButton] ä¸Šæ‚¬åœæ—¶ä½¿ç”¨çš„ [StyleBox] æ ·å¼ç›’。" #: doc/classes/MenuButton.xml msgid "Default [StyleBox] for the [MenuButton]." -msgstr "[MenuButton]的默认[StyleBox]æ ·å¼ç›’。" +msgstr "[MenuButton] 的默认 [StyleBox] æ ·å¼ç›’。" #: doc/classes/MenuButton.xml msgid "[StyleBox] used when the [MenuButton] is being pressed." -msgstr "[MenuButton]被按下时的[StyleBox]æ ·å¼ç›’。" +msgstr "[MenuButton] 被按下时的 [StyleBox] æ ·å¼ç›’。" #: doc/classes/Mesh.xml msgid "A [Resource] that contains vertex array-based geometry." @@ -42934,8 +42991,8 @@ msgstr "" "如果 [code]clean[/code] 是 [code]true[/code] (默认),é‡å¤çš„和内部的顶点会被" "è‡ªåŠ¨ç§»é™¤ã€‚ä½ å¯ä»¥æŠŠå®ƒè®¾ä¸º [code]false[/code] æ¥ä½¿è¿™ä¸ªè¿‡ç¨‹æ›´å¿«ï¼Œå¦‚æžœä¸éœ€è¦çš„" "è¯ã€‚\n" -"如果[code]simplify[/code]是[code]true[/code],å¯ä»¥è¿›ä¸€æ¥ç®€åŒ–å‡ ä½•ä½“ä»¥å‡å°‘顶点" -"的数é‡ã€‚默认情况下是ç¦ç”¨çš„。" +"如果 [code]simplify[/code] 是 [code]true[/code],å¯ä»¥è¿›ä¸€æ¥ç®€åŒ–å‡ ä½•ä½“ä»¥å‡å°‘é¡¶" +"点的数é‡ã€‚默认情况下是ç¦ç”¨çš„。" #: doc/classes/Mesh.xml msgid "" @@ -42949,11 +43006,11 @@ msgstr "" #: doc/classes/Mesh.xml msgid "Calculate a [ConcavePolygonShape] from the mesh." -msgstr "ä»Žç½‘æ ¼ä¸è®¡ç®—出[ConcavePolygonShape]。" +msgstr "ä»Žç½‘æ ¼ä¸è®¡ç®—出 [ConcavePolygonShape]。" #: doc/classes/Mesh.xml msgid "Generate a [TriangleMesh] from the mesh." -msgstr "ä»Žç½‘æ ¼ç”Ÿæˆ[TriangleMesh]。" +msgstr "ä»Žç½‘æ ¼ç”Ÿæˆ [TriangleMesh]。" #: doc/classes/Mesh.xml msgid "" @@ -42992,21 +43049,21 @@ msgstr "返回所需é¢çš„æ··åˆå½¢çŠ¶æ•°ç»„ã€‚" msgid "" "Returns a [Material] in a given surface. Surface is rendered using this " "material." -msgstr "返回给定é¢çš„[Material]æè´¨ã€‚é¢å°†ç”±è¯¥æè´¨æ¥æ¸²æŸ“。" +msgstr "返回给定é¢çš„ [Material] æè´¨ã€‚é¢å°†ç”±è¯¥æè´¨æ¥æ¸²æŸ“。" #: doc/classes/Mesh.xml msgid "" "Sets a [Material] for a given surface. Surface will be rendered using this " "material." -msgstr "设置给定é¢çš„[Material]æè´¨ã€‚该é¢å°†ä¼šä½¿ç”¨æ¤æè´¨æ¸²æŸ“。" +msgstr "设置给定é¢çš„ [Material] æè´¨ã€‚该é¢å°†ä¼šä½¿ç”¨æ¤æè´¨æ¸²æŸ“。" #: doc/classes/Mesh.xml msgid "" "Sets a hint to be used for lightmap resolution in [BakedLightmap]. Overrides " "[member BakedLightmap.default_texels_per_unit]." msgstr "" -"设置æç¤ºï¼Œç”¨äºŽ[BakedLightmap]ä¸çš„光照贴图分辨率。é‡å†™[member BakedLightmap." -"default_texels_per_unit]。" +"设置æç¤ºï¼Œç”¨äºŽ [BakedLightmap] ä¸çš„光照贴图分辨率。é‡å†™ [member " +"BakedLightmap.default_texels_per_unit]。" #: doc/classes/Mesh.xml msgid "Render array as points (one vertex equals one point)." @@ -43065,11 +43122,11 @@ msgstr "ç½‘æ ¼ç»„åŒ…å«é¢œè‰²ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array contains UVs." -msgstr "ç½‘æ ¼ç»„åŒ…å«UV。" +msgstr "ç½‘æ ¼ç»„åŒ…å« UV。" #: doc/classes/Mesh.xml msgid "Mesh array contains second UV." -msgstr "ç½‘æ ¼ç»„åŒ…å«ç¬¬äºŒå¥—UV。" +msgstr "ç½‘æ ¼ç»„åŒ…å«ç¬¬äºŒå¥— UV。" #: doc/classes/Mesh.xml msgid "Mesh array contains bones." @@ -43087,7 +43144,7 @@ msgstr "ç½‘æ ¼ç»„ä½¿ç”¨ç´¢å¼•ã€‚" msgid "" "Used internally to calculate other [code]ARRAY_COMPRESS_*[/code] enum " "values. Do not use." -msgstr "内部用于计算其他[code]ARRAY_COMPRESS_*[/code]枚举值。ä¸è¦ä½¿ç”¨ã€‚" +msgstr "内部用于计算其他 [code]ARRAY_COMPRESS_*[/code] 枚举值。ä¸è¦ä½¿ç”¨ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) vertex array." @@ -43095,25 +43152,25 @@ msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¡¶ç‚¹æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) normal array." -msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æ³•呿•°ç»„çš„ Flag。" +msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æ³•呿•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) tangent array." -msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰åˆ‡å‘数组的Flag。" +msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰åˆ‡å‘æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) color array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¢œè‰²æ•°ç»„çš„Flag。" +msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¢œè‰²æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) UV coordinates array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„ Flag。" +msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "" "Flag used to mark a compressed (half float) UV coordinates array for the " "second UV coordinates." -msgstr "æ›¾ç”¨äºŽæ ‡è®°ç¬¬äºŒå¥—UVåæ ‡çš„压缩(åŠç²¾åº¦æµ®ç‚¹ï¼‰UVåæ ‡æ•°ç»„çš„Flag。" +msgstr "æ›¾ç”¨äºŽæ ‡è®°ç¬¬äºŒå¥— UV åæ ‡çš„压缩(åŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed bone array." @@ -43125,15 +43182,15 @@ msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æƒé‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed index array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ç´¢å¼•æ•°ç»„çš„Flag。" +msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ç´¢å¼•æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark that the array contains 2D vertices." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŒ…å«2D顶点的数组的Flag。" +msgstr "æ›¾ç”¨äºŽæ ‡è®°åŒ…å« 2D é¡¶ç‚¹çš„æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark that the array uses 16-bit bones instead of 8-bit." -msgstr "ç”¨äºŽæ ‡è®°æ•°ç»„ä½¿ç”¨16ä½éª¨éª¼è€Œä¸æ˜¯8ä½çš„æ ‡å¿—。" +msgstr "ç”¨äºŽæ ‡è®°æ•°ç»„ä½¿ç”¨ 16 ä½éª¨éª¼è€Œä¸æ˜¯ 8 ä½çš„æ ‡å¿—。" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "" @@ -43149,10 +43206,10 @@ msgid "" "ARRAY_COMPRESS_TEX_UV2], [constant ARRAY_COMPRESS_WEIGHTS], and [constant " "ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." msgstr "" -"ç”¨äºŽå¿«é€Ÿè®¾ç½®æ ‡å¿—[constant ARRAY_COMPRESS_VERTEX], [constant " -"ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " -"ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV], [constant " -"ARRAY_COMPRESS_TEX_UV2] , [constant ARRAY_COMPRESS_WEIGHTS], å’Œ[constant " +"ç”¨äºŽå¿«é€Ÿè®¾ç½®æ ‡å¿— [constant ARRAY_COMPRESS_VERTEX]ã€[constant " +"ARRAY_COMPRESS_NORMAL]ã€[constant ARRAY_COMPRESS_TANGENT]ã€[constant " +"ARRAY_COMPRESS_COLOR]ã€[constant ARRAY_COMPRESS_TEX_UV]ã€[constant " +"ARRAY_COMPRESS_TEX_UV2]ã€[constant ARRAY_COMPRESS_WEIGHTS]ã€[constant " "ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] 。" #: doc/classes/Mesh.xml @@ -43165,7 +43222,7 @@ msgstr "法线数组。" #: doc/classes/Mesh.xml msgid "Array of tangents as an array of floats, 4 floats per tangent." -msgstr "åˆ‡å‘æ•°ç»„。æ¯ä¸€ä¸ªåˆ‡å‘æ•°æ®ç”±å››ä¸ªfloatå˜é‡æè¿°ã€‚" +msgstr "åˆ‡å‘æ•°ç»„。æ¯ä¸€ä¸ªåˆ‡å‘æ•°æ®ç”±å››ä¸ª float å˜é‡æè¿°ã€‚" #: doc/classes/Mesh.xml msgid "Array of colors." @@ -43177,7 +43234,7 @@ msgstr "UV åæ ‡æ•°ç»„。" #: doc/classes/Mesh.xml msgid "Array of second set of UV coordinates." -msgstr "第二套UVåæ ‡æ•°ç»„。" +msgstr "第二套 UV åæ ‡æ•°ç»„。" #: doc/classes/Mesh.xml msgid "Array of bone data." @@ -43259,7 +43316,7 @@ msgstr "" #: doc/classes/MeshDataTool.xml msgid "Clears all data currently in MeshDataTool." -msgstr "将当å‰MeshDataTool䏿‰€æœ‰çš„æ•°æ®å…¨éƒ¨æ¸…除。" +msgstr "å°†å½“å‰ MeshDataTool 䏿‰€æœ‰çš„æ•°æ®å…¨éƒ¨æ¸…除。" #: doc/classes/MeshDataTool.xml msgid "Adds a new surface to specified [Mesh] with edited data." @@ -43292,11 +43349,11 @@ msgid "" "vertices." msgstr "" "返回连接到给定边的指定顶点的索引。\n" -"é¡¶ç‚¹å‚æ•°åªèƒ½æ˜¯0或1ï¼Œå› ä¸ºè¾¹æ˜¯ç”±ä¸¤ä¸ªé¡¶ç‚¹ç»„æˆçš„。" +"é¡¶ç‚¹å‚æ•°åªèƒ½æ˜¯ 0 或 1ï¼Œå› ä¸ºè¾¹æ˜¯ç”±ä¸¤ä¸ªé¡¶ç‚¹ç»„æˆçš„。" #: doc/classes/MeshDataTool.xml msgid "Returns the number of faces in this [Mesh]." -msgstr "返回这个[Mesh]ä¸çš„颿•°ã€‚" +msgstr "返回这个 [Mesh] ä¸çš„颿•°ã€‚" #: doc/classes/MeshDataTool.xml msgid "" @@ -43340,7 +43397,7 @@ msgstr "" #: doc/classes/MeshDataTool.xml msgid "Returns the material assigned to the [Mesh]." -msgstr "返回分é…ç»™[Mesh]çš„æè´¨ã€‚" +msgstr "返回分é…ç»™ [Mesh] çš„æè´¨ã€‚" #: doc/classes/MeshDataTool.xml msgid "Returns the vertex at given index." @@ -43356,7 +43413,7 @@ msgstr "返回给定顶点的颜色。" #: doc/classes/MeshDataTool.xml msgid "Returns the total number of vertices in [Mesh]." -msgstr "返回[Mesh]ä¸é¡¶ç‚¹çš„æ€»æ•°ã€‚" +msgstr "返回 [Mesh] ä¸é¡¶ç‚¹çš„æ€»æ•°ã€‚" #: doc/classes/MeshDataTool.xml msgid "Returns an array of edges that share the given vertex." @@ -43380,11 +43437,11 @@ msgstr "返回给定顶点的æ£åˆ‡å€¼ã€‚" #: doc/classes/MeshDataTool.xml msgid "Returns the UV of the given vertex." -msgstr "返回给定顶点的UV。" +msgstr "返回给定顶点的 UV。" #: doc/classes/MeshDataTool.xml msgid "Returns the UV2 of the given vertex." -msgstr "返回给定顶点的UV2。" +msgstr "返回给定顶点的 UV2。" #: doc/classes/MeshDataTool.xml msgid "Returns bone weights of the given vertex." @@ -43400,7 +43457,7 @@ msgstr "设置给定é¢çš„元数æ®ã€‚" #: doc/classes/MeshDataTool.xml msgid "Sets the material to be used by newly-constructed [Mesh]." -msgstr "设置新构建的[Mesh]使用的æè´¨ã€‚" +msgstr "设置新构建的 [Mesh] 使用的æè´¨ã€‚" #: doc/classes/MeshDataTool.xml msgid "Sets the position of the given vertex." @@ -43428,11 +43485,11 @@ msgstr "设置给定顶点的切线。" #: doc/classes/MeshDataTool.xml msgid "Sets the UV of the given vertex." -msgstr "设置给定顶点的UV。" +msgstr "设置给定顶点的 UV。" #: doc/classes/MeshDataTool.xml msgid "Sets the UV2 of the given vertex." -msgstr "设置给定顶点的UV2。" +msgstr "设置给定顶点的 UV2。" #: doc/classes/MeshDataTool.xml msgid "Sets the bone weights of the given vertex." @@ -43451,10 +43508,10 @@ msgid "" "[Mesh] has to be instanced more than thousands of times at close proximity, " "consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" -"MeshInstance是一个节点,它获å–[Mesh]资æºå¹¶åˆ›å»ºä¸€ä¸ªå®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ°å½“å‰åœºæ™¯" -"ä¸ã€‚è¿™æ˜¯æœ€å¸¸è¢«ç”¨æ¥æ¸²æŸ“3Då‡ ä½•ä½“çš„ç±»ï¼Œè¿™å¯ä»¥åœ¨å¾ˆå¤šåœ°æ–¹ä½¿ç”¨[Mesh]实例,它å…许é‡" -"å¤ä½¿ç”¨å‡ 何体并节çœèµ„æºã€‚当[Mesh]å¿…é¡»åœ¨å¾ˆè¿‘çš„åœ°æ–¹è¢«å®žä¾‹åŒ–è¶…è¿‡æ•°åƒæ¬¡æ—¶ï¼Œå¯ä»¥è€ƒ" -"虑在[MultiMeshInstance]ä¸ä½¿ç”¨[MultiMesh]æ¥ä»£æ›¿ã€‚" +"MeshInstance æ˜¯ä¸€ä¸ªèŠ‚ç‚¹ï¼Œå®ƒèŽ·å– [Mesh] 资æºå¹¶åˆ›å»ºä¸€ä¸ªå®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ°å½“å‰åœºæ™¯" +"ä¸ã€‚è¿™æ˜¯æœ€å¸¸è¢«ç”¨æ¥æ¸²æŸ“ 3D å‡ ä½•ä½“çš„ç±»ï¼Œè¿™å¯ä»¥åœ¨å¾ˆå¤šåœ°æ–¹ä½¿ç”¨ [Mesh] 实例,它å…" +"许é‡å¤ä½¿ç”¨å‡ 何体并节çœèµ„æºã€‚当 [Mesh] å¿…é¡»åœ¨å¾ˆè¿‘çš„åœ°æ–¹è¢«å®žä¾‹åŒ–è¶…è¿‡æ•°åƒæ¬¡æ—¶ï¼Œ" +"å¯ä»¥è€ƒè™‘在 [MultiMeshInstance] ä¸ä½¿ç”¨ [MultiMesh] æ¥ä»£æ›¿ã€‚" #: doc/classes/MeshInstance.xml msgid "" @@ -43467,21 +43524,21 @@ msgid "" "If [code]simplify[/code] is [code]true[/code], the geometry can be further " "simplified to reduce the amount of vertices. Disabled by default." msgstr "" -"这个助手创建[StaticBody]åèŠ‚ç‚¹ï¼Œè¯¥èŠ‚ç‚¹å…·æœ‰ä»Žç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—çš„" -"[ConvexPolygonShape]碰撞形状。其主è¦ç”¨äºŽæµ‹è¯•。\n" -"如果[code]clean[/code]是[code]true[/code](默认),é‡å¤çš„顶点和内部顶点会被自" -"动移除。å¯ä»¥æŠŠå®ƒè®¾ç½®ä¸º [code]false[/code],以便在ä¸éœ€è¦çš„æƒ…况下使这个过程更" -"快。\n" -"如果[code]simplify[/code]是[code]true[/code],å¯ä»¥è¿›ä¸€æ¥ç®€åŒ–å‡ ä½•ä½“ä»¥å‡å°‘顶点" -"的数é‡ã€‚默认情况下是ç¦ç”¨çš„。" +"这个辅助工具创建 [StaticBody] åèŠ‚ç‚¹ï¼Œè¯¥èŠ‚ç‚¹å…·æœ‰ä»Žç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—çš„ " +"[ConvexPolygonShape] 碰撞形状。其主è¦ç”¨äºŽæµ‹è¯•。\n" +"如果 [code]clean[/code] 是 [code]true[/code](默认),é‡å¤çš„顶点和内部顶点会" +"被自动移除。å¯ä»¥æŠŠå®ƒè®¾ç½®ä¸º [code]false[/code],以便在ä¸éœ€è¦çš„æƒ…况下使这个过程" +"更快。\n" +"如果 [code]simplify[/code] 是 [code]true[/code],å¯ä»¥è¿›ä¸€æ¥ç®€åŒ–å‡ ä½•ä½“ä»¥å‡å°‘é¡¶" +"点的数é‡ã€‚默认情况下是ç¦ç”¨çš„。" #: doc/classes/MeshInstance.xml msgid "" "This helper creates a [MeshInstance] child node with gizmos at every vertex " "calculated from the mesh geometry. It's mainly used for testing." msgstr "" -"这个辅助工具创建[MeshInstance]å节点,在æ¯ä¸ªé¡¶ç‚¹éƒ½æœ‰æ ¹æ®ç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—çš„è¾…" -"助线框。其主è¦ç”¨äºŽæµ‹è¯•。" +"这个辅助工具创建 [MeshInstance] å节点,在æ¯ä¸ªé¡¶ç‚¹éƒ½æœ‰æ ¹æ®ç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—çš„" +"辅助线框。其主è¦ç”¨äºŽæµ‹è¯•。" #: doc/classes/MeshInstance.xml msgid "" @@ -43489,8 +43546,8 @@ msgid "" "[ConvexPolygonShape] collision shapes calculated from the mesh geometry via " "convex decomposition. It's mainly used for testing." msgstr "" -"这个助手创建[StaticBody]å节点,该节点具有多个[ConvexPolygonShape]碰撞形状," -"这些碰撞形状是通过凸é¢åˆ†è§£ä»Žç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—å‡ºæ¥çš„。其主è¦ç”¨äºŽæµ‹è¯•。" +"这个辅助工具创建 [StaticBody] å节点,该节点具有多个 [ConvexPolygonShape] 碰" +"撞形状,这些碰撞形状是通过凸é¢åˆ†è§£ä»Žç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—å‡ºæ¥çš„。其主è¦ç”¨äºŽæµ‹è¯•。" #: doc/classes/MeshInstance.xml msgid "" @@ -43498,7 +43555,7 @@ msgid "" "collision shape calculated from the mesh geometry. It's mainly used for " "testing." msgstr "" -"这个助手创建[StaticBody]åèŠ‚ç‚¹ï¼Œå…¶ç¢°æ’žå½¢çŠ¶æ˜¯ç”±ç½‘æ ¼çš„å‡ ä½•å½¢çŠ¶è®¡ç®—å‡ºæ¥çš„" +"这个辅助工具创建 [StaticBody] åèŠ‚ç‚¹ï¼Œå…¶ç¢°æ’žå½¢çŠ¶æ˜¯ç”±ç½‘æ ¼çš„å‡ ä½•å½¢çŠ¶è®¡ç®—å‡ºæ¥çš„ " "[ConcavePolygonShape],其主è¦ç”¨äºŽæµ‹è¯•。" #: doc/classes/MeshInstance.xml @@ -43509,17 +43566,23 @@ msgid "" "[Material] defined in the [Mesh]. For example, if [member GeometryInstance." "material_override] is used, all surfaces will return the override material." msgstr "" -"返回[Mesh]绘制时使用的[Material]。这å¯ä»¥è¿”回[member GeometryInstance." -"material_override],这个[MeshInstance]ä¸å®šä¹‰çš„表é¢è¦†ç›–[Material],或者[Mesh]" -"ä¸å®šä¹‰çš„表é¢[Material]。例如,如果使用[member GeometryInstance." +"返回 [Mesh] 绘制时使用的 [Material]。这å¯ä»¥è¿”回 [member GeometryInstance." +"material_override],这个 [MeshInstance] ä¸å®šä¹‰çš„表é¢è¦†ç›– [Material],或者 " +"[Mesh] ä¸å®šä¹‰çš„è¡¨é¢ [Material]。例如,如果使用 [member GeometryInstance." "material_override],所有的表é¢éƒ½ä¼šè¿”回覆盖的æè´¨ã€‚" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." -msgstr "返回[Mesh]资æºè¡¨é¢çš„[Material]。" +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." +msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." +#, fuzzy +msgid "Returns the number of surface override materials." msgstr "è¿”å›žè¡¨é¢æè´¨çš„æ•°é‡ã€‚" #: doc/classes/MeshInstance.xml @@ -43570,12 +43633,15 @@ msgstr "" "å¦å¤–请注æ„ï¼Œç›®æ ‡ [MeshInstance] ä¸çš„任何åˆå§‹æ•°æ®éƒ½ä¼šè¢«ä¸¢å¼ƒã€‚" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." -msgstr "为[Mesh]资æºçš„表é¢è®¾ç½®[Material]。" +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." +msgstr "" #: doc/classes/MeshInstance.xml msgid "The [Mesh] resource for the instance." -msgstr "该实例的[Mesh]资æºã€‚" +msgstr "该实例的 [Mesh] 资æºã€‚" #: doc/classes/MeshInstance.xml msgid "[NodePath] to the [Skeleton] associated with the instance." @@ -43601,7 +43667,7 @@ msgstr "" #: doc/classes/MeshInstance2D.xml msgid "Node used for displaying a [Mesh] in 2D." -msgstr "用于在2D䏿˜¾ç¤º[Mesh]的节点。" +msgstr "用于在 2D 䏿˜¾ç¤º [Mesh] 的节点。" #: doc/classes/MeshInstance2D.xml msgid "" @@ -43616,7 +43682,7 @@ msgstr "" #: doc/classes/MeshInstance2D.xml msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." -msgstr "[Mesh]将由[MeshInstance2D]绘制。" +msgstr "[Mesh] 将由 [MeshInstance2D] 绘制。" #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "" @@ -43642,7 +43708,7 @@ msgstr "" #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "Emitted when the [member texture] is changed." -msgstr "当[member texture]è¢«æ”¹å˜æ—¶è§¦å‘。" +msgstr "当 [member texture] è¢«æ”¹å˜æ—¶è§¦å‘。" #: doc/classes/MeshLibrary.xml msgid "Library of meshes." @@ -43654,8 +43720,8 @@ msgid "" "and ID. Each item can also include collision and navigation shapes. This " "resource is used in [GridMap]." msgstr "" -"ç½‘æ ¼åº“åŒ…å«ä¸€ä¸ª[Mesh]资æºåˆ—表,æ¯ä¸ªèµ„æºéƒ½æœ‰ä¸€ä¸ªåç§°å’ŒID。æ¯ä¸ªé¡¹ç›®è¿˜å¯ä»¥åŒ…括碰" -"撞和导航形状。这个资æºåœ¨[GridMap]ä¸ä½¿ç”¨ã€‚" +"ç½‘æ ¼åº“åŒ…å«ä¸€ä¸ª [Mesh] 资æºåˆ—表,æ¯ä¸ªèµ„æºéƒ½æœ‰ä¸€ä¸ªåç§°å’Œ ID。æ¯ä¸ªé¡¹ç›®è¿˜å¯ä»¥åŒ…括" +"碰撞和导航形状。这个资æºåœ¨ [GridMap] ä¸ä½¿ç”¨ã€‚" #: doc/classes/MeshLibrary.xml msgid "Clears the library." @@ -43666,8 +43732,8 @@ msgid "" "Creates a new item in the library with the given ID.\n" "You can get an unused ID from [method get_last_unused_item_id]." msgstr "" -"使用给定的ID在库ä¸åˆ›å»ºä¸€ä¸ªæ–°é¡¹ã€‚\n" -"ä½ å¯ä»¥ä»Ž[method get_last_unused_item_id]获å–一个未使用的ID。" +"使用给定的 ID 在库ä¸åˆ›å»ºä¸€ä¸ªæ–°é¡¹ã€‚\n" +"ä½ å¯ä»¥ä»Ž [method get_last_unused_item_id] 获å–一个未使用的 ID。" #: doc/classes/MeshLibrary.xml msgid "Returns the first item with the given name." @@ -43675,7 +43741,7 @@ msgstr "返回第一个指定åç§°çš„ item。" #: doc/classes/MeshLibrary.xml msgid "Returns the list of item IDs in use." -msgstr "返回æ£åœ¨ä½¿ç”¨çš„ item id列表。" +msgstr "返回æ£åœ¨ä½¿ç”¨çš„ item id 列表。" #: doc/classes/MeshLibrary.xml msgid "Returns the item's mesh." @@ -43715,11 +43781,11 @@ msgid "" "The array consists of each [Shape] followed by its [Transform]." msgstr "" "返回项目的碰撞形状。\n" -"这个数组由æ¯ä¸ª[Shape]和它的[Transform]组æˆã€‚" +"这个数组由æ¯ä¸ª [Shape] 和它的 [Transform] 组æˆã€‚" #: doc/classes/MeshLibrary.xml msgid "Gets an unused ID for a new item." -msgstr "èŽ·å–æ–°é¡¹æœªä½¿ç”¨çš„ID。" +msgstr "èŽ·å–æ–°é¡¹æœªä½¿ç”¨çš„ ID。" #: doc/classes/MeshLibrary.xml msgid "Removes the item." @@ -43740,7 +43806,7 @@ msgid "" "later using [method find_item_by_name]." msgstr "" "设置项的å称。\n" -"该å称显示在编辑器ä¸ã€‚ç¨åŽè¿˜å¯ä»¥ä½¿ç”¨[method find_item_by_name]æ¥æŸ¥æ‰¾è¯¥é¡¹ã€‚" +"该å称显示在编辑器ä¸ã€‚ç¨åŽè¿˜å¯ä»¥ä½¿ç”¨ [method find_item_by_name] æ¥æŸ¥æ‰¾è¯¥é¡¹ã€‚" #: doc/classes/MeshLibrary.xml msgid "Sets the item's navigation mesh." @@ -43774,8 +43840,8 @@ msgid "" "Simple texture that uses a mesh to draw itself. It's limited because flags " "can't be changed and region drawing is not supported." msgstr "" -"简å•的纹ç†ï¼Œä½¿ç”¨ä¸€ä¸ªç½‘æ ¼æ¥ç»˜åˆ¶è‡ªå·±ã€‚它的应用场景有é™ï¼Œå› 为Flagä¸èƒ½æ›´æ”¹ï¼Œè€Œä¸”" -"䏿”¯æŒåŒºåŸŸç»˜åˆ¶ã€‚" +"简å•的纹ç†ï¼Œä½¿ç”¨ä¸€ä¸ªç½‘æ ¼æ¥ç»˜åˆ¶è‡ªå·±ã€‚它的应用场景有é™ï¼Œå› 为 Flag ä¸èƒ½æ›´æ”¹ï¼Œè€Œ" +"䏔䏿”¯æŒåŒºåŸŸç»˜åˆ¶ã€‚" #: doc/classes/MeshTexture.xml msgid "Sets the base texture that the Mesh will use to draw." @@ -43787,7 +43853,7 @@ msgstr "设置图åƒçš„大å°ï¼Œéœ€è¦å‚考。" #: doc/classes/MeshTexture.xml msgid "Sets the mesh used to draw. It must be a mesh using 2D vertices." -msgstr "è®¾ç½®ç”¨äºŽç»˜åˆ¶çš„ç½‘æ ¼ï¼Œè¯¥ç½‘æ ¼å¿…é¡»ä½¿ç”¨2D顶点。" +msgstr "è®¾ç½®ç”¨äºŽç»˜åˆ¶çš„ç½‘æ ¼ï¼Œè¯¥ç½‘æ ¼å¿…é¡»ä½¿ç”¨ 2D 顶点。" #: doc/classes/MethodTweener.xml msgid "" @@ -43835,7 +43901,7 @@ msgstr "" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "Generic mobile VR implementation." -msgstr "通用移动VR实现。" +msgstr "通用移动 VR 实现。" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -43879,7 +43945,7 @@ msgstr "显示器的宽度,以厘米为å•ä½ã€‚" msgid "" "The height at which the camera is placed in relation to the ground (i.e. " "[ARVROrigin] node)." -msgstr "æ‘„åƒæœºç›¸å¯¹äºŽåœ°é¢æ‰€å¤„的高度,å³[ARVROrigin]节点。" +msgstr "æ‘„åƒæœºç›¸å¯¹äºŽåœ°é¢æ‰€å¤„çš„é«˜åº¦ï¼Œå³ [ARVROrigin] 节点。" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -43891,11 +43957,12 @@ msgstr "眼间è·ç¦»ï¼Œä¹Ÿç§°ä¸ºçž³å”é—´è·ç¦»ã€‚左眼和å³çœ¼çž³å”之间的 msgid "" "The k1 lens factor is one of the two constants that define the strength of " "the lens used and directly influences the lens distortion effect." -msgstr "k1é•œå¤´å› åæ˜¯å®šä¹‰æ‰€ä½¿ç”¨é•œå¤´å¼ºåº¦çš„两个常é‡ä¹‹ä¸€ï¼Œå¹¶ç›´æŽ¥å½±å“镜头失真效果。" +msgstr "" +"k1 é•œå¤´å› åæ˜¯å®šä¹‰æ‰€ä½¿ç”¨é•œå¤´å¼ºåº¦çš„两个常é‡ä¹‹ä¸€ï¼Œå¹¶ç›´æŽ¥å½±å“镜头失真效果。" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "The k2 lens factor, see k1." -msgstr "k2é•œå¤´å› å,è§k1。" +msgstr "k2 é•œå¤´å› åï¼Œè§ k1。" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -43950,7 +44017,7 @@ msgstr "返回已ç»ä¸ºç‰¹å®šå®žä¾‹è®¾ç½®çš„自定义数æ®ã€‚" #: doc/classes/MultiMesh.xml msgid "Returns the [Transform] of a specific instance." -msgstr "返回一个特定实例的[Transform]。" +msgstr "返回一个特定实例的 [Transform]。" #: doc/classes/MultiMesh.xml msgid "Returns the [Transform2D] of a specific instance." @@ -44025,8 +44092,8 @@ msgid "" "just a container for 4 floating point numbers. The format of the number can " "change depending on the [enum CustomDataFormat] used." msgstr "" -"为特定的实例设置自定义数æ®ã€‚虽然使用了[Color]ï¼Œä½†å®ƒåªæ˜¯ä¸€ä¸ªå®¹çº³4个浮点数的容" -"器。数å—çš„æ ¼å¼å¯ä»¥æ ¹æ®ä½¿ç”¨çš„[enum CustomDataFormat]æ¥æ”¹å˜ã€‚" +"为特定的实例设置自定义数æ®ã€‚虽然使用了 [Color]ï¼Œä½†å®ƒåªæ˜¯ä¸€ä¸ªå®¹çº³ 4 个浮点数的" +"容器。数å—çš„æ ¼å¼å¯ä»¥æ ¹æ®ä½¿ç”¨çš„ [enum CustomDataFormat] æ¥æ”¹å˜ã€‚" #: doc/classes/MultiMesh.xml msgid "Sets the [Transform] for a specific instance." @@ -44074,7 +44141,7 @@ msgstr "" #: doc/classes/MultiMesh.xml msgid "Format of transform used to transform mesh, either 2D or 3D." -msgstr "ç”¨äºŽå˜æ¢ç½‘æ ¼çš„å˜æ¢æ ¼å¼ï¼Œå¯ä»¥æ˜¯2D或3D。" +msgstr "ç”¨äºŽå˜æ¢ç½‘æ ¼çš„å˜æ¢æ ¼å¼ï¼Œå¯ä»¥æ˜¯ 2D 或 3D。" #: doc/classes/MultiMesh.xml msgid "" @@ -44123,7 +44190,7 @@ msgid "" "will be clamped." msgstr "" "ä¼ é€’ç»™ç€è‰²å™¨æ—¶å°† custom_data 压缩为 8 ä½ã€‚这使用更少的内å˜å¹¶ä¸”å¯ä»¥æ›´å¿«ï¼Œä½†ä¼š" -"失去精度和范围。 8 使µ®ç‚¹æ•°åªèƒ½è¡¨ç¤º 0 到 1 之间的值,超出该范围的数å—将被é™" +"失去精度和范围。8 使µ®ç‚¹æ•°åªèƒ½è¡¨ç¤º 0 到 1 之间的值,超出该范围的数å—将被é™" "制。" #: doc/classes/MultiMesh.xml @@ -44157,15 +44224,15 @@ msgid "" "This is useful to optimize the rendering of a high amount of instances of a " "given mesh (for example trees in a forest or grass strands)." msgstr "" -"[MultiMeshInstance]是特有的节点,用于基于[MultiMesh]资æºçš„[GeometryInstance]" -"的实例。\n" +"[MultiMeshInstance] 是特有的节点,用于基于 [MultiMesh] 资æºçš„ " +"[GeometryInstance] 的实例。\n" "è¿™å¯¹äºŽä¼˜åŒ–ç»™å®šç½‘æ ¼çš„å¤§é‡å®žä¾‹çš„æ¸²æŸ“是éžå¸¸æœ‰ç”¨çš„(例如,森林ä¸çš„æ ‘木或è‰ä¸›ï¼‰ã€‚" #: doc/classes/MultiMeshInstance.xml msgid "" "The [MultiMesh] resource that will be used and shared among all instances of " "the [MultiMeshInstance]." -msgstr "在[MultiMeshInstance]的所有实例ä¸ä½¿ç”¨å’Œå…±äº«çš„[MultiMesh]资æºã€‚" +msgstr "在 [MultiMeshInstance] 的所有实例ä¸ä½¿ç”¨å’Œå…±äº«çš„ [MultiMesh] 资æºã€‚" #: doc/classes/MultiMeshInstance2D.xml msgid "Node that instances a [MultiMesh] in 2D." @@ -44177,16 +44244,16 @@ msgid "" "resource in 2D.\n" "Usage is the same as [MultiMeshInstance]." msgstr "" -"[MultiMeshInstance2D]是特有的节点,用于实例化2Dçš„[MultiMesh]资æºã€‚\n" -"使用方法与[MultiMeshInstance]相åŒã€‚" +"[MultiMeshInstance2D] 是特有的节点,用于实例化 2D çš„ [MultiMesh] 资æºã€‚\n" +"使用方法与 [MultiMeshInstance] 相åŒã€‚" #: doc/classes/MultiMeshInstance2D.xml msgid "The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]." -msgstr "将由[MultiMeshInstance2D]绘制的[MultiMesh]。" +msgstr "将由 [MultiMeshInstance2D] 绘制的 [MultiMesh]。" #: doc/classes/MultiplayerAPI.xml msgid "High-level multiplayer API." -msgstr "高级多人游æˆAPI。" +msgstr "é«˜çº§å¤šäººæ¸¸æˆ API。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44201,40 +44268,42 @@ msgid "" "detail and isn't meant to be used by non-Godot servers. It may change " "without notice." msgstr "" -"该类实现了高阶多人游æˆAPI背åŽçš„大部分逻辑。å‚阅[NetworkedMultiplayerPeer]。\n" -"默认情况下,[SceneTree]æœ‰å¯¹è¯¥ç±»çš„å¼•ç”¨ï¼Œç”¨äºŽåœ¨æ•´ä¸ªåœºæ™¯ä¸æä¾›å¤šäººæ¸¸æˆåŠŸèƒ½ï¼ˆå³" +"è¯¥ç±»å®žçŽ°äº†é«˜é˜¶å¤šäººæ¸¸æˆ API 背åŽçš„大部分逻辑。å¦è¯·å‚阅 " +"[NetworkedMultiplayerPeer]。\n" +"默认情况下,[SceneTree] æœ‰å¯¹è¯¥ç±»çš„å¼•ç”¨ï¼Œç”¨äºŽåœ¨æ•´ä¸ªåœºæ™¯ä¸æä¾›å¤šäººæ¸¸æˆåŠŸèƒ½ï¼ˆå³ " "RPC/RSET)。\n" -"通过设置[member Node.custom_multiplayer]属性,å¯ä»¥é‡å†™ç‰¹å®šèŠ‚ç‚¹ä½¿ç”¨çš„å¤šäººæ¸¸æˆ" -"API实例,从而有效地å…许在åŒä¸€åœºæ™¯ä¸åŒæ—¶è¿è¡Œå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨ã€‚\n" -"[b]注æ„:[/b]高阶的多人游æˆAPIåè®®å®žçŽ°ç»†èŠ‚ï¼Œå¹¶ä¸æ„味ç€å¯ä»¥è¢«éžGodotæœåŠ¡å™¨ä½¿" -"用。它å¯èƒ½ä¼šæ”¹å˜ï¼Œä¸åšå¦è¡Œé€šçŸ¥ã€‚" +"通过设置 [member Node.custom_multiplayer] 属性,å¯ä»¥é‡å†™ç‰¹å®šèŠ‚ç‚¹ä½¿ç”¨çš„ " +"MultiplayerAPI 实例,从而有效地å…许在åŒä¸€åœºæ™¯ä¸åŒæ—¶è¿è¡Œå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨ã€‚\n" +"[b]注æ„:[/b]é«˜é˜¶çš„å¤šäººæ¸¸æˆ API åè®®å®žçŽ°ç»†èŠ‚ï¼Œå¹¶ä¸æ„味ç€å¯ä»¥è¢«éž Godot æœåС噍" +"使用。它å¯èƒ½ä¼šæ”¹å˜ï¼Œä¸åšå¦è¡Œé€šçŸ¥ã€‚" #: doc/classes/MultiplayerAPI.xml msgid "" "Clears the current MultiplayerAPI network state (you shouldn't call this " "unless you know what you are doing)." msgstr "" -"清除当å‰çš„MultiplayerAPI网络状æ€ï¼ˆé™¤éžä½ 知é“自己在åšä»€ä¹ˆï¼Œå¦åˆ™ä¸åº”该调用这" +"清除当å‰çš„ MultiplayerAPI 网络状æ€ï¼ˆé™¤éžä½ 知é“自己在åšä»€ä¹ˆï¼Œå¦åˆ™ä¸åº”该调用这" "个)。" #: doc/classes/MultiplayerAPI.xml msgid "" "Returns the peer IDs of all connected peers of this MultiplayerAPI's [member " "network_peer]." -msgstr "返回æ¤MultiplayerAPIçš„[member network_peer]的所有连接的对ç‰ä½“çš„ID。" +msgstr "" +"返回这个 MultiplayerAPI çš„ [member network_peer] 的所有连接的对ç‰ä½“çš„ ID。" #: doc/classes/MultiplayerAPI.xml msgid "" "Returns the unique peer ID of this MultiplayerAPI's [member network_peer]." -msgstr "返回该多人游æˆAPIçš„[member network_peer]的唯一对ç‰ä½“ID。" +msgstr "返回这个 MultiplayerAPI çš„ [member network_peer] 的唯一对ç‰ä½“ ID。" #: doc/classes/MultiplayerAPI.xml msgid "" "Returns the sender's peer ID for the RPC currently being executed.\n" "[b]Note:[/b] If not inside an RPC this method will return 0." msgstr "" -"è¿”å›žå½“å‰æ£åœ¨æ‰§è¡Œçš„RPCçš„å‘逿–¹çš„对ç‰ä½“ID。\n" -"[b]注æ„:[/b]如果ä¸åœ¨RPC内,这个方法将返回0。" +"è¿”å›žå½“å‰æ£åœ¨æ‰§è¡Œçš„ RPC çš„å‘逿–¹çš„对ç‰ä½“ ID。\n" +"[b]注æ„:[/b]如果ä¸åœ¨ RPC 内,这个方法将返回 0。" #: doc/classes/MultiplayerAPI.xml doc/classes/SceneTree.xml msgid "Returns [code]true[/code] if there is a [member network_peer] set." @@ -44245,8 +44314,8 @@ msgid "" "Returns [code]true[/code] if this MultiplayerAPI's [member network_peer] is " "in server mode (listening for connections)." msgstr "" -"如果这个MultiplayerAPIçš„[member network_peer]处于æœåŠ¡å™¨æ¨¡å¼ï¼ˆç›‘å¬è¿žæŽ¥ï¼‰ï¼Œè¿”" -"回 [code]true[/code]。" +"如果这个 MultiplayerAPI çš„ [member network_peer] 处于æœåŠ¡å™¨æ¨¡å¼ï¼ˆç›‘å¬è¿žæŽ¥ï¼‰ï¼Œ" +"返回 [code]true[/code]。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44258,9 +44327,10 @@ msgid "" "will be executed in the same context of this function (e.g. [code]_process[/" "code], [code]physics[/code], [Thread])." msgstr "" -"ç”¨äºŽè½®è¯¢å¤šäººæ¸¸æˆ API çš„æ–¹æ³•ã€‚åªæœ‰å½“ä½ ä½¿ç”¨ [member Node.custom_multiplayer] 覆" -"ç›–æˆ–è€…ä½ å°† [member SceneTree.multiplayer_poll] 设置为 [code]false[/code] 时," -"ä½ æ‰éœ€è¦æ‹…心这个问题。默认情况下,[SceneTree] å°†ä¸ºä½ è½®è¯¢å…¶å¤šäººæ¸¸æˆ API。\n" +"用于轮询 MultiplayerAPI çš„æ–¹æ³•ã€‚åªæœ‰å½“ä½ ä½¿ç”¨ [member Node." +"custom_multiplayer] è¦†ç›–æˆ–è€…ä½ å°† [member SceneTree.multiplayer_poll] 设置为 " +"[code]false[/code] æ—¶ï¼Œä½ æ‰éœ€è¦æ‹…心这个问题。默认情况下,[SceneTree] å°†ä¸ºä½ è½®" +"询其 MultiplayerAPI。\n" "[b]注æ„:[/b]这个方法导致 RPC å’Œ RSET 被调用,所以它们将在这个函数的åŒä¸€ä¸Šä¸‹" "æ–‡ä¸æ‰§è¡Œï¼ˆä¾‹å¦‚ [code]_process[/code]ã€[code]physics[/code]ã€[Thread])。" @@ -44284,8 +44354,8 @@ msgid "" "to avoid potential security threats such as remote code execution." msgstr "" "如果为 [code]true[/code](或者如果 [member network_peer] çš„ [member " -"PacketPeer.allow_object_decoding] 被设置为 [code]true[/code]ï¼‰ï¼Œå¤šäººæ¸¸æˆ API " -"å°†å…许在 RPC/RSET 期间的对象进行编ç 和解ç 。\n" +"PacketPeer.allow_object_decoding] 被设置为 [code]true[/code])," +"MultiplayerAPI å°†å…许在 RPC/RSET 期间的对象进行编ç 和解ç 。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化的对象å¯èƒ½åŒ…å«ä¼šè¢«æ‰§è¡Œçš„代ç 。如果åºåˆ—化的对象æ¥è‡ªä¸å—ä¿¡" "ä»»çš„æ¥æºï¼Œè¯·ä¸è¦ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼Œå¦‚è¿œç¨‹ä»£ç æ‰§è¡Œã€‚" @@ -44310,8 +44380,8 @@ msgid "" "If [code]true[/code], the MultiplayerAPI's [member network_peer] refuses new " "incoming connections." msgstr "" -"如果[code]true[/code],则MultiplayerAPIçš„[member network_peer]ä¼šæ‹’ç»æ–°çš„ä¼ å…¥" -"连接。" +"如果为 [code]true[/code],则MultiplayerAPIçš„[member network_peer]ä¼šæ‹’ç»æ–°çš„ä¼ " +"入连接。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44321,25 +44391,26 @@ msgid "" "managed by different MultiplayerAPI, allowing for example to run both client " "and server in the same scene." msgstr "" -"用于RPCçš„æ ¹èŠ‚ç‚¹ã€‚ä¸ä½¿ç”¨ç»å¯¹è·¯å¾„,而是使用相对路径æ¥å¯»æ‰¾åº”该执行RPC的节点。\n" -"这有效地å…è®¸åœºæ™¯æ ‘çš„ä¸åŒåˆ†æ”¯ç”±ä¸åŒçš„MultiplayerAPI管ç†ï¼Œä¾‹å¦‚å…许在åŒä¸€ä¸ªåœºæ™¯" -"ä¸åŒæ—¶è¿è¡Œå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨ã€‚" +"用于 RPC çš„æ ¹èŠ‚ç‚¹ã€‚ä¸ä½¿ç”¨ç»å¯¹è·¯å¾„,而是使用相对路径æ¥å¯»æ‰¾åº”该执行 RPC 的节" +"点。\n" +"这有效地å…è®¸åœºæ™¯æ ‘çš„ä¸åŒåˆ†æ”¯ç”±ä¸åŒçš„ MultiplayerAPI 管ç†ï¼Œä¾‹å¦‚å…许在åŒä¸€ä¸ªåœº" +"景ä¸åŒæ—¶è¿è¡Œå®¢æˆ·ç«¯å’ŒæœåŠ¡å™¨ã€‚" #: doc/classes/MultiplayerAPI.xml msgid "" "Emitted when this MultiplayerAPI's [member network_peer] successfully " "connected to a server. Only emitted on clients." msgstr "" -"当这个MultiplayerAPIçš„[member network_peer]æˆåŠŸè¿žæŽ¥åˆ°ä¸€ä¸ªæœåŠ¡å™¨æ—¶è§¦å‘该信å·ã€‚" -"è¿™åªåœ¨å®¢æˆ·ç«¯è§¦å‘。" +"当这个 MultiplayerAPI çš„ [member network_peer] æˆåŠŸè¿žæŽ¥åˆ°ä¸€ä¸ªæœåŠ¡å™¨æ—¶è§¦å‘该信" +"å·ã€‚è¿™åªåœ¨å®¢æˆ·ç«¯è§¦å‘。" #: doc/classes/MultiplayerAPI.xml msgid "" "Emitted when this MultiplayerAPI's [member network_peer] fails to establish " "a connection to a server. Only emitted on clients." msgstr "" -"当这个MultiplayerAPIçš„[member network_peer]æ— æ³•ä¸ŽæœåŠ¡å™¨å»ºç«‹è¿žæŽ¥æ—¶è§¦å‘。åªåœ¨å®¢" -"户端触å‘。" +"当这个 MultiplayerAPI çš„ [member network_peer] æ— æ³•ä¸ŽæœåŠ¡å™¨å»ºç«‹è¿žæŽ¥æ—¶è§¦å‘。åª" +"在客户端触å‘。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44348,9 +44419,9 @@ msgid "" "clients connect to the same server. Upon connecting to a server, a client " "also receives this signal for the server (with ID being 1)." msgstr "" -"当æ¤å¤šäººæ’放器的 [member network_peer] 与新对ç‰è¿žæŽ¥æ—¶è§¦å‘该信å·ã€‚ID 是新peer" -"çš„ peer ID。当其他客户端连接到åŒä¸€æœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¼šæ”¶åˆ°é€šçŸ¥ã€‚è¿žæŽ¥åˆ°æœåС噍" -"åŽï¼Œå®¢æˆ·ç«¯è¿˜ä¼šæ”¶åˆ°æœåŠ¡å™¨çš„æ¤ä¿¡å·ï¼ˆID 为 1)。" +"当这个 MultiplayerAPI çš„ [member network_peer] 与新对ç‰è¿žæŽ¥æ—¶è§¦å‘该信å·ã€‚ID " +"是新 peer çš„ peer ID。当其他客户端连接到åŒä¸€æœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¼šæ”¶åˆ°é€šçŸ¥ã€‚è¿žæŽ¥" +"到æœåС噍åŽï¼Œå®¢æˆ·ç«¯è¿˜ä¼šæ”¶åˆ°æœåŠ¡å™¨çš„æ¤ä¿¡å·ï¼ˆID 为 1)。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44358,8 +44429,8 @@ msgid "" "peer. Clients get notified when other clients disconnect from the same " "server." msgstr "" -"当这个MultiplayerAPIçš„[member network_peer]与一个åŒä¼´æ–开连接时触å‘该信å·ã€‚当" -"其他客户端与åŒä¸€æœåС噍æ–开连接时,客户端会得到通知。" +"当这个 MultiplayerAPI çš„ [member network_peer] 与一个åŒä¼´æ–开连接时触å‘该信" +"å·ã€‚当其他客户端与åŒä¸€æœåС噍æ–开连接时,客户端会得到通知。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44367,16 +44438,17 @@ msgid "" "[code]packet[/code] with custom data (see [method send_bytes]). ID is the " "peer ID of the peer that sent the packet." msgstr "" -"当这个MultiplayerAPIçš„[member network_peer]收到一个带有自定义数æ®çš„[code]æ•°æ®" -"包[/code](è§[method send_bytes])时触å‘。ID是å‘é€è¯¥æ•°æ®åŒ…的对ç‰ä½“çš„ID。" +"当这个 MultiplayerAPI çš„ [member network_peer] 收到一个带有自定义数æ®çš„æ•°æ®" +"包 [code]packet[/code]ï¼ˆè§ [method send_bytes])时触å‘。ID 是å‘é€è¯¥æ•°æ®åŒ…的对" +"ç‰ä½“çš„ID。" #: doc/classes/MultiplayerAPI.xml msgid "" "Emitted when this MultiplayerAPI's [member network_peer] disconnects from " "server. Only emitted on clients." msgstr "" -"当这个MultiplayerAPIçš„[member network_peer]与æœåС噍æ–开连接时触å‘。åªåœ¨å®¢æˆ·ç«¯" -"触å‘。" +"当这个 MultiplayerAPI çš„ [member network_peer] 与æœåС噍æ–开连接时触å‘。åªåœ¨å®¢" +"户端触å‘。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44430,8 +44502,8 @@ msgid "" "[i]Deprecated.[/i] Use [constant RPC_MODE_PUPPET] instead. Analogous to the " "[code]slave[/code] keyword." msgstr "" -"[i]已废弃。[/i] 使用[constant RPC_MODE_PUPPET]代替。类似于[code]slave[/code]" -"关键å—。" +"[i]已废弃。[/i]使用 [constant RPC_MODE_PUPPET] 代替。类似于 [code]slave[/" +"code] 关键å—。" #: doc/classes/MultiplayerAPI.xml msgid "" @@ -44446,15 +44518,15 @@ msgid "" "[i]Deprecated.[/i] Use [constant RPC_MODE_REMOTESYNC] instead. Analogous to " "the [code]sync[/code] keyword." msgstr "" -"[i]已废弃。[/i] 使用[constant RPC_MODE_REMOTESYNC]代替。类似于[code]sync[/" -"code]关键å—。" +"[i]已废弃。[/i]使用 [constant RPC_MODE_REMOTESYNC] 代替。类似于 [code]sync[/" +"code] 关键å—。" #: doc/classes/MultiplayerAPI.xml msgid "" "Behave like [constant RPC_MODE_MASTER] but also make the call or property " "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" -"类似于[constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " +"类似于 [constant RPC_MODE_MASTER]ï¼Œä½†ä¹Ÿä½¿æ–¹æ³•è°ƒç”¨æˆ–å±žæ€§æ”¹å˜æœ¬åœ°ã€‚类似于 " "[code]mastersync[/code] 关键å—。" #: doc/classes/MultiplayerAPI.xml @@ -44467,7 +44539,7 @@ msgstr "" #: doc/classes/Mutex.xml msgid "A synchronization mutex (mutual exclusion)." -msgstr "ä¸€ä¸ªåŒæ¥äº’æ–¥é”(相互排斥)。" +msgstr "åŒæ¥äº’æ–¥é”(相互排斥)。" #: doc/classes/Mutex.xml msgid "" @@ -44476,9 +44548,9 @@ msgid "" "that only one thread can ever acquire the lock at a time. A mutex can be " "used to protect a critical section; however, be careful to avoid deadlocks." msgstr "" -"ä¸€ä¸ªåŒæ¥äº’æ–¥é”(mutexï¼‰ã€‚å®ƒç”¨äºŽåŒæ¥å¤šä¸ª[Thread],相当于一个二进制" -"[Semaphore]。它ä¿è¯æ¯æ¬¡åªæœ‰ä¸€ä¸ªçº¿ç¨‹å¯ä»¥èŽ·å¾—é”。互斥é”å¯ä»¥ç”¨æ¥ä¿æŠ¤ä¸´ç•ŒåŒºï¼›ä½†" -"æ˜¯ï¼Œè¦æ³¨æ„é¿å…æ»é”。" +"åŒæ¥äº’æ–¥é”ï¼ˆç›¸äº’æŽ’æ–¥ï¼‰ã€‚å®ƒç”¨äºŽåŒæ¥å¤šä¸ª [Thread],相当于二元 [Semaphore]。它ä¿" +"è¯æ¯æ¬¡åªæœ‰ä¸€ä¸ªçº¿ç¨‹å¯ä»¥èŽ·å¾—é”。互斥é”å¯ä»¥ç”¨æ¥ä¿æŠ¤ä¸´ç•ŒåŒºï¼›ä½†æ˜¯ï¼Œè¦æ³¨æ„é¿å…æ»" +"é”。" #: doc/classes/Mutex.xml msgid "" @@ -44508,40 +44580,40 @@ msgid "" "unlock] the same number of times in order to unlock it correctly." msgstr "" "è§£é”这个 [Mutex],把它留给其他线程。\n" -"[b]注æ„:[/b]å¦‚æžœä¸€ä¸ªçº¿ç¨‹åœ¨å·²ç»æ‹¥æœ‰äº’æ–¥é”的情况下多次调用[method lock]或" -"[method try_lock]ï¼Œå®ƒä¹Ÿå¿…é¡»è°ƒç”¨ç›¸åŒæ¬¡æ•°çš„[method unlock]æ‰èƒ½æ£ç¡®è§£é”." +"[b]注æ„:[/b]å¦‚æžœä¸€ä¸ªçº¿ç¨‹åœ¨å·²ç»æ‹¥æœ‰äº’æ–¥é”的情况下多次调用 [method lock] 或 " +"[method try_lock]ï¼Œå®ƒä¹Ÿå¿…é¡»è°ƒç”¨ç›¸åŒæ¬¡æ•°çš„ [method unlock] æ‰èƒ½æ£ç¡®è§£é”." #: modules/gdnative/doc_classes/NativeScript.xml msgid "" "Returns the documentation string that was previously set with " "[code]godot_nativescript_set_class_documentation[/code]." msgstr "" -"返回之å‰ç”¨[code]godot_nativescript_set_class_documentation[/code]设置的文档å—" -"符串。" +"返回之å‰ç”¨ [code]godot_nativescript_set_class_documentation[/code] 设置的文档" +"å—符串。" #: modules/gdnative/doc_classes/NativeScript.xml msgid "" "Returns the documentation string that was previously set with " "[code]godot_nativescript_set_method_documentation[/code]." msgstr "" -"返回之å‰ç”¨[code]godot_nativescript_set_method_documentation[/code]设置的文档" -"å—符串。" +"返回之å‰ç”¨ [code]godot_nativescript_set_method_documentation[/code] 设置的文" +"æ¡£å—符串。" #: modules/gdnative/doc_classes/NativeScript.xml msgid "" "Returns the documentation string that was previously set with " "[code]godot_nativescript_set_property_documentation[/code]." msgstr "" -"返回之å‰ç”¨[code]godot_nativescript_set_property_documentation[/code]设置的文" -"æ¡£å—符串。" +"返回之å‰ç”¨ [code]godot_nativescript_set_property_documentation[/code] 设置的" +"文档å—符串。" #: modules/gdnative/doc_classes/NativeScript.xml msgid "" "Returns the documentation string that was previously set with " "[code]godot_nativescript_set_signal_documentation[/code]." msgstr "" -"返回之å‰ç”¨[code]godot_nativescript_set_signal_documentation[/code]设置的文档" -"å—符串。" +"返回之å‰ç”¨ [code]godot_nativescript_set_signal_documentation[/code] 设置的文" +"æ¡£å—符串。" #: modules/gdnative/doc_classes/NativeScript.xml msgid "" @@ -44560,7 +44632,11 @@ msgid "Mesh-based navigation and pathfinding node." msgstr "åŸºäºŽç½‘æ ¼çš„å¯¼èˆªå’Œå¯»è·¯èŠ‚ç‚¹ã€‚" #: doc/classes/Navigation.xml +#, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -44614,7 +44690,11 @@ msgid "Returns the [RID] of the navigation map on the [NavigationServer]." msgstr "返回这个导航地图在 [NavigationServer] 上的 [RID]。" #: doc/classes/Navigation.xml +#, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -44650,7 +44730,7 @@ msgid "" "Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " "which is the world's \"up\" direction." msgstr "" -"定义了å‘上的方å‘。默认情况下,这是[code](0,1,0)[/code],这是世界的“å‘ä¸Šâ€æ–¹" +"定义了å‘上的方å‘。默认情况下,这是 [code](0,1,0)[/code],这是世界的“å‘ä¸Šâ€æ–¹" "å‘。" #: doc/classes/Navigation.xml doc/classes/Navigation2DServer.xml @@ -44664,7 +44744,11 @@ msgid "2D navigation and pathfinding node." msgstr "2D 导航和寻路节点。" #: doc/classes/Navigation2D.xml +#, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -44688,7 +44772,11 @@ msgstr "" "[NavigationPolygonInstance]。" #: doc/classes/Navigation2D.xml +#, fuzzy msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -44854,11 +44942,47 @@ msgid "Destroys the given RID." msgstr "销æ¯ç»™å®šçš„ RID。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "åˆ›å»ºä¸€å¼ æ–°åœ°å›¾ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "返回所有与请求的导航地图 [code]map[/code] å…³è”的导航代ç†çš„ [RID]。" @@ -44974,6 +45098,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "返回 [code]region[/code] 地区的移动消耗 [code]travel_cost[/code]。" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "设置 [code]region[/code] 地区的进入消耗 [code]enter_cost[/code]。" @@ -45230,6 +45371,17 @@ msgstr "æœç´¢å…¶ä»–代ç†çš„è·ç¦»ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." @@ -45238,17 +45390,24 @@ msgstr "" "æ–°è®¡ç®—ç†æƒ³è·¯å¾„。" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." -msgstr "代ç†çš„åŠå¾„。" +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" -"è®¤ä¸ºåˆ°è¾¾ç›®æ ‡çš„è·ç¦»é˜ˆå€¼ã€‚å¯ä»¥è®©ä»£ç†æ— 需精准到达路径上的æŸä¸ªç‚¹ï¼Œåˆ°è¾¾æŸä¸ªåŒºåŸŸå³" -"å¯ã€‚" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -45469,7 +45628,7 @@ msgstr "" #: doc/classes/NavigationMesh.xml msgid "The Y axis cell size to use for fields." -msgstr "ç”¨äºŽå—æ®µYè½´å•元的尺寸。" +msgstr "ç”¨äºŽå—æ®µ Y è½´å•元的尺寸。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45498,6 +45657,16 @@ msgstr "" "[b]注æ„:[/b]烘焙时,这个值会å‘ä¸Šå–æ•´åˆ°æœ€æŽ¥è¿‘çš„[member cell_size]çš„å€æ•°ã€‚" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "如果为 [code]true[/code]ï¼Œåˆ™æ ‡è®°è¾¹ç¼˜é—´çš„è·¨åº¦ä¸ºä¸å¯è¡Œèµ°ã€‚" @@ -45532,13 +45701,14 @@ msgstr "" msgid "" "Determines which type of nodes will be parsed as geometry. See [enum " "ParsedGeometryType] for possible values." -msgstr "决定哪ç§ç±»åž‹çš„节点å¯è§£æžä¸ºå‡ 何图形。å‚阅 [enum ParsedGeometryType]。" +msgstr "" +"决定哪ç§ç±»åž‹çš„节点å¯è§£æžä¸ºå‡ 何图形。å¯èƒ½çš„å–å€¼è§ [enum ParsedGeometryType]。" #: doc/classes/NavigationMesh.xml msgid "" "The source of the geometry used when baking. See [enum SourceGeometryMode] " "for possible values." -msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æºã€‚å‚阅 [enum SourceGeometryMode]。" +msgstr "çƒ˜ç„™æ—¶ä½¿ç”¨çš„å‡ ä½•ä½“çš„æºã€‚å¯èƒ½çš„å–å€¼è§ [enum SourceGeometryMode]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45576,15 +45746,16 @@ msgid "" "cells allowed to form isolated island areas. For example, a value of 8 will " "set the number of cells to 64." msgstr "" -"一个区域被创建的最å°å°ºå¯¸ã€‚\n" -"[b]注æ„:[/b]该值将被平方,以计算出å…许形æˆå¤å²›åŒºåŸŸçš„æœ€å°å•元数。例如,8的值" -"将把å•å…ƒæ ¼çš„æ•°é‡è®¾ä¸º64。" +"区域被创建所需的最å°å°ºå¯¸ã€‚\n" +"[b]注æ„:[/b]该值将被平方,以计算出å…许形æˆå¤å²›åŒºåŸŸçš„æœ€å°å•元数。例如,值为 " +"8 时将把å•å…ƒæ ¼çš„æ•°é‡è®¾ä¸º 64。" #: doc/classes/NavigationMesh.xml msgid "" "Partitioning algorithm for creating the navigation mesh polys. See [enum " "SamplePartitionType] for possible values." -msgstr "åˆ›å»ºå¯¼èˆªç½‘æ ¼å¤šè¾¹å½¢å•元的分割算法。å‚阅 [enum SamplePartitionType]。" +msgstr "" +"åˆ›å»ºå¯¼èˆªç½‘æ ¼å¤šè¾¹å½¢å•元的分割算法。å¯èƒ½çš„å–å€¼è§ [enum SamplePartitionType]。" #: doc/classes/NavigationMesh.xml msgid "" @@ -45603,7 +45774,7 @@ msgstr "å•调分区。如果您想è¦å¿«é€Ÿç”Ÿæˆå¯¼èˆªç½‘æ ¼ï¼Œè¯·ä½¿ç”¨æ¤é€‰ msgid "" "Layer partitioning. Good choice to use for tiled navigation mesh with medium " "and small sized tiles." -msgstr "层分区。用于具有ä¸å°åž‹ç“·ç –çš„å¹³é“ºå¯¼èˆªç½‘æ ¼çš„ä¸é”™é€‰æ‹©ã€‚" +msgstr "层分区。用于具有ä¸å°åž‹å›¾å—çš„å¹³é“ºå¯¼èˆªç½‘æ ¼çš„ä¸é”™é€‰æ‹©ã€‚" #: doc/classes/NavigationMesh.xml msgid "Represents the size of the [enum SamplePartitionType] enum." @@ -45666,6 +45837,7 @@ msgid "Helper class for creating and clearing navigation meshes." msgstr "å¯¹å¯¼èˆªç½‘æ ¼è¿›è¡Œåˆ›å»ºå’Œæ¸…ç†çš„辅助类。" #: doc/classes/NavigationMeshGenerator.xml +#, fuzzy msgid "" "This class is responsible for creating and clearing 3D navigation meshes " "used as [NavigationMesh] resources inside [NavigationMeshInstance]. The " @@ -45696,7 +45868,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" "这个类负责 3D å¯¼èˆªç½‘æ ¼çš„åˆ›å»ºå’Œæ¸…ç†ï¼Œå¯¼èˆªç½‘æ ¼ [NavigationMesh] 是 " "[NavigationMeshInstance] ä¸çš„资æºã€‚[NavigationMeshGenerator] 在 2D ä¸çš„用处微" @@ -45811,7 +45991,6 @@ msgstr "决定该 [NavigationMeshInstance] å·²å¯ç”¨è¿˜æ˜¯å·²ç¦ç”¨ã€‚" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "" "When pathfinding enters this region's navmesh from another regions navmesh " "the [code]enter_cost[/code] value is added to the path distance for " @@ -45837,7 +46016,6 @@ msgstr "使用的 [NavigationMesh] 资æºã€‚" #: doc/classes/NavigationMeshInstance.xml #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "" "When pathfinding moves inside this region's navmesh the traveled distances " "are multiplied with [code]travel_cost[/code] for determining the shortest " @@ -46000,8 +46178,8 @@ msgid "" "make_polygons_from_outlines] in order for this array to be converted to " "polygons that the engine will use." msgstr "" -"将包å«è½®å»“顶点的[PoolVector2Array]æ·»åŠ åˆ°åŒ…å«æ‰€æœ‰è½®å»“的内部数组ä¸ã€‚ä½ å¿…é¡»è°ƒç”¨" -"[method make_polygons_from_outlines],将数组转æ¢ä¸ºå¼•擎å¯ä½¿ç”¨çš„多边形。" +"将包å«è½®å»“顶点的 [PoolVector2Array] æ·»åŠ åˆ°åŒ…å«æ‰€æœ‰è½®å»“的内部数组ä¸ã€‚ä½ å¿…é¡»è°ƒ" +"用 [method make_polygons_from_outlines],将数组转æ¢ä¸ºå¼•擎å¯ä½¿ç”¨çš„多边形。" #: doc/classes/NavigationPolygon.xml msgid "" @@ -46010,9 +46188,9 @@ msgid "" "to call [method make_polygons_from_outlines] in order for this array to be " "converted to polygons that the engine will use." msgstr "" -"将包å«è½®å»“顶点的[PoolVector2Array]æ·»åŠ åˆ°å†…éƒ¨æ•°ç»„ä¸ï¼Œè¯¥æ•°ç»„åŒ…å«æ‰€æœ‰å›ºå®šä½ç½®çš„" -"è½®å»“ã€‚ä½ å¿…é¡»è°ƒç”¨[method make_polygons_from_outlines],将数组转æ¢ä¸ºå¼•擎å¯ä½¿ç”¨" -"的多边形。" +"将包å«è½®å»“顶点的 [PoolVector2Array] æ·»åŠ åˆ°å†…éƒ¨æ•°ç»„ä¸ï¼Œè¯¥æ•°ç»„åŒ…å«æ‰€æœ‰å›ºå®šä½ç½®" +"çš„è½®å»“ã€‚ä½ å¿…é¡»è°ƒç”¨ [method make_polygons_from_outlines],将数组转æ¢ä¸ºå¼•擎å¯ä½¿" +"用的多边形。" #: doc/classes/NavigationPolygon.xml msgid "" @@ -46056,7 +46234,7 @@ msgstr "返回多边形的数é‡ã€‚" msgid "" "Returns a [PoolVector2Array] containing all the vertices being used to " "create the polygons." -msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„[PoolVector2Array]。" +msgstr "返回包å«ç”¨äºŽåˆ›å»ºå¤šè¾¹å½¢çš„æ‰€æœ‰é¡¶ç‚¹çš„ [PoolVector2Array]。" #: doc/classes/NavigationPolygon.xml msgid "Creates polygons from the outlines added in the editor or by script." @@ -46269,13 +46447,13 @@ msgid "" "the server port in UDP. You can use the [UPNP] class to try to forward the " "server port automatically when starting the server." msgstr "" -"一个 PacketPeer 实现,应该在åˆå§‹åŒ–为客户端或æœåС噍åŽä¼ 递给 [member SceneTree." +"PacketPeer 的实现,应该在åˆå§‹åŒ–为客户端或æœåС噍åŽä¼ 递给 [member SceneTree." "network_peer]。然åŽå¯ä»¥é€šè¿‡è¿žæŽ¥åˆ° [SceneTree] ä¿¡å·æ¥å¤„ç†äº‹ä»¶ã€‚\n" "ENet 的目的是在 UDPï¼ˆç”¨æˆ·æ•°æ®æŠ¥å议)之上æä¾›ä¸€ä¸ªç›¸å¯¹ç®€å•而å¥å…¨çš„网络通信" "层。\n" -"[b]注æ„:[/b]ENet åªä½¿ç”¨UDP,ä¸ä½¿ç”¨TCPã€‚è½¬å‘æœåŠ¡å™¨ç«¯å£ä½¿æ‚¨çš„æœåŠ¡å™¨å¯ä»¥åœ¨å…¬ç½‘" -"上访问时,åªéœ€è¦å°†æœåŠ¡å™¨ç«¯å£è½¬å‘为UDPå³å¯ã€‚您å¯ä»¥ä½¿ç”¨ [UPNP] ç±»å°è¯•在å¯åЍæœåŠ¡" -"å™¨æ—¶è‡ªåŠ¨è½¬å‘æœåŠ¡å™¨ç«¯å£ã€‚" +"[b]注æ„:[/b]ENet åªä½¿ç”¨ UDP,ä¸ä½¿ç”¨ TCPã€‚è½¬å‘æœåŠ¡å™¨ç«¯å£ä½¿æ‚¨çš„æœåŠ¡å™¨å¯ä»¥åœ¨å…¬" +"网上访问时,åªéœ€è¦å°†æœåŠ¡å™¨ç«¯å£è½¬å‘为 UDP å³å¯ã€‚您å¯ä»¥ä½¿ç”¨ [UPNP] ç±»å°è¯•在å¯åЍ" +"æœåŠ¡å™¨æ—¶è‡ªåŠ¨è½¬å‘æœåŠ¡å™¨ç«¯å£ã€‚" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46355,25 +46533,25 @@ msgid "" "Disconnect the given peer. If \"now\" is set to [code]true[/code], the " "connection will be closed immediately without flushing queued messages." msgstr "" -"æ–开给定对ç‰ä½“的连接。如果 \"now \"被设置为 [code]true[/code],连接将被立å³å…³" -"é—而ä¸å†²åˆ·é˜Ÿåˆ—ä¸çš„æ¶ˆæ¯ã€‚" +"æ–开给定对ç‰ä½“的连接。如果“nowâ€è¢«è®¾ç½®ä¸º [code]true[/code],连接将被立å³å…³é—而" +"ä¸å†²åˆ·é˜Ÿåˆ—ä¸çš„æ¶ˆæ¯ã€‚" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" "Returns the channel of the last packet fetched via [method PacketPeer." "get_packet]." -msgstr "返回通过[method PacketPeer.get_packet]获å–的最åŽä¸€ä¸ªåŒ…çš„Channel。" +msgstr "返回通过 [method PacketPeer.get_packet] 获å–的上一个数æ®åŒ…çš„ Channel。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" "Returns the channel of the next packet that will be retrieved via [method " "PacketPeer.get_packet]." -msgstr "返回将通过[method PacketPeer.get_packet]获å–的下一个数æ®åŒ…çš„Channel。" +msgstr "返回通过 [method PacketPeer.get_packet] 获å–的下一个数æ®åŒ…çš„ Channel。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml #: modules/websocket/doc_classes/WebSocketServer.xml msgid "Returns the IP address of the given peer." -msgstr "返回给定对ç‰ä½“çš„IP地å€ã€‚" +msgstr "返回给定对ç‰ä½“çš„ IP 地å€ã€‚" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml #: modules/websocket/doc_classes/WebSocketServer.xml @@ -46396,8 +46574,8 @@ msgid "" "code]. For servers, you must also setup the [CryptoKey] via [method " "set_dtls_key]." msgstr "" -"当[member use_dtls]为 [code]true[/code] 时,é…ç½®[X509Certificate]使用。对于æœ" -"务器,您还必须通过[method set_dtls_key]设置[CryptoKey]。" +"当 [member use_dtls] 为 [code]true[/code] 时,é…ç½® [X509Certificate] 使用。对" +"于æœåŠ¡å™¨ï¼Œæ‚¨è¿˜å¿…é¡»é€šè¿‡ [method set_dtls_key] 设置 [CryptoKey]。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46405,8 +46583,8 @@ msgid "" "code]. Remember to also call [method set_dtls_certificate] to setup your " "[X509Certificate]." msgstr "" -"当[member use_dtls]为 [code]true[/code] 时,é…ç½®[CryptoKey]æ¥ä½¿ç”¨ã€‚è®°ä½ä¹Ÿè¦è°ƒ" -"用[method set_dtls_certificate]æ¥è®¾ç½®[X509Certificate]。" +"当 [member use_dtls] 为 [code]true[/code] 时,é…ç½® [CryptoKey] æ¥ä½¿ç”¨ã€‚è®°ä½ä¹Ÿ" +"è¦è°ƒç”¨ [method set_dtls_certificate] æ¥è®¾ç½® [X509Certificate]。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46449,7 +46627,7 @@ msgid "" "status of a packet in one channel won't stall the delivery of other packets " "in another channel." msgstr "" -"ENetè¦ä½¿ç”¨çš„ä¿¡é“æ•°é‡ã€‚通é“用于分离ä¸åŒç±»åž‹çš„æ•°æ®ã€‚例如,在å¯é æˆ–æœ‰åºæ¨¡å¼ä¸‹ï¼Œ" +"ENet è¦ä½¿ç”¨çš„ä¿¡é“æ•°é‡ã€‚通é“用于分离ä¸åŒç±»åž‹çš„æ•°æ®ã€‚例如,在å¯é æˆ–æœ‰åºæ¨¡å¼ä¸‹ï¼Œ" "åŒ…äº¤ä»˜é¡ºåºæ˜¯åœ¨æ¯ä¸ªé€šé“的基础上ä¿è¯çš„ã€‚è¿™æ ·åšæ˜¯ä¸ºäº†æ¶ˆé™¤å»¶è¿Ÿå¹¶å‡å°‘对数æ®åŒ…的排" "åºé™åˆ¶ã€‚在一个通é“ä¸çš„包的交付状æ€ä¸ä¼šåœæ¢åœ¨å¦ä¸€ä¸ªé€šé“ä¸çš„其他包的交付。" @@ -46470,8 +46648,8 @@ msgid "" msgstr "" "用于网络数æ®åŒ…的压缩方法。这些在压缩速度与带宽之间有ä¸åŒçš„æƒè¡¡ï¼Œå¦‚æžœæ‚¨å®Œå…¨ä½¿" "用压缩,您å¯èƒ½éœ€è¦æµ‹è¯•å“ªä¸€ç§æœ€é€‚åˆæ‚¨çš„用例。\n" -"[b]注:[/b]大多数游æˆçš„网络设计都涉åŠé¢‘ç¹å‘é€è®¸å¤šå°æ•°æ®åŒ…(æ¯ä¸ªå°äºŽ4 KB)。如" -"果有疑问,建议ä¿ç•™é»˜è®¤åŽ‹ç¼©ç®—æ³•ï¼Œå› ä¸ºå®ƒå¯¹è¿™äº›å°æ•°æ®åŒ…效果最好。\n" +"[b]注æ„:[/b]大多数游æˆçš„网络设计都涉åŠé¢‘ç¹å‘é€è®¸å¤šå°æ•°æ®åŒ…(æ¯ä¸ªå°äºŽ 4 " +"KB)。如果有疑问,建议ä¿ç•™é»˜è®¤åŽ‹ç¼©ç®—æ³•ï¼Œå› ä¸ºå®ƒå¯¹è¿™äº›å°æ•°æ®åŒ…效果最好。\n" "[b]注æ„:[/b][member compression_mode] 必须在æœåС噍åŠå…¶æ‰€æœ‰å®¢æˆ·ç«¯ä¸Šè®¾ç½®ä¸ºç›¸åŒ" "的值。如果客户端上设置的 [member compression_mode] 与æœåŠ¡å™¨ä¸Šè®¾ç½®çš„ä¸åŒï¼Œåˆ™å®¢" "æˆ·ç«¯å°†æ— æ³•è¿žæŽ¥ã€‚åœ¨ Godot 3.4 之å‰ï¼Œé»˜è®¤çš„ [member compression_mode] 是 " @@ -46611,7 +46789,7 @@ msgstr "WebRTC ä¿¡å·æ¼”示" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" "Returns the current state of the connection. See [enum ConnectionStatus]." -msgstr "返回连接的当å‰çжæ€ã€‚请å‚阅 [enum ConnectionStatus]。" +msgstr "返回连接的当å‰çжæ€ã€‚è§ [enum ConnectionStatus]。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "" @@ -46653,7 +46831,7 @@ msgstr "" msgid "" "The manner in which to send packets to the [code]target_peer[/code]. See " "[enum TransferMode]." -msgstr "å‘[code]target_peer[/code]å‘逿•°æ®åŒ…的方å¼ã€‚å‚阅[enum TransferMode]。" +msgstr "å‘ [code]target_peer[/code] å‘逿•°æ®åŒ…的方å¼ã€‚è§ [enum TransferMode]。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "Emitted when a connection attempt fails." @@ -46718,7 +46896,7 @@ msgstr "æ£åœ¨è¿›è¡Œçš„连接æ–开了。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "A connection attempt is ongoing." -msgstr "一个连接å°è¯•æ£åœ¨è¿›è¡Œä¸ã€‚" +msgstr "æ£åœ¨å°è¯•进行连接。" #: doc/classes/NetworkedMultiplayerPeer.xml msgid "The connection attempt succeeded." @@ -46747,43 +46925,45 @@ msgid "" "grid. When you scale the node, it tiles the texture's sides horizontally or " "vertically, the center on both axes but it doesn't scale or tile the corners." msgstr "" -"NinePatchRect也被称为9片å¼é¢æ¿ï¼Œå®ƒåŸºäºŽä¸€ä¸ªå°çš„纹ç†ï¼Œäº§ç”Ÿä»»ä½•å°ºå¯¸çš„å¹²å‡€é¢æ¿ã€‚" -"为了åšåˆ°è¿™ä¸€ç‚¹ï¼Œå®ƒå°†çº¹ç†åˆ†å‰²æˆ3×3çš„ç½‘æ ¼ã€‚å½“ä½ ç¼©æ”¾èŠ‚ç‚¹æ—¶ï¼Œå®ƒåœ¨æ°´å¹³æˆ–åž‚ç›´æ–¹å‘上" -"平铺纹ç†çš„两侧,在两个轴上平铺ä¸å¿ƒï¼Œä½†å®ƒä¸ä¼šç¼©æ”¾æˆ–平铺角部。" +"NinePatchRect 也被称为 9 片å¼é¢æ¿ï¼Œå®ƒåŸºäºŽä¸€ä¸ªå°çš„纹ç†ï¼Œäº§ç”Ÿä»»ä½•尺寸的干净é¢" +"æ¿ã€‚为了åšåˆ°è¿™ä¸€ç‚¹ï¼Œå®ƒå°†çº¹ç†åˆ†å‰²æˆ 3×3 çš„ç½‘æ ¼ã€‚å½“ä½ ç¼©æ”¾èŠ‚ç‚¹æ—¶ï¼Œå®ƒåœ¨æ°´å¹³æˆ–åž‚ç›´" +"æ–¹å‘上平铺纹ç†çš„两侧,在两个轴上平铺ä¸å¿ƒï¼Œä½†å®ƒä¸ä¼šç¼©æ”¾æˆ–平铺角部。" #: doc/classes/NinePatchRect.xml msgid "" "Returns the size of the margin identified by the given [enum Margin] " "constant." -msgstr "返回由给定的[enum Margin]叏釿 ‡è¯†çš„è¾¹è·å¤§å°ã€‚" +msgstr "返回由给定的 [enum Margin] 叏釿 ‡è¯†çš„è¾¹è·å¤§å°ã€‚" #: doc/classes/NinePatchRect.xml msgid "" "Sets the size of the margin identified by the given [enum Margin] constant " "to [code]value[/code] in pixels." msgstr "" -"将由给定的[enum Margin]叏釿 ‡è¯†çš„è¾¹è·å¤§å°è®¾ç½®ä¸º[code]value[/code],å•ä½ä¸ºåƒ" -"ç´ ã€‚" +"将由给定的 [enum Margin] 叏釿 ‡è¯†çš„è¾¹è·å¤§å°è®¾ç½®ä¸º [code]value[/code],å•ä½ä¸º" +"åƒç´ 。" #: doc/classes/NinePatchRect.xml msgid "" "The stretch mode to use for horizontal stretching/tiling. See [enum " "NinePatchRect.AxisStretchMode] for possible values." msgstr "" -"水平拉伸/平铺时使用的拉伸模å¼ã€‚å‚阅[enum NinePatchRect.AxisStretchMode]。" +"水平拉伸/平铺时使用的拉伸模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum NinePatchRect." +"AxisStretchMode]。" #: doc/classes/NinePatchRect.xml msgid "" "The stretch mode to use for vertical stretching/tiling. See [enum " "NinePatchRect.AxisStretchMode] for possible values." msgstr "" -"用于垂直拉伸/平铺的拉伸模å¼ã€‚å‚阅[enum NinePatchRect.AxisStretchMode]。" +"用于垂直拉伸/平铺的拉伸模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum NinePatchRect." +"AxisStretchMode]。" #: doc/classes/NinePatchRect.xml msgid "" "If [code]true[/code], draw the panel's center. Else, only draw the 9-slice's " "borders." -msgstr "如果[code]true[/code]ï¼Œåˆ™ç»˜åˆ¶é¢æ¿çš„ä¸å¿ƒã€‚å¦åˆ™ï¼Œåªç”»9-slice的边框。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™ç»˜åˆ¶é¢æ¿çš„ä¸å¿ƒã€‚å¦åˆ™ï¼Œåªç”»9-slice的边框。" #: doc/classes/NinePatchRect.xml msgid "" @@ -46791,8 +46971,8 @@ msgid "" "bottom corners and side will have a height of 16 pixels. You can set all 4 " "margin values individually to create panels with non-uniform borders." msgstr "" -"9-slice的底层行的高度。边è·ä¸º16æ„味ç€9片的底角和侧é¢å°†æœ‰16åƒç´ çš„é«˜åº¦ã€‚ä½ å¯ä»¥" -"å•独设置所有4个边è·å€¼æ¥åˆ›å»ºå…·æœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" +"9-切片底行的高度。边è·ä¸º 16 æ„å‘³ç€ 9-切片的底角和侧é¢å°†æœ‰ 16 åƒç´ çš„é«˜åº¦ã€‚ä½ å¯" +"以å•独设置所有 4 个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" #: doc/classes/NinePatchRect.xml msgid "" @@ -46800,8 +46980,8 @@ msgid "" "left corners and side will have a width of 16 pixels. You can set all 4 " "margin values individually to create panels with non-uniform borders." msgstr "" -"9-切片的左列宽度。边è·ä¸º16æ„味ç€9切片的左角和侧é¢å°†æœ‰16åƒç´ çš„å®½åº¦ã€‚ä½ å¯ä»¥å•独" -"设置所有4个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" +"9-切片左列的宽度。边è·ä¸º 16 æ„å‘³ç€ 9-切片的左角和侧é¢å°†æœ‰ 16 åƒç´ çš„å®½åº¦ã€‚ä½ å¯" +"以å•独设置所有 4 个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" #: doc/classes/NinePatchRect.xml msgid "" @@ -46809,8 +46989,8 @@ msgid "" "right corners and side will have a width of 16 pixels. You can set all 4 " "margin values individually to create panels with non-uniform borders." msgstr "" -"9-切片的å³åˆ—宽度。边è·ä¸º16æ„味ç€9切片的å³è§’和侧é¢å°†æœ‰16åƒç´ çš„å®½åº¦ã€‚ä½ å¯ä»¥å•独" -"设置所有4个边è·å€¼ï¼Œä»¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" +"9-切片å³åˆ—的宽度。边è·ä¸º 16 æ„å‘³ç€ 9-切片的å³è§’和侧é¢å°†æœ‰ 16 åƒç´ çš„å®½åº¦ã€‚ä½ å¯" +"以å•独设置所有 4 个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" #: doc/classes/NinePatchRect.xml msgid "" @@ -46818,8 +46998,8 @@ msgid "" "corners and side will have a height of 16 pixels. You can set all 4 margin " "values individually to create panels with non-uniform borders." msgstr "" -"9切片的顶行的高度。边è·ä¸º16æ„味ç€9切片的顶角和侧é¢å°†æœ‰16åƒç´ çš„é«˜åº¦ã€‚ä½ å¯ä»¥å•" -"独设置所有4个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" +"9-切片顶行的高度。边è·ä¸º 16 æ„å‘³ç€ 9-切片的顶角和侧é¢å°†æœ‰ 16 åƒç´ çš„é«˜åº¦ã€‚ä½ å¯" +"以å•独设置所有 4 个边è·å€¼ï¼Œæ¥åˆ›å»ºæœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" #: doc/classes/NinePatchRect.xml msgid "" @@ -46828,9 +47008,9 @@ msgid "" "other properties are relative to this one. If the rect is empty, " "NinePatchRect will use the whole texture." msgstr "" -"è¦å–æ ·çš„çº¹ç†çš„çŸ©å½¢åŒºåŸŸã€‚å¦‚æžœä½ æ£åœ¨ä½¿ç”¨ä¸€ä¸ªå›¾é›†ï¼Œä½¿ç”¨è¿™ä¸ªå±žæ€§æ¥å®šä¹‰9-slice应该" -"使用的区域。所有其他属性都是相对于这个属性而言的。如果矩形为空,NinePatchRect" -"将使用整个纹ç†ã€‚" +"è¦å–æ ·çš„çº¹ç†çš„çŸ©å½¢åŒºåŸŸã€‚å¦‚æžœä½ æ£åœ¨ä½¿ç”¨ä¸€ä¸ªå›¾é›†ï¼Œä½¿ç”¨è¿™ä¸ªå±žæ€§æ¥å®šä¹‰ 9-切片应该" +"使用的区域。所有其他属性都是相对于这个属性而言的。如果矩形为空," +"NinePatchRect 将使用整个纹ç†ã€‚" #: doc/classes/NinePatchRect.xml msgid "The node's texture resource." @@ -46844,7 +47024,7 @@ msgstr "当节点的纹ç†å‘生å˜åŒ–时触å‘。" msgid "" "Stretches the center texture across the NinePatchRect. This may cause the " "texture to be distorted." -msgstr "å°†ä¸é—´çº¹ç†æ‹‰ä¼¸åˆ°9切片矩形。这å¯èƒ½ä¼šå¯¼è‡´çº¹ç†å¤±çœŸã€‚" +msgstr "在 NinePatchRect 上拉伸ä¸å¿ƒçº¹ç†ã€‚è¿™å¯èƒ½ä¼šå¯¼è‡´çº¹ç†å¤±çœŸã€‚" #: doc/classes/NinePatchRect.xml msgid "" @@ -46856,7 +47036,7 @@ msgid "" msgstr "" "在 NinePatchRect 上é‡å¤ä¸å¿ƒçº¹ç†ã€‚è¿™ä¸ä¼šå¯¼è‡´ä»»ä½•å¯è§çš„失真。纹ç†å¿…é¡»æ˜¯æ— ç¼çš„," "è¿™æ ·æ‰èƒ½åœ¨è¾¹ç¼˜ä¹‹é—´ä¸æ˜¾ç¤ºä¼ªå½±çš„æƒ…况下工作。\n" -"[b]注:[/b] 仅在使用 GLES3 渲染器时支æŒã€‚使用 GLES2 渲染器时,这将类似于 " +"[b]注æ„:[/b]仅在使用 GLES3 渲染器时支æŒã€‚使用 GLES2 渲染器时,这将类似于 " "[constant AXIS_STRETCH_MODE_STRETCH]。" #: doc/classes/NinePatchRect.xml @@ -46872,7 +47052,7 @@ msgstr "" "在 NinePatchRect 上é‡å¤ä¸å¿ƒçº¹ç†ï¼Œä½†ä¹Ÿä¼šæ‹‰ä¼¸çº¹ç†ä»¥ç¡®ä¿æ¯ä¸ªå›¾å—都完整å¯è§ã€‚è¿™å¯" "èƒ½ä¼šå¯¼è‡´çº¹ç†æ‰æ›²ï¼Œä½†å°äºŽ [constant AXIS_STRETCH_MODE_STRETCH]。纹ç†å¿…é¡»æ˜¯æ— ç¼" "çš„ï¼Œè¿™æ ·æ‰èƒ½åœ¨è¾¹ç¼˜ä¹‹é—´ä¸æ˜¾ç¤ºä¼ªå½±çš„æƒ…况下工作。\n" -"[b]注:[/b] 仅在使用 GLES3 渲染器时支æŒã€‚使用 GLES2 渲染器时,这将类似于 " +"[b]注æ„:[/b]仅在使用 GLES3 渲染器时支æŒã€‚使用 GLES2 渲染器时,这将类似于 " "[constant AXIS_STRETCH_MODE_STRETCH]。" #: doc/classes/Node.xml @@ -46944,8 +47124,8 @@ msgstr "" "节点的直接å节点)的åå—唯一。\n" "èŠ‚ç‚¹æ ‘è¢«ç§°ä¸º[i]场景[/i]。场景å¯ä»¥è¢«ä¿å˜åˆ°ç£ç›˜ä¸Šï¼Œç„¶åŽè¢«å®žä¾‹åŒ–到其他场景ä¸ã€‚è¿™" "使得 Godot é¡¹ç›®çš„æž¶æž„å’Œæ•°æ®æ¨¡åž‹å…·æœ‰éžå¸¸é«˜çš„çµæ´»æ€§ã€‚\n" -"[b]åœºæ™¯æ ‘ï¼š[/b] [SceneTree] åŒ…å«æ´»åŠ¨çš„èŠ‚ç‚¹æ ‘ã€‚å½“ä¸€ä¸ªèŠ‚ç‚¹è¢«æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸æ—¶ï¼Œ" -"它将收到 [constant NOTIFICATION_ENTER_TREE] 通知,并触å‘å…¶ [method " +"[b]åœºæ™¯æ ‘ï¼š[/b][SceneTree] åŒ…å«æ´»åŠ¨çš„èŠ‚ç‚¹æ ‘ã€‚å½“ä¸€ä¸ªèŠ‚ç‚¹è¢«æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸æ—¶ï¼Œå®ƒ" +"将收到 [constant NOTIFICATION_ENTER_TREE] 通知,并触å‘å…¶ [method " "_enter_tree] 回调。å节点总是在其父节点[i]之åŽ[/i]è¢«æ·»åŠ ï¼Œå³çˆ¶èŠ‚ç‚¹çš„ [method " "_enter_tree] 回调将在其å节点的之å‰è¢«è§¦å‘。\n" "ä¸€æ—¦æ‰€æœ‰çš„èŠ‚ç‚¹è¢«æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸ï¼Œå®ƒä»¬å°±ä¼šæ”¶åˆ° [constant NOTIFICATION_READY] 通" @@ -46954,8 +47134,8 @@ msgstr "" "è¿™æ„味ç€ï¼Œå½“æŠŠä¸€ä¸ªèŠ‚ç‚¹æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸æ—¶ï¼Œå°†ä½¿ç”¨ä¸‹é¢çš„顺åºè¿›è¡Œå›žè°ƒï¼šçˆ¶èŠ‚ç‚¹çš„ " "[method _enter_tree]ã€å节点的 [method _enter_tree]ã€å节点的 [method " "_ready]ï¼Œæœ€åŽæ˜¯çˆ¶èŠ‚ç‚¹çš„ [method _ready]ï¼ˆå¯¹æ•´ä¸ªåœºæ™¯æ ‘è¿›è¡Œé€’å½’ï¼‰ã€‚\n" -"[b]处ç†ï¼š[/b] 节点å¯ä»¥è¦†ç›–“处ç†â€çжæ€ï¼Œä»¥ä¾¿å®ƒä»¬åœ¨æ¯ä¸€å¸§ä¸Šéƒ½æ”¶åˆ°å›žè°ƒï¼Œè¦æ±‚它们" -"进行处ç†ï¼ˆåšä¸€äº›äº‹æƒ…)。普通处ç†ï¼ˆå›žè°ƒ [method _process],å¯ä»¥ä½¿ç”¨ [method " +"[b]处ç†ï¼š[/b]节点å¯ä»¥è¦†ç›–“处ç†â€çжæ€ï¼Œä»¥ä¾¿å®ƒä»¬åœ¨æ¯ä¸€å¸§ä¸Šéƒ½æ”¶åˆ°å›žè°ƒï¼Œè¦æ±‚它们进" +"行处ç†ï¼ˆåšä¸€äº›äº‹æƒ…)。普通处ç†ï¼ˆå›žè°ƒ [method _process],å¯ä»¥ä½¿ç”¨ [method " "set_process] 开关)会尽å¯èƒ½å¿«åœ°å‘生,并且å–å†³äºŽå¸§çŽ‡ï¼Œæ‰€ä»¥å¤„ç†æ—¶é—´ [i]delta[/" "i](å•ä½ä¸ºç§’ï¼‰ä¼šä½œä¸ºå‚æ•°ä¼ 入。物ç†å¤„ç†ï¼ˆå›žè°ƒ [method _physics_process],å¯ä»¥" "使用 [method set_physics_process] 开关)æ¯ç§’å‘生固定次数(默认为 60),对物ç†" @@ -46970,11 +47150,11 @@ msgstr "" "工具时éžå¸¸æœ‰ç”¨ã€‚\n" "最åŽï¼Œå½“一个节点被 [method Object.free] 或 [method queue_free] 释放时,它也将" "释放它的所有å节点。\n" -"[b]分组:[/b] 节点å¯ä»¥è¢«æ·»åŠ åˆ°å¾ˆå¤šçš„ç»„ä¸ï¼Œä»¥æ–¹ä¾¿ç®¡ç†ï¼Œä½ å¯ä»¥æ ¹æ®è‡ªå·±æ¸¸æˆçš„需" -"è¦æ¥åˆ›å»ºç±»ä¼¼â€œæ•Œäººâ€æˆ–“收集å“â€è¿™æ ·çš„组。å‚阅 [method add_to_group]ã€[method " +"[b]分组:[/b]节点å¯ä»¥è¢«æ·»åŠ åˆ°å¾ˆå¤šçš„ç»„ä¸ï¼Œä»¥æ–¹ä¾¿ç®¡ç†ï¼Œä½ å¯ä»¥æ ¹æ®è‡ªå·±æ¸¸æˆçš„需è¦" +"æ¥åˆ›å»ºç±»ä¼¼â€œæ•Œäººâ€æˆ–“收集å“â€è¿™æ ·çš„组。å‚阅 [method add_to_group]ã€[method " "is_in_group] å’Œ [method remove_from_group]ã€‚åŠ å…¥ç»„åŽï¼Œä½ å¯ä»¥æ£€ç´¢è¿™äº›ç»„ä¸çš„æ‰€" "有节点,对它们进行è¿ä»£ï¼Œç”šè‡³é€šè¿‡ [SceneTree] ä¸çš„æ–¹æ³•调用组内方法。\n" -"[b]节点的网络编程:[/b] 在连接到æœåŠ¡å™¨ï¼ˆæˆ–åˆ¶ä½œæœåŠ¡å™¨ï¼Œå‚阅 " +"[b]节点的网络编程:[/b]在连接到æœåŠ¡å™¨ï¼ˆæˆ–åˆ¶ä½œæœåŠ¡å™¨ï¼Œå‚阅 " "[NetworkedMultiplayerENet])之åŽï¼Œå¯ä»¥ä½¿ç”¨å†…置的 RPC(远程过程调用)系统在网" "络上进行通信。在调用 [method rpc] æ—¶ä¼ å…¥æ–¹æ³•å,将在本地和所有已连接的对ç‰ä½“" "ä¸è°ƒç”¨å¯¹åº”的方法(对ç‰ä½“=客户端和接å—连接的æœåŠ¡å™¨ï¼‰ã€‚ä¸ºäº†è¯†åˆ«å“ªä¸ªèŠ‚ç‚¹æ”¶åˆ° " @@ -46998,11 +47178,11 @@ msgid "" "Corresponds to the [constant NOTIFICATION_ENTER_TREE] notification in " "[method Object._notification]." msgstr "" -"当节点进入[SceneTree]时调用(ä¾‹å¦‚å®žä¾‹åŒ–æ—¶ï¼Œåœºæ™¯æ”¹å˜æ—¶ï¼Œæˆ–者在脚本ä¸è°ƒç”¨" -"[method add_child]åŽ)。如果节点有å节点,则首先调用它的[method _enter_tree]回" -"调函数,然åŽå†è°ƒç”¨å节点的回调函数。\n" -"对应于[method Object._notification]ä¸çš„[constant NOTIFICATION_ENTER_TREE]通" -"知。" +"当节点进入 [SceneTree] æ—¶è°ƒç”¨ï¼ˆä¾‹å¦‚å®žä¾‹åŒ–æ—¶ï¼Œåœºæ™¯æ”¹å˜æ—¶ï¼Œæˆ–者在脚本ä¸è°ƒç”¨ " +"[method add_child] åŽï¼‰ã€‚如果节点有å节点,则首先调用它的 [method " +"_enter_tree] 回调函数,然åŽå†è°ƒç”¨å节点的回调函数。\n" +"对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_ENTER_TREE] " +"通知。" #: doc/classes/Node.xml msgid "" @@ -47015,12 +47195,12 @@ msgid "" "the node has already left the active tree, connect to the [signal " "tree_exited]." msgstr "" -"当节点å³å°†ç¦»å¼€[SceneTree]时被调用(例如,在释放ã€åœºæ™¯æ”¹å˜æˆ–在脚本ä¸è°ƒç”¨" -"[method remove_child]åŽï¼‰ã€‚如果该节点有å节点,它的[method _exit_tree]回调将" -"在所有åèŠ‚ç‚¹ç¦»å¼€æ ‘åŽè¢«æœ€åŽè°ƒç”¨ã€‚\n" +"当节点å³å°†ç¦»å¼€ [SceneTree] 时被调用(例如,在释放ã€åœºæ™¯æ”¹å˜æˆ–在脚本ä¸è°ƒç”¨ " +"[method remove_child] åŽï¼‰ã€‚如果该节点有å节点,它的 [method _exit_tree] 回调" +"将在所有åèŠ‚ç‚¹ç¦»å¼€æ ‘åŽè¢«æœ€åŽè°ƒç”¨ã€‚\n" "对应于 [method Object._notification] ä¸çš„ [constant NOTIFICATION_EXIT_TREE] " "通知和 [signal tree_exiting] ä¿¡å·ã€‚è¦åœ¨èŠ‚ç‚¹å·²ç»ç¦»å¼€æ´»åŠ¨æ ‘æ—¶å¾—åˆ°é€šçŸ¥ï¼Œè¯·è¿žæŽ¥" -"到 [signal tree_exited] 。" +"到 [signal tree_exited]。" #: doc/classes/Node.xml msgid "" @@ -47030,10 +47210,10 @@ msgid "" "Call [method update_configuration_warning] when the warning needs to be " "updated for this node." msgstr "" -"如果覆盖该方法的脚本是一个[code]tool[/code]脚本,那么从该方法返回的å—符串将在" -"Scene Dock䏿˜¾ç¤ºä¸ºä¸€ä¸ªè¦å‘Šã€‚\n" +"如果覆盖该方法的脚本是一个 [code]tool[/code] 脚本,那么从该方法返回的å—符串将" +"åœ¨åœºæ™¯é¢æ¿ä¸æ˜¾ç¤ºä¸ºä¸€ä¸ªè¦å‘Šã€‚\n" "返回一个空å—符串ä¸ä¼šäº§ç”Ÿè¦å‘Šã€‚\n" -"å½“éœ€è¦æ›´æ–°è¿™ä¸ªèŠ‚ç‚¹çš„è¦å‘Šæ—¶ï¼Œè°ƒç”¨[method update_configuration_warning]。" +"å½“éœ€è¦æ›´æ–°è¿™ä¸ªèŠ‚ç‚¹çš„è¦å‘Šæ—¶ï¼Œè°ƒç”¨ [method update_configuration_warning]。" #: doc/classes/Node.xml msgid "" @@ -47272,7 +47452,7 @@ msgid "" "scene tree is not paused, and [code]false[/code] if the node is not in the " "tree." msgstr "" -"如果节点å¯ä»¥åœ¨åœºæ™¯æ ‘æš‚åœæ—¶è¿›è¡Œå¤„ç†ï¼Œè¿”回 [code]true[/code](è§[member " +"如果节点å¯ä»¥åœ¨åœºæ™¯æ ‘æš‚åœæ—¶è¿›è¡Œå¤„ç†ï¼Œè¿”回 [code]true[/code]ï¼ˆè§ [member " "pause_mode]ï¼‰ã€‚å¦‚æžœåœºæ™¯æ ‘æ²¡æœ‰æš‚åœï¼Œæ€»æ˜¯è¿”回 [code]true[/code],如果节点ä¸åœ¨æ ‘" "ä¸ï¼Œåˆ™è¿”回 [code]false[/code]。" @@ -47345,13 +47525,13 @@ msgid "" "[method get_node] instead. To avoid using [method find_parent] too often, " "consider caching the node reference into a variable." msgstr "" -"查找当å‰èŠ‚ç‚¹çš„ç¬¬ä¸€ä¸ªçˆ¶èŠ‚ç‚¹ï¼Œå…¶å称与[method String.match]ä¸çš„[code]mask[/" -"code]相匹é…,区分大å°å†™ï¼Œå…¶[code]\"*\"[/code]匹é…零或多个å—符,[code]\"?\"[/" -"code]匹é…任何å•个å—符,除了[code]\".\"[/code]。\n" +"查找当å‰èŠ‚ç‚¹çš„ç¬¬ä¸€ä¸ªçˆ¶èŠ‚ç‚¹ï¼Œå…¶å称与 [method String.match] ä¸çš„ [code]mask[/" +"code] 相匹é…,区分大å°å†™ï¼Œå…¶ [code]\"*\"[/code] 匹é…零或多个å—符,[code]\"?" +"\"[/code] 匹é…任何å•个å—符,除了 [code]\".\"[/code]。\n" "[b]注æ„:[/b]å®ƒä¸æ˜¯å…¨è·¯å¾„匹é…,åªä¸Žå•个节点å称匹é…。\n" "[b]注æ„:[/b]ç”±äºŽè¿™ä¸ªæ–¹æ³•åœ¨åœºæ™¯æ ‘ä¸å‘ä¸Šè¡Œèµ°ï¼Œåœ¨å¤§åž‹çš„ã€æ·±åº¦åµŒå¥—çš„åœºæ™¯æ ‘ä¸å¯èƒ½" -"会很慢。åªè¦æœ‰å¯èƒ½ï¼Œè¯·è€ƒè™‘使用[method get_node]代替。为了é¿å…过于频ç¹åœ°ä½¿ç”¨" -"[method find_parent],考虑将节点引用缓å˜åˆ°ä¸€ä¸ªå˜é‡ä¸ã€‚" +"会很慢。åªè¦æœ‰å¯èƒ½ï¼Œè¯·è€ƒè™‘使用 [method get_node] 代替。为了é¿å…过于频ç¹åœ°ä½¿" +"用 [method find_parent],考虑将节点引用缓å˜åˆ°ä¸€ä¸ªå˜é‡ä¸ã€‚" #: doc/classes/Node.xml msgid "" @@ -47412,7 +47592,7 @@ msgstr "返回节点的索引,å³å®ƒåœ¨å…¶çˆ¶èŠ‚ç‚¹çš„å…„å¼ŸèŠ‚ç‚¹ä¸çš„ä½ç½® msgid "" "Returns the peer ID of the network master for this node. See [method " "set_network_master]." -msgstr "返回æ¤èŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ ID。请å‚阅 [method set_network_master]。" +msgstr "返回æ¤èŠ‚ç‚¹çš„ç½‘ç»œä¸»èŠ‚ç‚¹çš„å¯¹ç‰ IDã€‚è§ [method set_network_master]。" #: doc/classes/Node.xml msgid "" @@ -47488,13 +47668,15 @@ msgid "" "[[CollisionShape2D:1161], [RectangleShape2D:1156], :extents]\n" "[/codeblock]" msgstr "" -"获å–一个节点åŠå…¶ç”±[NodePath]åå称指定的资æº(例如[code]Area2D/" -"CollisionShape2D:shape[/code])。如果在[NodePath]䏿Œ‡å®šäº†å¤šä¸ªåµŒå¥—资æºï¼Œåˆ™å°†èŽ·" -"å–æœ€åŽä¸€ä¸ªã€‚\n" -"返回值是一个大å°ä¸º3的数组:第一个索引指å‘[Node](或[code]null[/code]),第二个索" -"引指å‘[Resource](或[code]null[/code]),第三个索引是剩余的[NodePath]。\n" -"例如,å‡è®¾[code]Area2D/CollisionShape2D[/code]是一个有效的节点,并且它的" -"[code]shape[/code]属性被分é…了一个[RectangleShape2D]资æºï¼Œå¯ä»¥æœ‰è¿™æ ·çš„输出:\n" +"获å–一个节点åŠå…¶ç”± [NodePath] åå称指定的资æºï¼ˆä¾‹å¦‚[code]Area2D/" +"CollisionShape2D:shape[/code])。如果在 [NodePath] 䏿Œ‡å®šäº†å¤šä¸ªåµŒå¥—资æºï¼Œåˆ™å°†" +"èŽ·å–æœ€åŽä¸€ä¸ªã€‚\n" +"返回值是一个大å°ä¸º 3 的数组:ç¬¬ä¸€ä¸ªç´¢å¼•æŒ‡å‘ [Node](或 [code]null[/code]),第" +"äºŒä¸ªç´¢å¼•æŒ‡å‘ [Resource](或 [code]null[/code]),第三个索引是剩余的 " +"[NodePath]。\n" +"例如,å‡è®¾ [code]Area2D/CollisionShape2D[/code] 是一个有效的节点,并且它的 " +"[code]shape[/code] 属性被分é…了一个 [RectangleShape2D] 资æºï¼Œå¯ä»¥æœ‰è¿™æ ·çš„输" +"出:\n" "[codeblock]\n" "print(get_node_and_resource(\"Area2D/CollisionShape2D\")) # " "[[CollisionShape2D:1161], Null, ]\n" @@ -47531,8 +47713,8 @@ msgid "" "Returns the relative [NodePath] from this node to the specified [code]node[/" "code]. Both nodes must be in the same scene or the function will fail." msgstr "" -"从这个节点返回到指定的[code]node[/code]的相对[NodePath]。两个节点必须在åŒä¸€ä¸ª" -"场景ä¸ï¼Œå¦åˆ™å‡½æ•°å°†å¤±è´¥ã€‚" +"从这个节点返回到指定的 [code]node[/code] 的相对 [NodePath]。两个节点必须在åŒ" +"一个场景ä¸ï¼Œå¦åˆ™å‡½æ•°å°†å¤±è´¥ã€‚" #: doc/classes/Node.xml msgid "" @@ -47541,17 +47723,17 @@ msgid "" "processing unless the frames per second is changed via [member Engine." "iterations_per_second]." msgstr "" -"返回自上次物ç†ç»‘å®šå¸§ä»¥æ¥æ‰€ç»è¿‡çš„秒数(请å‚阅 [method _physics_process])。在" -"物ç†å¤„ç†ä¸ï¼Œé™¤éžé€šè¿‡ [member Engine.iterations_per_second] æ¥æ”¹å˜æ¯ç§’的帧数," -"å¦åˆ™å§‹ç»ˆä¸ºå¸¸é‡ã€‚" +"返回自上次物ç†ç»‘å®šå¸§ä»¥æ¥æ‰€ç»è¿‡çš„ç§’æ•°ï¼ˆè§ [method _physics_process])。在物ç†" +"处ç†ä¸ï¼Œé™¤éžé€šè¿‡ [member Engine.iterations_per_second] æ¥æ”¹å˜æ¯ç§’的帧数,å¦åˆ™" +"始终为常é‡ã€‚" #: doc/classes/Node.xml msgid "" "Returns the node's order in the scene tree branch. For example, if called on " "the first child node the position is [code]0[/code]." msgstr "" -"è¿”å›žåœºæ™¯æ ‘åˆ†æ”¯ä¸èŠ‚ç‚¹çš„é¡ºåºã€‚例如,如果在第一个å节点上调用,则ä½ç½®ä¸º[code]0[/" -"code]。" +"è¿”å›žåœºæ™¯æ ‘åˆ†æ”¯ä¸èŠ‚ç‚¹çš„é¡ºåºã€‚例如,如果在第一个å节点上调用,则ä½ç½®ä¸º " +"[code]0[/code]。" #: doc/classes/Node.xml msgid "" @@ -47564,21 +47746,21 @@ msgid "" "Returns [code]true[/code] if this is an instance load placeholder. See " "[InstancePlaceholder]." msgstr "" -"å¦‚æžœè¿™æ˜¯ä¸€ä¸ªå®žä¾‹åŠ è½½å ä½ç¬¦ï¼Œåˆ™è¿”回 [code]true[/code]。看到" +"å¦‚æžœè¿™æ˜¯ä¸€ä¸ªå®žä¾‹åŠ è½½å ä½ç¬¦ï¼Œåˆ™è¿”回 [code]true[/code]ã€‚è§ " "[InstancePlaceholder]。" #: doc/classes/Node.xml msgid "Returns the [SceneTree] that contains this node." -msgstr "返回包å«è¯¥èŠ‚ç‚¹çš„[SceneTree]。" +msgstr "返回包å«è¯¥èŠ‚ç‚¹çš„ [SceneTree]。" #: doc/classes/Node.xml msgid "Returns the node's [Viewport]." -msgstr "返回节点的[Viewport]。" +msgstr "返回节点的 [Viewport]。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if the node that the [NodePath] points to exists." -msgstr "如果[NodePath]指å‘的节点å˜åœ¨ï¼Œåˆ™è¿”回 [code]true[/code]。" +msgstr "如果 [NodePath] 指å‘的节点å˜åœ¨ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/Node.xml msgid "" @@ -47616,13 +47798,13 @@ msgid "" "Returns [code]true[/code] if this node is in the specified group. See notes " "in the description, and the group methods in [SceneTree]." msgstr "" -"如果该节点在指定的组ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。å‚阅æè¿°ä¸çš„æ³¨é‡Šå’Œ" -"[SceneTree]ä¸çš„组方法。" +"如果该节点在指定的组ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。å‚阅æè¿°ä¸çš„æ³¨é‡Šå’Œ " +"[SceneTree] ä¸çš„组方法。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if this node is currently inside a [SceneTree]." -msgstr "如果该节点当å‰åœ¨[SceneTree]ä¸ï¼Œè¿”回 [code]true[/code]。" +msgstr "如果该节点当å‰åœ¨ [SceneTree] ä¸ï¼Œè¿”回 [code]true[/code]。" #: doc/classes/Node.xml msgid "" @@ -47664,54 +47846,54 @@ msgid "" "Returns [code]true[/code] if physics processing is enabled (see [method " "set_physics_process])." msgstr "" -"如果å¯ç”¨äº†ç‰©ç†å¤„ç†ï¼Œè¿”回 [code]true[/code](å‚阅[method " -"set_physics_process])。" +"如果å¯ç”¨äº†ç‰©ç†å¤„ç†ï¼Œè¿”回 [code]true[/code]ï¼ˆè§ [method " +"set_physics_process])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if internal physics processing is enabled (see " "[method set_physics_process_internal])." msgstr "" -"如果内部物ç†å¤„ç†è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code](è§[method " -"set_physics_process_internal])。" +"如果内部物ç†å¤„ç†è¢«å¯ç”¨ï¼Œè¿”回 [code]true[/code]ï¼ˆè§ [method " +"set_physics_process_internal])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if processing is enabled (see [method " "set_process])." -msgstr "如果开å¯äº†å¤„ç†ï¼Œè¿”回 [code]true[/code](å‚阅[method set_process])。" +msgstr "如果开å¯äº†å¤„ç†ï¼Œè¿”回 [code]true[/code]ï¼ˆè§ [method set_process])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if the node is processing input (see [method " "set_process_input])." msgstr "" -"如果节点æ£åœ¨å¤„ç†è¾“入(请å‚阅 [method set_process_input]),则返回 " -"[code]true[/code]。" +"如果节点æ£åœ¨å¤„ç†è¾“入,则返回 [code]true[/code]ï¼ˆè§ [method " +"set_process_input])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if internal processing is enabled (see [method " "set_process_internal])." msgstr "" -"如果å¯ç”¨äº†å†…部处ç†ï¼Œè¿”回 [code]true[/code](å‚阅[method " -"set_process_internal])。" +"如果å¯ç”¨äº†å†…部处ç†ï¼Œåˆ™è¿”回 [code]true[/code]ï¼ˆè§ [method " +"set_process_internal])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if the node is processing unhandled input (see " "[method set_process_unhandled_input])." msgstr "" -"如果节点æ£åœ¨å¤„ç†æœªè¢«å¤„ç†çš„输入(å‚阅[method set_process_unhandled_input]),则" -"返回 [code]true[/code]。" +"如果节点æ£åœ¨å¤„ç†æœªè¢«å¤„ç†çš„输入,则返回 [code]true[/code]ï¼ˆè§ [method " +"set_process_unhandled_input])。" #: doc/classes/Node.xml msgid "" "Returns [code]true[/code] if the node is processing unhandled key input (see " "[method set_process_unhandled_key_input])." msgstr "" -"如果节点æ£åœ¨å¤„ç†æœªè¢«å¤„ç†çš„键输入(å‚阅[method " -"set_process_unhandled_key_input]),则返回 [code]true[/code]。" +"如果节点æ£åœ¨å¤„ç†æœªè¢«å¤„ç†çš„键输入,则返回 [code]true[/code]ï¼ˆè§ [method " +"set_process_unhandled_key_input])。" #: doc/classes/Node.xml msgid "" @@ -47719,8 +47901,8 @@ msgid "" "Since calls, signals, etc are performed by tree order, changing the order of " "children nodes may be useful." msgstr "" -"在其他å节点ä¸å°†å节点移动到ä¸åŒçš„ä½ç½®(顺åº)。由于调用ã€ä¿¡å·ç‰æ˜¯æŒ‰æ ‘é¡ºåºæ‰§è¡Œ" -"çš„ï¼Œå› æ¤æ›´æ”¹å节点的顺åºå¯èƒ½ä¼šå¾ˆæœ‰ç”¨ã€‚" +"在其他å节点ä¸å°†å节点移动到ä¸åŒçš„ä½ç½®ï¼ˆé¡ºåºï¼‰ã€‚由于调用ã€ä¿¡å·ç‰æ˜¯æŒ‰æ ‘é¡ºåºæ‰§" +"è¡Œçš„ï¼Œå› æ¤æ›´æ”¹å节点的顺åºå¯èƒ½ä¼šå¾ˆæœ‰ç”¨ã€‚" #: doc/classes/Node.xml msgid "" @@ -47792,10 +47974,11 @@ msgid "" "[code]parent_first[/code] is [code]false[/code], the children will be called " "first." msgstr "" -"在这个节点上使用[code]args[/code]ä¸ç»™å‡ºçš„傿•°è°ƒç”¨ç»™å®šçš„æ–¹æ³•(如果å˜åœ¨),并递归" -"地在其所有å节点身上调用。如果[code]parent_first[/code]傿•°ä¸º [code]true[/" -"code],该方法将首先在当å‰èŠ‚ç‚¹ä¸Šè°ƒç”¨ï¼Œç„¶åŽåœ¨å…¶æ‰€æœ‰å节点上调用。如果" -"[code]parent_first[/code]为 [code]false[/code],å节点的方法将首先被调用。" +"在这个节点上使用 [code]args[/code] ä¸ç»™å‡ºçš„傿•°è°ƒç”¨ç»™å®šçš„æ–¹æ³•(如果å˜åœ¨),并递" +"归地在其所有å节点身上调用。如果 [code]parent_first[/code] 傿•°ä¸º " +"[code]true[/code],该方法将首先在当å‰èŠ‚ç‚¹ä¸Šè°ƒç”¨ï¼Œç„¶åŽåœ¨å…¶æ‰€æœ‰å节点上调用。如" +"æžœ [code]parent_first[/code] 为 [code]false[/code],å节点的方法将首先被调" +"用。" #: doc/classes/Node.xml msgid "" @@ -47857,8 +48040,8 @@ msgid "" "longer a parent or ancestor." msgstr "" "åˆ é™¤ä¸€ä¸ªå节点。该节点ä¸ä¼šè¢«åˆ é™¤ï¼Œå¿…é¡»æ‰‹åŠ¨åˆ é™¤ã€‚\n" -"[b]注:[/b]如果该[member owner]ä¸å†æ˜¯çˆ¶èŠ‚ç‚¹æˆ–ç¥–å…ˆï¼Œåˆ™è¯¥å‡½æ•°å¯ä»¥å°†è¢«ç§»é™¤èŠ‚ç‚¹" -"(或其åŽä»£ï¼‰çš„[member owner]设置为[code]null[/code]。" +"[b]注æ„:[/b]如果该 [member owner] ä¸å†æ˜¯çˆ¶èŠ‚ç‚¹æˆ–ç¥–å…ˆï¼Œåˆ™è¯¥å‡½æ•°å¯ä»¥å°†è¢«ç§»é™¤èŠ‚" +"点(或其åŽä»£ï¼‰çš„ [member owner] 设置为 [code]null[/code]。" #: doc/classes/Node.xml msgid "" @@ -47892,10 +48075,11 @@ msgid "" "which case, [code]_ready[/code] will be called in the same order as it would " "normally)." msgstr "" -"è¯·æ±‚å†æ¬¡è°ƒç”¨[code]_ready[/code]。注æ„,该方法ä¸ä¼šè¢«ç«‹å³è°ƒç”¨ï¼Œè€Œæ˜¯è¢«å®‰æŽ’在该节" -"ç‚¹å†æ¬¡è¢«æ·»åŠ åˆ°åœºæ™¯æ ‘æ—¶ï¼ˆè§[method _ready])。[code]_ready[/code]åªä¸ºè¯·æ±‚它的" -"节点调用,这æ„味ç€å¦‚æžœä½ æƒ³è®©æ¯ä¸ªå节点也调用[code]_ready[/code]ï¼Œä½ éœ€è¦ä¸ºå®ƒä»¬" -"请求readyï¼ˆåœ¨è¿™ç§æƒ…况下,[code]_ready[/code]的调用顺åºä¸Žæ£å¸¸æƒ…况下相åŒï¼‰ã€‚" +"è¯·æ±‚å†æ¬¡è°ƒç”¨ [code]_ready[/code]。注æ„,该方法ä¸ä¼šè¢«ç«‹å³è°ƒç”¨ï¼Œè€Œæ˜¯è¢«å®‰æŽ’在该" +"èŠ‚ç‚¹å†æ¬¡è¢«æ·»åŠ åˆ°åœºæ™¯æ ‘æ—¶ï¼ˆè§ [method _ready])。[code]_ready[/code] åªä¸ºè¯·æ±‚" +"它的节点调用,这æ„味ç€å¦‚æžœä½ æƒ³è®©æ¯ä¸ªå节点也调用 [code]_ready[/code]ï¼Œä½ éœ€è¦" +"为它们请求 readyï¼ˆåœ¨è¿™ç§æƒ…况下,[code]_ready[/code] 的调用顺åºä¸Žæ£å¸¸æƒ…况下相" +"åŒï¼‰ã€‚" #: doc/classes/Node.xml msgid "" @@ -47955,8 +48139,8 @@ msgid "" "By default, methods are not exposed to networking (and RPCs). See also " "[method rset] and [method rset_config] for properties." msgstr "" -"å°† [code]method[/code] 方法的 RPC æ¨¡å¼æ”¹ä¸º [code]mode[/code] 模å¼ã€‚请å‚阅 " -"[enum MultiplayerAPI.RPCMode]。å¦ä¸€ç§æ–¹æ³•æ˜¯åœ¨æ–¹æ³•å’Œå±žæ€§ä¸ŠåŠ å…¥ç›¸åº”çš„å…³é”®å—æ³¨è§£" +"å°† [code]method[/code] 方法的 RPC æ¨¡å¼æ”¹ä¸º [code]mode[/code] 模å¼ã€‚è§ [enum " +"MultiplayerAPI.RPCMode]。å¦ä¸€ç§æ–¹æ³•æ˜¯åœ¨æ–¹æ³•å’Œå±žæ€§ä¸ŠåŠ å…¥ç›¸åº”çš„å…³é”®å—æ³¨è§£" "([code]remote[/code]ã€[code]master[/code]ã€[code]puppet[/code]ã€" "[code]remoteesync[/code]ã€[code]masterync[/code]ã€[code]puppetsync[/code])。" "é»˜è®¤æƒ…å†µä¸‹ï¼Œæ–¹æ³•ä¸æš´éœ²äºŽç½‘络(和 RPC)。请å‚阅 [method rset] å’Œ [method " @@ -47994,8 +48178,8 @@ msgid "" "applies to this method as well." msgstr "" "在其他对ç‰ä½“上远程改å˜ä¸€ä¸ªå±žæ€§çš„值(和本地)。行为å–决于给定属性的RPCé…置," -"è§ [method rset_config]。关于方法的RPC,也请å‚阅 [method rpc],大多数信æ¯ä¹Ÿé€‚" -"用于这个方法。" +"è§ [method rset_config]。关于方法的 RPC,也请å‚阅 [method rpc],大多数信æ¯ä¹Ÿ" +"适用于这个方法。" #: doc/classes/Node.xml msgid "" @@ -48019,14 +48203,14 @@ msgid "" "Remotely changes the property's value on a specific peer identified by " "[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." msgstr "" -"远程改å˜å±žæ€§çš„值在一个指定的peer上[code]peer_id[/code](å‚阅[method " -"NetworkedMultiplayerPeer.set_target_peer])。" +"远程改å˜å±žæ€§çš„值在一个指定的 peer 上 [code]peer_id[/code]ï¼ˆè§ [method " +"NetworkedMultiplayerPeer.set_target_peer])。" #: doc/classes/Node.xml msgid "" "Remotely changes the property's value on other peers (and locally) using an " "unreliable protocol." -msgstr "使用ä¸å¯é çš„å议远程更改其他对ç‰ç‚¹(和本地)上的属性值。" +msgstr "使用ä¸å¯é çš„å议远程更改其他对ç‰ç‚¹ï¼ˆå’Œæœ¬åœ°ï¼‰ä¸Šçš„属性值。" #: doc/classes/Node.xml msgid "" @@ -48034,12 +48218,12 @@ msgid "" "[code]peer_id[/code] using an unreliable protocol (see [method " "NetworkedMultiplayerPeer.set_target_peer])." msgstr "" -"使用ä¸å¯é çš„åè®®(å‚阅[method NetworkedMultiplayerPeer.set_target_peer])远程更" -"改指定对ç‰ä½“[code]peer_id[/code]上的属性值。" +"使用ä¸å¯é çš„åè®®ï¼ˆè§ [method NetworkedMultiplayerPeer.set_target_peer])远程" +"更改指定对ç‰ä½“ [code]peer_id[/code] 上的属性值。" #: doc/classes/Node.xml msgid "Sets the folded state of the node in the Scene dock." -msgstr "设置场景dockä¸èŠ‚ç‚¹çš„æŠ˜å 状æ€ã€‚" +msgstr "è®¾ç½®åœºæ™¯é¢æ¿ä¸èŠ‚ç‚¹çš„æŠ˜å 状æ€ã€‚" #: doc/classes/Node.xml msgid "" @@ -48050,9 +48234,9 @@ msgid "" "defaults to peer ID 1 (the server). If [code]recursive[/code], the given " "peer is recursively set as the master for all children of this node." msgstr "" -"将节点的网络主节点设置为具有给定ID的对ç‰ä½“。网络主节点是对网络上的节点具有æƒ" -"å¨çš„对ç‰ä½“。与[code]master[/code]å’Œ[code]puppet[/code]关键å—一起使用很有用。" -"默认情况下从父节点继承,父节点最终默认为peer ID 1(æœåС噍)。如果" +"将节点的网络主节点设置为具有给定 ID 的对ç‰ä½“。网络主节点是对网络上的节点具有" +"æƒå¨çš„对ç‰ä½“。与 [code]master[/code] å’Œ [code]puppet[/code] 关键å—一起使用很" +"有用。默认情况下从父节点继承,父节点最终默认为 peer ID 1(æœåŠ¡å™¨ï¼‰ã€‚å¦‚æžœ " "[code]recursive[/code],则递归地将给定的对ç‰èŠ‚ç‚¹è®¾ç½®ä¸ºè¯¥èŠ‚ç‚¹æ‰€æœ‰å节点的主节" "点。" @@ -48067,10 +48251,10 @@ msgid "" "_ready] will be ignored." msgstr "" "å¯ç”¨æˆ–ç¦ç”¨ç‰©ç†å¤„ç†ï¼ˆå³å›ºå®šå¸§çŽ‡ï¼‰ã€‚å½“ä¸€ä¸ªèŠ‚ç‚¹è¢«å¤„ç†æ—¶ï¼Œå®ƒå°†ä»¥ä¸€ä¸ªå›ºå®šçš„(通常" -"是60FPS,å‚阅[member Engine.iterations_per_second]æ¥æ›´æ”¹è¯¥å€¼ï¼‰æ—¶é—´é—´é𔿔¶åˆ°ä¸€" -"个[constant NOTIFICATION_PHYSICS_PROCESS](如果å˜åœ¨ï¼Œ[method " -"_physics_process]回调将被调用)。如果[method _physics_process]被é‡å†™ï¼Œåˆ™è‡ªåЍ" -"å¯ç”¨ã€‚在[method _ready]之å‰å¯¹å®ƒçš„任何调用都将被忽略。" +"是 60 FPS,å‚阅 [member Engine.iterations_per_second] æ¥æ›´æ”¹è¯¥å€¼ï¼‰æ—¶é—´é—´é𔿔¶" +"到一个 [constant NOTIFICATION_PHYSICS_PROCESS](如果å˜åœ¨ï¼Œ[method " +"_physics_process] 回调将被调用)。如果 [method _physics_process] 被é‡å†™ï¼Œåˆ™è‡ª" +"动å¯ç”¨ã€‚在 [method _ready] 之å‰å¯¹å®ƒçš„任何调用都将被忽略。" #: doc/classes/Node.xml msgid "" @@ -48112,8 +48296,8 @@ msgid "" "Enabled automatically if [method _input] is overridden. Any calls to this " "before [method _ready] will be ignored." msgstr "" -"å¯ç”¨æˆ–ç¦ç”¨è¾“入处ç†ã€‚对于GUI控件æ¥è¯´ï¼Œè¿™ä¸æ˜¯å¿…需的。如果[method _input]被é‡" -"写,则自动å¯ç”¨ã€‚任何在[method _ready]之å‰å¯¹å®ƒçš„调用都将被忽略。" +"å¯ç”¨æˆ–ç¦ç”¨è¾“入处ç†ã€‚对于 GUI 控件æ¥è¯´ä¸æ˜¯å¿…需的。如果 [method _input] 被覆" +"盖,则自动å¯ç”¨ã€‚任何在 [method _ready] 之å‰å¯¹å®ƒçš„调用都将被忽略。" #: doc/classes/Node.xml msgid "" @@ -48151,13 +48335,13 @@ msgid "" "_unhandled_key_input] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" -"å¯ç”¨æœªå¤„ç†çš„æŒ‰é”®è¾“入处ç†ã€‚如果[method _unhandled_key_input]被é‡å†™ï¼Œåˆ™è‡ªåЍå¯" -"用。任何在[method _ready]之å‰å¯¹å®ƒçš„调用都将被忽略。" +"å¯ç”¨æœªå¤„ç†çš„æŒ‰é”®è¾“入处ç†ã€‚如果 [method _unhandled_key_input] 被é‡å†™ï¼Œåˆ™è‡ªåЍå¯" +"用。任何在 [method _ready] 之å‰å¯¹å®ƒçš„调用都将被忽略。" #: doc/classes/Node.xml msgid "" "Sets whether this is an instance load placeholder. See [InstancePlaceholder]." -msgstr "è®¾ç½®è¿™æ˜¯å¦æ˜¯ä¸€ä¸ªå®žä¾‹åŠ è½½å ä½ç¬¦ã€‚å‚阅[InstancePlaceholder]。" +msgstr "è®¾ç½®è¿™æ˜¯å¦æ˜¯å®žä¾‹åŠ è½½å ä½ç¬¦ã€‚è§ [InstancePlaceholder]。" #: doc/classes/Node.xml msgid "" @@ -48173,7 +48357,7 @@ msgid "" "The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " "use the default [SceneTree] one." msgstr "" -"对默认的[MultiplayerAPI]çš„é‡å†™ã€‚设置为[code]null[/code]å¯ä»¥ä½¿ç”¨é»˜è®¤çš„" +"对默认的 [MultiplayerAPI] çš„é‡å†™ã€‚设置为 [code]null[/code] å¯ä»¥ä½¿ç”¨é»˜è®¤çš„ " "[SceneTree]。" #: doc/classes/Node.xml @@ -48192,8 +48376,8 @@ msgid "" "The [MultiplayerAPI] instance associated with this node. Either the [member " "custom_multiplayer], or the default SceneTree one (if inside tree)." msgstr "" -"与该节点相关的[MultiplayerAPI]实例。è¦ä¹ˆæ˜¯[member custom_multiplayer],è¦ä¹ˆæ˜¯" -"默认的SceneTreeï¼ˆå¦‚æžœåœ¨æ ‘å†…ï¼‰ã€‚" +"与该节点相关的 [MultiplayerAPI] 实例。è¦ä¹ˆæ˜¯ [member custom_multiplayer],è¦" +"么是默认的 SceneTreeï¼ˆå¦‚æžœåœ¨æ ‘å†…ï¼‰ã€‚" #: doc/classes/Node.xml msgid "" @@ -48277,20 +48461,25 @@ msgstr "" "称设置为唯一å称。" #: doc/classes/Node.xml +#, fuzzy msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" "在åèŠ‚ç‚¹è¿›å…¥åœºæ™¯æ ‘æ—¶è§¦å‘,å¯ä»¥æ˜¯å› 为该å节点自行进入,也å¯ä»¥æ˜¯å› 为本节点带ç€" "该å节点一起进入。" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" -"在åèŠ‚ç‚¹ç¦»å¼€åœºæ™¯æ ‘æ—¶è§¦å‘,å¯ä»¥æ˜¯å› 为该å节点自行离开,也å¯ä»¥æ˜¯å› 为本节点离" -"开。" #: doc/classes/Node.xml msgid "Emitted when the node is ready." @@ -48301,27 +48490,38 @@ msgid "Emitted when the node is renamed." msgstr "在é‡å‘½å节点时触å‘。" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." -msgstr "å½“èŠ‚ç‚¹è¿›å…¥æ ‘æ—¶è§¦å‘。" +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." +msgstr "" #: doc/classes/Node.xml msgid "Emitted after the node exits the tree and is no longer active." msgstr "åœ¨èŠ‚ç‚¹é€€å‡ºæ ‘ä¹‹åŽè§¦å‘,并且ä¸å†å¤„于活动状æ€ã€‚" #: doc/classes/Node.xml +#, fuzzy msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" "当节点ä»å¤„于活动状æ€ä½†å³å°†é€€å‡ºæ ‘æ—¶å‘出。这是ååˆå§‹åŒ–çš„æ£ç¡®ä½ç½®ï¼ˆå¦‚果愿æ„,也" "å¯ä»¥ç§°ä¹‹ä¸ºâ€œæžæž„函数â€ï¼‰ã€‚" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." -msgstr "当该节点进入 [SceneTree] 时收到的通知。" +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." +msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +#, fuzzy +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "当该节点å³å°†é€€å‡º [SceneTree] 时收到的通知。" #: doc/classes/Node.xml @@ -48330,7 +48530,7 @@ msgstr "当该节点在其父节点ä¸ç§»åŠ¨æ—¶æ”¶åˆ°çš„é€šçŸ¥ã€‚" #: doc/classes/Node.xml msgid "Notification received when the node is ready. See [method _ready]." -msgstr "当该节点就绪时接收到通知。请å‚阅 [method _ready]。" +msgstr "å½“è¯¥èŠ‚ç‚¹å°±ç»ªæ—¶æŽ¥æ”¶åˆ°é€šçŸ¥ã€‚è§ [method _ready]。" #: doc/classes/Node.xml msgid "Notification received when the node is paused." @@ -48361,7 +48561,7 @@ msgid "" "[b]Note:[/b] This doesn't mean that a node entered the [SceneTree]." msgstr "" "当一个节点被设置为å¦ä¸€ä¸ªèŠ‚ç‚¹çš„å节点时收到该通知。\n" -"[b]注æ„:[/b]è¿™å¹¶ä¸æ„味ç€ä¸€ä¸ªèŠ‚ç‚¹è¿›å…¥äº†[SceneTree]。" +"[b]注æ„:[/b]è¿™å¹¶ä¸æ„味ç€ä¸€ä¸ªèŠ‚ç‚¹è¿›å…¥äº† [SceneTree]。" #: doc/classes/Node.xml msgid "" @@ -48548,8 +48748,8 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" -"基于[method Node._process]çš„[code]delta[/code],在节点的X轴上应用一个局部平" -"移。如果[code]scaled[/code]是[code]false[/code],则对è¿åŠ¨è¿›è¡Œæ ‡å‡†åŒ–ã€‚" +"基于 [method Node._process] çš„ [code]delta[/code],在节点的 X 轴上应用一个局" +"部平移。如果 [code]scaled[/code] 是 [code]false[/code],则对è¿åŠ¨è¿›è¡Œæ ‡å‡†åŒ–ã€‚" #: doc/classes/Node2D.xml msgid "" @@ -48557,8 +48757,8 @@ msgid "" "_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" "code], normalizes the movement." msgstr "" -"基于[method Node._process]çš„[code]delta[/code],在节点的Y轴上应用一个局部平" -"移。如果[code]scaled[/code]是[code]false[/code],则对è¿åŠ¨è¿›è¡Œæ ‡å‡†åŒ–ã€‚" +"基于 [method Node._process] çš„ [code]delta[/code],在节点的 Y 轴上应用一个局" +"部平移。如果 [code]scaled[/code] 是 [code]false[/code],则对è¿åŠ¨è¿›è¡Œæ ‡å‡†åŒ–ã€‚" #: doc/classes/Node2D.xml msgid "" @@ -48650,9 +48850,9 @@ msgid "" "index. If this node's Z index is 2 and its parent's effective Z index is 3, " "then this node's effective Z index will be 2 + 3 = 5." msgstr "" -"如果 [code]true[/code],节点的 Z 索引是相对于它的父节点的 Z 索引而言的。如果" -"这个节点的 Z 索引是 2,它的父节点的实际 Z 索引是 3,那么这个节点的实际 Z 索引" -"将是 2 + 3 = 5。" +"如果为 [code]true[/code],节点的 Z 索引是相对于它的父节点的 Z 索引而言的。如" +"果这个节点的 Z 索引是 2,它的父节点的实际 Z 索引是 3,那么这个节点的实际 Z ç´¢" +"引将是 2 + 3 = 5。" #: doc/classes/Node2D.xml msgid "" @@ -48723,7 +48923,7 @@ msgstr "" "@\"..\" # 父节点。\n" "@\"../C\" # 兄弟节点 C.\n" "# å‰å¯¼æ–œæ 表示它是æ¥è‡ªåœºæ™¯æ ‘çš„ç»å¯¹è·¯å¾„。\n" -"@\"/root\" # ç‰ä»·äºŽ get_tree().get_root()。\n" +"@\"/root\" # 相当于 get_tree().get_root()。\n" "@\"/root/Main\" # å¦‚æžœä½ çš„ä¸»åœºæ™¯çš„æ ¹èŠ‚ç‚¹è¢«å‘½å为“Mainâ€ã€‚\n" "@\"/root/MyAutoload\" # å¦‚æžœä½ æœ‰ä¸€ä¸ªè‡ªåŠ¨åŠ è½½çš„èŠ‚ç‚¹æˆ–åœºæ™¯ã€‚\n" "[/codeblock]\n" @@ -48770,17 +48970,17 @@ msgstr "" "ç›®æ ‡èŠ‚ç‚¹è·¯å¾„åŽåŠ ä¸Šå¯é€‰çš„“ååç§°â€å¯ä»¥æŒ‡å‘èµ„æºæˆ–属性,也å¯ä»¥åµŒå¥—。\n" "有效 NodePath 的示例(å‡è®¾è¿™äº›èŠ‚ç‚¹å˜åœ¨å¹¶å…·æœ‰å¼•ç”¨çš„èµ„æºæˆ–属性):\n" "[codeblock]\n" -"# 指å‘ç²¾çµèŠ‚ç‚¹\n" +"# æŒ‡å‘ Sprite 节点\n" "“Path2D/PathFollow2D/Spriteâ€\n" "# æŒ‡å‘ Sprite 节点åŠå…¶â€œçº¹ç†â€èµ„æºã€‚\n" -"# get_node() 将检索“Spriteâ€ï¼Œè€Œ get_node_and_resource()\n" -"# å°†åŒæ—¶æ£€ç´¢ Sprite 节点和“纹ç†â€èµ„æºã€‚\n" +"# get_node() 将获å–“Spriteâ€ï¼Œè€Œ get_node_and_resource()\n" +"# å°†åŒæ—¶èŽ·å– Sprite 节点åŠå…¶â€œtextureâ€èµ„æºã€‚\n" "“Path2D/PathFollow2D/Sprite:textureâ€\n" -"# æŒ‡å‘ Sprite 节点åŠå…¶â€œä½ç½®â€å±žæ€§ã€‚\n" +"# æŒ‡å‘ Sprite 节点åŠå…¶â€œpositionâ€å±žæ€§ã€‚\n" "\"Path2D/PathFollow2D/Sprite:position\"\n" "# æŒ‡å‘ Sprite 节点åŠå…¶â€œpositionâ€å±žæ€§çš„“xâ€ç»„件。\n" "\"Path2D/PathFollow2D/Sprite:position:x\"\n" -"# ç»å¯¹è·¯å¾„(æ¥è‡ªâ€œrootâ€ï¼‰\n" +"# ç»å¯¹è·¯å¾„(以“rootâ€å¼€å¤´ï¼‰\n" "“/root/Level/Path2Dâ€\n" "[/codeblock]" @@ -48939,8 +49139,8 @@ msgid "" "If [code]true[/code], the resulting texture contains a normal map created " "from the original noise interpreted as a bump map." msgstr "" -"如果 [code]true[/code],产生的纹ç†åŒ…å«ä¸€ä¸ªç”±åŽŸå§‹å™ªå£°åˆ›å»ºçš„æ³•çº¿è´´å›¾ï¼Œè§£é‡Šä¸ºå‡¹" -"凸贴图。" +"如果为 [code]true[/code],产生的纹ç†åŒ…å«ä¸€ä¸ªç”±åŽŸå§‹å™ªå£°åˆ›å»ºçš„æ³•çº¿è´´å›¾ï¼Œè§£é‡Šä¸º" +"凹凸贴图。" #: modules/opensimplex/doc_classes/NoiseTexture.xml msgid "" @@ -48976,7 +49176,7 @@ msgid "" "seamless noise." msgstr "" "çº¹ç†æ˜¯å¦å¯ä»¥å¹³é“ºè€Œæ²¡æœ‰å¯è§çš„æŽ¥ç¼ã€‚ç”Ÿæˆæ— ç¼çº¹ç†éœ€è¦æ›´é•¿çš„æ—¶é—´ã€‚\n" -"[b]注:[/b] ä¸Žéžæ— ç¼å™ªå£°ç›¸æ¯”ï¼Œæ— ç¼å™ªå£°å…·æœ‰è¾ƒä½Žçš„对比度。这是由于噪声使用更高" +"[b]注æ„:[/b]ä¸Žéžæ— ç¼å™ªå£°ç›¸æ¯”ï¼Œæ— ç¼å™ªå£°å…·æœ‰è¾ƒä½Žçš„对比度。这是由于噪声使用更高" "维度æ¥ç”Ÿæˆæ— ç¼å™ªå£°çš„æ–¹å¼ã€‚" #: modules/opensimplex/doc_classes/NoiseTexture.xml @@ -49029,9 +49229,9 @@ msgstr "" "çš„ [code]new Object[/code] 或 VisualScript ä¸çš„â€œæž„é€ å¯¹è±¡â€èŠ‚ç‚¹ã€‚\n" "对象ä¸ç®¡ç†å†…å˜ã€‚如果类继承自 Objectï¼Œåˆ™å¿…é¡»æ‰‹åŠ¨åˆ é™¤å®ƒçš„å®žä¾‹ã€‚ä¸ºæ¤ï¼Œè¯·ä»Žæ‚¨çš„脚" "本ä¸è°ƒç”¨ [method free] 方法或从 C++ ä¸åˆ 除该实例。\n" -"一些继承 Object çš„ç±»æ·»åŠ äº†å†…å˜ç®¡ç†ã€‚ [Reference] å°±æ˜¯è¿™ç§æƒ…况,它对引用进行计" -"数,并在ä¸å†è¢«å¼•ç”¨æ—¶è‡ªåŠ¨åˆ é™¤è‡ªå·±ã€‚ [Node] 是å¦ä¸€ç§åŸºæœ¬ç±»åž‹ï¼Œåœ¨ä»Žå†…å˜ä¸é‡Šæ”¾æ—¶" -"åˆ é™¤å…¶æ‰€æœ‰å节点。\n" +"一些继承 Object çš„ç±»æ·»åŠ äº†å†…å˜ç®¡ç†ã€‚[Reference] å°±æ˜¯è¿™ç§æƒ…况,它对引用进行计" +"数,并在ä¸å†è¢«å¼•ç”¨æ—¶è‡ªåŠ¨åˆ é™¤è‡ªå·±ã€‚[Node] 是å¦ä¸€ç§åŸºæœ¬ç±»åž‹ï¼Œåœ¨ä»Žå†…å˜ä¸é‡Šæ”¾æ—¶åˆ " +"除其所有å节点。\n" "对象导出属性,这些属性主è¦ç”¨äºŽå˜å‚¨å’Œç¼–辑,但在编程ä¸å¹¶ä¸æ˜¯é‚£ä¹ˆæœ‰ç”¨ã€‚属性在 " "[method _get_property_list] ä¸å¯¼å‡ºå¹¶åœ¨ [method _get] å’Œ [method _set] ä¸å¤„" "ç†ã€‚然而,脚本è¯è¨€å’Œ C++ 有更简å•的方法æ¥å¯¼å‡ºå®ƒä»¬ã€‚\n" @@ -49186,14 +49386,14 @@ msgid "" "where you should use the same convention as in the C# source (typically " "PascalCase)." msgstr "" -"在空闲时间调用对象上的[code]method[/code]。这个方法支æŒå¯å˜æ•°é‡çš„傿•°ï¼Œæ‰€ä»¥å‚" -"数是以逗å·åˆ†éš”的列表形å¼ä¼ é€’ã€‚ä¸‹é¢æ˜¯ä¸ªä¾‹å:\n" +"在空闲时间调用对象上的 [code]method[/code]。这个方法支æŒå¯å˜æ•°é‡çš„傿•°ï¼Œæ‰€ä»¥" +"傿•°æ˜¯ä»¥é€—å·åˆ†éš”的列表形å¼ä¼ é€’ã€‚ä¸‹é¢æ˜¯ä¸ªä¾‹å:\n" "[codeblock]\n" "call_deferred(\"set\", \"position\", Vector2(42.0, 0.0))\n" "[/codeblock]\n" -"[b]注æ„:[/b]在C#ä¸ï¼Œå¦‚果方法å称是由内置的Godot节点定义的,必须指定为" -"snake_case。这ä¸é€‚ç”¨äºŽç”¨æˆ·å®šä¹‰çš„æ–¹æ³•ï¼Œåœ¨é‚£é‡Œä½ åº”è¯¥ä½¿ç”¨ä¸ŽC#æºä»£ç ä¸ç›¸åŒçš„约定" -"(通常是PascalCase)。" +"[b]注æ„:[/b]在 C# ä¸ï¼Œå¦‚果方法å称是由内置的 Godot 节点定义的,必须指定为 " +"snake_case。这ä¸é€‚ç”¨äºŽç”¨æˆ·å®šä¹‰çš„æ–¹æ³•ï¼Œåœ¨é‚£é‡Œä½ åº”è¯¥ä½¿ç”¨ä¸Ž C# æºä»£ç ä¸ç›¸åŒçš„约" +"定(通常是 PascalCase)。" #: doc/classes/Object.xml msgid "" @@ -49204,8 +49404,8 @@ msgid "" "callv(\"set\", [ \"position\", Vector2(42.0, 0.0) ])\n" "[/codeblock]" msgstr "" -"在对象上调用[code]method[/code]并返回结果。与[method call]相åï¼Œè¿™ä¸ªæ–¹æ³•ä¸æ”¯" -"æŒå¯å˜æ•°é‡çš„傿•°ï¼Œè€Œæ˜¯æœŸæœ›æ‰€æœ‰çš„傿•°éƒ½é€šè¿‡ä¸€ä¸ª[Array]。\n" +"在对象上调用 [code]method[/code] 并返回结果。与 [method call] 相å,这个方法" +"䏿”¯æŒå¯å˜æ•°é‡çš„傿•°ï¼Œè€Œæ˜¯æœŸæœ›æ‰€æœ‰çš„傿•°éƒ½é€šè¿‡ä¸€ä¸ª [Array]。\n" "[codeblock]\n" "callv(\"set\", [ \"position\", Vector2(42.0, 0.0) ])\n" "[/codeblock]" @@ -49215,8 +49415,8 @@ msgid "" "Returns [code]true[/code] if the object can translate strings. See [method " "set_message_translation] and [method tr]." msgstr "" -"如果该对象å¯ä»¥ç¿»è¯‘å—符串,则返回 [code]true[/code]。å‚阅[method " -"set_message_translation]å’Œ[method tr]。" +"如果该对象å¯ä»¥ç¿»è¯‘å—符串,则返回 [code]true[/code]ã€‚è§ [method " +"set_message_translation] å’Œ [method tr]。" #: doc/classes/Object.xml msgid "" @@ -49429,8 +49629,8 @@ msgstr "" "将该对象的属性列表作为 [Array] è¿”å›žï¼Œå…ƒç´ ä¸ºå—典。\n" "æ¯ä¸ªå±žæ€§çš„ [Dictionary] è‡³å°‘åŒ…å« [code]name: String[/code] å’Œ [code]type: " "int[/code]ï¼ˆè§ [enum Variant.Type])æ¡ç›®ã€‚å¦å¤–,它还å¯ä»¥åŒ…括 [code]hint: " -"int[/code](è§[enum PropertyHint])ã€[code]hint_string: String[/code],以åŠ" -"[code]usage: int[/code](è§[enum PropertyUsageFlags])。" +"int[/code]ï¼ˆè§ [enum PropertyHint])ã€[code]hint_string: String[/code]ï¼Œä»¥åŠ " +"[code]usage: int[/code]ï¼ˆè§ [enum PropertyUsageFlags])。" #: doc/classes/Object.xml msgid "" @@ -49487,9 +49687,9 @@ msgid "" msgstr "" "如果对象从给定的 [code]class[/code] ä¸ç»§æ‰¿ï¼Œåˆ™è¿”回 [code]true[/code]。å¦è¯·å‚" "阅 [method get_class]。\n" -"[b]注:[/b] [method is_class] 没有考虑 [code]class_name[/code] 声明。如果对象" -"有 [code]class_name[/code] 定义,[method is_class] 将为该å称返回 " -"[code]false[/code] 。" +"[b]注æ„:[/b][method is_class] 没有考虑 [code]class_name[/code] 声明。如果对" +"象有 [code]class_name[/code] 定义,[method is_class] 将为该å称返回 " +"[code]false[/code]。" #: doc/classes/Object.xml msgid "" @@ -49535,7 +49735,7 @@ msgstr "" #: doc/classes/Object.xml msgid "" "Removes a given entry from the object's metadata. See also [method set_meta]." -msgstr "从对象的元数æ®ä¸åˆ 除给定æ¡ç›®ã€‚å¦è§ [method set_meta]。" +msgstr "从对象的元数æ®ä¸åˆ 除给定æ¡ç›®ã€‚å¦è¯·å‚阅 [method set_meta]。" #: doc/classes/Object.xml msgid "" @@ -49596,7 +49796,7 @@ msgstr "" msgid "" "Defines whether the object can translate strings (with calls to [method " "tr]). Enabled by default." -msgstr "定义对象是å¦å¯ä»¥è½¬æ¢å—符串(通过调用[method tr])。默认å¯ç”¨ã€‚" +msgstr "定义对象是å¦å¯ä»¥è½¬æ¢å—符串(通过调用 [method tr])。默认å¯ç”¨ã€‚" #: doc/classes/Object.xml msgid "" @@ -49686,7 +49886,7 @@ msgstr "" #: doc/classes/Occluder.xml msgid "Allows [OccluderShape]s to be used for occlusion culling." -msgstr "å…许使用[OccluderShape]æ¥è¿›è¡Œé®æŒ¡å‰”除。" +msgstr "å…许使用 [OccluderShape] æ¥è¿›è¡Œé®æŒ¡å‰”除。" #: doc/classes/Occluder.xml msgid "" @@ -49727,13 +49927,13 @@ msgstr "" #: doc/classes/OccluderPolygon2D.xml msgid "Defines a 2D polygon for LightOccluder2D." -msgstr "为LightOccluder2D定义一个2D多边形。" +msgstr "为 LightOccluder2D 定义一个 2D 多边形。" #: doc/classes/OccluderPolygon2D.xml msgid "" "Editor facility that helps you draw a 2D polygon used as resource for " "[LightOccluder2D]." -msgstr "ç¼–è¾‘å·¥å…·ï¼Œå¸®åŠ©ä½ ç»˜åˆ¶ä¸€ä¸ª2D多边形用作资æº[LightOccluder2D]。" +msgstr "ç¼–è¾‘å·¥å…·ï¼Œå¸®åŠ©ä½ ç»˜åˆ¶ä¸€ä¸ª 2D å¤šè¾¹å½¢ç”¨ä½œèµ„æº [LightOccluder2D]。" #: doc/classes/OccluderPolygon2D.xml msgid "" @@ -49741,7 +49941,7 @@ msgid "" "occludes the light coming from any direction. An opened OccluderPolygon2D " "occludes the light only at its outline's direction." msgstr "" -"如果[code]true[/code],å°é—该多边形。一个å°é—çš„polygon2då°é—æ¥è‡ªä»»ä½•æ–¹å‘çš„" +"如果为 [code]true[/code],å°é—该多边形。一个å°é—çš„polygon2då°é—æ¥è‡ªä»»ä½•æ–¹å‘çš„" "光。一个开放的OccluderPolygon2Dåªåœ¨å…¶è½®å»“æ–¹å‘ä¸Šé®æŒ¡å…‰ã€‚" #: doc/classes/OccluderPolygon2D.xml @@ -49754,28 +49954,28 @@ msgid "" "[b]Note:[/b] The returned value is a copy of the underlying array, rather " "than a reference." msgstr "" -"带有多边形顶点ä½ç½®ç´¢å¼•çš„[Vector2]数组。\n" +"带有多边形顶点ä½ç½®ç´¢å¼•çš„ [Vector2] 数组。\n" "[b]注æ„:[/b]è¿”å›žå€¼æ˜¯åŸºç¡€æ•°ç»„çš„å‰¯æœ¬ï¼Œè€Œä¸æ˜¯å¼•用。" #: doc/classes/OccluderPolygon2D.xml msgid "Culling is disabled. See [member cull_mode]." -msgstr "ç¦ç”¨å‰”除。å‚阅[member cull_mode]。" +msgstr "ç¦ç”¨å‰”é™¤ã€‚è§ [member cull_mode]。" #: doc/classes/OccluderPolygon2D.xml msgid "" "Culling is performed in the clockwise direction. See [member cull_mode]." -msgstr "按顺时针方å‘进行剔除。è§[member cull_mode]。" +msgstr "按顺时针方å‘è¿›è¡Œå‰”é™¤ã€‚è§ [member cull_mode]。" #: doc/classes/OccluderPolygon2D.xml msgid "" "Culling is performed in the counterclockwise direction. See [member " "cull_mode]." -msgstr "按逆时针方å‘进行剔除。å‚阅[member cull_mode]。" +msgstr "按逆时针方å‘è¿›è¡Œå‰”é™¤ã€‚è§ [member cull_mode]。" #: doc/classes/OccluderShape.xml msgid "" "Base class for shapes used for occlusion culling by the [Occluder] node." -msgstr "用于[Occluder]èŠ‚ç‚¹è¿›è¡Œé®æŒ¡å‰”除的形状的基类。" +msgstr "用于 [Occluder] èŠ‚ç‚¹è¿›è¡Œé®æŒ¡å‰”除的形状的基类。" #: doc/classes/OccluderShape.xml msgid "[Occluder]s can use any primitive shape derived from [OccluderShape]." @@ -49905,31 +50105,32 @@ msgid "" "[member omni_attenuation] in use, the light will never reach anything " "outside this radius." msgstr "" -"光的åŠå¾„。请注æ„,有效的照明区域å¯èƒ½çœ‹èµ·æ¥æ›´å°ï¼Œè¿™å–决于使用的[member " -"omni_attenuation]ã€‚æ— è®ºä½¿ç”¨ä½•ç§[member omni_attenuation],光线都ä¸ä¼šåˆ°è¾¾è¿™ä¸ª" +"光的åŠå¾„。请注æ„,有效的照明区域å¯èƒ½çœ‹èµ·æ¥æ›´å°ï¼Œè¿™å–决于使用的 [member " +"omni_attenuation]ã€‚æ— è®ºä½¿ç”¨ä½•ç§ [member omni_attenuation],光线都ä¸ä¼šåˆ°è¾¾è¿™ä¸ª" "åŠå¾„以外的地方。" #: doc/classes/OmniLight.xml msgid "See [enum ShadowDetail]." -msgstr "å‚阅[enum ShadowDetail]。" +msgstr "è§ [enum ShadowDetail]。" #: doc/classes/OmniLight.xml msgid "See [enum ShadowMode]." -msgstr "å‚阅[enum ShadowMode]。" +msgstr "è§ [enum ShadowMode]。" #: doc/classes/OmniLight.xml msgid "" "Shadows are rendered to a dual-paraboloid texture. Faster than [constant " "SHADOW_CUBE], but lower-quality." msgstr "" -"é˜´å½±è¢«æ¸²æŸ“åˆ°ä¸€ä¸ªåŒæŠ›ç‰©é¢çº¹ç†ã€‚比[constant SHADOW_CUBE]更快,但质é‡è¾ƒå·®ã€‚" +"é˜´å½±è¢«æ¸²æŸ“åˆ°ä¸€ä¸ªåŒæŠ›ç‰©é¢çº¹ç†ã€‚比 [constant SHADOW_CUBE] 更快,但质é‡è¾ƒå·®ã€‚" #: doc/classes/OmniLight.xml msgid "" "Shadows are rendered to a cubemap. Slower than [constant " "SHADOW_DUAL_PARABOLOID], but higher-quality." msgstr "" -"阴影被渲染æˆä¸€ä¸ªcubemap。比[constant SHADOW_DUAL_PARABOLOID]æ…¢ï¼Œä½†è´¨é‡æ›´é«˜ã€‚" +"阴影被渲染æˆä¸€ä¸ªç«‹æ–¹ä½“贴图。比 [constant SHADOW_DUAL_PARABOLOID] æ…¢ï¼Œä½†è´¨é‡æ›´" +"高。" #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -49941,7 +50142,7 @@ msgstr "在计算阴影时,在水平方å‘上使用更多的细节。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Noise generator based on Open Simplex." -msgstr "基于Open Simplex的噪声å‘生器。" +msgstr "基于 Open Simplex 的噪声å‘生器。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -49965,17 +50166,17 @@ msgid "" "[/codeblock]" msgstr "" "这个资æºå…è®¸ä½ é…ç½®å’Œé‡‡æ ·ä¸€ä¸ªåˆ†å½¢å™ªå£°ç©ºé—´ã€‚ä¸‹é¢æ˜¯ä¸€ä¸ªç®€çŸçš„使用例å,它é…置了" -"一个OpenSimplexNoise,并在ä¸åŒçš„ä½ç½®å’Œç»´åº¦ä¸Šå¾—åˆ°é‡‡æ ·ã€‚\n" +"一个 OpenSimplexNoise,并在ä¸åŒçš„ä½ç½®å’Œç»´åº¦ä¸Šå¾—åˆ°é‡‡æ ·ã€‚\n" "[codeblock]\n" "var noise = OpenSimplexNoise.new()\n" "\n" -"# Configure\n" +"# é…ç½®\n" "noise.seed = randi()\n" "noise.octaves = 4\n" "noise.period = 20.0\n" "noise.persistence = 0.8\n" "\n" -"# Sample\n" +"# é‡‡æ ·\n" "print(\"Values:\")\n" "print(noise.get_noise_2d(1.0, 1.0))\n" "print(noise.get_noise_3d(0.5, 3.0, 15.0))\n" @@ -49990,9 +50191,9 @@ msgid "" "value is used as the coordinates of the top-left corner of the generated " "noise." msgstr "" -"æ ¹æ®å½“å‰çš„å™ªå£°å‚æ•°ï¼Œç”Ÿæˆä¸€ä¸ª[constant Image.FORMAT_L8]æ ¼å¼çš„噪声图åƒï¼Œéœ€è¦æŒ‡" -"定其[code]width[/code] å’Œ [code]height[/code]。如果指定了[code]noise_offset[/" -"code],那么å移值将作为生æˆçš„å™ªå£°å·¦ä¸Šè§’çš„åæ ‡ã€‚" +"æ ¹æ®å½“å‰çš„å™ªå£°å‚æ•°ï¼Œç”Ÿæˆä¸€ä¸ª [constant Image.FORMAT_L8] æ ¼å¼çš„噪声图åƒï¼Œéœ€è¦" +"指定其 [code]width[/code] å’Œ [code]height[/code]。如果指定了 " +"[code]noise_offset[/code],那么å移值将作为生æˆçš„å™ªå£°å·¦ä¸Šè§’çš„åæ ‡ã€‚" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -50000,21 +50201,21 @@ msgid "" "[b]Note:[/b] This method actually returns the 2D noise value [code][-1,1][/" "code] with fixed y-coordinate value 0.0." msgstr "" -"返回给定xåæ ‡å¤„的一维噪声值[code][-1,1][/code]。\n" -"[b]注æ„:[/b]这个方法实际上返回的是固定Yåæ ‡å€¼ä¸º0.0的二维噪声值[code][-1,1][/" -"code]。" +"返回给定 x åæ ‡å¤„çš„ 1D 噪声值 [code][-1,1][/code]。\n" +"[b]注æ„:[/b]这个方法实际上返回的是固定 Y åæ ‡å€¼ä¸º 0.0 的二维噪声值 [code]" +"[-1,1][/code]。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Returns the 2D noise value [code][-1,1][/code] at the given position." -msgstr "返回给定ä½ç½®çš„2D噪声值[code][-1,1][/code]。" +msgstr "返回在给定ä½ç½®çš„ 2D 噪声值 [code][-1,1][/code]。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Returns the 3D noise value [code][-1,1][/code] at the given position." -msgstr "返回在给定ä½ç½®çš„3D噪声值[code][-1,1][/code]。" +msgstr "返回在给定ä½ç½®çš„ 3D 噪声值 [code][-1,1][/code]。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "Returns the 4D noise value [code][-1,1][/code] at the given position." -msgstr "返回指定ä½ç½®çš„4D噪声值[code][-1,1][/code]。" +msgstr "返回在给定ä½ç½®çš„ 4D 噪声值 [code][-1,1][/code]。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -50041,16 +50242,16 @@ msgid "" "generate.\n" "[b]Note:[/b] The maximum allowed value is 9." msgstr "" -"é‡‡æ ·å¾—åˆ°åˆ†å½¢å™ªå£°çš„OpenSimplexå™ªå£°å±‚æ•°ã€‚æ›´é«˜çš„å€¼å¯¼è‡´æ›´è¯¦ç»†çš„å™ªå£°ï¼Œä½†éœ€è¦æ›´å¤šçš„" -"æ—¶é—´æ¥ç”Ÿæˆã€‚\n" -"[b]备注:[/b]最大值为9。" +"é‡‡æ ·å¾—åˆ°åˆ†å½¢å™ªå£°çš„ OpenSimplex å™ªå£°å±‚æ•°ã€‚æ›´é«˜çš„å€¼å¯¼è‡´æ›´è¯¦ç»†çš„å™ªå£°ï¼Œä½†éœ€è¦æ›´å¤š" +"的时间æ¥ç”Ÿæˆã€‚\n" +"[b]备注:[/b]最大值为 9。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" "Period of the base octave. A lower period results in a higher-frequency " "noise (more value changes across the same distance)." msgstr "" -"基本八度的周期。较低的周期会导致更高频率的噪声(在相åŒè·ç¦»ä¸Šçš„值å˜åŒ–更多)。" +"基本八度的周期。较低的周期会导致更高频率的噪声(在相åŒè·ç¦»ä¸Šçš„值å˜åŒ–更多)。" #: modules/opensimplex/doc_classes/OpenSimplexNoise.xml msgid "" @@ -50116,15 +50317,15 @@ msgstr "清除[OptionButton]ä¸çš„æ‰€æœ‰é¡¹ç›®ã€‚" #: doc/classes/OptionButton.xml msgid "Returns the amount of items in the OptionButton, including separators." -msgstr "返回OptionButtonä¸çš„项目数é‡ï¼ŒåŒ…括分隔符。" +msgstr "返回 OptionButton ä¸çš„项目数é‡ï¼ŒåŒ…括分隔符。" #: doc/classes/OptionButton.xml doc/classes/PopupMenu.xml msgid "Returns the icon of the item at index [code]idx[/code]." -msgstr "返回索引[code]idx[/code]å¤„é¡¹ç›®çš„å›¾æ ‡ã€‚" +msgstr "返回索引 [code]idx[/code] å¤„é¡¹ç›®çš„å›¾æ ‡ã€‚" #: doc/classes/OptionButton.xml msgid "Returns the ID of the item at index [code]idx[/code]." -msgstr "返回索引[code]idx[/code]处项目的ID。" +msgstr "返回索引 [code]idx[/code] 处项目的 ID。" #: doc/classes/OptionButton.xml msgid "Returns the index of the item with the given [code]id[/code]." @@ -50156,16 +50357,17 @@ msgstr "返回所选项目的 ID,如果没有选择项目,则返回 [code]-1 msgid "" "Gets the metadata of the selected item. Metadata for items can be set using " "[method set_item_metadata]." -msgstr "获å–选定项的元数æ®ã€‚å¯ä»¥ä½¿ç”¨[method set_item_metadata]设置项的元数æ®ã€‚" +msgstr "" +"获å–选定项的元数æ®ã€‚å¯ä»¥ä½¿ç”¨ [method set_item_metadata] 设置项的元数æ®ã€‚" #: doc/classes/OptionButton.xml msgid "" "Returns [code]true[/code] if the item at index [code]idx[/code] is disabled." -msgstr "如果索引[code]idx[/code]项被ç¦ç”¨ï¼Œè¿”回 [code]true[/code]。" +msgstr "如果索引 [code]idx[/code] 项被ç¦ç”¨ï¼Œè¿”回 [code]true[/code]。" #: doc/classes/OptionButton.xml msgid "Removes the item at index [code]idx[/code]." -msgstr "移除索引[code]idx[/code]处的项目。" +msgstr "移除索引 [code]idx[/code] 处的项目。" #: doc/classes/OptionButton.xml msgid "" @@ -50234,11 +50436,11 @@ msgstr "当用户更改当å‰é¡¹æ—¶è§¦å‘ã€‚æ‰€é€‰é¡¹ç›®çš„ç´¢å¼•ä½œä¸ºå‚æ•°ä¼ #: doc/classes/OptionButton.xml msgid "Default text [Color] of the [OptionButton]." -msgstr "[OptionButton]的默认文本[Color]。" +msgstr "[OptionButton] 的默认文本 [Color]。" #: doc/classes/OptionButton.xml msgid "Text [Color] used when the [OptionButton] is disabled." -msgstr "当[OptionButton]被ç¦ç”¨æ—¶ä½¿ç”¨çš„æ–‡æœ¬[Color]。" +msgstr "当 [OptionButton] 被ç¦ç”¨æ—¶ä½¿ç”¨çš„æ–‡æœ¬ [Color]。" #: doc/classes/OptionButton.xml msgid "" @@ -50246,16 +50448,16 @@ msgid "" "normal text color of the button. Disabled, hovered, and pressed states take " "precedence over this color." msgstr "" -"当[OptionButton]获得焦点时使用的文本[Color]ã€‚åªæ›¿æ¢æŒ‰é’®çš„æ£å¸¸æ–‡æœ¬é¢œè‰²ã€‚ç¦ç”¨ã€" -"悬åœå’ŒæŒ‰ä¸‹çжæ€ä¼˜å…ˆäºŽè¿™ä¸ªé¢œè‰²ã€‚" +"当 [OptionButton] 获得焦点时使用的文本 [Color]ã€‚åªæ›¿æ¢æŒ‰é’®çš„æ£å¸¸æ–‡æœ¬é¢œè‰²ã€‚ç¦" +"ç”¨ã€æ‚¬åœå’ŒæŒ‰ä¸‹çжæ€ä¼˜å…ˆäºŽè¿™ä¸ªé¢œè‰²ã€‚" #: doc/classes/OptionButton.xml msgid "Text [Color] used when the [OptionButton] is being hovered." -msgstr "å½“é¼ æ ‡æ‚¬åœ[OptionButton]时使用的文本[Color]。" +msgstr "å½“é¼ æ ‡æ‚¬åœ [OptionButton] 时使用的文本 [Color]。" #: doc/classes/OptionButton.xml msgid "Text [Color] used when the [OptionButton] is being pressed." -msgstr "当[OptionButton]被按下时使用的文本[Color]。" +msgstr "当 [OptionButton] 被按下时使用的文本 [Color]。" #: doc/classes/OptionButton.xml msgid "" @@ -50264,11 +50466,11 @@ msgstr "ç®å¤´å›¾æ ‡å’ŒæŒ‰é’®çš„å³è¾¹ç¼˜ä¹‹é—´çš„æ°´å¹³ç©ºé—´ã€‚" #: doc/classes/OptionButton.xml msgid "The horizontal space between [OptionButton]'s icon and text." -msgstr "[OptionButton]å›¾æ ‡ä¸Žæ–‡æœ¬ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" +msgstr "[OptionButton] å›¾æ ‡ä¸Žæ–‡æœ¬ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" #: doc/classes/OptionButton.xml msgid "[Font] of the [OptionButton]'s text." -msgstr "[OptionButton]的文本的[Font]。" +msgstr "[OptionButton] 的文本的 [Font]。" #: doc/classes/OptionButton.xml msgid "The arrow icon to be drawn on the right end of the button." @@ -50276,7 +50478,7 @@ msgstr "è¦ç»˜åˆ¶åœ¨æŒ‰é’®å³ä¾§çš„ç®å¤´å›¾æ ‡ã€‚" #: doc/classes/OptionButton.xml msgid "[StyleBox] used when the [OptionButton] is disabled." -msgstr "当[OptionButton]被ç¦ç”¨æ—¶ä½¿ç”¨çš„[StyleBox]。" +msgstr "当 [OptionButton] 被ç¦ç”¨æ—¶ä½¿ç”¨çš„ [StyleBox]。" #: doc/classes/OptionButton.xml msgid "" @@ -50284,20 +50486,20 @@ msgid "" "current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " "visual effect." msgstr "" -"当[OptionButton]被èšç„¦æ—¶ä½¿ç”¨çš„[StyleBox]。它显示在当å‰çš„[StyleBox]上,所以使" -"用[StyleBoxEmpty]å°†åªæ˜¯ç¦ç”¨ç„¦ç‚¹çš„视觉效果。" +"当 [OptionButton] 被èšç„¦æ—¶ä½¿ç”¨çš„ [StyleBox]。它显示在当å‰çš„ [StyleBox] 上,所" +"以使用 [StyleBoxEmpty] å°†åªæ˜¯ç¦ç”¨ç„¦ç‚¹çš„视觉效果。" #: doc/classes/OptionButton.xml msgid "[StyleBox] used when the [OptionButton] is being hovered." -msgstr "当[OptionButton]è¢«é¼ æ ‡æ‚¬åœæ—¶ä½¿ç”¨çš„[StyleBox]。" +msgstr "当 [OptionButton] è¢«é¼ æ ‡æ‚¬åœæ—¶ä½¿ç”¨çš„ [StyleBox]。" #: doc/classes/OptionButton.xml msgid "Default [StyleBox] for the [OptionButton]." -msgstr "[OptionButton]的默认[StyleBox]。" +msgstr "[OptionButton] 的默认 [StyleBox]。" #: doc/classes/OptionButton.xml msgid "[StyleBox] used when the [OptionButton] is being pressed." -msgstr "当按下[OptionButton]时使用的[StyleBox]。" +msgstr "当按下 [OptionButton] 时使用的 [StyleBox]。" #: doc/classes/OS.xml msgid "Operating System functions." @@ -50310,8 +50512,8 @@ msgid "" "driver, date and time, timers, environment variables, execution of binaries, " "command line, etc." msgstr "" -"æ“作系统的功能。OS 包装了与主机æ“作系统通信的最常è§åŠŸèƒ½ï¼Œå¦‚å‰ªè´´æ¿ã€è§†é¢‘驱动程" -"åºã€æ—¥æœŸå’Œæ—¶é—´ã€è®¡æ—¶å™¨ã€çŽ¯å¢ƒå˜é‡ã€äºŒè¿›åˆ¶æ–‡ä»¶çš„æ‰§è¡Œã€å‘½ä»¤è¡Œç‰ã€‚" +"æ“作系统的功能。OS å°è£…了与主机æ“作系统通信的最常è§åŠŸèƒ½ï¼Œå¦‚å‰ªè´´æ¿ã€è§†é¢‘驱动ã€" +"日期和时间ã€è®¡æ—¶å™¨ã€çŽ¯å¢ƒå˜é‡ã€äºŒè¿›åˆ¶æ–‡ä»¶çš„æ‰§è¡Œã€å‘½ä»¤è¡Œç‰ã€‚" #: doc/classes/OS.xml msgid "" @@ -50339,8 +50541,8 @@ msgid "" "Shuts down system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" -"å…³é—系统MIDI驱动程åºã€‚\n" -"[b]注æ„:[/b]该方法åªåœ¨Linux, macOSå’ŒWindows上实现。" +"å…³é—系统 MIDI 驱动程åºã€‚\n" +"[b]注æ„:[/b]该方法åªåœ¨ Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -50374,18 +50576,18 @@ msgid "" "the project if it is currently running (since the project is an independent " "child process)." msgstr "" -"将当å‰çº¿ç¨‹çš„æ‰§è¡Œå»¶è¿Ÿ [code]msec[/code] 毫秒。 [code]msec[/code] 必须大于或ç‰" -"于 [code]0[/code]。å¦åˆ™ï¼Œ [method delay_msec] 将䏿‰§è¡Œä»»ä½•æ“作并打å°é”™è¯¯æ¶ˆ" +"将当å‰çº¿ç¨‹çš„æ‰§è¡Œå»¶è¿Ÿ [code]msec[/code] 毫秒。[code]msec[/code] 必须大于或ç‰" +"于 [code]0[/code]。å¦åˆ™ï¼Œ[method delay_msec] 将䏿‰§è¡Œä»»ä½•æ“作并打å°é”™è¯¯æ¶ˆ" "æ¯ã€‚\n" -"[b]注:[/b] [method delay_msec]是一ç§[i]阻塞[/i]å»¶è¿Ÿä»£ç æ‰§è¡Œçš„æ–¹å¼ã€‚è¦ä»¥éžé˜»" -"塞方å¼å»¶è¿Ÿä»£ç 执行,请å‚阅 [method SceneTree.create_timer]。使用 [method " +"[b]注æ„:[/b][method delay_msec] 是一ç§[i]阻塞[/i]å»¶è¿Ÿä»£ç æ‰§è¡Œçš„æ–¹å¼ã€‚è¦ä»¥éž" +"阻塞方å¼å»¶è¿Ÿä»£ç 执行,请å‚阅 [method SceneTree.create_timer]。使用 [method " "SceneTree.create_timer] 生æˆå°†å»¶è¿Ÿä½äºŽ [code]yield[/code] 下方的代ç 的执行," "而ä¸ä¼šå½±å“项目的其余部分(或编辑器,例如 [EditorPlugin] å’Œ " "[EditorScript])。\n" -"[b]注æ„:[/b]当在主线程上调用[method delay_msec]时,它会冻结项目并阻æ¢å®ƒé‡æ–°" -"绘制和注册输入,直到延迟结æŸã€‚当使用 [method delay_msec] 作为 [EditorPlugin] " -"或 [EditorScript] 的一部分时,它会冻结编辑器但ä¸ä¼šå†»ç»“当剿£åœ¨è¿è¡Œçš„é¡¹ç›®ï¼ˆå› " -"为项目是一个独立的å进程)。" +"[b]注æ„:[/b]当在主线程上调用 [method delay_msec] 时,它会冻结项目并阻æ¢å®ƒé‡" +"新绘制和注册输入,直到延迟结æŸã€‚当使用 [method delay_msec] 作为 " +"[EditorPlugin] 或 [EditorScript] 的一部分时,它会冻结编辑器但ä¸ä¼šå†»ç»“当剿£åœ¨" +"è¿è¡Œçš„é¡¹ç›®ï¼ˆå› ä¸ºé¡¹ç›®æ˜¯ä¸€ä¸ªç‹¬ç«‹çš„å进程)。" #: doc/classes/OS.xml msgid "" @@ -50406,26 +50608,26 @@ msgid "" "the project if it is currently running (since the project is an independent " "child process)." msgstr "" -"将当å‰çº¿ç¨‹çš„æ‰§è¡Œå»¶è¿Ÿ [code]usec[/code] 微秒。 [code]usec[/code] 必须大于或ç‰" -"于 [code]0[/code]。å¦åˆ™ï¼Œ [method delay_usec] 将什么也ä¸åšï¼Œå¹¶ä¼šæ‰“å°é”™è¯¯æ¶ˆ" +"将当å‰çº¿ç¨‹çš„æ‰§è¡Œå»¶è¿Ÿ [code]usec[/code] 微秒。[code]usec[/code] 必须大于或ç‰" +"于 [code]0[/code]。å¦åˆ™ï¼Œ[method delay_usec] 将什么也ä¸åšï¼Œå¹¶ä¼šæ‰“å°é”™è¯¯æ¶ˆ" "æ¯ã€‚\n" -"[b]注:[/b] [method delay_usec]是一ç§[i]阻塞[/i]å»¶è¿Ÿä»£ç æ‰§è¡Œçš„æ–¹å¼ã€‚è¦ä»¥éžé˜»" -"塞方å¼å»¶è¿Ÿä»£ç 执行,请å‚阅 [method SceneTree.create_timer]。使用 [method " +"[b]注æ„:[/b][method delay_usec] 是一ç§[i]阻塞[/i]å»¶è¿Ÿä»£ç æ‰§è¡Œçš„æ–¹å¼ã€‚è¦ä»¥éž" +"阻塞方å¼å»¶è¿Ÿä»£ç 执行,请å‚阅 [method SceneTree.create_timer]。使用 [method " "SceneTree.create_timer] 生æˆå°†å»¶è¿Ÿä½äºŽ [code]yield[/code] 下方的代ç 的执行," "而ä¸ä¼šå½±å“项目的其余部分(或编辑器,例如 [EditorPlugin] å’Œ " "[EditorScript])。\n" -"[b]注æ„:[/b]当在主线程上调用[method delay_usec]时,它会冻结项目并阻æ¢å®ƒé‡ç»˜" -"和注册输入,直到延迟结æŸã€‚当使用 [method delay_usec] 作为 [EditorPlugin] 或 " -"[EditorScript] 的一部分时,它会冻结编辑器但ä¸ä¼šå†»ç»“当剿£åœ¨è¿è¡Œçš„é¡¹ç›®ï¼ˆå› ä¸ºé¡¹" -"目是一个独立的å进程)。" +"[b]注æ„:[/b]当在主线程上调用 [method delay_usec] 时,它会冻结项目并阻æ¢å®ƒé‡" +"绘和注册输入,直到延迟结æŸã€‚当使用 [method delay_usec] 作为 [EditorPlugin] " +"或 [EditorScript] 的一部分时,它会冻结编辑器但ä¸ä¼šå†»ç»“当剿£åœ¨è¿è¡Œçš„é¡¹ç›®ï¼ˆå› " +"为项目是一个独立的å进程)。" #: doc/classes/OS.xml msgid "" "Dumps the memory allocation ringlist to a file (only works in debug).\n" "Entry format per line: \"Address - Size - Description\"." msgstr "" -"将内å˜åˆ†é…ringlist转储到一个文件(仅在调试ä¸å·¥ä½œ)。\n" -"æ¯è¡Œè¾“å…¥æ ¼å¼:“地å€-大å°-æè¿°â€ã€‚" +"将内å˜åˆ†é… ringlist 转储到一个文件(仅在调试时å¯ç”¨ï¼‰ã€‚\n" +"æ¯è¡Œæ¡ç›®æ ¼å¼ï¼šâ€œåœ°å€ - å¤§å° - æè¿°â€ã€‚" #: doc/classes/OS.xml msgid "" @@ -50433,8 +50635,8 @@ msgid "" "Entry format per line: \"Resource Type : Resource Location\".\n" "At the end of the file is a statistic of all used Resource Types." msgstr "" -"将所有使用的资æºè½¬å‚¨åˆ°æ–‡ä»¶ä¸(ä»…åœ¨è°ƒè¯•ä¸æœ‰æ•ˆ)。\n" -"æ¯è¡Œè¾“å…¥æ ¼å¼:“资æºç±»åž‹:资æºä½ç½®â€ã€‚\n" +"将所有使用的资æºè½¬å‚¨åˆ°æ–‡ä»¶ä¸ï¼ˆä»…åœ¨è°ƒè¯•ä¸æœ‰æ•ˆï¼‰ã€‚\n" +"æ¯è¡Œè¾“å…¥æ ¼å¼ï¼šâ€œèµ„æºç±»åž‹:资æºä½ç½®â€ã€‚\n" "在文件的末尾是所有已使用资æºç±»åž‹çš„统计数æ®ã€‚" #: doc/classes/OS.xml @@ -50566,6 +50768,7 @@ msgstr "" "径。" #: doc/classes/OS.xml +#, fuzzy msgid "" "Returns the command-line arguments passed to the engine.\n" "Command-line arguments can be written in any form, including both [code]--" @@ -50584,6 +50787,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" "è¿”å›žä¼ é€’ç»™å¼•æ“Žçš„å‘½ä»¤è¡Œå‚æ•°ã€‚\n" @@ -50733,8 +50940,8 @@ msgid "" "been granted to the Android application.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" -"é€šè¿‡è¿™ä¸ªå‡½æ•°ï¼Œä½ å¯ä»¥èŽ·å¾—å·²ç»æŽˆäºˆAndroid应用程åºçš„å±é™©æƒé™åˆ—表。\n" -"[b]注æ„:[/b]这个方法在Android上实现。" +"é€šè¿‡è¿™ä¸ªå‡½æ•°ï¼Œä½ å¯ä»¥èŽ·å¾—å·²ç»æŽˆäºˆ Android 应用程åºçš„å±é™©æƒé™åˆ—表。\n" +"[b]注æ„:[/b]这个方法在 Android 上实现。" #: doc/classes/OS.xml msgid "" @@ -50747,7 +50954,7 @@ msgstr "" "返回相对于组åˆå—符串ä¸çš„å—符的 IME å…‰æ ‡ä½ç½®ï¼ˆå—符串的当å‰ç¼–辑部分)。\n" "[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] 被å‘é€åˆ°åº”用程åºä»¥é€šçŸ¥å®ƒ IME " "å…‰æ ‡ä½ç½®çš„å˜åŒ–。\n" -"[b]注:[/b]æ¤æ–¹æ³•在macOS上实现。" +"[b]注æ„:[/b]æ¤æ–¹æ³•在 macOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -50759,7 +50966,7 @@ msgstr "" "返回 IME ä¸é—´ç»„åˆå—符串。\n" "[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] 被å‘é€åˆ°åº”用程åºä»¥é€šçŸ¥å®ƒå¯¹ " "IME 组åˆå—符串的更改。\n" -"[b]注:[/b]æ¤æ–¹æ³•在macOS上实现。" +"[b]注æ„:[/b]æ¤æ–¹æ³•在 macOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -50771,7 +50978,7 @@ msgid "" "[code]\"QWERTY\"[/code] on unsupported platforms." msgstr "" "将当剿‹‰ä¸é”®ç›˜å˜ä½“作为å—符串返回。\n" -"å¯èƒ½çš„返回值是: [code]\"QWERTY\"[/code], [code]\"AZERTY\"[/code], " +"å¯èƒ½çš„返回值是:[code]\"QWERTY\"[/code],[code]\"AZERTY\"[/code]," "[code]\"QZERTY\"[/code],[code]\"DVORAK\"[/code],[code]\"NEO\"[/code]," "[code]\"COLEMAK\"[/code]或[code]\"错误ERROR\"[/code]。\n" "[b]注æ„:[/b]æ¤æ–¹æ³•在 Linuxã€macOS å’Œ Windows 上实现。在ä¸å—支æŒçš„å¹³å°ä¸Šè¿”回 " @@ -50803,8 +51010,8 @@ msgstr "" "ISO_15924]æ–‡å—代ç [/url]ï¼Œé¦–å—æ¯å¤§å†™ã€‚\n" "[code]COUNTRY[/code] - å¯é€‰ï¼Œ2 个或 3 ä¸ªå—æ¯ [url=https://en.wikipedia.org/" "wiki/ISO_3166-1]国家地区代ç [/url],大写。\n" -"[code]VARIANT[/code] - å¯é€‰ï¼Œè¯è¨€å˜ä½“,地区和排åºé¡ºåºã€‚ å˜ä½“å¯ä»¥æœ‰ä»»æ„æ•°é‡çš„" -"带下划线的关键å—。\n" +"[code]VARIANT[/code] - å¯é€‰ï¼Œè¯è¨€å˜ä½“,地区和排åºé¡ºåºã€‚å˜ä½“å¯ä»¥æœ‰ä»»æ„æ•°é‡çš„带" +"下划线的关键å—。\n" "[code]extra[/code] - å¯é€‰ï¼Œåˆ†å·åˆ†éš”çš„é™„åŠ å…³é”®å—列表。货å¸ã€æ—¥åŽ†ã€æŽ’åºé¡ºåºå’Œç¼–" "å·ç³»ç»Ÿä¿¡æ¯ã€‚" @@ -50819,8 +51026,8 @@ msgid "" "about country code or variants. For example, for a French Canadian user with " "[code]fr_CA[/code] locale, this would return [code]fr[/code]." msgstr "" -"将主机æ“作系统区域设置的 2 或 3 ä¸ªå—æ¯ [url=https://en.wikipedia.org/wiki/" -"List_of_ISO_639-1_codes]è¯è¨€ä»£ç [/url] 作为å—符串返回,该å—符串应在所有平å°ä¸Š" +"将主机æ“作系统区域设置的 2 或 3 ä¸ªå—æ¯çš„[url=https://en.wikipedia.org/wiki/" +"List_of_ISO_639-1_codes]è¯è¨€ä»£ç [/url]作为å—符串返回,该å—符串应在所有平å°ä¸Š" "ä¿æŒä¸€è‡´ã€‚这相当于æå– [method get_locale] å—符串的 [code]language[/code] 部" "分。\n" "当您ä¸éœ€è¦æœ‰å…³å›½å®¶/åœ°åŒºä»£ç æˆ–å˜ä½“çš„é™„åŠ ä¿¡æ¯æ—¶ï¼Œè¿™å¯ç”¨äºŽå°†å®Œå…¨æŒ‡å®šçš„区域设置å—" @@ -50853,10 +51060,9 @@ msgid "" "[code]\"Server\"[/code], [code]\"Windows\"[/code], [code]\"UWP\"[/code], " "[code]\"X11\"[/code]." msgstr "" -"返回主机æ“作系统的å称。å¯èƒ½çš„值有: [code]\"Android\"[/code], " -"[code]\"iOS\"[/code], [code]\"HTML5\"[/code], [code]\"OSX\"[/code], " -"[code]\"Server\"[/code], [code]\"Windows\"[/code], [code]\"UWP\"[/code], " -"[code]\"X11\"[/code]." +"返回主机æ“作系统的å称。å¯èƒ½çš„值有:[code]\"Android\"[/code], [code]\"iOS\"[/" +"code], [code]\"HTML5\"[/code], [code]\"OSX\"[/code], [code]\"Server\"[/" +"code], [code]\"Windows\"[/code], [code]\"UWP\"[/code], [code]\"X11\"[/code]." #: doc/classes/OS.xml msgid "" @@ -50864,8 +51070,8 @@ msgid "" "[b]Note:[/b] This method is implemented on Linux and Windows (other OSs will " "soon be supported)." msgstr "" -"返回内部结构指针,以便在GDNativeæ’ä»¶ä¸ä½¿ç”¨ã€‚\n" -"[b]注æ„:[/b]æ¤æ–¹æ³•在Linuxå’ŒWindows上实现(其他æ“作系统将很快被支æŒï¼‰ã€‚" +"返回内部结构指针,以便在 GDNative æ’ä»¶ä¸ä½¿ç”¨ã€‚\n" +"[b]注æ„:[/b]这个方法在 Linux å’Œ Windows 上实现(其他æ“作系统将很快被支æŒï¼‰ã€‚" #: doc/classes/OS.xml msgid "" @@ -50875,7 +51081,7 @@ msgid "" msgstr "" "以百分比形å¼è¿”回设备ä¸å‰©ä½™çš„ç”µæ± ç”µé‡ã€‚如果电æºçŠ¶æ€æœªçŸ¥ï¼Œåˆ™è¿”回 [code]-1[/" "code]。\n" -"[b]注æ„:[/b]该方法在Linuxã€macOSå’ŒWindows上实现。" +"[b]注æ„:[/b]这个方法在 Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -50885,7 +51091,7 @@ msgid "" msgstr "" "è¿”å›žè®¾å¤‡è€—å°½ç”µæ± å‰å‡ 秒钟内剩余时间的估计值。如果电æºçŠ¶æ€æœªçŸ¥ï¼Œåˆ™è¿”回 " "[code]-1[/code]。\n" -"[b]注æ„:[/b]æ¤æ–¹æ³•在 Linuxã€macOS å’Œ Windows 上实现。" +"[b]注æ„:[/b]这个方法在 Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -50893,8 +51099,8 @@ msgid "" "[enum PowerState] constants.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" -"è¿”å›žè®¾å¤‡å…³äºŽç”µæ± å’Œç”µæºçš„当å‰çжæ€ã€‚请å‚阅 [enum PowerState] 常é‡ã€‚\n" -"[b]注æ„:[/b]该方法在Linuxã€macOSå’ŒWindows上实现。" +"è¿”å›žè®¾å¤‡å…³äºŽç”µæ± å’Œç”µæºçš„当å‰çжæ€ã€‚è§ [enum PowerState] 常é‡ã€‚\n" +"[b]注æ„:[/b]这个方法在 Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -50903,7 +51109,7 @@ msgid "" "Windows." msgstr "" "返回项目的进程 ID。\n" -"[b]注æ„:[/b]æ¤æ–¹æ³•在Androidã€iOSã€Linuxã€macOSå’ŒWindows上实现。" +"[b]注æ„:[/b]这个方法在 Androidã€iOSã€Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -50990,8 +51196,8 @@ msgid "" "[b]Note:[/b] This method is implemented on macOS." msgstr "" "返回最大的å±å¹•的缩放。\n" -"[b]注:[/b] 在macOS上,如果系统ä¸è‡³å°‘有一个hiDPI(Retina)å±å¹•,则返回值为" -"[code]2.0[/code],其他情况为[code]1.0[/code]。\n" +"[b]注æ„:[/b]在 macOS 上,如果系统ä¸è‡³å°‘有一个 hiDPI(Retina)å±å¹•,则返回值" +"为 [code]2.0[/code],其他情况为 [code]1.0[/code]。\n" "[b]注æ„:[/b]æ¤æ–¹æ³•仅在macOS上实现。" #: doc/classes/OS.xml @@ -51118,7 +51324,7 @@ msgid "" "application restarts." msgstr "" "返回当å‰çº¿ç¨‹çš„ ID。这å¯ç”¨äºŽæ—¥å¿—,以简化多线程应用程åºçš„调试。\n" -"[b]注:[/b] 线程 ID 䏿˜¯ç¡®å®šçš„,也许会在应用程åºé‡æ–°å¯åŠ¨æ—¶è¢«é‡å¤ä½¿ç”¨ã€‚" +"[b]注æ„:[/b] 线程 ID 䏿˜¯ç¡®å®šçš„,也许会在应用程åºé‡æ–°å¯åŠ¨æ—¶è¢«é‡å¤ä½¿ç”¨ã€‚" #: doc/classes/OS.xml msgid "" @@ -51147,7 +51353,7 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the current time zone as a dictionary with the keys: bias and name." -msgstr "以å—典形å¼è¿”å›žå½“å‰æ—¶åŒºï¼Œé”®ä¸ºï¼šbiaså’Œname。" +msgstr "以å—典形å¼è¿”å›žå½“å‰æ—¶åŒºï¼Œé”®ä¸ºï¼šbias å’Œ name。" #: doc/classes/OS.xml msgid "" @@ -51179,8 +51385,8 @@ msgid "" "decrease)." msgstr "" "以秒为å•ä½è¿”回当å‰çš„ UNIX 纪元时间戳。\n" -"[b]é‡è¦ï¼š[/b] 这是用户å¯ä»¥æ‰‹åŠ¨è®¾ç½®çš„ç³»ç»Ÿæ—¶é’Ÿã€‚ [b]永远ä¸è¦ä½¿ç”¨[/b]è¿™ç§æ–¹æ³•è¿›" -"è¡Œç²¾ç¡®çš„æ—¶é—´è®¡ç®—ï¼Œå› ä¸ºå®ƒçš„ç»“æžœä¹Ÿä¼šå—到æ“作系统的自动调整。 [b]始终使用[/b] " +"[b]é‡è¦ï¼š[/b]这是用户å¯ä»¥æ‰‹åŠ¨è®¾ç½®çš„ç³»ç»Ÿæ—¶é’Ÿã€‚[b]永远ä¸è¦ä½¿ç”¨[/b]è¿™ç§æ–¹æ³•进行" +"ç²¾ç¡®çš„æ—¶é—´è®¡ç®—ï¼Œå› ä¸ºå®ƒçš„ç»“æžœä¹Ÿä¼šå—到æ“作系统的自动调整。[b]始终使用[/b] " "[method get_ticks_usec] 或 [method get_ticks_msec] è¿›è¡Œç²¾ç¡®æ—¶é—´è®¡ç®—ï¼Œå› ä¸ºå®ƒä»¬" "ä¿è¯æ˜¯å•è°ƒçš„ï¼ˆå³æ°¸ä¸å‡å°‘)。" @@ -51275,7 +51481,7 @@ msgid "" msgstr "" "å°†å¸¦æœ‰æ–‡æœ¬â€œæ ‡ç¾â€çš„æ–°é¡¹ç›®æ·»åŠ åˆ°å…¨å±€èœå•。使用“_dockâ€èœå•å°†é¡¹ç›®æ·»åŠ åˆ° macOS åœ" "é æ å›¾æ ‡èœå•。\n" -"[b]注:[/b]æ¤æ–¹æ³•在macOS上实现。" +"[b]注æ„:[/b]æ¤æ–¹æ³•在 macOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51478,7 +51684,7 @@ msgid "" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" "设置活动键盘布局。\n" -"[b]注:[/b]æ¤æ–¹æ³•å¯åœ¨Linuxã€macOSå’ŒWindows上实现。" +"[b]注æ„:[/b]æ¤æ–¹æ³•在 Linuxã€macOS å’Œ Windows 上实现。" #: doc/classes/OS.xml msgid "" @@ -51533,7 +51739,7 @@ msgid "" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" "如果本地视频æ£åœ¨æ’放,返回 [code]true[/code]。\n" -"[b]注æ„:[/b]这个方法åªåœ¨iOS上实现。" +"[b]注æ„:[/b]这个方法åªåœ¨ iOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51541,7 +51747,7 @@ msgid "" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" "æš‚åœæœ¬åœ°è§†é¢‘æ’æ”¾ã€‚\n" -"[b]注æ„:[/b]这个方法åªåœ¨iOS上实现。" +"[b]注æ„:[/b]这个方法åªåœ¨ iOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51550,7 +51756,7 @@ msgid "" "[b]Note:[/b] This method is only implemented on iOS." msgstr "" "以给定的音é‡ã€éŸ³é¢‘å’Œå—å¹•è½¨é“æ’放æ¥è‡ªæŒ‡å®šè·¯å¾„的本地视频。\n" -"[b]注æ„:[/b]这个方法åªåœ¨iOS上实现。" +"[b]注æ„:[/b]这个方法åªåœ¨ iOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51558,7 +51764,7 @@ msgid "" "[b]Note:[/b] This method is implemented on iOS." msgstr "" "åœæ¢æœ¬åœ°è§†é¢‘æ’æ”¾ã€‚\n" -"[b]注æ„:[/b]这个方法在iOS上实现。" +"[b]注æ„:[/b]这个方法在 iOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51566,7 +51772,7 @@ msgid "" "[b]Note:[/b] This method is implemented on iOS." msgstr "" "æ¢å¤æœ¬åœ°è§†é¢‘æ’æ”¾ã€‚\n" -"[b]注æ„:[/b]这个方法在iOS上实现。" +"[b]注æ„:[/b]这个方法在 iOS 上实现。" #: doc/classes/OS.xml msgid "" @@ -51821,7 +52027,7 @@ msgid "" "each frame, and attempts to compensate for random variation. This will only " "operate on systems where V-Sync is active." msgstr "" -"如果 [code]true[/code],引擎会过滤æ¯å¸§ä¹‹é—´æµ‹é‡çš„æ—¶é—´å¢žé‡ï¼Œå¹¶å°è¯•è¡¥å¿éšæœºå˜" +"如果为 [code]true[/code],引擎会过滤æ¯å¸§ä¹‹é—´æµ‹é‡çš„æ—¶é—´å¢žé‡ï¼Œå¹¶å°è¯•è¡¥å¿éšæœºå˜" "化。这åªä¼šåœ¨åž‚ç›´åŒæ¥å¤„于活动状æ€çš„系统上è¿è¡Œã€‚" #: doc/classes/OS.xml @@ -51908,8 +52114,8 @@ msgid "" "framerate halving (e.g. from 60 FPS to 30 FPS) when using it.\n" "[b]Note:[/b] This property is only implemented on Windows." msgstr "" -"为 [code]true[/code] 时,如果 [code]vsync_enabled[/code] 为真,当æ“作系统的窗" -"å£åˆæˆå™¨è¢«å¯ç”¨å¹¶ä¸”游æˆå¤„äºŽçª—å£æ¨¡å¼æ—¶ï¼Œå°†ä½¿ç”¨è¯¥åˆæˆå™¨è¿›è¡Œåž‚ç›´åŒæ¥ã€‚\n" +"如果为 [code]true[/code] 且 [code]vsync_enabled[/code] 为真,当æ“作系统的窗å£" +"åˆæˆå™¨è¢«å¯ç”¨å¹¶ä¸”游æˆå¤„äºŽçª—å£æ¨¡å¼æ—¶ï¼Œå°†ä½¿ç”¨è¯¥åˆæˆå™¨è¿›è¡Œåž‚ç›´åŒæ¥ã€‚\n" "[b]注æ„:[/b]æ¤é€‰é¡¹æ˜¯å®žéªŒæ€§çš„,旨在缓解æŸäº›ç”¨æˆ·é‡åˆ°çš„å¡é¡¿ã€‚但是,一些用户在使" "用时é‡åˆ°äº† Vsync 帧率å‡åŠï¼Œä¾‹å¦‚从 60 FPS 到 30 FPS。\n" "[b]注æ„:[/b]æ¤å±žæ€§ä»…在 Windows 上实现。" @@ -52117,10 +52323,10 @@ msgid "" "- Linux: [code]X11::GLXContext[/code]\n" "- MacOS: [code]NSOpenGLContext*[/code] (not yet implemented)" msgstr "" -"OpenGL上下文:\n" +"OpenGL 上下文:\n" "- Windows:[code]HGLRC[/code]\n" "- Linux:[code]X11::GLXContext[/code]\n" -"- MacOS:[code]NSOpenGLContext*[/code] (尚未实现)" +"- MacOS:[code]NSOpenGLContext*[/code](尚未实现)" #: doc/classes/OS.xml msgid "Landscape screen orientation." @@ -52208,7 +52414,7 @@ msgstr "[PackedDataContainer] 的引用版本。" #: doc/classes/PackedScene.xml msgid "An abstraction of a serialized scene." -msgstr "一个åºåˆ—化场景的抽象。" +msgstr "对åºåˆ—化场景的抽象。" #: doc/classes/PackedScene.xml msgid "" @@ -52390,9 +52596,9 @@ msgid "" "without having to encode data as low-level bytes or having to worry about " "network ordering." msgstr "" -"PacketPeer是基于数æ®åŒ…çš„å议(如UDP)的抽象和基类。它æä¾›äº†ä¸€ä¸ªAPI,用于å‘é€" -"å’ŒæŽ¥æ”¶ä½œä¸ºåŽŸå§‹æ•°æ®æˆ–å˜é‡çš„æ•°æ®åŒ…。这使得通过åè®®ä¼ è¾“æ•°æ®å˜å¾—很容易,而ä¸å¿…å°†" -"æ•°æ®ç¼–ç 为低级å—节或担心网络顺åºã€‚" +"PacketPeer 是基于数æ®åŒ…çš„å议(如 UDP)的抽象和基类。它æä¾›äº†ä¸€ä¸ª API,用于å‘" +"é€å’ŒæŽ¥æ”¶ä½œä¸ºåŽŸå§‹æ•°æ®æˆ–å˜é‡çš„æ•°æ®åŒ…。这使得通过åè®®ä¼ è¾“æ•°æ®å˜å¾—很容易,而ä¸å¿…" +"将数æ®ç¼–ç 为低级å—节或担心网络顺åºã€‚" #: doc/classes/PacketPeer.xml msgid "Returns the number of packets currently available in the ring-buffer." @@ -52407,7 +52613,8 @@ msgid "" "Returns the error state of the last packet received (via [method get_packet] " "and [method get_var])." msgstr "" -"è¿”å›žæœ€åŽæŽ¥æ”¶çš„æ•°æ®åŒ…的错误状æ€ï¼ˆé€šè¿‡[method get_packet]å’Œ[method get_var])。" +"è¿”å›žæœ€åŽæŽ¥æ”¶çš„æ•°æ®åŒ…的错误状æ€ï¼ˆé€šè¿‡ [method get_packet] å’Œ [method " +"get_var])。" #: doc/classes/PacketPeer.xml msgid "" @@ -52417,8 +52624,8 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" -"获å–一个å˜é‡ã€‚如果[code]allow_objects[/code] 或 [member " -"allow_object_decoding]为 [code]true[/code],则å…许对对象进行解ç 。\n" +"获å–一个å˜é‡ã€‚如果 [code]allow_objects[/code] 或 [member " +"allow_object_decoding] 为 [code]true[/code],则å…许对对象进行解ç 。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化对象å¯èƒ½åŒ…嫿‰§è¡Œçš„代ç 。如果åºåˆ—化对象æ¥è‡ªä¸å—信任的æºï¼Œ" "请ä¸è¦ä½¿ç”¨æ¤é€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼Œå¦‚è¿œç¨‹ä»£ç æ‰§è¡Œã€‚" @@ -52432,8 +52639,8 @@ msgid "" "allow_object_decoding]) is [code]true[/code], encoding objects is allowed " "(and can potentially include code)." msgstr "" -"å°†[Variant]作为数æ®åŒ…å‘é€ã€‚如果[code]full_objects[/code] 或 [member " -"allow_object_decoding]为 [code]true[/code],则å…许对对象进行编ç (并且å¯èƒ½åŒ…" +"å°† [Variant] 作为数æ®åŒ…å‘é€ã€‚如果 [code]full_objects[/code] 或 [member " +"allow_object_decoding] 为 [code]true[/code],则å…许对对象进行编ç (并且å¯èƒ½åŒ…" "å«ä»£ç )。" #: doc/classes/PacketPeer.xml @@ -52448,7 +52655,7 @@ msgid "" msgstr "" "[i]已废弃。[/i] ä½ åº”è¯¥ä½¿ç”¨ [code]get_var[/code] å’Œ [code]put_var[/code] 傿•°" "æ¥ä»£æ›¿å®ƒã€‚\n" -"如果[code]true[/code],多人游æˆAPIå°†å…许在RPC/RSETs期间对对象进行编ç 和解" +"如果为 [code]true[/code],多人游æˆAPIå°†å…许在RPC/RSETs期间对对象进行编ç 和解" "ç 。\n" "[b]è¦å‘Šï¼š[/b]ååºåˆ—化的对象å¯èƒ½åŒ…å«ä¼šè¢«æ‰§è¡Œçš„代ç 。如果åºåˆ—化的对象æ¥è‡ªä¸å—ä¿¡" "ä»»çš„æ¥æºï¼Œè¯·ä¸è¦ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼Œä»¥é¿å…潜在的安全å¨èƒï¼Œå¦‚è¿œç¨‹ä»£ç æ‰§è¡Œã€‚" @@ -52463,14 +52670,15 @@ msgid "" "[code]encode_buffer_max_size[/code], the method will error out with " "[constant ERR_OUT_OF_MEMORY]." msgstr "" -"ç¼–ç [Variant]æ—¶å…许的最大缓冲区大å°ã€‚æé«˜æ¤å€¼ä»¥æ”¯æŒæ›´å¤§çš„内å˜åˆ†é…。\n" -"[method put_var]æ–¹æ³•åœ¨å †æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次" -"方,以匹é…[Variant]的大å°ã€‚如果[Variant]大于 [code]encode_buffer_max_size[/" -"code],则该方法将以[constant ERR_OUT_OF_MEMORY]出错。" +"ç¼–ç [Variant] æ—¶å…许的最大缓冲区大å°ã€‚æé«˜æ¤å€¼ä»¥æ”¯æŒæ›´å¤§çš„内å˜åˆ†é…。\n" +"[method put_var] æ–¹æ³•åœ¨å †æ ˆä¸Šåˆ†é…内å˜ï¼Œä½¿ç”¨çš„缓冲区将自动增长到最接近的二次" +"æ–¹ï¼Œä»¥åŒ¹é… [Variant] 的大å°ã€‚如果 [Variant] 大于 " +"[code]encode_buffer_max_size[/code],则该方法将以 [constant " +"ERR_OUT_OF_MEMORY] 出错。" #: doc/classes/PacketPeerDTLS.xml msgid "DTLS packet peer." -msgstr "DTLSæ•°æ®åŒ…客户端。" +msgstr "DTLS æ•°æ®åŒ…客户端。" #: doc/classes/PacketPeerDTLS.xml msgid "" @@ -52497,19 +52705,19 @@ msgid "" "argument. You can specify a custom [X509Certificate] to use for validation " "via the [code]valid_certificate[/code] argument." msgstr "" -"使用必须连接的底层[PacketPeerUDP](è§[method PacketPeerUDP.connect_to_host])" -"连接一个[code]peer[/code],开始DTLSæ¡æ‰‹è¿‡ç¨‹ã€‚如果[code]validate_certs[/code]" -"是[code]true[/code],[PacketPeerDTLS]将验è¯è¿œç¨‹å¯¹ç‰ä½“æäº¤çš„è¯ä¹¦å¹¶ä¸Ž" -"[code]for_hostname[/code]傿•°åŒ¹é…ã€‚ä½ å¯ä»¥é€šè¿‡[code]valid_certificate[/code]å‚" -"数指定一个自定义的[X509Certificate]æ¥è¿›è¡ŒéªŒè¯ã€‚" +"使用必须连接的底层 [PacketPeerUDP]ï¼ˆè§ [method PacketPeerUDP." +"connect_to_host])连接一个 [code]peer[/code],开始 DTLS æ¡æ‰‹è¿‡ç¨‹ã€‚如果 " +"[code]validate_certs[/code] 为 [code]true[/code],[PacketPeerDTLS] 将验è¯è¿œç¨‹" +"对ç‰ä½“æäº¤çš„è¯ä¹¦å¹¶ä¸Ž [code]for_hostname[/code] 傿•°åŒ¹é…ã€‚ä½ å¯ä»¥é€šè¿‡ " +"[code]valid_certificate[/code] 傿•°æŒ‡å®šç”¨äºŽéªŒè¯çš„自定义 [X509Certificate]。" #: doc/classes/PacketPeerDTLS.xml msgid "Disconnects this peer, terminating the DTLS session." -msgstr "æ–å¼€æ¤å¯¹ç‰ä½“的连接,终æ¢DTLS会è¯ã€‚" +msgstr "æ–å¼€æ¤å¯¹ç‰ä½“çš„è¿žæŽ¥ï¼Œç»ˆæ¢ DTLS 会è¯ã€‚" #: doc/classes/PacketPeerDTLS.xml doc/classes/StreamPeerSSL.xml msgid "Returns the status of the connection. See [enum Status] for values." -msgstr "返回连接的状æ€ã€‚有关值,请å‚阅[enum Status]。" +msgstr "返回连接的状æ€ã€‚å–å€¼è§ [enum Status]。" #: doc/classes/PacketPeerDTLS.xml msgid "" @@ -52520,13 +52728,13 @@ msgstr "" #: doc/classes/PacketPeerDTLS.xml msgid "A status representing a [PacketPeerDTLS] that is disconnected." -msgstr "表示已æ–开连接的[PacketPeerDTLS]的状æ€ã€‚" +msgstr "表示已æ–开连接的 [PacketPeerDTLS] 的状æ€ã€‚" #: doc/classes/PacketPeerDTLS.xml msgid "" "A status representing a [PacketPeerDTLS] that is currently performing the " "handshake with a remote peer." -msgstr "è¡¨ç¤ºå½“å‰æ£åœ¨ä¸Žè¿œç¨‹å¯¹ç‰æ–¹è¿›è¡Œæ¡æ‰‹çš„[PacketPeerDTLS]的状æ€ã€‚" +msgstr "è¡¨ç¤ºå½“å‰æ£åœ¨ä¸Žè¿œç¨‹å¯¹ç‰æ–¹è¿›è¡Œæ¡æ‰‹çš„ [PacketPeerDTLS] 的状æ€ã€‚" #: doc/classes/PacketPeerDTLS.xml msgid "" @@ -52545,7 +52753,7 @@ msgstr "显示主机æä¾›çš„DTLSè¯ä¹¦åŸŸä¸Žè¯·æ±‚验è¯çš„域ä¸åŒ¹é…çš„é”™è¯ #: doc/classes/PacketPeerStream.xml msgid "Wrapper to use a PacketPeer over a StreamPeer." -msgstr "在StreamPeer上使用PacketPeer的包装器。" +msgstr "在 StreamPeer 上使用 PacketPeer 的包装器。" #: doc/classes/PacketPeerStream.xml msgid "" @@ -52554,9 +52762,9 @@ msgid "" "implements a custom protocol over the StreamPeer, so the user should not " "read or write to the wrapped StreamPeer directly." msgstr "" -"PacketStreamPeeræä¾›äº†ä¸€ä¸ªåŒ…装器,用于在æµä¸Šä½¿ç”¨æ•°æ®åŒ…工作。这å…许在" -"StreamPeer上使用基于数æ®åŒ…的代ç 。PacketPeerStream在StreamPeer上实现了一个自" -"定义的å议,所以用户ä¸åº”该直接读或写到被包装的StreamPeer上。" +"PacketStreamPeer æä¾›äº†ä¸€ä¸ªåŒ…装器,用于在æµä¸Šä½¿ç”¨æ•°æ®åŒ…工作。这å…许在 " +"StreamPeer 上使用基于数æ®åŒ…的代ç 。PacketPeerStream 在 StreamPeer 上实现了一" +"个自定义的å议,所以用户ä¸åº”该直接读或写到被包装的 StreamPeer 上。" #: doc/classes/PacketPeerStream.xml msgid "The wrapped [StreamPeer] object." @@ -52573,7 +52781,7 @@ msgstr "UDPæ•°æ®åŒ…对ç‰ä½“。å¯ä»¥ç”¨æ¥å‘é€åŽŸå§‹çš„UDPæ•°æ®åŒ…以åŠ[Va #: doc/classes/PacketPeerUDP.xml msgid "Closes the UDP socket the [PacketPeerUDP] is currently listening on." -msgstr "å…³é—[PacketPeerUDP]当剿£åœ¨ä¾¦å¬çš„UDP套接å—。" +msgstr "å…³é— [PacketPeerUDP] 当剿£åœ¨ä¾¦å¬çš„ UDP 套接å—。" #: doc/classes/PacketPeerUDP.xml msgid "" @@ -52590,41 +52798,41 @@ msgid "" "technique like SSL or DTLS if you feel like your application is transferring " "sensitive information." msgstr "" -"è°ƒç”¨æ¤æ–¹æ³•å°†UDP对ç‰ä½“连接到给定的[code]host[/code]/[code]port[/code]对。UDP实" -"é™…ä¸Šæ˜¯æ— è¿žæŽ¥çš„ï¼Œæ‰€ä»¥è¿™ä¸ªé€‰é¡¹åªæ„å‘³ç€æ¥è‡ªä¸åŒåœ°å€çš„入包被自动丢弃,而出包总是" -"被å‘é€åˆ°è¿žæŽ¥çš„地å€(ä¸å…许将æ¥è°ƒç”¨[method set_dest_address])。该方法ä¸å‘远程对" -"ç‰ä½“å‘é€ä»»ä½•æ•°æ®ï¼Œè¦å‘逿•°æ®ï¼Œè¯·ä½¿ç”¨[method PacketPeer.put_var]或[method " -"PacketPeer.put_packet]。å‚è§[UDPServer]。\n" -"[b]注æ„:[/b]连接到远程对ç‰ä½“å¹¶ä¸èƒ½é˜²æ¢IPæ¬ºéª—ç‰æ¶æ„攻击。如果您觉得您的应用程" -"åºæ£åœ¨ä¼ è¾“æ•æ„Ÿä¿¡æ¯ï¼Œå¯ä»¥è€ƒè™‘使用SSL或DTLSç‰åŠ å¯†æŠ€æœ¯ã€‚" +"è°ƒç”¨æ¤æ–¹æ³•å°† UDP 对ç‰ä½“连接到给定的 [code]host[/code]/[code]port[/code] 对。" +"UDP å®žé™…ä¸Šæ˜¯æ— è¿žæŽ¥çš„ï¼Œæ‰€ä»¥è¿™ä¸ªé€‰é¡¹åªæ„å‘³ç€æ¥è‡ªä¸åŒåœ°å€çš„入包被自动丢弃,而出" +"包总是被å‘é€åˆ°è¿žæŽ¥çš„地å€ï¼ˆä¸å…许将æ¥è°ƒç”¨ [method set_dest_address])。该方法" +"ä¸å‘远程对ç‰ä½“å‘é€ä»»ä½•æ•°æ®ï¼Œè¦å‘逿•°æ®ï¼Œè¯·ä½¿ç”¨ [method PacketPeer.put_var] " +"或 [method PacketPeer.put_packet]。å¦è¯·å‚阅 [UDPServer]。\n" +"[b]注æ„:[/b]连接到远程对ç‰ä½“å¹¶ä¸èƒ½é˜²æ¢ IP æ¬ºéª—ç‰æ¶æ„攻击。如果您觉得您的应用" +"ç¨‹åºæ£åœ¨ä¼ è¾“æ•æ„Ÿä¿¡æ¯ï¼Œå¯ä»¥è€ƒè™‘使用 SSL 或 DTL Sç‰åŠ å¯†æŠ€æœ¯ã€‚" #: doc/classes/PacketPeerUDP.xml msgid "" "Returns the IP of the remote peer that sent the last packet(that was " "received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." msgstr "" -"返回å‘逿œ€åŽä¸€ä¸ªæ•°æ®åŒ…(通过[method PacketPeer.get_packet]或[method " -"PacketPeer.get_var]接收)的远程对ç‰ä½“çš„IP。" +"返回å‘逿œ€åŽä¸€ä¸ªæ•°æ®åŒ…(通过 [method PacketPeer.get_packet] 或 [method " +"PacketPeer.get_var] 接收)的远程对ç‰ä½“çš„ IP。" #: doc/classes/PacketPeerUDP.xml msgid "" "Returns the port of the remote peer that sent the last packet(that was " "received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." msgstr "" -"返回å‘逿œ€åŽä¸€ä¸ªæ•°æ®åŒ…(通过[method PacketPeer.get_packet]或[method " -"PacketPeer.get_var]æŽ¥æ”¶ï¼‰çš„è¿œç¨‹å¯¹ç‰æ–¹çš„端å£ã€‚" +"返回å‘逿œ€åŽä¸€ä¸ªæ•°æ®åŒ…(通过 [method PacketPeer.get_packet] 或 [method " +"PacketPeer.get_var] æŽ¥æ”¶ï¼‰çš„è¿œç¨‹å¯¹ç‰æ–¹çš„端å£ã€‚" #: doc/classes/PacketPeerUDP.xml msgid "" "Returns [code]true[/code] if the UDP socket is open and has been connected " "to a remote address. See [method connect_to_host]." msgstr "" -"如果UDP套接å—已打开并已连接到远程地å€ï¼Œåˆ™è¿”回 [code]true[/code]。请å‚阅" +"如果 UDP 套接å—已打开并已连接到远程地å€ï¼Œåˆ™è¿”回 [code]true[/code]ã€‚è§ " "[method connect_to_host]。" #: doc/classes/PacketPeerUDP.xml msgid "Returns whether this [PacketPeerUDP] is listening." -msgstr "返回这个[PacketPeerUDP]æ˜¯å¦æ£åœ¨ç›‘å¬ã€‚" +msgstr "返回这个 [PacketPeerUDP] æ˜¯å¦æ£åœ¨ç›‘å¬ã€‚" #: doc/classes/PacketPeerUDP.xml msgid "" @@ -52647,8 +52855,8 @@ msgid "" "Removes the interface identified by [code]interface_name[/code] from the " "multicast group specified by [code]multicast_address[/code]." msgstr "" -"从[code]multicast_address[/code]指定的组æ’组ä¸ç§»é™¤[code]interface_name[/code]" -"æ ‡è¯†çš„æŽ¥å£ã€‚" +"从 [code]multicast_address[/code] 指定的组æ’组ä¸ç§»é™¤ [code]interface_name[/" +"code] æ ‡è¯†çš„æŽ¥å£ã€‚" #: doc/classes/PacketPeerUDP.xml msgid "" @@ -52664,15 +52872,16 @@ msgid "" "only listen on the interface with that addresses (or fail if no interface " "with the given address exists)." msgstr "" -"使这个[PacketPeerUDP]在与[code]bind_address[/code]绑定的[code]端å£[/code]上监" -"å¬ï¼Œç¼“冲区大å°ä¸º[code]recv_buf_size[/code]。\n" -"如果[code]bind_address[/code]被设置为[code]\"*\"[/code](默认),对ç‰ä½“将监å¬" -"所有å¯ç”¨åœ°å€ï¼ˆåŒ…括IPv4å’ŒIPv6)。\n" -"如果[code]bind_address[/code]被设置为[code]\"0.0.0.0\"[/code](对于IPv4)或" -"[code]\":\"[/code](对于IPv6),对ç‰ä½“å°†ç›‘å¬æ‰€æœ‰ç¬¦åˆè¯¥IP类型的å¯ç”¨åœ°å€ã€‚\n" -"如果[code]bind_address[/code]被设置为任何有效的地å€ï¼ˆä¾‹å¦‚" -"[code]\"192.168.1.101\"[/code],[code]\":1\"[/code]ç‰ï¼‰ï¼Œå¯¹ç‰ä½“å°†åªç›‘å¬å…·æœ‰è¯¥" -"地å€çš„æŽ¥å£ï¼ˆå¦‚æžœä¸å˜åœ¨å…·æœ‰è¯¥åœ°å€çš„æŽ¥å£ï¼Œåˆ™å¤±è´¥ï¼‰ã€‚" +"使这个 [PacketPeerUDP] 在与 [code]bind_address[/code] ç»‘å®šçš„ç«¯å£ [code]port[/" +"code] 上监å¬ï¼Œç¼“冲区大å°ä¸º [code]recv_buf_size[/code]。\n" +"如果 [code]bind_address[/code] 被设置为 [code]\"*\"[/code](默认),对ç‰ä½“å°†" +"ç›‘å¬æ‰€æœ‰å¯ç”¨åœ°å€ï¼ˆåŒ…括 IPv4 å’Œ IPv6)。\n" +"如果 [code]bind_address[/code] 被设置为 [code]\"0.0.0.0\"[/code](对于 IPv4)" +"或 [code]\":\"[/code](对于 IPv6),对ç‰ä½“å°†ç›‘å¬æ‰€æœ‰ç¬¦åˆè¯¥ IP 类型的å¯ç”¨åœ°" +"å€ã€‚\n" +"如果 [code]bind_address[/code] 被设置为任何有效的地å€ï¼ˆä¾‹å¦‚ " +"[code]\"192.168.1.101\"[/code]ã€[code]\":1\"[/code] ç‰ï¼‰ï¼Œå¯¹ç‰ä½“å°†åªç›‘å¬å…·æœ‰" +"该地å€çš„æŽ¥å£ï¼ˆå¦‚æžœä¸å˜åœ¨å…·æœ‰è¯¥åœ°å€çš„æŽ¥å£ï¼Œåˆ™å¤±è´¥ï¼‰ã€‚" #: doc/classes/PacketPeerUDP.xml msgid "" @@ -52718,15 +52927,15 @@ msgid "" " return\n" "[/codeblock]" msgstr "" -"ç‰å¾…æ•°æ®åŒ…到达侦å¬ç«¯å£ã€‚å‚è§[method listen]。\n" -"[b]注æ„:[/b][method wait]一旦被调用就ä¸èƒ½è¢«ä¸æ–。这å¯ä»¥é€šè¿‡å…许å¦ä¸€æ–¹å‘é€ä¸€" +"ç‰å¾…æ•°æ®åŒ…到达侦å¬ç«¯å£ã€‚è§ [method listen]。\n" +"[b]注æ„:[/b][method wait] 一旦被调用就ä¸èƒ½è¢«ä¸æ–。这å¯ä»¥é€šè¿‡å…许å¦ä¸€æ–¹å‘é€ä¸€" "个特定的“death pillâ€åŒ…æ¥è§£å†³ï¼Œå¦‚下所示:\n" "[codeblock]\n" -"# Server\n" +"# æœåС噍\n" "socket.set_dest_address(\"127.0.0.1\", 789)\n" "socket.put_packet(\"Time to stop\".to_ascii())\n" "\n" -"# Client\n" +"# 客户的\n" "while socket.wait() == OK:\n" " var data = socket.get_packet().get_string_from_ascii()\n" " if data == \"Time to stop\":\n" @@ -52735,15 +52944,15 @@ msgstr "" #: doc/classes/Panel.xml msgid "Provides an opaque background for [Control] children." -msgstr "为[Control]åæŽ§ä»¶æä¾›ä¸é€æ˜Žçš„背景。" +msgstr "为 [Control] åæŽ§ä»¶æä¾›ä¸é€æ˜Žçš„背景。" #: doc/classes/Panel.xml msgid "" "Panel is a [Control] that displays an opaque background. It's commonly used " "as a parent and container for other types of [Control] nodes." msgstr "" -"颿¿æ˜¯ä¸€ä¸ªæ˜¾ç¤ºä¸é€æ˜ŽèƒŒæ™¯çš„[Control]。它通常用作其他类型的[Control]节点的父节" -"点和容器。" +"颿¿æ˜¯ä¸€ä¸ªæ˜¾ç¤ºä¸é€æ˜ŽèƒŒæ™¯çš„ [Control]。它通常用作其他类型的 [Control] 节点的父" +"节点和容器。" #: doc/classes/Panel.xml msgid "2D Finite State Machine Demo" @@ -52884,25 +53093,25 @@ msgid "" "will not be mirrored." msgstr "" "视差图层的[Texture]镜åƒã€‚ç”¨äºŽåˆ›å»ºæ— é™æ»šåŠ¨çš„èƒŒæ™¯ã€‚å¦‚æžœä¸€ä¸ªè½´è¢«è®¾ç½®ä¸º[code]0[/" -"code], [Texture]å°†ä¸ä¼šè¢«é•œåƒã€‚" +"code],[Texture]å°†ä¸ä¼šè¢«é•œåƒã€‚" #: doc/classes/ParallaxLayer.xml msgid "" "The ParallaxLayer's offset relative to the parent ParallaxBackground's " "[member ParallaxBackground.scroll_offset]." msgstr "" -"ParallaxLayer相对于父ParallaxBackgroundçš„åç§»é‡[member ParallaxBackground." -"scroll_offset]。" +"ParallaxLayer 相对于父 ParallaxBackground çš„åç§»é‡ [member " +"ParallaxBackground.scroll_offset]。" #: doc/classes/ParallaxLayer.xml msgid "" "Multiplies the ParallaxLayer's motion. If an axis is set to [code]0[/code], " "it will not scroll." -msgstr "å¤åˆ¶è§†å·®å›¾å±‚çš„è¿åŠ¨ã€‚å¦‚æžœä¸€ä¸ªè½´è¢«è®¾ç½®ä¸º[code]0[/code],它将ä¸ä¼šæ»šåŠ¨ã€‚" +msgstr "å¤åˆ¶è§†å·®å›¾å±‚çš„è¿åŠ¨ã€‚å¦‚æžœä¸€ä¸ªè½´è¢«è®¾ç½®ä¸º [code]0[/code],它将ä¸ä¼šæ»šåŠ¨ã€‚" #: doc/classes/Particles.xml msgid "GPU-based 3D particle emitter." -msgstr "基于GPUçš„3Dç²’åå‘射器。" +msgstr "基于 GPU çš„ 3D ç²’åå‘射器。" #: doc/classes/Particles.xml msgid "" @@ -53034,8 +53243,8 @@ msgid "" "when particles are off-screen." msgstr "" "[AABB] 确定节点的区域,该区域需è¦åœ¨å±å¹•上å¯è§æ‰èƒ½ä½¿ç²’å系统处于活动状æ€ã€‚\n" -"如果在节点进入/退出å±å¹•æ—¶ç²’åçªç„¶å‡ºçް/消失,则增大框。 [AABB] å¯ä»¥é€šè¿‡ä»£ç 或" -"使用 [b]Particles → Generate AABB[/b] 编辑器工具生æˆã€‚\n" +"如果在节点进入/退出å±å¹•æ—¶ç²’åçªç„¶å‡ºçް/消失,则增大框。[AABB] å¯ä»¥é€šè¿‡ä»£ç 或使" +"用 [b]Particles → Generate AABB[/b] 编辑器工具生æˆã€‚\n" "[b]注æ„:[/b]如果使用ä¸çš„ [ParticlesMaterial] é…置为投射阴影,您å¯èƒ½éœ€è¦æ”¾å¤§" "æ¤ AABB 以确ä¿åœ¨ç²’åç¦»å±æ—¶æ›´æ–°é˜´å½±ã€‚" @@ -53072,7 +53281,7 @@ msgid "" "[b]Note:[/b] Unlike [CPUParticles2D], [Particles2D] currently ignore the " "texture region defined in [AtlasTexture]s." msgstr "" -"用于创建å„ç§ç²’å系统和效果的 2D ç²’å节点。 [Particles2D] 具有一个å‘射器,å¯ä»¥" +"用于创建å„ç§ç²’å系统和效果的 2D ç²’å节点。[Particles2D] 具有一个å‘射器,å¯ä»¥" "以给定的速率生æˆä¸€å®šæ•°é‡çš„ç²’å。\n" "使用 [code]process_material[/code] å±žæ€§æ·»åŠ [ParticlesMaterial] 以é…置粒å外" "观和行为。或者,您å¯ä»¥æ·»åŠ å°†åº”ç”¨äºŽæ‰€æœ‰ç²’åçš„ [ShaderMaterial]。\n" @@ -53110,7 +53319,7 @@ msgid "" "→ Generate Visibility Rect[/b] editor tool." msgstr "" "[Rect2] 确定节点的区域,该区域需è¦åœ¨å±å¹•上å¯è§æ‰èƒ½ä½¿ç²’å系统处于活动状æ€ã€‚\n" -"如果当节点进入/退出å±å¹•æ—¶ç²’åçªç„¶å‡ºçް/消失,则增长矩形。 [Rect2] å¯ä»¥é€šè¿‡ä»£ç " +"如果当节点进入/退出å±å¹•æ—¶ç²’åçªç„¶å‡ºçް/消失,则增长矩形。[Rect2] å¯ä»¥é€šè¿‡ä»£ç " "或使用 [b]Particles → Generate Visibility Rect[/b] 编辑器工具生æˆã€‚" #: doc/classes/ParticlesMaterial.xml @@ -53132,14 +53341,14 @@ msgid "" "ratio of [code]0.4[/code] would scale the original property between " "[code]0.4-1.0[/code] of its original value." msgstr "" -"ParticlesMaterial定义了粒å的属性和行为。它å¯ç”¨äºŽ[Particles]å’Œ[Particles2D]å‘" -"射器节点的[code]process_material[/code]ä¸ã€‚\n" -"这个æè´¨çš„一些属性在å‘射时被应用到æ¯ä¸ªç²’å上,而其他属性å¯ä»¥åº”用" -"[CurveTexture]æ¥åœ¨ç²’åçš„ç”Ÿå‘½å‘¨æœŸä¸æ”¹å˜æ•°å€¼ã€‚\n" -"å½“éšæœºæ€§æ¯”率被应用到一个属性时,用æ¥ä»¥ä¸€ä¸ªéšæœºé‡æ¥æ‰©å±•è¯¥å±žæ€§ã€‚éšæœºçŽ‡ç”¨æ¥åœ¨" -"[code]1.0[/code]和一个å°äºŽ1çš„éšæœºæ•°ä¹‹é—´æ’å€¼ï¼Œç»“æžœä¹˜ä»¥å±žæ€§ï¼Œå¾—åˆ°éšæœºçš„属性。例" -"如,一个[code]0.4[/code]çš„éšæœºæ¯”率将在[code]0.4-1.0[/code]之间缩放原始属性的" -"原值。" +"ParticlesMaterial 定义了粒å的属性和行为。它å¯ç”¨äºŽ [Particles] å’Œ " +"[Particles2D] å‘射器节点的 [code]process_material[/code]ä¸ã€‚\n" +"这个æè´¨çš„一些属性在å‘射时被应用到æ¯ä¸ªç²’å上,而其他属性å¯ä»¥åº”用 " +"[CurveTexture] æ¥åœ¨ç²’åçš„ç”Ÿå‘½å‘¨æœŸä¸æ”¹å˜æ•°å€¼ã€‚\n" +"å½“éšæœºæ€§æ¯”率被应用到一个属性时,用æ¥ä»¥ä¸€ä¸ªéšæœºé‡æ¥æ‰©å±•è¯¥å±žæ€§ã€‚éšæœºçŽ‡ç”¨æ¥åœ¨ " +"[code]1.0[/code] 和一个å°äºŽ 1 çš„éšæœºæ•°ä¹‹é—´æ’å€¼ï¼Œç»“æžœä¹˜ä»¥å±žæ€§ï¼Œå¾—åˆ°éšæœºçš„属" +"性。例如,一个 [code]0.4[/code] çš„éšæœºæ¯”率将在 [code]0.4-1.0[/code] 之间缩放" +"原始属性的原值。" #: doc/classes/ParticlesMaterial.xml msgid "Returns [code]true[/code] if the specified flag is enabled." @@ -53157,7 +53366,7 @@ msgstr "è¿”å›žæŒ‡å®šå‚æ•°ä½¿ç”¨çš„ [Texture]。" msgid "" "If [code]true[/code], enables the specified flag. See [enum Flags] for " "options." -msgstr "如果[code]true[/code],å¯ç”¨æŒ‡å®šçš„Flag。选项请å‚阅[enum Flags]。" +msgstr "如果为 [code]true[/code],å¯ç”¨æŒ‡å®šçš„æ ‡å¿—。选项请å‚阅 [enum Flags]。" #: doc/classes/ParticlesMaterial.xml msgid "Sets the specified [enum Parameter]." @@ -53202,15 +53411,15 @@ msgstr "" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's angular velocity will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的角速度将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的角速度将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's animation offset will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的动画å移将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的动画å移将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's animation speed will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的动画速度将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的动画速度将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" @@ -53318,12 +53527,12 @@ msgstr "沿 Y è½´çš„ [member spread] é‡ã€‚" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's hue will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的色调将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的色调将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" "Each particle's linear acceleration will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’åçš„çº¿æ€§åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’åçš„çº¿æ€§åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" @@ -53337,37 +53546,37 @@ msgstr "" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's orbital velocity will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的轨é“速度将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的轨é“速度将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" "Each particle's radial acceleration will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的径å‘åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的径å‘åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "Each particle's scale will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的比例将沿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的比例将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" "Each particle's tangential acceleration will vary along this [CurveTexture]." -msgstr "æ¯ä¸ªç²’å的切å‘åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "æ¯ä¸ªç²’å的切å‘åŠ é€Ÿåº¦å°†æ²¿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "Trail particles' color will vary along this [GradientTexture]." -msgstr "轨迹粒å的颜色将沿ç€è¿™ä¸ª[GradientTexture]å˜åŒ–。" +msgstr "轨迹粒å的颜色将沿ç€è¿™ä¸ª [GradientTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" "Emitter will emit [code]amount[/code] divided by [code]trail_divisor[/code] " "particles. The remaining particles will be used as trail(s)." msgstr "" -"å‘射器将å‘å°„[code]amount[/code]除以[code]trail_visor[/code]的粒å。剩下的粒å" -"将作为轨迹使用。" +"å‘射器将å‘å°„ [code]amount[/code] 除以 [code]trail_visor[/code] 的粒å。剩下的" +"ç²’å将作为轨迹使用。" #: doc/classes/ParticlesMaterial.xml msgid "Trail particles' size will vary along this [CurveTexture]." -msgstr "轨迹粒å的大å°å°†æ²¿ç€è¿™ä¸ª[CurveTexture]å˜åŒ–。" +msgstr "轨迹粒å的大å°å°†æ²¿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" #: doc/classes/ParticlesMaterial.xml msgid "" @@ -53483,8 +53692,8 @@ msgid "" "point on the [member emission_point_texture]. Particle color will be " "modulated by [member emission_color_texture]." msgstr "" -"ç²’å将在[member emission_point_texture]ä¸Šéšæœºé‡‡æ ·ç‚¹æ‰€å†³å®šçš„ä½ç½®å‘射。粒å颜色" -"将由[member emission_color_texture]调节。" +"ç²’å将在 [member emission_point_texture] ä¸Šéšæœºé‡‡æ ·ç‚¹æ‰€å†³å®šçš„ä½ç½®å‘射。粒å颜" +"色将由 [member emission_color_texture] 调节。" #: doc/classes/ParticlesMaterial.xml msgid "" @@ -53493,9 +53702,9 @@ msgid "" "will be set based on [member emission_normal_texture]. Particle color will " "be modulated by [member emission_color_texture]." msgstr "" -"ç²’å将在[member emission_point_texture]ä¸Šéšæœºé‡‡æ ·ç‚¹æ‰€å†³å®šçš„ä½ç½®å‘射。粒å速度" -"和旋转将基于[member emission_normal_texture]进行设置。粒å颜色将由[member " -"emission_color_texture]调节。" +"ç²’å将在 [member emission_point_texture] ä¸Šéšæœºé‡‡æ ·ç‚¹æ‰€å†³å®šçš„ä½ç½®å‘射。粒å速" +"度和旋转将基于 [member emission_normal_texture] 进行设置。粒å颜色将由 " +"[member emission_color_texture] 调节。" #: doc/classes/Path.xml msgid "Contains a [Curve3D] path for [PathFollow] nodes to follow." @@ -53516,15 +53725,15 @@ msgstr "" #: doc/classes/Path.xml msgid "A [Curve3D] describing the path." -msgstr "A [Curve3D]æè¿°è·¯å¾„。" +msgstr "æè¿°è·¯å¾„çš„ [Curve3D]。" #: doc/classes/Path.xml msgid "Emitted when the [member curve] changes." -msgstr "当[member curve]æ”¹å˜æ—¶è§¦å‘。" +msgstr "当 [member curve] æ”¹å˜æ—¶è§¦å‘。" #: doc/classes/Path2D.xml msgid "Contains a [Curve2D] path for [PathFollow2D] nodes to follow." -msgstr "包å«ä¸€ä¸ª[Curve2D]路径,供[PathFollow2D]节点éµå¾ªã€‚" +msgstr "包å«ä¸€ä¸ª [Curve2D] 路径,供 [PathFollow2D] 节点éµå¾ªã€‚" #: doc/classes/Path2D.xml msgid "" @@ -53534,14 +53743,14 @@ msgid "" "of [PathFollow2D]). As such, the curve should usually start with a zero " "vector ([code](0, 0)[/code])." msgstr "" -"å¯ä»¥è®©[PathFollow2D]å节点沿ç€[Curve2D]移动。有关用法的更多信æ¯ï¼Œè¯·å‚阅" +"å¯ä»¥è®© [PathFollow2D] åèŠ‚ç‚¹æ²¿ç€ [Curve2D] 移动。有关用法的更多信æ¯ï¼Œè¯·å‚阅 " "[PathFollow2D]。\n" -"[b]注:[/b]该路径被认为是相对于移动的节点([PathFollow2D]çš„å节点)ã€‚å› æ¤ï¼Œæ›²çº¿" -"通常以零å‘é‡([code](0,0)[/code])开始。" +"[b]注æ„:[/b]该路径被认为是相对于移动的节点([PathFollow2D] çš„åèŠ‚ç‚¹ï¼‰ã€‚å› " +"æ¤ï¼Œæ›²çº¿é€šå¸¸ä»¥é›¶å‘é‡ï¼ˆ[code](0,0)[/code])开始。" #: doc/classes/Path2D.xml msgid "A [Curve2D] describing the path." -msgstr "A [Curve2D]æè¿°è·¯å¾„。" +msgstr "æè¿°è·¯å¾„çš„ [Curve2D]。" #: doc/classes/PathFollow.xml msgid "Point sampler for a [Path]." @@ -53574,10 +53783,11 @@ msgid "" "points and increase memory consumption, or make a cubic interpolation " "between two points at the cost of (slightly) slower calculations." msgstr "" -"如果[code]true[/code],两个缓å˜çš„点之间的ä½ç½®æ˜¯ç«‹æ–¹æ’值,å¦åˆ™æ˜¯çº¿æ€§æ’值。\n" -"沿ç€[Path]çš„[Curve3D]的点在使用å‰è¢«é¢„è®¡ç®—ï¼Œä»¥åŠ å¿«è®¡ç®—ã€‚è€ŒåŽï¼Œåœ¨ç¡®å®šåç§»é‡ä¸Šçš„" -"点会在两个相邻的缓å˜ç‚¹ä¹‹é—´è¿›è¡Œæ’值计算。如果曲线有急转弯,这å¯èƒ½ä¼šäº§ç”Ÿä¸€ä¸ªé—®" -"é¢˜ï¼Œå› ä¸ºç¼“å˜çš„点å¯èƒ½ä¸ä¼šè¶³å¤Ÿç´§è·Ÿæ›²çº¿ã€‚\n" +"如果为 [code]true[/code],两个缓å˜çš„点之间的ä½ç½®æ˜¯ç«‹æ–¹æ’值,å¦åˆ™æ˜¯çº¿æ€§æ’" +"值。\n" +"æ²¿ç€ [Path] çš„ [Curve3D] 的点在使用å‰è¢«é¢„è®¡ç®—ï¼Œä»¥åŠ å¿«è®¡ç®—ã€‚è€ŒåŽï¼Œåœ¨ç¡®å®šåç§»é‡" +"上的点会在两个相邻的缓å˜ç‚¹ä¹‹é—´è¿›è¡Œæ’值计算。如果曲线有急转弯,这å¯èƒ½ä¼šäº§ç”Ÿä¸€" +"ä¸ªé—®é¢˜ï¼Œå› ä¸ºç¼“å˜çš„点å¯èƒ½ä¸ä¼šè¶³å¤Ÿç´§è·Ÿæ›²çº¿ã€‚\n" "è¿™ä¸ªé—®é¢˜æœ‰ä¸¤ä¸ªç”æ¡ˆï¼šè¦ä¹ˆå¢žåŠ ç¼“å˜ç‚¹çš„æ•°é‡ï¼Œä»£ä»·æ˜¯å¢žåŠ å†…å˜æ¶ˆè€—ï¼›è¦ä¹ˆåœ¨ä¸¤ä¸ªç‚¹ä¹‹" "间进行立方æ’å€¼ï¼Œä»£ä»·æ˜¯è®¡ç®—é€Ÿåº¦ç¨æ…¢ã€‚" @@ -53590,8 +53800,8 @@ msgid "" "If [code]true[/code], any offset outside the path's length will wrap around, " "instead of stopping at the ends. Use it for cyclic paths." msgstr "" -"如果[code]true[/code],路径长度以外的任何åç§»éƒ½å°†çŽ¯ç»•ï¼Œè€Œä¸æ˜¯åœ¨ç»“æŸæ—¶åœæ¢ã€‚对" -"于循环路径使用它。" +"如果为 [code]true[/code],路径长度以外的任何åç§»éƒ½å°†çŽ¯ç»•ï¼Œè€Œä¸æ˜¯åœ¨ç»“æŸæ—¶åœ" +"æ¢ã€‚对于循环路径使用它。" #: doc/classes/PathFollow.xml msgid "" @@ -53606,7 +53816,7 @@ msgid "" "Allows or forbids rotation on one or more axes, depending on the [enum " "RotationMode] constants being used." msgstr "" -"å…è®¸æˆ–ç¦æ¢åœ¨ä¸€ä¸ªæˆ–多个轴上旋转,这å–决于使用的[enum RotationMode]常é‡ã€‚" +"å…è®¸æˆ–ç¦æ¢åœ¨ä¸€ä¸ªæˆ–多个轴上旋转,这å–决于使用的 [enum RotationMode] 常é‡ã€‚" #: doc/classes/PathFollow.xml msgid "" @@ -53615,8 +53825,8 @@ msgid "" "the path, as the offset supplied is multiplied internally by the path's " "length." msgstr "" -"到第一个顶点的è·ç¦»ï¼Œå°†0.0作为第一个顶点,1.0作为最åŽä¸€ä¸ªé¡¶ç‚¹ã€‚è¿™åªæ˜¯è¡¨ç¤ºè·¯å¾„" -"内åç§»é‡çš„å¦ä¸€ç§æ–¹å¼ï¼Œå› 为æä¾›çš„åç§»é‡åœ¨å†…部乘以路径的长度。" +"到第一个顶点的è·ç¦»ï¼Œå°† 0.0 作为第一个顶点,1.0 作为最åŽä¸€ä¸ªé¡¶ç‚¹ã€‚è¿™åªæ˜¯è¡¨ç¤ºè·¯" +"径内åç§»é‡çš„å¦ä¸€ç§æ–¹å¼ï¼Œå› 为æä¾›çš„åç§»é‡åœ¨å†…部乘以路径的长度。" #: doc/classes/PathFollow.xml doc/classes/PathFollow2D.xml msgid "The node's offset perpendicular to the curve." @@ -53649,7 +53859,7 @@ msgstr "" #: doc/classes/PathFollow2D.xml msgid "Point sampler for a [Path2D]." -msgstr "对[Path2D]çš„ç‚¹å–æ ·çš„å–æ ·å™¨ã€‚" +msgstr "对 [Path2D] çš„ç‚¹å–æ ·çš„å–æ ·å™¨ã€‚" #: doc/classes/PathFollow2D.xml msgid "" @@ -53660,8 +53870,8 @@ msgid "" "descendant nodes will then move accordingly when setting an offset in this " "node." msgstr "" -"这个节点接å—它的父节点[Path2D],并返回其ä¸ä¸€ä¸ªç‚¹çš„åæ ‡(给定到第一个顶点的è·" -"离)。\n" +"这个节点接å—它的父节点 [Path2D] 并返回其ä¸ä¸€ä¸ªç‚¹çš„åæ ‡ï¼Œéœ€è¦ç»™å®šåˆ°ç¬¬ä¸€ä¸ªé¡¶ç‚¹" +"çš„è·ç¦»ã€‚\n" "在ä¸ç¼–ç 移动模å¼çš„æƒ…况下,它å¯ä»¥ä½¿å…¶ä»–节点éµå¾ªä¸€æ¡è·¯å¾„ã€‚å› æ¤ï¼ŒèŠ‚ç‚¹å¿…é¡»æ˜¯è¿™ä¸ª" "节点的å节点。当在该节点ä¸è®¾ç½®åç§»é‡æ—¶ï¼ŒåŽä»£èŠ‚ç‚¹å°†ç›¸åº”åœ°ç§»åŠ¨ã€‚" @@ -53711,8 +53921,9 @@ msgid "" "offset within the path, as the offset supplied is multiplied internally by " "the path's length." msgstr "" -"在0.0(第一个顶点)到1.0(最åŽä¸€ä¸ªé¡¶ç‚¹)的范围内,沿ç€è·¯å¾„çš„è·ç¦»ä¸ºä¸€ä¸ªæ•°å—。这åª" -"是表示路径内åç§»é‡çš„å¦ä¸€ç§æ–¹å¼ï¼Œå› 为æä¾›çš„åç§»é‡åœ¨å†…部乘以路径的长度。" +"在 0.0(第一个顶点)到 1.0(最åŽä¸€ä¸ªé¡¶ç‚¹ï¼‰çš„范围内,沿ç€è·¯å¾„çš„è·ç¦»ä¸ºä¸€ä¸ªæ•°" +"å—ã€‚è¿™åªæ˜¯è¡¨ç¤ºè·¯å¾„内åç§»é‡çš„å¦ä¸€ç§æ–¹å¼ï¼Œå› 为æä¾›çš„åç§»é‡åœ¨å†…部乘以路径的长" +"度。" #: doc/classes/PCKPacker.xml msgid "Creates packages that can be loaded into a running project." @@ -53731,24 +53942,24 @@ msgid "" "The above [PCKPacker] creates package [code]test.pck[/code], then adds a " "file named [code]text.txt[/code] at the root of the package." msgstr "" -"[PCKPacker]用于创建å¯ä»¥é€šè¿‡[method ProjectSettings.load_resource_pack]åŠ è½½åˆ°" -"æ£åœ¨è¿è¡Œçš„项目ä¸çš„包。\n" +"[PCKPacker] 用于创建å¯ä»¥é€šè¿‡ [method ProjectSettings.load_resource_pack] åŠ è½½" +"到æ£åœ¨è¿è¡Œçš„项目ä¸çš„包。\n" "[codeblock]\n" "var packer = PCKPacker.new()\n" "packer.pck_start(\"test.pck\")\n" "packer.add_file(\"res://text.txt\", \"text.txt\")\n" "packer.flush()\n" "[/codeblock]\n" -"上é¢çš„[PCKPacker]创建包[code]test.pck[/code],然åŽåœ¨åŒ…çš„æ ¹ç›®å½•ä¸æ·»åŠ ä¸€ä¸ªå为" -"[code]text.txt[/code]的文件。" +"上é¢çš„ [PCKPacker] 创建包 [code]test.pck[/code],然åŽåœ¨åŒ…çš„æ ¹ç›®å½•ä¸æ·»åŠ ä¸€ä¸ªå" +"为 [code]text.txt[/code] 的文件。" #: doc/classes/PCKPacker.xml msgid "" "Adds the [code]source_path[/code] file to the current PCK package at the " "[code]pck_path[/code] internal path (should start with [code]res://[/code])." msgstr "" -"å°†[code]source_path[/code]æ–‡ä»¶æ·»åŠ åˆ°å½“å‰PCK包的[code]pck_path[/code]内部路径" -"(应该以[code]res://[/code]开始)。" +"å°† [code]source_path[/code] æ–‡ä»¶æ·»åŠ åˆ°å½“å‰ PCK 包的 [code]pck_path[/code] 内" +"部路径(应该以 [code]res://[/code] 开头)。" #: doc/classes/PCKPacker.xml msgid "" @@ -53756,8 +53967,8 @@ msgid "" "flush. If [code]verbose[/code] is [code]true[/code], a list of files added " "will be printed to the console for easier debugging." msgstr "" -"自上次刷新以æ¥ï¼Œä½¿ç”¨æ‰€æœ‰[method add_file]调用写入指定的文件。如果" -"[code]verbose[/code]为 [code]true[/code]ï¼Œæ·»åŠ çš„æ–‡ä»¶åˆ—è¡¨å°†è¢«æ‰“å°åˆ°æŽ§åˆ¶å°ï¼Œä»¥" +"自上次刷新以æ¥ï¼Œä½¿ç”¨æ‰€æœ‰ [method add_file] 调用写入指定的文件。如果 " +"[code]verbose[/code] 为 [code]true[/code]ï¼Œæ·»åŠ çš„æ–‡ä»¶åˆ—è¡¨å°†è¢«æ‰“å°åˆ°æŽ§åˆ¶å°ï¼Œä»¥" "便于调试。" #: doc/classes/PCKPacker.xml @@ -53766,8 +53977,9 @@ msgid "" "code] file extension isn't added automatically, so it should be part of " "[code]pck_name[/code] (even though it's not required)." msgstr "" -"创建一个å为[code]pck_name[/code]的新PCK文件。[code].Pck[/code]文件扩展åä¸ä¼š" -"è‡ªåŠ¨æ·»åŠ ï¼Œæ‰€ä»¥å®ƒåº”è¯¥æ˜¯[code]pck_name[/code]的一部分(å³ä½¿å®ƒä¸æ˜¯å¿…需的)。" +"创建一个å为 [code]pck_name[/code] 的新 PCK 文件。ä¸ä¼šè‡ªåŠ¨æ·»åŠ [code].pck[/" +"code] 文件扩展å,所以它应该是 [code]pck_name[/code] 的一部分(å³ä½¿å®ƒä¸æ˜¯å¿…需" +"的)。" #: doc/classes/Performance.xml msgid "Exposes performance-related data." @@ -53802,10 +54014,9 @@ msgid "" "console\n" "[/codeblock]" msgstr "" -"返回一个å¯ç”¨ç›‘è§†å™¨çš„å€¼ã€‚ä½ åº”è¯¥æä¾›ä¸€ä¸ª[enum Monitor]常é‡ä½œä¸ºå‚数,åƒè¿™æ ·:\n" +"返回一个å¯ç”¨ç›‘è§†å™¨çš„å€¼ã€‚ä½ åº”è¯¥æä¾›ä¸€ä¸ª [enum Monitor] 常é‡ä½œä¸ºå‚数,åƒè¿™æ ·:\n" "[codeblock]\n" -"print(Performance.get_monitor(Performance.TIME_FPS)) # Prints the FPS to the " -"console\n" +"print(Performance.get_monitor(Performance.TIME_FPS)) # 在终端ä¸è¾“出 FPS\n" "[/codeblock]" #: doc/classes/Performance.xml @@ -53843,12 +54054,12 @@ msgid "" "Largest amount of memory the message queue buffer has used, in bytes. The " "message queue is used for deferred functions calls and notifications." msgstr "" -"消æ¯é˜Ÿåˆ—ç¼“å†²åŒºä½¿ç”¨çš„æœ€å¤§å†…å˜æ•°é‡(以å—节为å•ä½)。消æ¯é˜Ÿåˆ—用于延迟函数调用和通" -"知。" +"消æ¯é˜Ÿåˆ—ç¼“å†²åŒºä½¿ç”¨çš„æœ€å¤§å†…å˜æ•°é‡ï¼ˆä»¥å—节为å•ä½ï¼‰ã€‚消æ¯é˜Ÿåˆ—用于延迟函数调用和" +"通知。" #: doc/classes/Performance.xml msgid "Number of objects currently instanced (including nodes)." -msgstr "当å‰å®žä¾‹åŒ–的对象数é‡(包括节点)。" +msgstr "当å‰å®žä¾‹åŒ–的对象数é‡ï¼ˆåŒ…括节点)。" #: doc/classes/Performance.xml msgid "Number of resources currently used." @@ -53872,23 +54083,23 @@ msgstr "æ¯å¸§ç»˜åˆ¶3D对象的数é‡ã€‚" #: doc/classes/Performance.xml msgid "Vertices drawn per frame. 3D only." -msgstr "æ¯å¸§ç»˜åˆ¶çš„顶点数。åªåœ¨3D䏿œ‰æ•ˆã€‚" +msgstr "æ¯å¸§ç»˜åˆ¶çš„顶点数。åªåœ¨ 3D 䏿œ‰æ•ˆã€‚" #: doc/classes/Performance.xml msgid "Material changes per frame. 3D only." -msgstr "æ¯ä¸€å¸§çš„æè´¨å˜åŒ–。仅é™3D。" +msgstr "æ¯ä¸€å¸§çš„æè´¨å˜åŒ–ã€‚ä»…é™ 3D。" #: doc/classes/Performance.xml msgid "Shader changes per frame. 3D only." -msgstr "æ¯ä¸€å¸§çš„ç€è‰²å™¨å˜åŒ–。仅é™3D。" +msgstr "æ¯ä¸€å¸§çš„ç€è‰²å™¨å˜åŒ–ã€‚ä»…é™ 3D。" #: doc/classes/Performance.xml msgid "Render surface changes per frame. 3D only." -msgstr "æ¯å¸§æ¸²æŸ“é¢çš„å˜åŒ–。仅3D䏿œ‰æ•ˆã€‚" +msgstr "æ¯å¸§æ¸²æŸ“é¢çš„å˜åŒ–。仅 3D 䏿œ‰æ•ˆã€‚" #: doc/classes/Performance.xml msgid "Draw calls per frame. 3D only." -msgstr "æ¯ä¸€å¸§çš„绘图调用。仅é™3D。" +msgstr "æ¯ä¸€å¸§çš„ç»˜å›¾è°ƒç”¨ã€‚ä»…é™ 3D。" #: doc/classes/Performance.xml msgid "Items or joined items drawn per frame." @@ -53918,15 +54129,15 @@ msgstr "在 GLES2 å’Œ GLES3 渲染åŽç«¯ä¸æœªå®žçŽ°ï¼Œå§‹ç»ˆè¿”å›ž 0。" #: doc/classes/Performance.xml msgid "Number of active [RigidBody2D] nodes in the game." -msgstr "游æˆä¸æ´»è·ƒçš„[RigidBody2D]节点数é‡ã€‚" +msgstr "游æˆä¸æ´»è·ƒçš„ [RigidBody2D] 节点数é‡ã€‚" #: doc/classes/Performance.xml msgid "Number of collision pairs in the 2D physics engine." -msgstr "2D物ç†å¼•擎ä¸çš„碰撞对数é‡ã€‚" +msgstr "2D 物ç†å¼•擎ä¸çš„碰撞对数é‡ã€‚" #: doc/classes/Performance.xml msgid "Number of islands in the 2D physics engine." -msgstr "2D物ç†å¼•擎ä¸çš„岛屿数é‡ã€‚" +msgstr "2D 物ç†å¼•擎ä¸çš„岛屿数é‡ã€‚" #: doc/classes/Performance.xml msgid "Number of active [RigidBody] and [VehicleBody] nodes in the game." @@ -53934,19 +54145,19 @@ msgstr "游æˆä¸æ´»åŠ¨çš„ [RigidBody] å’Œ [VehicleBody] 节点的数é‡ã€‚" #: doc/classes/Performance.xml msgid "Number of collision pairs in the 3D physics engine." -msgstr "3D物ç†å¼•擎ä¸çš„碰撞对数é‡ã€‚" +msgstr "3D 物ç†å¼•擎ä¸çš„碰撞对数é‡ã€‚" #: doc/classes/Performance.xml msgid "Number of islands in the 3D physics engine." -msgstr "3D物ç†å¼•擎ä¸çš„岛屿数é‡ã€‚" +msgstr "3D 物ç†å¼•擎ä¸çš„岛屿数é‡ã€‚" #: doc/classes/Performance.xml msgid "Output latency of the [AudioServer]." -msgstr "[AudioServer]的输出延迟。" +msgstr "[AudioServer] 的输出延迟。" #: doc/classes/Performance.xml msgid "Represents the size of the [enum Monitor] enum." -msgstr "表示[enum Monitor] enum的大å°ã€‚" +msgstr "表示 [enum Monitor] 枚举的大å°ã€‚" #: doc/classes/PHashTranslation.xml msgid "Optimized translation." @@ -53956,13 +54167,13 @@ msgstr "优化的翻译。" msgid "" "Optimized translation. Uses real-time compressed translations, which results " "in very small dictionaries." -msgstr "优化翻译。使用实时压缩翻译,从而生æˆéžå¸¸å°çš„è¯å…¸ã€‚" +msgstr "优化的翻译。使用实时压缩翻译,从而生æˆéžå¸¸å°çš„è¯å…¸ã€‚" #: doc/classes/PHashTranslation.xml msgid "" "Generates and sets an optimized translation from the given [Translation] " "resource." -msgstr "从给定的[Translation]资æºç”Ÿæˆå¹¶è®¾ç½®ä¼˜åŒ–的翻译。" +msgstr "从给定的 [Translation] 资æºç”Ÿæˆå¹¶è®¾ç½®ä¼˜åŒ–的翻译。" #: doc/classes/Physics2DDirectBodyState.xml msgid "Direct access object to a physics body in the [Physics2DServer]." @@ -54029,7 +54240,7 @@ msgstr "返回碰撞体的[RID]。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "Returns the collider's object id." -msgstr "返回碰撞体的对象id。" +msgstr "返回碰撞体的对象 id。" #: doc/classes/Physics2DDirectBodyState.xml msgid "" @@ -54055,8 +54266,8 @@ msgid "" "[method Object.get_meta], and is set with [method Physics2DServer." "shape_set_data]." msgstr "" -"返回碰撞形状的元数æ®ã€‚这个元数æ®ä¸åŒäºŽ[method Object.get_meta],是用[method " -"Physics2DServer.shape_set_data]设置的。" +"返回碰撞形状的元数æ®ã€‚这个元数æ®ä¸åŒäºŽ [method Object.get_meta],是用 " +"[method Physics2DServer.shape_set_data] 设置的。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml @@ -54126,12 +54337,12 @@ msgstr "物体的线性速度,å•ä½ä¸ºåƒç´ æ¯ç§’。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "If [code]true[/code], this body is currently sleeping (not active)." -msgstr "如果[code]true[/code],则该物体当å‰å¤„于ç¡çœ 状æ€(䏿´»åЍ)。" +msgstr "如果为 [code]true[/code],则该物体当å‰å¤„于ç¡çœ 状æ€ï¼ˆä¸æ´»åŠ¨ï¼‰ã€‚" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml msgid "The timestep (delta) used for the simulation." -msgstr "用于模拟的时间æ¥é•¿(delta)。" +msgstr "用于模拟的时间æ¥é•¿ï¼ˆdelta)。" #: doc/classes/Physics2DDirectBodyState.xml #: doc/classes/PhysicsDirectBodyState.xml @@ -54159,15 +54370,15 @@ msgstr "ç‰©ä½“çš„å˜æ¢çŸ©é˜µã€‚" #: doc/classes/Physics2DDirectSpaceState.xml msgid "Direct access object to a space in the [Physics2DServer]." -msgstr "直接访问[Physics2DServer]ä¸çš„空间的对象。" +msgstr "直接访问 [Physics2DServer] ä¸çš„空间的对象。" #: doc/classes/Physics2DDirectSpaceState.xml msgid "" "Direct access object to a space in the [Physics2DServer]. It's used mainly " "to do queries against objects and areas residing in a given space." msgstr "" -"直接访问[Physics2DServer]ä¸çš„空间的对象。它主è¦ç”¨äºŽå¯¹ä½äºŽç»™å®šç©ºé—´ä¸çš„对象和区" -"域进行查询。" +"直接访问 [Physics2DServer] ä¸çš„空间的对象。它主è¦ç”¨äºŽå¯¹ä½äºŽç»™å®šç©ºé—´ä¸çš„对象和" +"区域进行查询。" #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -54379,7 +54590,7 @@ msgstr "" #: doc/classes/Physics2DServer.xml msgid "Server interface for low-level 2D physics access." -msgstr "用于底层2D物ç†è®¿é—®æœåŠ¡çš„æŽ¥å£ã€‚" +msgstr "用于底层 2D 物ç†è®¿é—®æœåŠ¡çš„æŽ¥å£ã€‚" #: doc/classes/Physics2DServer.xml msgid "" @@ -54420,17 +54631,17 @@ msgstr "" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Gets the instance ID of the object the area is assigned to." -msgstr "获å–区域分é…给的对象的实例ID。" +msgstr "获å–区域分é…给的对象的实例 ID。" #: doc/classes/Physics2DServer.xml msgid "" "Returns an area parameter value. See [enum AreaParameter] for a list of " "available parameters." -msgstr "è¿”å›žåŒºåŸŸå‚æ•°å€¼ã€‚有关å¯ç”¨å‚数的列表,请å‚阅[enum AreaParameter]。" +msgstr "è¿”å›žåŒºåŸŸå‚æ•°å€¼ã€‚有关å¯ç”¨å‚数的列表,请å‚阅 [enum AreaParameter]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the [RID] of the nth shape of an area." -msgstr "返回区域的第n个形状的[RID]。" +msgstr "返回区域的第 n 个形状的 [RID]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the number of shapes assigned to an area." @@ -54517,8 +54728,8 @@ msgid "" "Sets the space override mode for the area. See [enum AreaSpaceOverrideMode] " "for a list of available modes." msgstr "" -"为该区域设置空间覆盖模å¼ã€‚请å‚阅[enum AreaSpaceOverrideMode]获å–å¯ç”¨æ¨¡å¼çš„列" -"表。" +"为该区域设置空间覆盖模å¼ã€‚请å‚阅 [enum AreaSpaceOverrideMode] 获å–å¯ç”¨æ¨¡å¼çš„" +"列表。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Sets the transform matrix for an area." @@ -54535,9 +54746,9 @@ msgid "" "in global coordinates. A force differs from an impulse in that, while the " "two are forces, the impulse clears itself after being applied." msgstr "" -"åœ¨æ–½åŠ çš„åŠ›å’Œæ‰çŸ©ä¸Šæ·»åŠ ä¸€ä¸ªæœ‰ä½œç”¨ç‚¹çš„åŠ›ã€‚ä¸Ž[method body_apply_impulse]ä¸€æ ·ï¼ŒåŠ›" -"和物体原点的åç§»é‡éƒ½åœ¨å…¨å±€åæ ‡ä¸ã€‚力与冲é‡çš„ä¸åŒä¹‹å¤„在于,虽然两者都是力,但" -"冲é‡åœ¨è¢«æ–½åŠ åŽä¼šè‡ªåŠ¨æ¸…é™¤ã€‚" +"åœ¨æ–½åŠ çš„åŠ›å’Œæ‰çŸ©ä¸Šæ·»åŠ ä¸€ä¸ªæœ‰ä½œç”¨ç‚¹çš„åŠ›ã€‚ä¸Ž [method body_apply_impulse] ä¸€æ ·ï¼Œ" +"力和物体原点的åç§»é‡éƒ½åœ¨å…¨å±€åæ ‡ä¸ã€‚力与冲é‡çš„ä¸åŒä¹‹å¤„在于,虽然两者都是力," +"但冲é‡åœ¨è¢«æ–½åŠ åŽä¼šè‡ªåŠ¨æ¸…é™¤ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" @@ -54587,7 +54798,7 @@ msgstr "" msgid "" "Returns the maximum contacts that can be reported. See [method " "body_set_max_contacts_reported]." -msgstr "è¿”å›žå¯æŠ¥å‘Šçš„æœ€å¤§æŽ¥è§¦æ•°ã€‚å‚阅[method body_set_max_contacts_reported]。" +msgstr "è¿”å›žå¯æŠ¥å‘Šçš„æœ€å¤§æŽ¥è§¦æ•°ã€‚è§ [method body_set_max_contacts_reported]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the body mode." @@ -54597,11 +54808,11 @@ msgstr "返回物体模å¼ã€‚" msgid "" "Returns the value of a body parameter. See [enum BodyParameter] for a list " "of available parameters." -msgstr "è¿”å›žç‰©ä½“å‚æ•°çš„值。请å‚阅[enum BodyParameter]获å–å¯ç”¨å‚数列表。" +msgstr "è¿”å›žç‰©ä½“å‚æ•°çš„值。请å‚阅 [enum BodyParameter] 获å–å¯ç”¨å‚数列表。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the [RID] of the nth shape of a body." -msgstr "返回body的第n个碰撞形状的[RID]。" +msgstr "返回 body 的第 n 个碰撞形状的 [RID]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the number of shapes assigned to a body." @@ -54617,7 +54828,7 @@ msgstr "è¿”å›žç‰©ä½“ç¢°æ’žå½¢çŠ¶çš„å˜æ¢çŸ©é˜µã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns the [RID] of the space assigned to a body." -msgstr "返回分é…给物体的空间的[RID]。" +msgstr "返回分é…给物体的空间的 [RID]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Returns a body state." @@ -54628,8 +54839,8 @@ msgid "" "Returns whether a body uses a callback function to calculate its own physics " "(see [method body_set_force_integration_callback])." msgstr "" -"返回一个body是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†å€¼(å‚阅" -"body_set_force_integration_callback方法)。" +"返回一个 body 是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†å€¼ï¼ˆè§ [method " +"body_set_force_integration_callback])。" #: doc/classes/Physics2DServer.xml msgid "Removes a body from the list of bodies exempt from collisions." @@ -54666,7 +54877,7 @@ msgid "" "Continuous collision detection tries to predict where a moving body will " "collide, instead of moving it and correcting its movement if it collided." msgstr "" -"设置使用[enum CCDMode]常é‡ä¹‹ä¸€çš„连ç»ç¢°æ’žæ£€æµ‹æ¨¡å¼ã€‚\n" +"设置使用 [enum CCDMode] 常é‡ä¹‹ä¸€çš„连ç»ç¢°æ’žæ£€æµ‹æ¨¡å¼ã€‚\n" "连ç»ç¢°æ’žæ£€æµ‹è¯•图预测一个è¿åŠ¨ä½“å°†åœ¨å“ªé‡Œå‘ç”Ÿç¢°æ’žï¼Œè€Œä¸æ˜¯ç§»åŠ¨å®ƒå¹¶åœ¨å®ƒå‘生碰撞时" "çº æ£å…¶è¿åŠ¨ã€‚" @@ -54689,14 +54900,14 @@ msgstr "" #: doc/classes/Physics2DServer.xml msgid "Sets the body mode using one of the [enum BodyMode] constants." -msgstr "使用[enum BodyMode]常é‡ä¹‹ä¸€è®¾ç½®body模å¼ã€‚" +msgstr "使用 [enum BodyMode] 常é‡ä¹‹ä¸€è®¾ç½® body 模å¼ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" "Sets whether a body uses a callback function to calculate its own physics " "(see [method body_set_force_integration_callback])." msgstr "" -"设置一个物体是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†ï¼ˆå‚阅 [method " +"设置一个物体是å¦ä½¿ç”¨å›žè°ƒå‡½æ•°æ¥è®¡ç®—它自己的物ç†ï¼ˆè§ [method " "body_set_force_integration_callback])。" #: doc/classes/Physics2DServer.xml @@ -54710,26 +54921,27 @@ msgid "" "Substitutes a given body shape by another. The old shape is selected by its " "index, the new one by its [RID]." msgstr "" -"用一个给定的物体形状代替å¦ä¸€ä¸ªã€‚旧的形状是通过其索引选择的,新的是通过其[RID]" -"选择的。" +"用一个给定的物体形状代替å¦ä¸€ä¸ªã€‚旧的形状是通过其索引选择的,新的是通过其 " +"[RID] 选择的。" #: doc/classes/Physics2DServer.xml msgid "" "Enables one way collision on body if [code]enable[/code] is [code]true[/" "code]." -msgstr "如果[code]enable[/code]为 [code]true[/code],则在body上å¯ç”¨å•å‘碰撞。" +msgstr "" +"如果 [code]enable[/code] 为 [code]true[/code],则在 body 上å¯ç”¨å•å‘碰撞。" #: doc/classes/Physics2DServer.xml msgid "Disables shape in body if [code]disable[/code] is [code]true[/code]." -msgstr "如果[code]disable[/code]为 [code]true[/code],则在bodyä¸ç¦ç”¨å½¢çŠ¶ã€‚" +msgstr "如果 [code]disable[/code] 为 [code]true[/code],则在 body ä¸ç¦ç”¨å½¢çŠ¶ã€‚" #: doc/classes/Physics2DServer.xml msgid "" "Sets metadata of a shape within a body. This metadata is different from " "[method Object.set_meta], and can be retrieved on shape queries." msgstr "" -"设置一个体ä¸çš„形状的元数æ®ã€‚这个元数æ®ä¸Ž[method Object.set_meta]ä¸åŒï¼Œå¯ä»¥åœ¨" -"å½¢çŠ¶æŸ¥è¯¢ä¸æ£€ç´¢ã€‚" +"设置一个体ä¸çš„形状的元数æ®ã€‚这个元数æ®ä¸Ž [method Object.set_meta] ä¸åŒï¼Œå¯ä»¥" +"åœ¨å½¢çŠ¶æŸ¥è¯¢ä¸æ£€ç´¢ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Sets the transform matrix for a body shape." @@ -54737,7 +54949,7 @@ msgstr "è®¾ç½®ç‰©ä½“å½¢çŠ¶çš„å˜æ¢çŸ©é˜µã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Assigns a space to the body (see [method space_create])." -msgstr "给物体分é…一个空间(å‚阅 [method space_create])。" +msgstr "给物体分é…ä¸€ä¸ªç©ºé—´ï¼ˆè§ [method space_create])。" #: doc/classes/Physics2DServer.xml msgid "" @@ -54756,7 +54968,7 @@ msgid "" "can be passed to return additional information in." msgstr "" "如果从空间ä¸çš„给定点沿给定方å‘移动会导致碰撞,则返回 [code]true[/code]。边è·" -"å¢žåŠ äº†ç¢°æ’žæ£€æµ‹ä¸æ¶‰åŠçš„形状的大å°ã€‚ 通过返回[Physics2DTestMotionResult] å¯ä»¥é™„" +"å¢žåŠ äº†ç¢°æ’žæ£€æµ‹ä¸æ¶‰åŠçš„形状的大å°ã€‚通过返回[Physics2DTestMotionResult] å¯ä»¥é™„" "åŠ ä¿¡æ¯ã€‚" #: doc/classes/Physics2DServer.xml @@ -54774,7 +54986,8 @@ msgstr "è¿”å›žé˜»å°¼å¼¹ç°§å…³èŠ‚å‚æ•°å€¼ã€‚" msgid "" "Sets a damped spring joint parameter. See [enum DampedStringParam] for a " "list of available parameters." -msgstr "è®¾ç½®é˜»å°¼å¼¹ç°§å…³èŠ‚å‚æ•°ã€‚å‚阅[enum DampedStringParam]获å–å¯ç”¨å‚数的列表。" +msgstr "" +"è®¾ç½®é˜»å°¼å¼¹ç°§å…³èŠ‚å‚æ•°ã€‚å‚阅 [enum DampedStringParam] 获å–å¯ç”¨å‚数的列表。" #: doc/classes/Physics2DServer.xml msgid "" @@ -54790,7 +55003,7 @@ msgid "" "Returns information about the current state of the 2D physics engine. See " "[enum ProcessInfo] for a list of available states." msgstr "" -"返回关于2D物ç†å¼•擎当å‰çжæ€çš„ä¿¡æ¯ã€‚有关å¯ç”¨çжæ€åˆ—表,请å‚阅[enum " +"返回关于 2D 物ç†å¼•擎当å‰çжæ€çš„ä¿¡æ¯ã€‚有关å¯ç”¨çжæ€åˆ—表,请å‚阅 [enum " "ProcessInfo]。" #: doc/classes/Physics2DServer.xml @@ -54805,7 +55018,7 @@ msgstr "è¿”å›žå…³èŠ‚å‚æ•°çš„值。" #: doc/classes/Physics2DServer.xml msgid "Returns a joint's type (see [enum JointType])." -msgstr "返回一个关节的类型(è§[enum JointType])。" +msgstr "è¿”å›žä¸€ä¸ªå…³èŠ‚çš„ç±»åž‹ï¼ˆè§ [enum JointType])。" #: doc/classes/Physics2DServer.xml msgid "" @@ -54841,14 +55054,14 @@ msgstr "返回形状数æ®ã€‚" #: doc/classes/Physics2DServer.xml msgid "Returns a shape's type (see [enum ShapeType])." -msgstr "返回一个形状的类型(å‚阅[enum ShapeType])。" +msgstr "è¿”å›žä¸€ä¸ªå½¢çŠ¶çš„ç±»åž‹ï¼ˆè§ [enum ShapeType])。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" "Sets the shape data that defines its shape and size. The data to be passed " "depends on the kind of shape created [method shape_get_type]." msgstr "" -"设置定义形状和大å°çš„形状数æ®ã€‚è¦ä¼ 递的数æ®å–决于创建的形状的类型[method " +"设置定义形状和大å°çš„形状数æ®ã€‚è¦ä¼ 递的数æ®å–决于创建的形状的类型 [method " "shape_get_type]。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml @@ -54857,9 +55070,9 @@ msgid "" "engine that can be assigned to an area or a body. It can be assigned to an " "area with [method area_set_space], or to a body with [method body_set_space]." msgstr "" -"创建一个空间。空间是物ç†å¼•æ“Žçš„å‚æ•°é›†åˆï¼Œå¯ä»¥åˆ†é…给区域或主体。它å¯ä»¥é€šè¿‡" -"[method area_set_space]分é…给一个区域,或者通过[method body_set_space]分é…ç»™" -"一个主体。" +"创建一个空间。空间是物ç†å¼•æ“Žçš„å‚æ•°é›†åˆï¼Œå¯ä»¥åˆ†é…给区域或主体。它å¯ä»¥é€šè¿‡ " +"[method area_set_space] 分é…给一个区域,或者通过 [method body_set_space] 分é…" +"给一个主体。" #: doc/classes/Physics2DServer.xml msgid "" @@ -54886,7 +55099,7 @@ msgstr "å°†ç©ºé—´æ ‡è®°ä¸ºæ´»åŠ¨ç©ºé—´ã€‚å®ƒä¸ä¼šæœ‰æ•ˆæžœï¼Œé™¤éžå®ƒè¢«åˆ†é… msgid "" "Sets the value for a space parameter. See [enum SpaceParameter] for a list " "of available parameters." -msgstr "è®¾ç½®ç©ºé—´å‚æ•°çš„值。å‚阅[enum SpaceParameter]获å–å¯ç”¨å‚数列表。" +msgstr "è®¾ç½®ç©ºé—´å‚æ•°çš„值。å‚阅 [enum SpaceParameter] 获å–å¯ç”¨å‚数列表。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "" @@ -55144,7 +55357,7 @@ msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的角度阻尼系数。" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Represents the size of the [enum BodyParameter] enum." -msgstr "表示[enum BodyParameter]枚举的大å°ã€‚" +msgstr "表示 [enum BodyParameter] 枚举的大å°ã€‚" #: doc/classes/Physics2DServer.xml doc/classes/PhysicsServer.xml msgid "Constant to set/get the current transform matrix of the body." @@ -55211,7 +55424,7 @@ msgstr "" msgid "" "Enables continuous collision detection by raycasting. It is faster than " "shapecasting, but less precise." -msgstr "通过射线投射实现连ç»çš„碰撞检测。它比shapecasting更快,但ä¸å¤Ÿç²¾ç¡®ã€‚" +msgstr "通过射线投射实现连ç»çš„碰撞检测。它比 shapecasting 更快,但ä¸å¤Ÿç²¾ç¡®ã€‚" #: doc/classes/Physics2DServer.xml msgid "" @@ -55261,12 +55474,12 @@ msgstr "设置用于碰撞/相交查询的 [Shape2D]。" #: doc/classes/Physics2DShapeQueryParameters.xml msgid "If [code]true[/code], the query will take [Area2D]s into account." -msgstr "如果[code]true[/code],查询将考虑[Area2D]。" +msgstr "如果为 [code]true[/code],查询将考虑 [Area2D]。" #: doc/classes/Physics2DShapeQueryParameters.xml msgid "" "If [code]true[/code], the query will take [PhysicsBody2D]s into account." -msgstr "如果[code]true[/code],查询将考虑[PhysicsBody2D]。" +msgstr "如果为 [code]true[/code],查询将考虑 [PhysicsBody2D]。" #: doc/classes/Physics2DShapeQueryParameters.xml #: doc/classes/PhysicsShapeQueryParameters.xml @@ -55298,7 +55511,7 @@ msgstr "æ£åœ¨æŸ¥è¯¢çš„形状的è¿åŠ¨ã€‚" #: doc/classes/Physics2DShapeQueryParameters.xml #: doc/classes/PhysicsShapeQueryParameters.xml msgid "The queried shape's [RID]. See also [method set_shape]." -msgstr "查询形状的 [RID]。å¦è§[method set_shape]。" +msgstr "查询形状的 [RID]。å¦è¯·å‚阅 [method set_shape]。" #: doc/classes/Physics2DShapeQueryParameters.xml #: doc/classes/PhysicsShapeQueryParameters.xml @@ -55307,7 +55520,7 @@ msgstr "è¢«æŸ¥è¯¢å½¢çŠ¶çš„å˜æ¢çŸ©é˜µã€‚" #: doc/classes/PhysicsBody.xml msgid "Base class for all objects affected by physics in 3D space." -msgstr "在3D空间ä¸å—物ç†å½±å“的所有对象的基类。" +msgstr "在 3D 空间ä¸å—物ç†å½±å“的所有对象的基类。" #: doc/classes/PhysicsBody.xml msgid "" @@ -55371,7 +55584,7 @@ msgid "" "This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." msgstr "" "å¢žåŠ ä¸€ä¸ªæ’定的方å‘力,而ä¸å½±å“旋转。\n" -"这相当于[code]add_force(force, Vector3(0,0,0))[/code]。" +"相当于 [code]add_force(force, Vector3(0,0,0))[/code]。" #: doc/classes/PhysicsDirectBodyState.xml msgid "Adds a constant rotational force without affecting position." @@ -55383,7 +55596,7 @@ msgid "" "This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]." msgstr "" "æ–½åŠ å•一方å‘的冲é‡è€Œä¸å½±å“旋转。\n" -"è¿™ç‰ä»·äºŽ [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]。" +"相当于 [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]。" #: doc/classes/PhysicsDirectBodyState.xml msgid "" @@ -55600,7 +55813,8 @@ msgstr "æä¾›äº†ä¸€ç§ä¿®æ”¹[PhysicsBody]的碰撞属性的方法。" msgid "" "If [code]true[/code], subtracts the bounciness from the colliding object's " "bounciness instead of adding it." -msgstr "如果[code]true[/code],则从碰撞对象的弹跳性ä¸å‡åŽ»å¼¹æ€§ï¼Œè€Œä¸æ˜¯æ·»åŠ å®ƒã€‚" +msgstr "" +"如果为 [code]true[/code],则从碰撞对象的弹跳性ä¸å‡åŽ»å¼¹æ€§ï¼Œè€Œä¸æ˜¯æ·»åŠ å®ƒã€‚" #: doc/classes/PhysicsMaterial.xml msgid "" @@ -55614,7 +55828,7 @@ msgid "" "The body's friction. Values range from [code]0[/code] (frictionless) to " "[code]1[/code] (maximum friction)." msgstr "" -"物体的摩擦。å–值范围从[code]0[/code](æ— æ‘©æ“¦)到[code]1[/code](最大摩擦)。" +"物体的摩擦。å–值范围从[code]0[/code]ï¼ˆæ— æ‘©æ“¦ï¼‰åˆ°[code]1[/code](最大摩擦)。" #: doc/classes/PhysicsMaterial.xml msgid "" @@ -55624,9 +55838,9 @@ msgid "" "instead. If [code]true[/code] for both colliding objects, the physics engine " "will use the highest friction." msgstr "" -"如果 [code]true[/code],当两个物体碰撞时,物ç†å¼•æ“Žå°†ä½¿ç”¨æ ‡è®°ä¸ºâ€œç²—ç³™â€çš„物体的" -"摩擦。如果 [code]false[/code],物ç†å¼•擎将使用所有碰撞物体的最低摩擦力æ¥ä»£æ›¿ã€‚" -"如果两个碰撞的对象都为 [code]true[/code],物ç†å¼•擎将使用最高的摩擦力。" +"如果为 [code]true[/code],当两个物体碰撞时,物ç†å¼•æ“Žå°†ä½¿ç”¨æ ‡è®°ä¸ºâ€œç²—ç³™â€çš„物体" +"的摩擦。如果 [code]false[/code],物ç†å¼•擎将使用所有碰撞物体的最低摩擦力æ¥ä»£" +"替。如果两个碰撞的对象都为 [code]true[/code],物ç†å¼•擎将使用最高的摩擦力。" #: doc/classes/PhysicsServer.xml msgid "Server interface for low-level physics access." @@ -55648,17 +55862,17 @@ msgstr "创建一个[Area]区域。" msgid "" "Returns an area parameter value. A list of available parameters is on the " "[enum AreaParameter] constants." -msgstr "è¿”å›žåŒºåŸŸå‚æ•°å€¼ã€‚å¯ç”¨å‚数列表ä½äºŽ[enum AreaParameter]常é‡ä¸Šã€‚" +msgstr "è¿”å›žåŒºåŸŸå‚æ•°å€¼ã€‚å¯ç”¨å‚数列表ä½äºŽ [enum AreaParameter] 常é‡ä¸Šã€‚" #: doc/classes/PhysicsServer.xml msgid "If [code]true[/code], area collides with rays." -msgstr "如果[code]true[/code],则区域与光线碰撞。" +msgstr "如果为 [code]true[/code],则区域与光线碰撞。" #: doc/classes/PhysicsServer.xml msgid "" "Sets the value for an area parameter. A list of available parameters is on " "the [enum AreaParameter] constants." -msgstr "设置é¢ç§¯å‚数的值。å¯ç”¨å‚数列表ä½äºŽ[enum AreaParameter]常é‡ä¸Šã€‚" +msgstr "设置é¢ç§¯å‚数的值。å¯ç”¨å‚数列表ä½äºŽ [enum AreaParameter] 常é‡ä¸Šã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets object pickable with rays." @@ -55669,7 +55883,7 @@ msgid "" "Sets the space override mode for the area. The modes are described in the " "[enum AreaSpaceOverrideMode] constants." msgstr "" -"设置区域的空间替代模å¼ã€‚[enum AreaSpaceOverrideMode]常é‡ä¸æè¿°äº†è¿™äº›æ¨¡å¼ã€‚" +"设置区域的空间替代模å¼ã€‚[enum AreaSpaceOverrideMode] 常é‡ä¸æè¿°äº†è¿™äº›æ¨¡å¼ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55728,7 +55942,7 @@ msgid "" "Continuous collision detection tries to predict where a moving body will " "collide, instead of moving it and correcting its movement if it collided." msgstr "" -"如果[code]true[/code],则å¯ç”¨è¿žç»ç¢°æ’žæ£€æµ‹æ¨¡å¼ã€‚\n" +"如果为 [code]true[/code],则å¯ç”¨è¿žç»ç¢°æ’žæ£€æµ‹æ¨¡å¼ã€‚\n" "连ç»ç¢°æ’žæ£€æµ‹å°è¯•预测è¿åŠ¨ç‰©ä½“ç¢°æ’žçš„ä½ç½®ï¼Œè€Œä¸æ˜¯åœ¨ç¢°æ’žæ—¶ç§»åŠ¨ç‰©ä½“å¹¶çº æ£å…¶è¿åŠ¨ã€‚" #: doc/classes/PhysicsServer.xml @@ -55739,7 +55953,7 @@ msgstr "从[enum BodyMode]常é‡ä¹‹ä¸€è®¾ç½®ä¸»ä½“模å¼ã€‚" msgid "" "Sets a body parameter. A list of available parameters is on the [enum " "BodyParameter] constants." -msgstr "è®¾ç½®ç‰©ä½“å‚æ•°ã€‚å¯ç”¨å‚数列表ä½äºŽ[enum BodyParameter]常é‡ä¸Šã€‚" +msgstr "è®¾ç½®ç‰©ä½“å‚æ•°ã€‚å¯ç”¨å‚数列表ä½äºŽ [enum BodyParameter] 常é‡ä¸Šã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets the body pickable with rays if [code]enabled[/code] is set." @@ -55747,7 +55961,7 @@ msgstr "如果设置了[code]enabled[/code],则设置å¯ä½¿ç”¨å…‰çº¿æ‹¾å–çš„ç #: doc/classes/PhysicsServer.xml msgid "Sets a body state (see [enum BodyState] constants)." -msgstr "设置主体状æ€ï¼ˆè¯·å‚阅[enum BodyState]常é‡ï¼‰ã€‚" +msgstr "设置主体状æ€ï¼ˆè§ [enum BodyState] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55761,12 +55975,12 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "" "Gets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." -msgstr "获å–åœ†é”¥ä½“æ‰æ›²å…³èЂ傿•°ï¼ˆè¯·å‚阅[enum ConeTwistJointParam]常é‡ï¼‰ã€‚" +msgstr "获å–åœ†é”¥ä½“æ‰æ›²å…³èЂ傿•°ï¼ˆè§ [enum ConeTwistJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" "Sets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." -msgstr "è®¾ç½®åœ†é”¥ä½“æ‰æ›²å…³èЂ傿•°ï¼ˆè¯·å‚阅[enum ConeTwistJointParam]常é‡ï¼‰ã€‚" +msgstr "è®¾ç½®åœ†é”¥ä½“æ‰æ›²å…³èЂ傿•°ï¼ˆè§ [enum ConeTwistJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55780,25 +55994,24 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "" "Gets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." -msgstr "获å–generic_6_DOF_joit flag(请å‚阅[enum G6DOFJointAxisFlag]常é‡ï¼‰ã€‚" +msgstr "èŽ·å– generic_6_DOF_joit æ ‡å¿—ï¼ˆè§ [enum G6DOFJointAxisFlag] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" "Gets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " "constants)." -msgstr "" -"èŽ·å– generic_6_DOF_joint 傿•°ï¼ˆè¯·å‚阅[enum G6DOFJointAxisParam]常é‡ï¼‰ã€‚" +msgstr "èŽ·å– generic_6_DOF_joint 傿•°ï¼ˆè§ [enum G6DOFJointAxisParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" "Sets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." -msgstr "设置generic_6_DOF_joint flag(请å‚阅[enum G6DOFJointAxisFlag]常é‡ï¼‰ã€‚" +msgstr "设置 generic_6_DOF_joint æ ‡å¿—ï¼ˆè§ [enum G6DOFJointAxisFlag] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" "Sets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " "constants)." -msgstr "设置 generic_6_DOF_joint傿•°ï¼ˆè¯·å‚阅[enum G6DOFJointAxisParam]常é‡ï¼‰ã€‚" +msgstr "设置 generic_6_DOF_joint 傿•°ï¼ˆè§ [enum G6DOFJointAxisParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55811,39 +56024,39 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "Gets a hinge_joint flag (see [enum HingeJointFlag] constants)." -msgstr "获å–é“°é“¾å…³èŠ‚æ ‡å¿—ï¼ˆè¯·å‚阅[enum HingeJointFlag]常é‡ï¼‰ã€‚" +msgstr "èŽ·å– hinge_joint æ ‡å¿—ï¼ˆè§ [enum HingeJointFlag] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Gets a hinge_joint parameter (see [enum HingeJointParam])." -msgstr "获å–é“°é“¾å…³èŠ‚å‚æ•°ï¼ˆè¯·å‚阅[enum HingeJointParam])。" +msgstr "èŽ·å– hinge_joint 傿•°ï¼ˆè§ [enum HingeJointParam])。" #: doc/classes/PhysicsServer.xml msgid "Sets a hinge_joint flag (see [enum HingeJointFlag] constants)." -msgstr "è®¾ç½®é“°é“¾å…³èŠ‚æ ‡å¿—ï¼ˆè¯·å‚阅[enum HingeJointFlag]常é‡ï¼‰ã€‚" +msgstr "设置 hinge_joint æ ‡å¿—ï¼ˆè§ [enum HingeJointFlag] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets a hinge_joint parameter (see [enum HingeJointParam] constants)." -msgstr "è®¾ç½®é“°é“¾å…³èŠ‚å‚æ•°ï¼ˆè¯·å‚阅[enum HingeJointParam]常é‡ï¼‰ã€‚" +msgstr "设置 hinge_joint 傿•°ï¼ˆè§ [enum HingeJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Creates a [ConeTwistJoint]." -msgstr "创建一个[ConeTwistJoint]。" +msgstr "创建一个 [ConeTwistJoint]。" #: doc/classes/PhysicsServer.xml msgid "Creates a [Generic6DOFJoint]." -msgstr "创建一个 [Generic6DOFJoint]通用6å‘关节。" +msgstr "创建一个 [Generic6DOFJoint] 通用 6 å‘关节。" #: doc/classes/PhysicsServer.xml msgid "Creates a [HingeJoint]." -msgstr "创建一个 [HingeJoint]关节。" +msgstr "创建一个 [HingeJoint] 铰链关节。" #: doc/classes/PhysicsServer.xml msgid "Creates a [PinJoint]." -msgstr "创建一个 [PinJoint]图钉关节。" +msgstr "创建一个 [PinJoint] 图钉关节。" #: doc/classes/PhysicsServer.xml msgid "Creates a [SliderJoint]." -msgstr "创建一个 [SliderJoint]关节。" +msgstr "创建一个 [SliderJoint] 关节。" #: doc/classes/PhysicsServer.xml msgid "Gets the priority value of the Joint." @@ -55869,7 +56082,7 @@ msgstr "返回关节在关节物体B的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "Gets a pin_joint parameter (see [enum PinJointParam] constants)." -msgstr "获å–pin_joint傿•°ï¼ˆè¯·å‚阅[enum PinJointParam]常é‡ï¼‰ã€‚" +msgstr "èŽ·å– pin_joint 傿•°ï¼ˆè§ [enum PinJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets position of the joint in the local space of body a of the joint." @@ -55881,7 +56094,7 @@ msgstr "设置关节在关节物体B的局部空间ä¸çš„ä½ç½®ã€‚" #: doc/classes/PhysicsServer.xml msgid "Sets a pin_joint parameter (see [enum PinJointParam] constants)." -msgstr "设置pin_joint傿•°ï¼ˆè¯·å‚阅[enum PinJointParam]常é‡ï¼‰ã€‚" +msgstr "设置 pin_joint 傿•°ï¼ˆè§ [enum PinJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Activates or deactivates the 3D physics engine." @@ -55912,11 +56125,11 @@ msgstr "" #: doc/classes/PhysicsServer.xml msgid "Returns the type of shape (see [enum ShapeType] constants)." -msgstr "返回形状的类型(请å‚阅[enum ShapeType]常é‡ï¼‰ã€‚" +msgstr "è¿”å›žå½¢çŠ¶çš„ç±»åž‹ï¼ˆè§ [enum ShapeType] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "Gets a slider_joint parameter (see [enum SliderJointParam] constants)." -msgstr "获å–slider_joint傿•°ï¼ˆè¯·å‚阅[enum SliderJointParam]常é‡ï¼‰ã€‚" +msgstr "èŽ·å– slider_joint 傿•°ï¼ˆè§ [enum SliderJointParam] 常é‡ï¼‰ã€‚" #: doc/classes/PhysicsServer.xml msgid "" @@ -55933,7 +56146,7 @@ msgstr "è®¾ç½®ç©ºé—´å‚æ•°çš„值。å¯ç”¨å‚数列表ä½äºŽ[enum SpaceParameter] #: doc/classes/PhysicsServer.xml msgid "The [Joint] is a [PinJoint]." -msgstr "该[Joint] 是 [PinJoint]。" +msgstr "该 [Joint] 是 [PinJoint]。" #: doc/classes/PhysicsServer.xml msgid "The [Joint] is a [HingeJoint]." @@ -55985,7 +56198,7 @@ msgstr "é“°é“¾ä¸Šçš„æœ€å°æ—‹è½¬ã€‚" #: doc/classes/PhysicsServer.xml msgid "If [code]true[/code], the Hinge has a maximum and a minimum rotation." -msgstr "如果[code]true[/code]ï¼Œé“°é“¾å…·æœ‰æœ€å¤§å’Œæœ€å°æ—‹è½¬ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œé“°é“¾å…·æœ‰æœ€å¤§å’Œæœ€å°æ—‹è½¬ã€‚" #: doc/classes/PhysicsServer.xml msgid "If [code]true[/code], a motor turns the Hinge." @@ -56131,7 +56344,7 @@ msgstr "çº¿æ€§é©¬è¾¾åœ¨è¯•å›¾è¾¾åˆ°ç›®æ ‡é€Ÿåº¦æ—¶å¯ä»¥æ–½åŠ çš„æœ€å¤§åŠ›ã€‚" #: doc/classes/PhysicsServer.xml msgid "A factor that gets multiplied onto all rotations across the axes." -msgstr "ä¸€ä¸ªä¹˜ä»¥æ‰€æœ‰è½´æ—‹è½¬çš„å› å。" +msgstr "ä¹˜ä»¥æ‰€æœ‰è½´æ—‹è½¬çš„å› å。" #: doc/classes/PhysicsServer.xml msgid "" @@ -56161,7 +56374,7 @@ msgstr "设置时,å˜åœ¨è·¨è¿™äº›è½´çš„线性马达,以指定的速度为目 #: doc/classes/PhysicsServer.xml msgid "The [Shape] is a [PlaneShape]." -msgstr "该[Shape] 是 [PlaneShape]。" +msgstr "该 [Shape] 是 [PlaneShape]。" #: doc/classes/PhysicsServer.xml msgid "The [Shape] is a [RayShape]." @@ -56211,11 +56424,11 @@ msgstr "设置将用于碰撞/相交查询的 [Shape]。" #: doc/classes/PhysicsShapeQueryParameters.xml msgid "If [code]true[/code], the query will take [Area]s into account." -msgstr "如果[code]true[/code],查询将考虑 [Area]。" +msgstr "如果为 [code]true[/code],查询将考虑 [Area]。" #: doc/classes/PhysicsShapeQueryParameters.xml msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." -msgstr "如果 [code]true[/code],则查询将考虑 [PhysicsBody]。" +msgstr "如果为 [code]true[/code],则查询将考虑 [PhysicsBody]。" #: doc/classes/PinJoint.xml msgid "Pin joint for 3D PhysicsBodies." @@ -56273,9 +56486,9 @@ msgid "" "the plane is considered the side of the plane towards where the normal is " "pointing." msgstr "" -"å¹³é¢è¡¨ç¤ºæ ‡å‡†åŒ–çš„å¹³é¢æ–¹ç¨‹ã€‚åŸºæœ¬ä¸Šï¼Œâ€œæ³•çº¿â€æ˜¯å¹³é¢çš„æ³•线(aã€bã€c归一化),而“dâ€æ˜¯" -"原点到平é¢çš„è·ç¦»(åœ¨â€œæ³•çº¿â€æ–¹å‘)ã€‚â€œä¸Šæ–¹â€æˆ–“上方â€å¹³é¢è¢«è®¤ä¸ºæ˜¯æ³•线指å‘的平é¢ä¸€" -"侧。" +"å¹³é¢è¡¨ç¤ºæ ‡å‡†åŒ–çš„å¹³é¢æ–¹ç¨‹ã€‚åŸºæœ¬ä¸Šï¼Œâ€œæ³•çº¿â€æ˜¯å¹³é¢çš„æ³•线(归一化的 aã€bã€c)," +"而“dâ€æ˜¯åŽŸç‚¹åˆ°å¹³é¢çš„è·ç¦»ï¼ˆåœ¨â€œæ³•çº¿â€æ–¹å‘ï¼‰ã€‚â€œä¸Šæ–¹â€æˆ–“上方â€å¹³é¢è¢«è®¤ä¸ºæ˜¯æ³•线指å‘çš„" +"å¹³é¢ä¸€ä¾§ã€‚" #: doc/classes/Plane.xml msgid "" @@ -56397,15 +56610,15 @@ msgstr "" #: doc/classes/Plane.xml msgid "The X component of the plane's [member normal] vector." -msgstr "å¹³é¢çš„[member normal]å‘é‡çš„X分é‡ã€‚" +msgstr "平颿³•å‘é‡ [member normal] çš„ X 分é‡ã€‚" #: doc/classes/Plane.xml msgid "The Y component of the plane's [member normal] vector." -msgstr "å¹³é¢çš„[member normal]å‘é‡çš„Y分é‡ã€‚" +msgstr "平颿³•å‘é‡ [member normal] çš„ Y 分é‡ã€‚" #: doc/classes/Plane.xml msgid "The Z component of the plane's [member normal] vector." -msgstr "å¹³é¢çš„[member normal]å‘é‡çš„Z分é‡ã€‚" +msgstr "平颿³•å‘é‡ [member normal] çš„ Z 分é‡ã€‚" #: doc/classes/Plane.xml msgid "A plane that extends in the Y and Z axes (normal vector points +X)." @@ -56521,7 +56734,7 @@ msgid "" "canvas_polygon_index_buffer_size_kb]." msgstr "" "Polygon2D 由一组点定义。æ¯ä¸ªç‚¹éƒ½è¿žæŽ¥åˆ°ä¸‹ä¸€ä¸ªç‚¹ï¼Œæœ€åŽä¸€ä¸ªç‚¹è¿žæŽ¥åˆ°ç¬¬ä¸€ä¸ªç‚¹ï¼Œä»Ž" -"而形æˆå°é—的多边形。 Polygon2D å¯ä»¥å¡«å……颜色(纯色或æ¸å˜è‰²ï¼‰æˆ–填充给定的纹" +"而形æˆå°é—的多边形。Polygon2D å¯ä»¥å¡«å……颜色(纯色或æ¸å˜è‰²ï¼‰æˆ–填充给定的纹" "ç†ã€‚\n" "[b]注æ„:[/b]默认情况下,Godot 一次最多åªèƒ½ç»˜åˆ¶ 4096 个多边形点。è¦å¢žåŠ æ¤é™" "åˆ¶ï¼Œè¯·æ‰“å¼€é¡¹ç›®è®¾ç½®å¹¶å¢žåŠ [member ProjectSettings.rendering/limits/buffers/" @@ -56531,35 +56744,35 @@ msgstr "" #: doc/classes/Polygon2D.xml msgid "" "Adds a bone with the specified [code]path[/code] and [code]weights[/code]." -msgstr "æ·»åŠ æŒ‡å®š[code]path[/code]å’Œ[code]weights[/code]的骨骼." +msgstr "æ·»åŠ æŒ‡å®š [code]path[/code] å’Œ [code]weights[/code] 的骨骼。" #: doc/classes/Polygon2D.xml msgid "Removes all bones from this [Polygon2D]." -msgstr "åˆ é™¤è¿™ä¸ª[Polygon2D]的所有骨骼." +msgstr "åˆ é™¤è¿™ä¸ª [Polygon2D] 的所有骨骼。" #: doc/classes/Polygon2D.xml msgid "Removes the specified bone from this [Polygon2D]." -msgstr "从这个[Polygon2D]ä¸åˆ 除指定的骨骼." +msgstr "从这个 [Polygon2D] ä¸åˆ 除指定的骨骼。" #: doc/classes/Polygon2D.xml msgid "Returns the number of bones in this [Polygon2D]." -msgstr "返回这个[Polygon2D]ä¸éª¨éª¼çš„æ•°é‡." +msgstr "返回这个 [Polygon2D] ä¸éª¨éª¼çš„æ•°é‡ã€‚" #: doc/classes/Polygon2D.xml msgid "Returns the path to the node associated with the specified bone." -msgstr "返回与指定骨骼相关è”的节点的路径." +msgstr "返回与指定骨骼相关è”的节点的路径。" #: doc/classes/Polygon2D.xml msgid "Returns the height values of the specified bone." -msgstr "返回指定骨骼的高度值." +msgstr "返回指定骨骼的高度值。" #: doc/classes/Polygon2D.xml msgid "Sets the path to the node associated with the specified bone." -msgstr "设置与指定骨骼相关è”的节点的路径." +msgstr "设置与指定骨骼相关è”的节点的路径。" #: doc/classes/Polygon2D.xml msgid "Sets the weight values for the specified bone." -msgstr "设置指定骨骼的æƒé‡å€¼." +msgstr "设置指定骨骼的æƒé‡å€¼ã€‚" #: doc/classes/Polygon2D.xml msgid "" @@ -56737,7 +56950,7 @@ msgid "" "[code]buffer_size[/code] to the size of the uncompressed data. Set the " "compression mode using one of [enum File.CompressionMode]'s constants." msgstr "" -"返回新的 [PoolByteArray] 解压数æ®ã€‚ [code]buffer_size[/code] 设置未压缩数æ®çš„" +"返回新的 [PoolByteArray] 解压数æ®ã€‚[code]buffer_size[/code] 设置未压缩数æ®çš„" "大å°ã€‚使用 [enum File.CompressionMode] 常é‡ä¹‹ä¸€è®¾ç½®åŽ‹ç¼©æ¨¡å¼ã€‚" #: doc/classes/PoolByteArray.xml @@ -56812,7 +57025,7 @@ msgid "" "[b]Note:[/b] This is equivalent to using the [code]in[/code] operator." msgstr "" "如果该数组包å«ç»™å®šçš„值,则返回 [code]true[/code]。\n" -"[b]注æ„:[/b]与使用 [code]in[/code] æ“作符ç‰ä»·ã€‚" +"[b]注æ„:[/b]相当于使用 [code]in[/code] æ“作符。" #: doc/classes/PoolByteArray.xml msgid "" @@ -56950,7 +57163,7 @@ msgstr "" #: doc/classes/PoolColorArray.xml msgid "Changes the [Color] at the given index." -msgstr "更改给定索引处的[Color]。" +msgstr "更改给定索引处的 [Color]。" #: doc/classes/PoolIntArray.xml msgid "A pooled array of integers ([int])." @@ -57092,11 +57305,12 @@ msgstr "" msgid "" "Constructs a new [PoolRealArray]. Optionally, you can pass in a generic " "[Array] that will be converted." -msgstr "构建新的[PoolRealArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的[Array],它将被转æ¢ã€‚" +msgstr "" +"构建新的 [PoolRealArray]ã€‚ä½ å¯ä»¥é€‰æ‹©ä¼ 入一个通用的 [Array],它将被转æ¢ã€‚" #: doc/classes/PoolRealArray.xml msgid "Appends a [PoolRealArray] at the end of this array." -msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolRealArray]。" +msgstr "åœ¨è¿™ä¸ªæ•°ç»„çš„æœ€åŽæ·»åŠ [PoolRealArray]。" #: doc/classes/PoolRealArray.xml msgid "Changes the float at the given index." @@ -57172,7 +57386,7 @@ msgstr "åœ¨æ•°ç»„çš„æœ«å°¾è¿½åŠ å—ç¬¦ä¸²å…ƒç´ ã€‚" #: doc/classes/PoolStringArray.xml msgid "Changes the [String] at the given index." -msgstr "更改给定索引处的[String]。" +msgstr "更改给定索引处的 [String]。" #: doc/classes/PoolVector2Array.xml msgid "A pooled array of [Vector2]s." @@ -57382,8 +57596,8 @@ msgid "" "ConfirmationDialog.get_cancel] and hide the buttons in question by setting " "their [member CanvasItem.visible] property to [code]false[/code]." msgstr "" -"如果[code]true[/code],当点击事件å‘生在它之外,或者当它收到[code]ui_cancel[/" -"code]动作事件时,弹出窗å£ä¸ä¼šè¢«éšè—。\n" +"如果为 [code]true[/code],当点击事件å‘生在它之外,或者当它收到" +"[code]ui_cancel[/code]动作事件时,弹出窗å£ä¸ä¼šè¢«éšè—。\n" "[b]注æ„:[/b]å¯ç”¨æ¤å±žæ€§ä¸ä¼šå½±å“从æ¤ç±»ç»§æ‰¿çš„å¯¹è¯æ¡†ä¸å…³é—æˆ–å–æ¶ˆæŒ‰é’®çš„行为。作为" "解决方法,您å¯ä»¥ä½¿ç”¨ [method WindowDialog.get_close_button] 或 [method " "ConfirmationDialog.get_cancel] 并通过将其 [member CanvasItem.visible] 属性设" @@ -57430,9 +57644,19 @@ msgstr "PopupMenu(弹出èœå•)显示选项列表." #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" -"[PopupMenu]是一个显示选项列表的[Control].å®ƒä»¬åœ¨å·¥å…·æ æˆ–上下文èœå•ä¸å¾ˆå¸¸ç”¨." #: doc/classes/PopupMenu.xml msgid "" @@ -57446,13 +57670,14 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°çš„å¸¦æœ‰[code]label[/code]æ–‡æœ¬çš„å¯æ£€æŸ¥é¡¹ç›®.\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª[code]id[/code]以åŠä¸€ä¸ªå¿«æ·é”®([code]accel[/code])åŠ é€Ÿ.如果没" -"有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ª.如果没有æä¾›[code]accel[/code],那么" -"将为其分é…默认的[code]0[/code].å‚阅 [method get_item_accelerator]了解更多关于" -"å¿«æ·é”®çš„ä¿¡æ¯.\n" -"[b]注æ„:[/b]坿£€æŸ¥é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªæ£€æŸ¥æ ‡è®°,但没有任何内置的检查行为,必须手动" -"æ£€æŸ¥æˆ–å–æ¶ˆæ£€æŸ¥.å‚阅[method set_item_checked]了解更多关于如何控制它的信æ¯." +"æ·»åŠ ä¸€ä¸ªæ–°çš„å¸¦æœ‰ [code]label[/code] 文本的å¯å‹¾é€‰é¡¹ç›®ã€‚\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª [code]id[/code] 以åŠä¸€ä¸ªå¿«æ·é”®ï¼ˆ[code]accel[/code])。如果没" +"有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/code]," +"那么将为其分é…默认的 [code]0[/code]。å‚阅 [method get_item_accelerator] 了解" +"更多关于快æ·é”®çš„ä¿¡æ¯.\n" +"[b]注æ„:[/b]å¯å‹¾é€‰é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå‹¾é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须手" +"åŠ¨å‹¾é€‰æˆ–å–æ¶ˆå‹¾é€‰ã€‚å‚阅 [method set_item_checked] 了解更多关于如何控制它的信" +"æ¯ã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57520,11 +57745,11 @@ msgid "" "[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " "more info on accelerators." msgstr "" -"æ·»åŠ å¸¦æœ‰æ–‡æœ¬[code]lable[/code]å’Œå›¾æ ‡[code]texture[/code]的新项目。\n" -"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª[code]id[/code],以åŠä¸€ä¸ªåŠ é€Ÿå™¨([code]accel[/code])。如果没有" -"æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾›[code]accel[/code],则将" -"为其分é…默认的[code]0[/code]ã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅[method " -"get_item_accelerator]。" +"æ·»åŠ å¸¦æœ‰æ–‡æœ¬ [code]lable[/code] å’Œå›¾æ ‡ [code]texture[/code] 的新项目。\n" +"å¯ä»¥é€‰æ‹©æä¾›ä¸€ä¸ª [code]id[/code],以åŠä¸€ä¸ªå¿«æ·é”®ï¼ˆ[code]accel[/code])。如果" +"没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/" +"code],则将为其分é…默认的[code]0[/code]。有关快æ·é”®çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅 " +"[method get_item_accelerator]。" #: doc/classes/PopupMenu.xml msgid "Same as [method add_icon_check_item], but uses a radio check button." @@ -57556,10 +57781,10 @@ msgid "" "[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " "more info on accelerators." msgstr "" -"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬[code]label[/code]的新项目。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code],以åŠåŠ é€Ÿå™¨([code]accel[/code])。如果没有æä¾›" -"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾›[code]accel[/code],则默认的" -"[code]0[/code]将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅[method " +"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬ [code]label[/code] 的新项目。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code],以åŠåŠ é€Ÿå™¨ï¼ˆ[code]accel[/code])。如果没有æä¾› " +"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/code],则默认" +"çš„ [code]0[/code] 将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅 [method " "get_item_accelerator]。" #: doc/classes/PopupMenu.xml @@ -57575,13 +57800,13 @@ msgid "" "[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " "more info on accelerators." msgstr "" -"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬[code]label[/code]的新的多状æ€é¡¹ã€‚\n" -"与普通的二进制项相å,多状æ€é¡¹å¯ä»¥æœ‰ä¸¤ä¸ªä»¥ä¸Šçš„状æ€ï¼Œå¦‚[code]max_states[/code]" -"æ‰€å®šä¹‰çš„ã€‚æ¯æ¬¡æŒ‰ä¸‹æˆ–激活物å“å°†å¢žåŠ ä¸€ä¸ªçŠ¶æ€ã€‚默认值由[code]default_state[/" -"code]定义。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code],以åŠåŠ é€Ÿå™¨([code]accel[/code])。如果没有æä¾›" -"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾›[code]accel[/code],则默认的" -"[code]0[/code]将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅[method " +"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬ [code]label[/code] 的新的多状æ€é¡¹ã€‚\n" +"与普通的二进制项相å,多状æ€é¡¹å¯ä»¥æœ‰ä¸¤ä¸ªä»¥ä¸Šçš„状æ€ï¼Œå¦‚ [code]max_states[/" +"code] æ‰€å®šä¹‰çš„ã€‚æ¯æ¬¡æŒ‰ä¸‹æˆ–激活物å“å°†å¢žåŠ ä¸€ä¸ªçŠ¶æ€ã€‚默认值由 " +"[code]default_state[/code] 定义。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code],以åŠåŠ é€Ÿå™¨ï¼ˆ[code]accel[/code])。如果没有æä¾›" +"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/code],则默认" +"çš„ [code]0[/code] 将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅 [method " "get_item_accelerator]。" #: doc/classes/PopupMenu.xml @@ -57596,10 +57821,10 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬[code]label[/code]çš„å•选按钮。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code],以åŠåŠ é€Ÿå™¨([code]accel[/code])。如果没有æä¾›" -"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾›[code]accel[/code],则默认的" -"[code]0[/code]将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅[method " +"æ·»åŠ ä¸€ä¸ªå¸¦æœ‰æ–‡æœ¬ [code]label[/code] çš„å•选按钮。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code],以åŠåŠ é€Ÿå™¨ï¼ˆ[code]accel[/code])。如果没有æä¾›" +"[code]id[/code],将从索引ä¸åˆ›å»ºä¸€ä¸ªã€‚如果没有æä¾› [code]accel[/code],则默认" +"çš„ [code]0[/code] 将被分é…ç»™å®ƒã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·å‚阅 [method " "get_item_accelerator]。\n" "[b]注æ„:[/b]Checkable é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必" "须手动检查/䏿£€æŸ¥ã€‚有关如何控制它的更多信æ¯ï¼Œè¯·å‚阅 [method " @@ -57615,12 +57840,12 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually. See " "[method set_item_checked] for more info on how to control it." msgstr "" -"æ·»åŠ ä¸€ä¸ªæ–°çš„å•选å¤é€‰æŒ‰é’®å¹¶ä¸ºå…¶åˆ†é…一个[ShortCut]。将å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º" -"[ShortCut]çš„å称。\n" -"å¯ä»¥é€‰æ‹©æä¾›[code]id[/code]。如果没有æä¾›[code]id[/code],将从索引ä¸åˆ›å»ºä¸€" +"æ·»åŠ ä¸€ä¸ªæ–°çš„å•选å¤é€‰æŒ‰é’®å¹¶ä¸ºå…¶åˆ†é…一个 [ShortCut]。将å¤é€‰æ¡†çš„æ ‡ç¾è®¾ç½®ä¸º " +"[ShortCut] çš„å称。\n" +"å¯ä»¥é€‰æ‹©æä¾› [code]id[/code]。如果没有æä¾› [code]id[/code],将从索引ä¸åˆ›å»ºä¸€" "个。\n" -"[b]注:[/b] Checkableé¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须" -"手动检查/䏿£€æŸ¥ã€‚有关如何控制它的更多信æ¯ï¼Œè¯·å‚阅[method set_item_checked]。" +"[b]注æ„:[/b]å¯å‹¾é€‰çš„é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须" +"手动检查/䏿£€æŸ¥ã€‚有关如何控制它的更多信æ¯ï¼Œè¯·å‚阅 [method set_item_checked]。" #: doc/classes/PopupMenu.xml msgid "" @@ -57736,10 +57961,10 @@ msgid "" "don't have any built-in checking behavior and must be checked/unchecked " "manually." msgstr "" -"如果索引[code]idx[/code]的项目以æŸç§æ–¹å¼æ˜¯å¯æ£€æŸ¥çš„,例如,如果它有一个å¤é€‰æ¡†" -"或å•选按钮,则返回 [code]true[/code]。\n" -"[b]注:[/b]坿£€æŸ¥é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°æˆ–å•选按钮,但没有任何内置的检查行" -"为,必须手动检查/å–æ¶ˆã€‚" +"如果索引 [code]idx[/code] 的项目以æŸç§æ–¹å¼æ˜¯å¯æ£€æŸ¥çš„,例如,如果它有一个å¤é€‰" +"框或å•选按钮,则返回 [code]true[/code]。\n" +"[b]注æ„:[/b]å¯å‹¾é€‰é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°æˆ–å•选按钮,但没有任何内置的检查行" +"为,必须手动勾选/å–æ¶ˆã€‚" #: doc/classes/PopupMenu.xml msgid "" @@ -57763,9 +57988,10 @@ msgid "" "[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/" "unchecking items in radio groups." msgstr "" -"如果index [code]idx[/code]具有å•é€‰æŒ‰é’®æ ·å¼çš„坿£€æŸ¥æ€§ï¼Œåˆ™è¿”回 [code]true[/" +"å¦‚æžœç´¢å¼•å· [code]idx[/code] 具有å•é€‰æŒ‰é’®æ ·å¼çš„坿£€æŸ¥æ€§ï¼Œåˆ™è¿”回 [code]true[/" "code]。\n" -"[b]注:[/b]这纯粹是装饰性的;æ‚¨å¿…é¡»æ·»åŠ ç”¨äºŽåœ¨å•é€‰ç»„ä¸æ£€æŸ¥/å–æ¶ˆæ£€æŸ¥é¡¹ç›®çš„逻辑。" +"[b]注æ„:[/b]è¿™çº¯ç²¹æ˜¯è£…é¥°æ€§çš„ï¼›æ‚¨å¿…é¡»æ·»åŠ ç”¨äºŽåœ¨å•é€‰ç»„ä¸æ£€æŸ¥/å–æ¶ˆæ£€æŸ¥é¡¹ç›®çš„逻" +"辑。" #: doc/classes/PopupMenu.xml msgid "" @@ -57786,8 +58012,8 @@ msgid "" "[b]Note:[/b] The indices of items after the removed item will be shifted by " "one." msgstr "" -"从èœå•ä¸ç§»é™¤ç´¢å¼•[code]idx[/code]项。\n" -"[b]注:[/b]被移除项åŽçš„项的索引将被移ä½1。" +"从èœå•ä¸ç§»é™¤ç´¢å¼• [code]idx[/code] 项。\n" +"[b]注æ„:[/b]被移除项åŽçš„é¡¹çš„ç´¢å¼•å°†è¢«ç§»ä½ 1。" #: doc/classes/PopupMenu.xml msgid "Sets the currently focused item as the given [code]index[/code]." @@ -57813,17 +58039,17 @@ msgid "" "[b]Note:[/b] Checkable items just display a checkmark, but don't have any " "built-in checking behavior and must be checked/unchecked manually." msgstr "" -"设置索引[code]idx[/code]é¡¹æ˜¯å¦æœ‰å¤é€‰æ¡†ã€‚如果[code]false[/code],则将项目类型" -"设置为纯文本。\n" -"[b]注:[/b] Checkableé¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的检查行为,必须" -"手动检查/䏿£€æŸ¥ã€‚" +"设置索引 [code]idx[/code] é¡¹æ˜¯å¦æœ‰å¤é€‰æ¡†ã€‚如果为 [code]false[/code],则将项目" +"类型设置为纯文本。\n" +"[b]注æ„:[/b]å¯å‹¾é€‰é¡¹ç›®åªæ˜¯æ˜¾ç¤ºä¸€ä¸ªå¤é€‰æ ‡è®°ï¼Œä½†æ²¡æœ‰ä»»ä½•内置的勾选行为,必须手" +"动勾选/å–æ¶ˆã€‚" #: doc/classes/PopupMenu.xml msgid "" "Sets the type of the item at the specified index [code]idx[/code] to radio " "button. If [code]false[/code], sets the type of the item to plain text." msgstr "" -"将指定索引[code]idx[/code]处的项目类型设置为å•选按钮。如果[code]false[/" +"将指定索引[code]idx[/code]处的项目类型设置为å•选按钮。如果为 [code]false[/" "code],则将项目类型设置为纯文本。" #: doc/classes/PopupMenu.xml @@ -57832,7 +58058,7 @@ msgid "" "would be displayed as a line. If [code]false[/code], sets the type of the " "item to plain text." msgstr "" -"将索引 [code]idx[/code]æ ‡è®°ä¸ºåˆ†éš”ç¬¦ï¼Œè¿™æ„味ç€å®ƒå°†æ˜¾ç¤ºä¸ºä¸€è¡Œã€‚如果" +"将索引 [code]idx[/code]æ ‡è®°ä¸ºåˆ†éš”ç¬¦ï¼Œè¿™æ„味ç€å®ƒå°†æ˜¾ç¤ºä¸ºä¸€è¡Œã€‚如果为 " "[code]false[/code],则将项目类型设置为纯文本。" #: doc/classes/PopupMenu.xml @@ -57849,7 +58075,7 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "Replaces the [Texture] icon of the specified [code]idx[/code]." -msgstr "æ›¿æ¢æŒ‡å®š[code]idx[/code]的纹ç†[Texture]å›¾æ ‡ã€‚" +msgstr "æ›¿æ¢æŒ‡å®š [code]idx[/code] çš„çº¹ç† [Texture] å›¾æ ‡ã€‚" #: doc/classes/PopupMenu.xml msgid "Sets the [code]id[/code] of the item at index [code]idx[/code]." @@ -57868,15 +58094,15 @@ msgstr "" msgid "" "Sets the state of a multistate item. See [method add_multistate_item] for " "details." -msgstr "设置一个多æ€é¡¹ç›®çš„状æ€ã€‚详è§[method add_multistate_item]。" +msgstr "设置一个多æ€é¡¹ç›®çš„状æ€ã€‚详情请å‚阅 [method add_multistate_item]。" #: doc/classes/PopupMenu.xml msgid "Sets a [ShortCut] for the specified item [code]idx[/code]." -msgstr "为指定的项目[code]idx[/code]设置[ShortCut]。" +msgstr "为指定的项目 [code]idx[/code] 设置 [ShortCut]。" #: doc/classes/PopupMenu.xml msgid "Disables the [ShortCut] of the specified index [code]idx[/code]." -msgstr "ç¦ç”¨æŒ‡å®šç´¢å¼•[code]idx[/code]çš„[ShortCut]。" +msgstr "ç¦ç”¨æŒ‡å®šç´¢å¼• [code]idx[/code] çš„ [ShortCut]。" #: doc/classes/PopupMenu.xml msgid "" @@ -57884,44 +58110,45 @@ msgid "" "name of a child [PopupMenu] node that would be shown when the item is " "clicked." msgstr "" -"将项目的åèœå•设置为索引[code]idx[/code]。åèœå•是一个å[PopupMenu]节点的å" -"称,在å•击项目时显示该节点。" +"将项目的åèœå•设置为索引 [code]idx[/code]。åèœå•是一个å [PopupMenu] 节点的" +"å称,在å•击项目时显示该节点。" #: doc/classes/PopupMenu.xml msgid "" "Sets the [String] tooltip of the item at the specified index [code]idx[/" "code]." -msgstr "在指定的索引[code]idx[/code]处设置项目的[String]工具æç¤ºã€‚" +msgstr "在指定的索引 [code]idx[/code] 处设置项目的 [String] 工具æç¤ºã€‚" #: doc/classes/PopupMenu.xml msgid "" "Toggles the check state of the item of the specified index [code]idx[/code]." -msgstr "åˆ‡æ¢æŒ‡å®šç´¢å¼•[code]idx[/code]项的检查状æ€ã€‚" +msgstr "åˆ‡æ¢æŒ‡å®šç´¢å¼• [code]idx[/code] 项的检查状æ€ã€‚" #: doc/classes/PopupMenu.xml msgid "" "Cycle to the next state of a multistate item. See [method " "add_multistate_item] for details." -msgstr "循环到一个多æ€é¡¹ç›®çš„下一个状æ€ã€‚详è§[method add_multistate_item]。" +msgstr "" +"循环到一个多æ€é¡¹ç›®çš„下一个状æ€ã€‚详情请å‚阅 [method add_multistate_item]。" #: doc/classes/PopupMenu.xml msgid "If [code]true[/code], allows navigating [PopupMenu] with letter keys." -msgstr "如果为 [code]true[/code],å…è®¸ç”¨å—æ¯é”®å¯¼èˆª[PopupMenu]。" +msgstr "如果为 [code]true[/code],å…è®¸ç”¨å—æ¯é”®å¯¼èˆª [PopupMenu]。" #: doc/classes/PopupMenu.xml msgid "" "If [code]true[/code], hides the [PopupMenu] when a checkbox or radio button " "is selected." -msgstr "如果[code]true[/code],则在选ä¸å¤é€‰æ¡†æˆ–å•选按钮时éšè—[PopupMenu]。" +msgstr "如果为 [code]true[/code],则在选ä¸å¤é€‰æ¡†æˆ–å•选按钮时éšè— [PopupMenu]。" #: doc/classes/PopupMenu.xml msgid "If [code]true[/code], hides the [PopupMenu] when an item is selected." -msgstr "如果[code]true[/code]ï¼Œå½“ä¸€ä¸ªé¡¹ç›®è¢«é€‰ä¸æ—¶éšè—[PopupMenu]。" +msgstr "如果为 [code]true[/code]ï¼Œå½“ä¸€ä¸ªé¡¹ç›®è¢«é€‰ä¸æ—¶éšè— [PopupMenu]。" #: doc/classes/PopupMenu.xml msgid "" "If [code]true[/code], hides the [PopupMenu] when a state item is selected." -msgstr "如果[code]true[/code],则在选ä¸çжæ€é¡¹æ—¶éšè—[PopupMenu]。" +msgstr "如果为 [code]true[/code],则在选ä¸çжæ€é¡¹æ—¶éšè— [PopupMenu]。" #: doc/classes/PopupMenu.xml msgid "" @@ -57929,16 +58156,16 @@ msgid "" "hovering. If the popup menu is added as a child of another (acting as a " "submenu), it will inherit the delay time of the parent menu item." msgstr "" -"è®¾ç½®é¼ æ ‡æ‚¬åœæ—¶åèœå•项弹出的延迟时间(以秒为å•ä½)。如果弹出èœå•è¢«æ·»åŠ ä¸ºå¦ä¸€ä¸ª" -"èœå•çš„åèœå•(作为åèœå•),它将继承父èœå•项的延迟时间。" +"è®¾ç½®é¼ æ ‡æ‚¬åœæ—¶åèœå•项弹出的延迟时间,以秒为å•ä½ã€‚如果弹出èœå•è¢«æ·»åŠ ä¸ºå¦ä¸€ä¸ª" +"èœå•çš„åèœå•(作为åèœå•),它将继承父èœå•项的延迟时间。" #: doc/classes/PopupMenu.xml msgid "" "Emitted when user navigated to an item of some [code]id[/code] using " "[code]ui_up[/code] or [code]ui_down[/code] action." msgstr "" -"当用户使用[code]ui_up[/code]或[code]ui_down[/code]æ“作导航到æŸä¸ª[code]id[/" -"code]项时触å‘。" +"当用户使用 [code]ui_up[/code] 或 [code]ui_down[/code] æ“作导航到æŸä¸ª " +"[code]id[/code] 项时触å‘。" #: doc/classes/PopupMenu.xml msgid "" @@ -57954,7 +58181,7 @@ msgstr "当按下æŸä¸ª[code]index[/code]çš„é¡¹æˆ–æ¿€æ´»å…¶åŠ é€Ÿå™¨æ—¶è§¦å‘。 #: doc/classes/PopupMenu.xml msgid "The default text [Color] for menu items' names." -msgstr "èœå•项å称的默认文本[Color]。" +msgstr "èœå•项å称的默认文本 [Color]。" #: doc/classes/PopupMenu.xml msgid "" @@ -57962,8 +58189,8 @@ msgid "" "menu item name when defined. See [method get_item_accelerator] for more info " "on accelerators." msgstr "" -"文本[Color]用于快æ·é”®å’ŒåŠ é€Ÿå™¨ï¼Œå½“å®šä¹‰æ—¶æ˜¾ç¤ºåœ¨èœå•项åç§°æ—è¾¹ã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´å¤š" -"ä¿¡æ¯ï¼Œè¯·å‚阅[method get_item_accelerator]。" +"文本 [Color] 用于快æ·é”®å’ŒåŠ é€Ÿå™¨ï¼Œå½“å®šä¹‰æ—¶æ˜¾ç¤ºåœ¨èœå•项åç§°æ—è¾¹ã€‚æœ‰å…³åŠ é€Ÿå™¨çš„æ›´" +"多信æ¯ï¼Œè¯·å‚阅 [method get_item_accelerator]。" #: doc/classes/PopupMenu.xml msgid "[Color] used for disabled menu items' text." @@ -58147,14 +58374,14 @@ msgid "" "If you want to override this default, set this value to [code]false[/code], " "and the local [member portal_margin] will take effect." msgstr "" -"在大多数情况下,您会希望在Portalä¸ä½¿ç”¨é»˜è®¤çš„ [Portal] è¾¹è·ï¼ˆè¿™æ˜¯åœ¨ " +"在大多数情况下,您会希望在 Portal ä¸ä½¿ç”¨é»˜è®¤çš„ [Portal] è¾¹è·ï¼ˆè¿™æ˜¯åœ¨ " "[RoomManager] ä¸è®¾ç½®çš„)。\n" -"如果è¦è¦†ç›–这个默认值,把这个值设置为 [code]false[/code],本地的[member " -"portal_margin]就会生效。" +"如果è¦è¦†ç›–这个默认值,把这个值设置为 [code]false[/code],本地的 [member " +"portal_margin] 就会生效。" #: doc/classes/Position2D.xml msgid "Generic 2D position hint for editing." -msgstr "用于编辑的通用2Dä½ç½®æç¤ºã€‚" +msgstr "用于编辑的通用 2D ä½ç½®æç¤ºã€‚" #: doc/classes/Position2D.xml msgid "" @@ -58162,8 +58389,9 @@ msgid "" "it displays as a cross in the 2D editor at all times. You can set cross' " "visual size by using the gizmo in the 2D editor while the node is selected." msgstr "" -"用于编辑的通用2Dä½ç½®æç¤ºã€‚它就åƒä¸€ä¸ªæ™®é€šçš„[Node2D],但它在2D编辑器ä¸å§‹ç»ˆæ˜¾ç¤º" -"为一个åå—。选择节点时,å¯ä»¥ä½¿ç”¨2D编辑器ä¸çš„尿ާ件æ¥è®¾ç½®åå—的视觉大å°ã€‚" +"用于编辑的通用 2D ä½ç½®æç¤ºã€‚它就åƒä¸€ä¸ªæ™®é€šçš„ [Node2D],但它在 2D 编辑器ä¸å§‹ç»ˆ" +"显示为一个åå—。选择节点时,å¯ä»¥ä½¿ç”¨ 2D 编辑器ä¸çš„尿ާ件æ¥è®¾ç½®åå—的视觉大" +"å°ã€‚" #: doc/classes/Position3D.xml msgid "Generic 3D position hint for editing." @@ -58755,12 +58983,12 @@ msgid "" "The [member application/config/use_custom_user_dir] setting must be enabled " "for this to take effect." msgstr "" -"该用户目录用于å˜å‚¨æŒä¹…æ•°æ®([code]user://[/code]文件系统)。如果留空," -"[code]user://[/code]将解æžä¸ºGodot自己的é…置文件夹ä¸ç‰¹å®šäºŽé¡¹ç›®çš„æ–‡ä»¶å¤¹(请å‚阅" -"[method OS.get_user_data_dir])。如果定义了自定义目录å,将使用该å称并将其附" -"åŠ åˆ°ç³»ç»Ÿç‰¹å®šçš„ç”¨æˆ·æ•°æ®ç›®å½•(与[method OS.get_user_data_dir]ä¸è®°å½•çš„Godoté…置文" -"件夹相åŒçš„父文件夹)。\n" -"å¿…é¡»å¯ç”¨ [member application/config/use_custom_user_dir]设置æ‰èƒ½ä½¿å…¶ç”Ÿæ•ˆã€‚" +"这个用户目录用于å˜å‚¨æŒä¹…æ•°æ®ï¼ˆ[code]user://[/code]文件系统)。如果留空," +"[code]user://[/code] 将解æžä¸º Godot 自己的é…置文件夹ä¸ç‰¹å®šäºŽé¡¹ç›®çš„æ–‡ä»¶å¤¹ï¼ˆè§ " +"[method OS.get_user_data_dir])。如果定义了自定义目录å,将使用该å称并将其附" +"åŠ åˆ°ç³»ç»Ÿç‰¹å®šçš„ç”¨æˆ·æ•°æ®ç›®å½•(与 [method OS.get_user_data_dir] ä¸è®°å½•çš„ Godot " +"é…置文件夹相åŒçš„父文件夹)。\n" +"å¿…é¡»å¯ç”¨ [member application/config/use_custom_user_dir] 设置æ‰èƒ½ä½¿å…¶ç”Ÿæ•ˆã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -58825,11 +59053,11 @@ msgid "" "effect. If [code]false[/code], the project will save user data to [code](OS " "user data directory)/Godot/app_userdata/(project name)[/code]." msgstr "" -"如果[code]true[/code],项目将把用户数æ®ä¿å˜åˆ°è‡ªå·±çš„用户目录ä¸ï¼ˆè¯·å‚阅[member " -"application/config/custom_user_dir_name])。æ¤è®¾ç½®ä»…在桌é¢å¹³å°ä¸Šæœ‰æ•ˆã€‚必须在" -"[member application/config/custom_user_dir_name]设置ä¸è®¾ç½®åç§°æ‰èƒ½ç”Ÿæ•ˆã€‚如果" -"[code]false[/code],项目将把用户数æ®ä¿å˜åˆ°[code](OS user data directory)/" -"Godot/app_userdata/(project name)[/code]。" +"如果为 [code]true[/code],项目将把用户数æ®ä¿å˜åˆ°è‡ªå·±çš„用户目录ä¸ï¼ˆè¯·å‚阅" +"[member application/config/custom_user_dir_name])。æ¤è®¾ç½®ä»…在桌é¢å¹³å°ä¸Šæœ‰" +"效。必须在[member application/config/custom_user_dir_name]设置ä¸è®¾ç½®åç§°æ‰èƒ½" +"生效。如果为 [code]false[/code],项目将把用户数æ®ä¿å˜åˆ°[code](OS user data " +"directory)/Godot/app_userdata/(project name)[/code]。" #: doc/classes/ProjectSettings.xml msgid "" @@ -58845,9 +59073,9 @@ msgid "" "default can impact compatibility with some external tools or plugins which " "expect the default [code].import[/code] folder." msgstr "" -"如果 [code]true[/code],项目将使用一个éšè—目录([code].import[/code])æ¥å˜å‚¨" -"项目特定的数æ®ï¼ˆå…ƒæ•°æ®ã€ç€è‰²å™¨ç¼“å˜ç‰ï¼‰ã€‚\n" -"如果 [code]false[/code],将使用éžéšè—目录 ([code]import[/code])。\n" +"如果为 [code]true[/code],项目将使用一个éšè—目录([code].import[/code])æ¥å˜" +"储项目特定的数æ®ï¼ˆå…ƒæ•°æ®ã€ç€è‰²å™¨ç¼“å˜ç‰ï¼‰ã€‚\n" +"如果为 [code]false[/code],将使用éžéšè—目录([code]import[/code])。\n" "[b]注æ„:[/b]更改æ¤è®¾ç½®åŽé‡æ–°å¯åŠ¨åº”ç”¨ç¨‹åºã€‚\n" "[b]注æ„:[/b]更改æ¤å€¼æœ‰åŠ©äºŽåœ¨å¹³å°ä¸Šæˆ–使用ä¸å…许éšè—目录模å¼çš„第三方工具。仅当" "æ‚¨çŸ¥é“æ‚¨çš„çŽ¯å¢ƒéœ€è¦æ—¶æ‰ä¿®æ”¹æ¤è®¾ç½®ï¼Œå› 为更改默认设置会影å“与æŸäº›éœ€è¦é»˜è®¤ " @@ -58899,9 +59127,9 @@ msgid "" "application/run/disable_stdout].\n" "Changes to this setting will only be applied upon restarting the application." msgstr "" -"如果 [code]true[/code],则ç¦ç”¨æ‰“å°åˆ°æ ‡å‡†é”™è¯¯ã€‚如果 [code]true[/code],这也会" -"éšè—ç”± [method @GDScript.push_error] å’Œ [method @GDScript.push_warning] 打å°" -"的错误和è¦å‘Šæ¶ˆæ¯ã€‚å¦è§[member application/run/disable_stdout]。\n" +"如果为 [code]true[/code],则ç¦ç”¨æ‰“å°åˆ°æ ‡å‡†é”™è¯¯ã€‚如果为 [code]true[/code],这" +"也会éšè—ç”± [method @GDScript.push_error] å’Œ [method @GDScript.push_warning] " +"打å°çš„错误和è¦å‘Šæ¶ˆæ¯ã€‚å¦è§[member application/run/disable_stdout]。\n" "对æ¤è®¾ç½®çš„æ›´æ”¹åªä¼šåœ¨é‡æ–°å¯åŠ¨åº”ç”¨ç¨‹åºæ—¶åº”用。" #: doc/classes/ProjectSettings.xml @@ -58911,7 +59139,7 @@ msgid "" "command line argument. See also [member application/run/disable_stderr].\n" "Changes to this setting will only be applied upon restarting the application." msgstr "" -"如果 [code]true[/code],则ç¦ç”¨æ‰“å°åˆ°æ ‡å‡†è¾“出。这相当于使用 [code]--quiet[/" +"如果为 [code]true[/code],则ç¦ç”¨æ‰“å°åˆ°æ ‡å‡†è¾“出。这相当于使用 [code]--quiet[/" "code] å‘½ä»¤è¡Œå‚æ•°å¯åŠ¨ç¼–è¾‘å™¨æˆ–é¡¹ç›®ã€‚å¦è§[member application/run/" "disable_stderr]。\n" "对æ¤è®¾ç½®çš„æ›´æ”¹åªä¼šåœ¨é‡æ–°å¯åŠ¨åº”ç”¨ç¨‹åºæ—¶åº”用。" @@ -58931,8 +59159,8 @@ msgid "" "([code]stderr[/code]) is always flushed when a line is printed to it.\n" "Changes to this setting will only be applied upon restarting the application." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™æ¯æ¬¡æ‰“å°ä¸€è¡Œæ—¶åˆ·æ–°æ ‡å‡†è¾“出æµã€‚这会影å“终端日志记录" -"和文件日志记录。\n" +"如果为 [code]true[/code]ï¼Œåˆ™æ¯æ¬¡æ‰“å°ä¸€è¡Œæ—¶åˆ·æ–°æ ‡å‡†è¾“出æµã€‚这会影å“终端日志记" +"录和文件日志记录。\n" "è¿è¡Œé¡¹ç›®æ—¶ï¼Œå¦‚果希望由 systemd/journalctl ç‰æœåŠ¡ç®¡ç†å™¨æ”¶é›†æ—¥å¿—,则必须å¯ç”¨æ¤" "设置。默认情况下,在å‘布版本ä¸ç¦ç”¨æ¤è®¾ç½®ï¼Œå› ä¸ºå¦‚æžœå¿«é€Ÿè¿žç»æ‰“å°å¤§é‡è¡Œï¼Œåˆ™åœ¨æ¯" "个打å°è¡Œä¸Šåˆ·æ–°éƒ½ä¼šå¯¹æ€§èƒ½äº§ç”Ÿè´Ÿé¢å½±å“。æ¤å¤–,如果å¯ç”¨æ¤è®¾ç½®ï¼Œå¦‚果应用程åºå´©æºƒ" @@ -58966,15 +59194,16 @@ msgid "" "visually. This is meant for writing applications and editors, but is pretty " "useless (and can hurt performance) in most games." msgstr "" -"如果 [code]true[/code],则å¯ç”¨ä½Žå¤„ç†å™¨ä½¿ç”¨æ¨¡å¼ã€‚æ¤è®¾ç½®ä»…适用于桌é¢å¹³å°ã€‚如果" -"视觉上没有任何å˜åŒ–,å±å¹•ä¸ä¼šè¢«é‡ç»˜ã€‚这是为了编写应用程åºå’Œç¼–辑器,但在大多数" -"游æˆä¸è¿™æ˜¯éžå¸¸æ— 用的(并å¯èƒ½æŸå®³æ€§èƒ½ï¼‰ã€‚" +"如果为 [code]true[/code],则å¯ç”¨ä½Žå¤„ç†å™¨ä½¿ç”¨æ¨¡å¼ã€‚æ¤è®¾ç½®ä»…适用于桌é¢å¹³å°ã€‚如" +"果视觉上没有任何å˜åŒ–,å±å¹•ä¸ä¼šè¢«é‡ç»˜ã€‚这是为了编写应用程åºå’Œç¼–辑器,但在大多" +"数游æˆä¸è¿™æ˜¯éžå¸¸æ— 用的(并å¯èƒ½æŸå®³æ€§èƒ½ï¼‰ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Amount of sleeping between frames when the low-processor usage mode is " "enabled (in microseconds). Higher values will result in lower CPU usage." -msgstr "å¯ç”¨ä½Žå¤„ç†å™¨ä½¿ç”¨æ¨¡å¼æ—¶å¸§é—´çš„ç¡çœ é‡(以微秒计)。值越高,CPUå 用率越低。" +msgstr "" +"å¯ç”¨ä½Žå¤„ç†å™¨ä½¿ç”¨æ¨¡å¼æ—¶å¸§é—´çš„ç¡çœ é‡ï¼ˆä»¥å¾®ç§’计)。值越高,CPUå 用率越低。" #: doc/classes/ProjectSettings.xml msgid "Path to the main scene file that will be loaded when the project runs." @@ -59194,14 +59423,15 @@ msgstr "" msgid "" "If [code]true[/code], enables warnings when using a function as if it was a " "property." -msgstr "如果[code]true[/code],则在使用函数时å¯ç”¨è¦å‘Šï¼Œå°±åƒå®ƒæ˜¯å±žæ€§ä¸€æ ·ã€‚" +msgstr "如果为 [code]true[/code],则在使用函数时å¯ç”¨è¦å‘Šï¼Œå°±åƒå®ƒæ˜¯å±žæ€§ä¸€æ ·ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when a ternary operator may emit " "values with incompatible types." msgstr "" -"如果[code]true[/code],则当三元è¿ç®—符å¯èƒ½å‘出类型ä¸å…¼å®¹çš„值时,将å¯ç”¨è¦å‘Šã€‚" +"如果为 [code]true[/code],则当三元è¿ç®—符å¯èƒ½å‘出类型ä¸å…¼å®¹çš„值时,将å¯ç”¨è¦" +"告。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59224,7 +59454,7 @@ msgstr "" msgid "" "If [code]true[/code], enables warnings when using a property as if it was a " "function." -msgstr "如果[code]true[/code],则在将属性当作函数使用时å¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code],则在将属性当作函数使用时å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59233,9 +59463,9 @@ msgid "" "argument). Such return values are sometimes used to denote possible errors " "using the [enum Error] enum." msgstr "" -"如果[code]true[/code],则在ä¸ä½¿ç”¨å‡½æ•°è¿”回值(通过将其赋值给å˜é‡æˆ–将其用作函数" -"傿•°)调用函数时å¯ç”¨è¦å‘Šã€‚è¿™æ ·çš„è¿”å›žå€¼æœ‰æ—¶ä½¿ç”¨[enum Error] 枚举æ¥è¡¨ç¤ºå¯èƒ½çš„é”™" -"误。" +"如果为 [code]true[/code],则在ä¸ä½¿ç”¨å‡½æ•°è¿”回值(通过将其赋值给å˜é‡æˆ–将其用作函" +"æ•°å‚æ•°)调用函数时å¯ç”¨è¦å‘Šã€‚è¿™æ ·çš„è¿”å›žå€¼æœ‰æ—¶ä½¿ç”¨[enum Error] 枚举æ¥è¡¨ç¤ºå¯èƒ½çš„" +"错误。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59243,8 +59473,8 @@ msgid "" "member variable that would shadow a variable at an upper level (such as a " "member variable)." msgstr "" -"如果[code]true[/code],则在定义局部或åç±»æˆå‘˜å˜é‡æ—¶å¯ç”¨è¦å‘Šï¼Œè¯¥å±€éƒ¨æˆ–åç±»æˆå‘˜" -"å˜é‡å°†åœ¨ä¸Šå±‚阴影å˜é‡(如æˆå‘˜å˜é‡)。" +"如果为 [code]true[/code],则在定义局部或åç±»æˆå‘˜å˜é‡æ—¶å¯ç”¨è¦å‘Šï¼Œè¯¥å±€éƒ¨æˆ–åç±»" +"æˆå‘˜å˜é‡å°†åœ¨ä¸Šå±‚阴影å˜é‡ï¼ˆå¦‚æˆå‘˜å˜é‡ï¼‰ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59252,8 +59482,8 @@ msgid "" "no effect on the surrounding code, such as writing [code]2 + 2[/code] as a " "statement." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™åœ¨è°ƒç”¨å¯¹å‘¨å›´ä»£ç æ²¡æœ‰å½±å“çš„è¡¨è¾¾å¼æ—¶å¯ç”¨è¦å‘Šï¼Œä¾‹å¦‚å°†" -"[code]2 + 2[/code]写æˆè¯å¥ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™åœ¨è°ƒç”¨å¯¹å‘¨å›´ä»£ç æ²¡æœ‰å½±å“çš„è¡¨è¾¾å¼æ—¶å¯ç”¨è¦å‘Šï¼Œä¾‹å¦‚" +"å°†[code]2 + 2[/code]写æˆè¯å¥ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59261,19 +59491,19 @@ msgid "" "that has no effect on the surrounding code, such as writing [code]42 if " "active else 0[/code] as a statement." msgstr "" -"如果[code]true[/code]ï¼Œåˆ™åœ¨è°ƒç”¨å¯¹å‘¨å›´ä»£ç æ²¡æœ‰å½±å“çš„ä¸‰å…ƒè¡¨è¾¾å¼æ—¶å¯ç”¨è¦å‘Šï¼Œä¾‹å¦‚" -"å°†[code]42(如果激活else 0[/code])写入è¯å¥ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™åœ¨è°ƒç”¨å¯¹å‘¨å›´ä»£ç æ²¡æœ‰å½±å“çš„ä¸‰å…ƒè¡¨è¾¾å¼æ—¶å¯ç”¨è¦å‘Šï¼Œ" +"例如将[code]42(如果激活else 0[/code])写入è¯å¥ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], all warnings will be reported as if they were errors." -msgstr "如果[code]true[/code],所有è¦å‘Šå°†è¢«æŠ¥å‘Šä¸ºé”™è¯¯ã€‚" +msgstr "如果为 [code]true[/code],所有è¦å‘Šå°†è¢«æŠ¥å‘Šä¸ºé”™è¯¯ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when using a variable that wasn't " "previously assigned." -msgstr "如果[code]true[/code]ï¼Œåˆ™åœ¨ä½¿ç”¨ä»¥å‰æ²¡æœ‰èµ‹å€¼çš„å˜é‡æ—¶å¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™åœ¨ä½¿ç”¨ä»¥å‰æ²¡æœ‰èµ‹å€¼çš„å˜é‡æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59281,60 +59511,60 @@ msgid "" "assignment operator like [code]+=[/code] if the variable wasn't previously " "assigned." msgstr "" -"如果[code]true[/code],则在使用赋值æ“作符[code]+=[/code](如果å˜é‡ä¹‹å‰æ²¡æœ‰èµ‹" -"值)为å˜é‡èµ‹å€¼æ—¶å¯ç”¨è¦å‘Šã€‚" +"如果为 [code]true[/code],则在使用赋值æ“作符[code]+=[/code](如果å˜é‡ä¹‹å‰æ²¡æœ‰" +"赋值)为å˜é‡èµ‹å€¼æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when unreachable code is detected " "(such as after a [code]return[/code] statement that will always be executed)." msgstr "" -"如果[code]true[/code],则在检测到ä¸å¯è¾¾çš„ä»£ç æ—¶å¯ç”¨è¦å‘Š(例如在始终执行的" -"[code]return[/code]è¯å¥ä¹‹åŽ)。" +"如果为 [code]true[/code],则在检测到ä¸å¯è¾¾çš„ä»£ç æ—¶å¯ç”¨è¦å‘Šï¼ˆä¾‹å¦‚在始终执行的" +"[code]return[/code]è¯å¥ä¹‹åŽï¼‰ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when using an expression whose type " "may not be compatible with the function parameter expected." msgstr "" -"如果[code]true[/code],则在使用类型å¯èƒ½ä¸ŽæœŸæœ›çš„å‡½æ•°å‚æ•°ä¸å…¼å®¹çš„è¡¨è¾¾å¼æ—¶å¯ç”¨è¦" -"告。" +"如果为 [code]true[/code],则在使用类型å¯èƒ½ä¸ŽæœŸæœ›çš„å‡½æ•°å‚æ•°ä¸å…¼å®¹çš„è¡¨è¾¾å¼æ—¶å¯" +"用è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], enables warnings when performing an unsafe cast." -msgstr "如果[code]true[/code],则在执行ä¸å®‰å…¨çš„å¼ºåˆ¶è½¬æ¢æ—¶å¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code],则在执行ä¸å®‰å…¨çš„å¼ºåˆ¶è½¬æ¢æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when calling a method whose presence " "is not guaranteed at compile-time in the class." msgstr "" -"如果[code]true[/code],则在调用类ä¸ä¸èƒ½ä¿è¯åœ¨ç¼–译时å˜åœ¨çš„æ–¹æ³•æ—¶å¯ç”¨è¦å‘Šã€‚" +"如果为 [code]true[/code],则在调用类ä¸ä¸èƒ½ä¿è¯åœ¨ç¼–译时å˜åœ¨çš„æ–¹æ³•æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when accessing a property whose " "presence is not guaranteed at compile-time in the class." msgstr "" -"如果[code]true[/code],则在访问类ä¸ä¸èƒ½ä¿è¯åœ¨ç¼–译时å˜åœ¨çš„属性时å¯ç”¨è¦å‘Šã€‚" +"如果为 [code]true[/code],则在访问类ä¸ä¸èƒ½ä¿è¯åœ¨ç¼–译时å˜åœ¨çš„属性时å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when a function parameter is unused." -msgstr "如果[code]true[/code]ï¼Œå½“ä¸€ä¸ªå‡½æ•°å‚æ•°æœªä½¿ç”¨æ—¶ï¼Œå¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code]ï¼Œå½“ä¸€ä¸ªå‡½æ•°å‚æ•°æœªä½¿ç”¨æ—¶ï¼Œå¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when a member variable is unused." -msgstr "如果[code]true[/code],当一个æˆå‘˜å˜é‡æœªä½¿ç”¨æ—¶ï¼Œå¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code],当一个æˆå‘˜å˜é‡æœªä½¿ç”¨æ—¶ï¼Œå¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], enables warnings when a signal is unused." -msgstr "如果[code]true[/code]ï¼Œåˆ™åœ¨ä¿¡å·æœªä½¿ç”¨æ—¶å¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™åœ¨ä¿¡å·æœªä½¿ç”¨æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], enables warnings when a local variable is unused." -msgstr "如果[code]true[/code],则在局部å˜é‡æœªä½¿ç”¨æ—¶å¯ç”¨è¦å‘Šã€‚" +msgstr "如果为 [code]true[/code],则在局部å˜é‡æœªä½¿ç”¨æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59342,16 +59572,16 @@ msgid "" "same name as a function. This will turn into an error in a future version " "when first-class functions become supported in GDScript." msgstr "" -"如果 [code]true[/code],则在声明与函数åŒåçš„å˜é‡æ—¶å¯ç”¨è¦å‘Šã€‚当 GDScript 支æŒ" -"一æµå‡½æ•°æ—¶ï¼Œè¿™å°†åœ¨æœªæ¥ç‰ˆæœ¬ä¸å˜æˆé”™è¯¯ã€‚" +"如果为 [code]true[/code],则在声明与函数åŒåçš„å˜é‡æ—¶å¯ç”¨è¦å‘Šã€‚当 GDScript 支" +"æŒä¸€æµå‡½æ•°æ—¶ï¼Œè¿™å°†åœ¨æœªæ¥ç‰ˆæœ¬ä¸å˜æˆé”™è¯¯ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], enables warnings when assigning the result of a " "function that returns [code]void[/code] to a variable." msgstr "" -"如果[code]true[/code],则在将返回 [code]void[/code]的函数的结果赋值给å˜é‡æ—¶å¯" -"用è¦å‘Šã€‚" +"如果为 [code]true[/code],则在将返回 [code]void[/code]的函数的结果赋值给å˜é‡" +"æ—¶å¯ç”¨è¦å‘Šã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59435,43 +59665,42 @@ msgstr "最大的å¯è§†è„šæœ¬è°ƒç”¨å †æ ˆï¼Œä»¥é¿å…æ— é™é€’归。" msgid "" "Color of the contact points between collision shapes, visible when \"Visible " "Collision Shapes\" is enabled in the Debug menu." -msgstr "碰撞形状之间接触点的颜色,在调试èœå•ä¸å¯ç”¨â€œå¯è§ç¢°æ’žå½¢çŠ¶â€æ—¶å¯è§ã€‚" +msgstr "碰撞形状之间接触点的颜色,在调试èœå•ä¸å¯ç”¨â€œæ˜¾ç¤ºç¢°æ’žå½¢çŠ¶â€æ—¶å¯è§ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Sets whether 2D physics will display collision outlines in game when " "\"Visible Collision Shapes\" is enabled in the Debug menu." msgstr "" -"设置当调试èœå•ä¸çš„å¯ç”¨ \"å¯è§çš„碰撞形状\" 时,2Dç‰©ç†æ˜¯å¦ä¼šåœ¨æ¸¸æˆä¸æ˜¾ç¤ºç¢°æ’žè½®" -"廓。" +"设置当调试èœå•ä¸çš„å¯ç”¨â€œæ˜¾ç¤ºç¢°æ’žå½¢çŠ¶â€æ—¶ï¼Œ2D ç‰©ç†æ˜¯å¦ä¼šåœ¨æ¸¸æˆä¸æ˜¾ç¤ºç¢°æ’žè½®å»“。" #: doc/classes/ProjectSettings.xml msgid "" "Maximum number of contact points between collision shapes to display when " "\"Visible Collision Shapes\" is enabled in the Debug menu." -msgstr "当在调试èœå•ä¸å¯ç”¨â€œå¯è§ç¢°æ’žå½¢çŠ¶â€æ—¶ï¼Œç¢°æ’žå½¢çŠ¶ä¹‹é—´æ˜¾ç¤ºçš„æœ€å¤§æŽ¥è§¦ç‚¹æ•°ã€‚" +msgstr "当在调试èœå•ä¸å¯ç”¨â€œæ˜¾ç¤ºç¢°æ’žå½¢çŠ¶â€æ—¶ï¼Œç¢°æ’žå½¢çŠ¶ä¹‹é—´æ˜¾ç¤ºçš„æœ€å¤§æŽ¥è§¦ç‚¹æ•°ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Color of the collision shapes, visible when \"Visible Collision Shapes\" is " "enabled in the Debug menu." -msgstr "碰撞形状的颜色,当在调试èœå•ä¸å¯ç”¨â€œå¯è§ç¢°æ’žå½¢çŠ¶â€æ—¶å¯è§ã€‚" +msgstr "碰撞形状的颜色,当在调试èœå•ä¸å¯ç”¨â€œæ˜¾ç¤ºç¢°æ’žå½¢çŠ¶â€æ—¶å¯è§ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Color of the disabled navigation geometry, visible when \"Visible " "Navigation\" is enabled in the Debug menu." -msgstr "被ç¦ç”¨çš„å¯¼èˆªå‡ ä½•å›¾å½¢çš„é¢œè‰²ï¼Œåœ¨è°ƒè¯•èœå•ä¸å¯ç”¨â€œå¯è§å¯¼èˆªâ€æ—¶å¯è§ã€‚" +msgstr "被ç¦ç”¨çš„å¯¼èˆªå‡ ä½•å›¾å½¢çš„é¢œè‰²ï¼Œåœ¨è°ƒè¯•èœå•ä¸å¯ç”¨â€œæ˜¾ç¤ºå¯¼èˆªâ€æ—¶å¯è§ã€‚" #: doc/classes/ProjectSettings.xml msgid "" "Color of the navigation geometry, visible when \"Visible Navigation\" is " "enabled in the Debug menu." -msgstr "å¯¼èˆªå‡ ä½•å›¾å½¢çš„é¢œè‰²ï¼Œåœ¨è°ƒè¯•èœå•ä¸å¯ç”¨â€œå¯è§å¯¼èˆªâ€æ—¶å¯è§ã€‚" +msgstr "å¯¼èˆªå‡ ä½•å›¾å½¢çš„é¢œè‰²ï¼Œåœ¨è°ƒè¯•èœå•ä¸å¯ç”¨â€œæ˜¾ç¤ºå¯¼èˆªâ€æ—¶å¯è§ã€‚" #: doc/classes/ProjectSettings.xml msgid "Custom image for the mouse cursor (limited to 256×256)." -msgstr "é¼ æ ‡å…‰æ ‡çš„è‡ªå®šä¹‰å›¾åƒ(最大256×256)。" +msgstr "é¼ æ ‡å…‰æ ‡çš„è‡ªå®šä¹‰å›¾åƒï¼ˆæœ€å¤§ 256×256)。" #: doc/classes/ProjectSettings.xml msgid "Hotspot for the custom mouse cursor image." @@ -59690,6 +59919,11 @@ msgid "" "- [code]2[/code] (snake_case): Converts the scene root name to snake_case " "casing." msgstr "" +"场景文件的默认命åé£Žæ ¼ï¼Œä»Žåœºæ™¯æ ¹èŠ‚ç‚¹æŽ¨å¯¼æ—¶ä½¿ç”¨ã€‚å¯èƒ½çš„选项有:\n" +"- [code]0[/code]ï¼ˆè‡ªåŠ¨ï¼‰ï¼šä¿æŒåœºæ™¯æ ¹èŠ‚ç‚¹å称,ä¸ä¿®æ”¹å¤§å°å†™ã€‚\n" +"- [code]1[/code](PascalCaseï¼‰ï¼šå°†åœºæ™¯æ ¹èŠ‚ç‚¹å称转æ¢ä¸º PascalCase 驼峰风" +"æ ¼ã€‚\n" +"- [code]2[/code](snake_caseï¼‰ï¼šå°†åœºæ™¯æ ¹èŠ‚ç‚¹å称转æ¢ä¸º snake_case è›‡å½¢é£Žæ ¼ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59697,7 +59931,7 @@ msgid "" "script templates both in the editor-specific path and in this project-" "specific path." msgstr "" -"对于项目特定的脚本模æ¿çš„æœç´¢è·¯å¾„ã€‚ Godot 将在编辑器的特定路径和æ¤é¡¹ç›®çš„路径ä¸" +"对于项目特定的脚本模æ¿çš„æœç´¢è·¯å¾„ã€‚Godot 将在编辑器的特定路径和æ¤é¡¹ç›®çš„路径ä¸" "æœç´¢ã€‚" #: doc/classes/ProjectSettings.xml @@ -59730,8 +59964,8 @@ msgid "" "Default value for [member ScrollContainer.scroll_deadzone], which will be " "used for all [ScrollContainer]s unless overridden." msgstr "" -"[member ScrollContainer.scroll_deadzone],它将用于所有[ScrollContainer]s,除" -"éžé‡å†™ã€‚" +"[member ScrollContainer.scroll_deadzone],它将用于所有 [ScrollContainer],除" +"éžfug。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59757,8 +59991,8 @@ msgid "" "If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and " "UWP to follow interface conventions." msgstr "" -"如果[code]true[/code],在Windowså’ŒUWPçš„å¯¹è¯æ¡†ä¸äº¤æ¢ç¡®å®šå’Œå–消按钮,以éµå¾ªç•Œé¢" -"惯例。" +"如果为 [code]true[/code],在Windowså’ŒUWPçš„å¯¹è¯æ¡†ä¸äº¤æ¢ç¡®å®šå’Œå–消按钮,以éµå¾ª" +"ç•Œé¢æƒ¯ä¾‹ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -59776,17 +60010,17 @@ msgstr "自定义 [Font] 资æºçš„路径,用于项目的所有 GUI å…ƒç´ çš„é» #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], makes sure the theme used works with HiDPI." -msgstr "如果[code]true[/code],确ä¿ä½¿ç”¨çš„主题将在HiDPI下工作。" +msgstr "如果为 [code]true[/code],确ä¿ä½¿ç”¨çš„主题将在 HiDPI 下工作。" #: doc/classes/ProjectSettings.xml msgid "" "Timer setting for incremental search in [Tree], [ItemList], etc. controls " "(in milliseconds)." -msgstr "在[Tree], [ItemList]ç‰æŽ§ä»¶ä¸ä¸ºå¢žé‡æœç´¢è®¾ç½®è®¡æ—¶å™¨(以毫秒为å•ä½)。" +msgstr "在 [Tree]ã€[ItemList] ç‰æŽ§ä»¶ä¸ä¸ºå¢žé‡æœç´¢è®¾ç½®è®¡æ—¶å™¨ï¼ˆå•ä½ä¸ºæ¯«ç§’)。" #: doc/classes/ProjectSettings.xml msgid "Timer for detecting idle in [TextEdit] (in seconds)." -msgstr "检测[TextEdit]空闲的计时器(å•ä½ä¸ºç§’)。" +msgstr "检测 [TextEdit] 空闲的计时器(å•ä½ä¸ºç§’)。" #: doc/classes/ProjectSettings.xml msgid "Default delay for tooltips (in seconds)." @@ -59900,10 +60134,11 @@ msgid "" "necessary for the internal logic of several [Control]s. The events assigned " "to the action can however be modified." msgstr "" -"默认的在[Control](例如[ItemList]或[Tree])ä¸ä¸‹æ‹‰é¡µé¢çš„[InputEventAction],与典" -"型桌é¢UI系统ä¸[constant KEY_PAGEDOWN]的行为相匹é…。\n" -"[b]注æ„:[/b]默认的[code]ui_*[/code]动作ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒä»¬æ˜¯å‡ ä¸ª[Control]çš„" -"内部逻辑所必需的。但是,å¯ä»¥ä¿®æ”¹åˆ†é…给该æ“作的事件。" +"默认的在 [Control](例如 [ItemList] 或 [Tree])ä¸å‘下翻页的 " +"[InputEventAction]ï¼Œä¸Žå…¸åž‹æ¡Œé¢ UI ç³»ç»Ÿä¸ [constant KEY_PAGEDOWN] 的行为相匹" +"é…。\n" +"[b]注æ„:[/b]默认的 [code]ui_*[/code] 动作ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒä»¬æ˜¯å‡ ä¸ª " +"[Control] 的内部逻辑所必需的。但是,å¯ä»¥ä¿®æ”¹åˆ†é…给该æ“作的事件。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59914,10 +60149,11 @@ msgid "" "necessary for the internal logic of several [Control]s. The events assigned " "to the action can however be modified." msgstr "" -"默认在[Control](例如[ItemList]或[Tree])ä¸ä¸Šç§»é¡µé¢çš„[InputEventAction],与典型" -"桌é¢UI系统ä¸[constant KEY_PAGEUP]的行为相匹é…。\n" -"[b]注æ„:[/b]默认的[code]ui_*[/code]动作ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒä»¬æ˜¯å‡ ä¸ª[Control]çš„" -"内部逻辑所必需的。但是,å¯ä»¥ä¿®æ”¹åˆ†é…给该æ“作的事件。" +"默认的在 [Control](例如 [ItemList] 或 [Tree])ä¸å‘上翻页的 " +"[InputEventAction]ï¼Œä¸Žå…¸åž‹æ¡Œé¢ UI ç³»ç»Ÿä¸ [constant KEY_PAGEUP] 的行为相匹" +"é…。\n" +"[b]注æ„:[/b]默认的 [code]ui_*[/code] 动作ä¸èƒ½è¢«åˆ é™¤ï¼Œå› ä¸ºå®ƒä»¬æ˜¯å‡ ä¸ª " +"[Control] 的内部逻辑所必需的。但是,å¯ä»¥ä¿®æ”¹åˆ†é…给该æ“作的事件。" #: doc/classes/ProjectSettings.xml msgid "" @@ -59964,12 +60200,12 @@ msgid "" "because they can't run at the target frame rate.\n" "[b]Note:[/b] Currently implemented only in Android." msgstr "" -"如果 [code]true[/code],按键/触摸/æ“纵æ†äº‹ä»¶å°†åœ¨æ¯ä¸ªç©ºé—²å¸§å’Œç‰©ç†å¸§ä¹‹å‰åˆ·" +"如果为 [code]true[/code],按键/触摸/æ“纵æ†äº‹ä»¶å°†åœ¨æ¯ä¸ªç©ºé—²å¸§å’Œç‰©ç†å¸§ä¹‹å‰åˆ·" "新。\n" -"如果 [code]false[/code],æ¤ç±»äº‹ä»¶å°†åœ¨å¼•擎è¿ä»£ä¹‹é—´æ¯ä¸ªç©ºé—²å¸§ä»…刷新一次。\n" +"如果为 [code]false[/code],æ¤ç±»äº‹ä»¶å°†åœ¨å¼•擎è¿ä»£ä¹‹é—´æ¯ä¸ªç©ºé—²å¸§ä»…刷新一次。\n" "å¯ç”¨æ¤åŠŸèƒ½å¯ä»¥å¤§å¤§æé«˜å¯¹è¾“入的å“åº”èƒ½åŠ›ï¼Œç‰¹åˆ«æ˜¯åœ¨éœ€è¦æ¯ä¸ªå¯è§ï¼ˆç©ºé—²ï¼‰å¸§è¿è¡Œå¤š" "个物ç†å¸§çš„设备ä¸ï¼Œå› ä¸ºå®ƒä»¬æ— æ³•ä»¥ç›®æ ‡å¸§é€ŸçŽ‡è¿è¡Œã€‚\n" -"[b]注:[/b] ç›®å‰ä»…在 Android ä¸å®žçŽ°ã€‚" +"[b]注æ„:[/b]ç›®å‰ä»…在 Android ä¸å®žçŽ°ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -60838,7 +61074,7 @@ msgid "" "on threads. If servers get stalled too often when loading resources in a " "thread, increase this number." msgstr "" -"在多线程模å¼ä¸‹ä½¿ç”¨æ—¶ï¼ŒæœåŠ¡å™¨ä¼šä½¿ç”¨å®ƒï¼ˆæœåŠ¡å™¨å’Œå¯è§†åŒ–端)。 RID 是预先分é…的," +"在多线程模å¼ä¸‹ä½¿ç”¨æ—¶ï¼ŒæœåŠ¡å™¨ä¼šä½¿ç”¨å®ƒï¼ˆæœåŠ¡å™¨å’Œå¯è§†åŒ–端)。RID 是预先分é…的," "以é¿å…åœ¨çº¿ç¨‹ä¸Šåœæ¢è¯·æ±‚它们的æœåŠ¡å™¨ã€‚å¦‚æžœåœ¨çº¿ç¨‹ä¸åŠ è½½èµ„æºæ—¶æœåС噍ç»å¸¸å¡é¡¿ï¼Œè¯·" "å¢žåŠ æ¤æ•°å—。" @@ -60966,11 +61202,11 @@ msgstr "使用TCP的连接å°è¯•的超时(以秒为å•ä½ï¼‰ã€‚" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." -msgstr "[WebRTCDataChannel] 输入缓冲区的最大尺寸(å•ä½ï¼šåƒå—节)。" +msgstr "[WebRTCDataChannel] 输入缓冲区的最大尺寸(å•ä½ä¸º kiB)。" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." -msgstr "[WebSocketClient] 输入缓冲区的最大尺寸,以 kiB 为å•ä½ã€‚" +msgstr "[WebSocketClient] 输入缓冲区的最大尺寸(å•ä½ä¸º kiB)。" #: doc/classes/ProjectSettings.xml msgid "Maximum number of concurrent input packets for [WebSocketClient]." @@ -60978,7 +61214,7 @@ msgstr "[WebSocketClient] 的最大并å‘输入数æ®åŒ…数。" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." -msgstr "[WebSocketClient]输出缓冲区的最大尺寸,以kiB为å•ä½ã€‚" +msgstr "[WebSocketClient]输出缓冲区的最大尺寸(å•ä½ä¸º kiB)。" #: doc/classes/ProjectSettings.xml msgid "Maximum number of concurrent output packets for [WebSocketClient]." @@ -60986,7 +61222,7 @@ msgstr "[WebSocketClient]的最大并å‘输出数æ®åŒ…æ•°é‡ã€‚" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." -msgstr "[WebSocketServer]输入缓冲区的最大尺寸,以kiB为å•ä½ã€‚" +msgstr "[WebSocketServer]输入缓冲区的最大尺寸(å•ä½ä¸º kiB)。" #: doc/classes/ProjectSettings.xml msgid "Maximum number of concurrent input packets for [WebSocketServer]." @@ -60994,7 +61230,7 @@ msgstr "[WebSocketServer] 的最大并å‘输入数æ®åŒ…æ•°é‡ã€‚" #: doc/classes/ProjectSettings.xml msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." -msgstr "[WebSocketServer] 输出缓冲区的最大尺寸,以 kiB 为å•ä½ã€‚" +msgstr "[WebSocketServer] 输出缓冲区的最大尺寸(å•ä½ä¸º kiB)。" #: doc/classes/ProjectSettings.xml msgid "Maximum number of concurrent output packets for [WebSocketServer]." @@ -61021,9 +61257,9 @@ msgid "" "bundle will be used.\n" "If in doubt, leave this setting empty." msgstr "" -"用于SSL连接的CAè¯ä¹¦åŒ…。如果设置为éžç©ºå€¼ï¼Œè¿™å°†[i]覆盖[/i]Godot默认的" +"用于 SSL 连接的 CA è¯ä¹¦åŒ…。如果设置为éžç©ºå€¼ï¼Œè¿™å°†[i]覆盖[/i] Godot 默认的 " "[url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-" -"certificates.crt]Mozillaè¯ä¹¦åŒ…[/url]。如果留空,将使用默认的è¯ä¹¦åŒ…。\n" +"certificates.crt]Mozilla è¯ä¹¦åŒ…[/url]。如果留空,将使用默认的è¯ä¹¦åŒ…。\n" "如果有疑问,让这个设置为空。" #: doc/classes/ProjectSettings.xml @@ -61559,8 +61795,8 @@ msgid "" "with hardware skinning, [code]VERTEX[/code] is the position [i]before[/i] " "skinning." msgstr "" -"如果 [code]true[/code],则在 CPU è€Œéž GPU 上执行 2D 蒙皮。这æä¾›äº†ä¸Žå„ç§ç¡¬ä»¶" -"的更大兼容性,并且在æŸäº›æƒ…况下也å¯èƒ½æ›´å¿«ã€‚\n" +"如果为 [code]true[/code],则在 CPU è€Œéž GPU 上执行 2D 蒙皮。这æä¾›äº†ä¸Žå„ç§ç¡¬" +"件的更大兼容性,并且在æŸäº›æƒ…况下也å¯èƒ½æ›´å¿«ã€‚\n" "当å‰ä»…在 [member rendering/batching/options/use_batching] å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶å¯" "用。\n" "[b]注æ„:[/b]䏿”¯æŒæŠ—锯齿软件蒙皮多边形,将在没有抗锯齿的情况下渲染。\n" @@ -61576,8 +61812,8 @@ msgid "" "Consider using the project setting [member rendering/batching/precision/" "uv_contract] to prevent artifacts." msgstr "" -"如果 [code]true[/code],则在 2D 渲染ä¸å¼ºåˆ¶å°†é¡¶ç‚¹å¯¹é½åˆ°åƒç´ 。å¯èƒ½æœ‰åŠ©äºŽæŸäº›åƒ" -"ç´ è‰ºæœ¯é£Žæ ¼ã€‚\n" +"如果为 [code]true[/code],则在 2D 渲染ä¸å¼ºåˆ¶å°†é¡¶ç‚¹å¯¹é½åˆ°åƒç´ 。å¯èƒ½æœ‰åŠ©äºŽæŸäº›" +"åƒç´ è‰ºæœ¯é£Žæ ¼ã€‚\n" "è¿™ç§æ•æ‰æ˜¯åœ¨é¡¶ç‚¹ç€è‰²å™¨ä¸çš„ GPU 上执行的。\n" "考虑使用项目设置[member rendering/batching/precision/uv_contract] æ¥é˜²æ¢å‡ºçް" "伪影。" @@ -61821,6 +62057,7 @@ msgstr "" "义。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" "This is the maximum number of shaders that can be compiled (or reconstructed " "from cache) at the same time.\n" @@ -61836,9 +62073,8 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" "这是åŒä¸€æ—¶é—´æ‰€èƒ½ç¼–译(或者从缓å˜ä¸é‡å»ºï¼‰çš„ç€è‰²å™¨çš„æœ€å¤§æ•°é‡ã€‚\n" "在è¿è¡Œæ—¶ï¼Œå¦‚果已ç»è¾¾åˆ°äº†è¿™ä¸ªæ•°é‡ï¼Œå…¶ä»–能够进行异æ¥ç¼–译的ç€è‰²å™¨ä¼šç›´æŽ¥ä½¿ç”¨å®ƒä»¬" @@ -61852,14 +62088,31 @@ msgstr "" "义。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" +"默认是针对 [code]rendering/gles3/shaders/max_concurrent_compiles[/code] 的覆" +"盖,å–值éžå¸¸ä¿å®ˆã€‚\n" +"æ ¹æ®ä½ æ‰€è®¾å®šä¸ºç›®æ ‡çš„ç‰¹å®šè®¾å¤‡ï¼Œä½ å¯èƒ½ä¼šæƒ³è¦æé«˜è¿™ä¸ªå€¼ã€‚\n" +"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" +"shader_compilation_mode[/code] [b]ä¸ä¸º[/b] [code]Synchronous[/code] 时有æ„" +"义。" + +#: doc/classes/ProjectSettings.xml +#, fuzzy +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" "默认是针对 [code]rendering/gles3/shaders/max_concurrent_compiles[/code] 的覆" "盖,å–值éžå¸¸ä¿å®ˆã€‚\n" @@ -61869,13 +62122,13 @@ msgstr "" "义。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" "超级ç€è‰²å™¨ç¼“å˜æ‰€èƒ½å¢žé•¿åˆ°çš„æœ€å¤§å¤§å°ï¼Œå•ä½ä¸ºå…†å—节。在å¯åŠ¨æ—¶ï¼Œä¼šåˆ é™¤æœ€ä¹…æœªç”¨çš„" "æ¡ç›®ï¼Œç›´åˆ°æ€»å¤§å°åˆ°è¾¾èŒƒå›´å†…。\n" @@ -61884,13 +62137,30 @@ msgstr "" "义。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" +"[code]rendering/gles3/shaders/ubershader_cache_size_mb[/code] 的覆盖项,为针" +"对移动平å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" +"[b]注æ„:[/b]本设置仅在 [code]rendering/gles3/shaders/" +"shader_compilation_mode[/code] 为 [code]Asynchronous + Cache[/code] 时有æ„" +"义。" + +#: doc/classes/ProjectSettings.xml +#, fuzzy +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" "[code]rendering/gles3/shaders/ubershader_cache_size_mb[/code] 的覆盖项,为针" "对移动平å°é…置更å°çš„æœ€å¤§å¤§å°ï¼Œç§»åЍ平å°çš„å˜å‚¨ç©ºé—´æ›´æœ‰é™ã€‚\n" @@ -61942,9 +62212,10 @@ msgstr "" "ç€è‰²å™¨ä¹Ÿä¸ä¼šä½¿ç”¨å¼‚æ¥ç¼–译。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" @@ -61953,6 +62224,18 @@ msgstr "" "移动 GPU 通常ä¸ä¼šæ”¯æŒè¶…级ç€è‰²å™¨ï¼Œå› ä¸ºå…¶å¤æ‚度较高。" #: doc/classes/ProjectSettings.xml +#, fuzzy +msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" +"[code]rendering/gles3/shaders/shader_compilation_mode[/code] 的覆盖项,用于为" +"移动设备ç¦ç”¨å¼‚æ¥ç¼–译。\n" +"移动 GPU 通常ä¸ä¼šæ”¯æŒè¶…级ç€è‰²å™¨ï¼Œå› ä¸ºå…¶å¤æ‚度较高。" + +#: doc/classes/ProjectSettings.xml msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." @@ -62270,7 +62553,7 @@ msgid "" "VRAM-compressed textures will be exported on Android and iOS, increasing the " "data pack's size." msgstr "" -"如果 [code]true[/code]ï¼Œä¸”ä¸æ”¯æŒ GLES3 驱动程åºï¼Œåˆ™å…许回退到 GLES2 驱动程" +"如果为 [code]true[/code]ï¼Œä¸”ä¸æ”¯æŒ GLES3 驱动程åºï¼Œåˆ™å…许回退到 GLES2 驱动程" "åºã€‚\n" "[b]注æ„:[/b]两个显å¡é©±åЍ䏿˜¯äº’相替代的,所以为 GLES3 设计的游æˆåœ¨å›žé€€åˆ° " "GLES2 æ—¶å¯èƒ½æ— 法æ£å¸¸è¿è¡Œã€‚特别是,GLES3 åŽç«¯çš„æŸäº›åŠŸèƒ½åœ¨ GLES2 ä¸ä¸å¯ç”¨ã€‚å¯ç”¨" @@ -62307,9 +62590,8 @@ msgid "" "[member rendering/quality/filters/use_fxaa]." msgstr "" "如果设置为大于 [code]0.0[/code] 的值,对比度自适应é”化将应用于 3D 视å£ã€‚这具" -"æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ç”¨äºŽæ¢å¤ä½¿ç”¨ FXAA æ—¶æŸå¤±çš„一些é”度。 [code]0.5[/code] 附" -"近的值通常会给出最好的结果。å¦è§ [member rendering/quality/filters/" -"use_fxaa]。" +"æœ‰è¾ƒä½Žçš„æ€§èƒ½æˆæœ¬ï¼Œå¯ç”¨äºŽæ¢å¤ä½¿ç”¨ FXAA æ—¶æŸå¤±çš„一些é”度。[code]0.5[/code] 附近" +"的值通常会给出最好的结果。å¦è§ [member rendering/quality/filters/use_fxaa]。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62327,8 +62609,8 @@ msgstr "" "如果为 [code]true[/code],则使用快速åŽå¤„ç†è¿‡æ»¤å™¨ä½¿æ¡å¸¦æ˜Žæ˜¾ä¸é‚£ä¹ˆæ˜Žæ˜¾ã€‚在æŸäº›" "情况下,去带å¯èƒ½ä¼šå¼•å…¥ç¨å¾®æ˜Žæ˜¾çš„æŠ–动模å¼ã€‚å»ºè®®ä»…åœ¨å®žé™…éœ€è¦æ—¶å¯ç”¨åŽ»æ¡å¸¦ï¼Œå› 为" "抖动模å¼ä¼šä½¿æ— æŸåŽ‹ç¼©çš„å±å¹•截图更大。\n" -"[b]注æ„:[/b]仅在 GLES3 åŽç«¯å¯ç”¨ã€‚ [member rendering/quality/depth/hdr] 也必" -"须为 [code]true[/code] æ‰èƒ½ä½¿åŽ»è‰²å¸¦æœ‰æ•ˆã€‚\n" +"[b]注æ„:[/b]仅在 GLES3 åŽç«¯å¯ç”¨ã€‚[member rendering/quality/depth/hdr] 也必须" +"为 [code]true[/code] æ‰èƒ½ä½¿åŽ»è‰²å¸¦æœ‰æ•ˆã€‚\n" "[b]注æ„:[/b]已知在移动平å°ä¸Šçš„去色带å˜åœ¨ç ´åæ¸²æŸ“çš„é—®é¢˜ã€‚å› æ¤ï¼Œå»ºè®®åœ¨ç”¨äºŽç§»åЍ" "平尿—¶ç¦ç”¨æ¤é€‰é¡¹ã€‚" @@ -62354,10 +62636,10 @@ msgid "" "mobile as less memory bandwidth is used. If [code]false[/code], linear " "mipmap filtering (also called \"trilinear filtering\") is used." msgstr "" -"如果 [code]true[/code],则在使用 mipmap 时使用最近邻 mipmap 过滤(也称为“åŒçº¿" -"性过滤â€ï¼‰ï¼Œè¿™å°†å¯¼è‡´ mipmap 阶段之间出现å¯è§çš„æŽ¥ç¼ã€‚由于使用较少的内å˜å¸¦å®½ï¼Œè¿™" -"å¯èƒ½ä¼šæé«˜ç§»åŠ¨è®¾å¤‡çš„æ€§èƒ½ã€‚å¦‚æžœ [code]false[/code],则使用线性 mipmap 过滤(也" -"称为“三线性过滤â€ï¼‰ã€‚" +"如果为 [code]true[/code],则在使用 mipmap 时使用最近邻 mipmap 过滤(也称为“åŒ" +"线性过滤â€ï¼‰ï¼Œè¿™å°†å¯¼è‡´ mipmap 阶段之间出现å¯è§çš„æŽ¥ç¼ã€‚由于使用较少的内å˜å¸¦å®½ï¼Œ" +"è¿™å¯èƒ½ä¼šæé«˜ç§»åŠ¨è®¾å¤‡çš„æ€§èƒ½ã€‚å¦‚æžœ [code]false[/code],则使用线性 mipmap 过滤" +"(也称为“三线性过滤â€ï¼‰ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -62380,8 +62662,8 @@ msgid "" "framebuffer_allocation] on mobile devices, due to performance concerns or " "driver support." msgstr "" -"由于性能或驱动支æŒé—®é¢˜ï¼Œåœ¨ç§»åŠ¨è®¾å¤‡ä¸Šå¯¹[member rendering/quality/" -"intended_usage/framebuffer_allocation]ä»¥ä½Žé…æ•°å€¼è¦†ç›–。" +"由于性能或驱动支æŒé—®é¢˜ï¼Œåœ¨ç§»åŠ¨è®¾å¤‡ä¸Šå¯¹ [member rendering/quality/" +"intended_usage/framebuffer_allocation] ä»¥ä½Žé…æ•°å€¼è¦†ç›–。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62397,8 +62679,8 @@ msgid "" "Lower-end override for [member rendering/quality/lightmapping/" "use_bicubic_sampling] on mobile devices, in order to reduce bandwidth usage." msgstr "" -"在移动设备上对[member rendering/quality/lightmapping/use_bicubic_sampling]è¿›" -"行低端覆盖,以å‡å°‘带宽使用。" +"在移动设备上对 [member rendering/quality/lightmapping/use_bicubic_sampling] " +"进行低端覆盖,以å‡å°‘带宽使用。" #: doc/classes/ProjectSettings.xml msgid "" @@ -62422,8 +62704,8 @@ msgid "" "variants of reflection probes and panorama backgrounds (sky). Those blurred " "variants are used by rough materials." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨å¤§é‡æ ·æœ¬æ¥åˆ›å»ºå射探针和全景背景(天空)的模糊" -"å˜ä½“。这些模糊的å˜ä½“å¯ä»¥è¢«ç²—糙的æè´¨ä½¿ç”¨ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨å¤§é‡æ ·æœ¬æ¥åˆ›å»ºå射探针和全景背景(天空)的模" +"糊å˜ä½“。这些模糊的å˜ä½“å¯ä»¥è¢«ç²—糙的æè´¨ä½¿ç”¨ã€‚" #: doc/classes/ProjectSettings.xml msgid "" @@ -62444,7 +62726,7 @@ msgid "" "[b]Note:[/b] Low and mid range hardware do not support complex irradiance " "maps well and may crash if this is set too high." msgstr "" -"é™åˆ¶è¾ç…§åº¦è´´å›¾çš„大å°ï¼Œé€šå¸¸ç”± [member Sky.radiance_size] 确定。与[member " +"é™åˆ¶è¾ç…§åº¦è´´å›¾çš„大å°ï¼Œé€šå¸¸ç”± [member Sky.radiance_size] 确定。与 [member " "rendering/quality/reflections/high_quality_ggx] 类似,更大的尺寸会产生更高质" "é‡çš„è¾ç…§åº¦è´´å›¾ã€‚使用高频 HDRI 贴图时使用较高的值,å¦åˆ™è¯·å°½å¯èƒ½é™ä½Žè¯¥å€¼ã€‚\n" "[b]注æ„:[/b]ä¸ä½Žæ¡£ç¡¬ä»¶ä¸èƒ½å¾ˆå¥½åœ°æ”¯æŒå¤æ‚çš„è¾ç…§åº¦è´´å›¾ï¼Œå¦‚果设置太高å¯èƒ½ä¼šå´©" @@ -62715,8 +62997,8 @@ msgid "" "Try enabling this option if you see any visual anomalies in 3D (such as " "incorrect object visibility)." msgstr "" -"如果 [code]true[/code],则将在渲染和 Godot 物ç†ä¸ä½¿ç”¨çº¿ç¨‹å®‰å…¨ç‰ˆæœ¬çš„ BVH(边界" -"体积层次结构)。\n" +"如果为 [code]true[/code],则将在渲染和 Godot 物ç†ä¸ä½¿ç”¨çº¿ç¨‹å®‰å…¨ç‰ˆæœ¬çš„ BVH(边" +"界体积层次结构)。\n" "如果您在 3D ä¸çœ‹åˆ°ä»»ä½•è§†è§‰å¼‚å¸¸ï¼Œä¾‹å¦‚ä¸æ£ç¡®çš„å¯è§æ€§å¯¹è±¡ï¼Œè¯·å°è¯•å¯ç”¨æ¤é€‰é¡¹ã€‚" #: doc/classes/ProjectSettings.xml @@ -63135,7 +63417,7 @@ msgid "" "operations (obtaining axis-angle and performing SLERP, in particular) are " "more efficient and robust against floating-point errors." msgstr "" -"一个用于表示 3D 旋转的å•ä½å››å…ƒæ•°ã€‚四元数需è¦ç»è¿‡å½’一化æ‰èƒ½ç”¨äºŽæ—‹è½¬ã€‚\n" +"用于表示 3D 旋转的å•ä½å››å…ƒæ•°ã€‚四元数需è¦ç»è¿‡å½’一化æ‰èƒ½ç”¨äºŽæ—‹è½¬ã€‚\n" "它类似于 Basis,åŽè€…实现了旋转的矩阵表示,并且å¯ä»¥ä½¿ç”¨è½´-è§’å¯¹æˆ–æ¬§æ‹‰è§’è¿›è¡Œå‚æ•°" "化。Basis å¯ä»¥å˜å‚¨æ—‹è½¬ã€ç¼©æ”¾å’Œé”™åˆ‡ï¼Œè€Œ Quat åªå˜å‚¨æ—‹è½¬ã€‚\n" "由于它的紧凑性和在内å˜ä¸çš„å˜å‚¨æ–¹å¼ï¼ŒæŸäº›æ“作(特别是获得轴角和执行 SLERP)更" @@ -63307,12 +63589,12 @@ msgid "" "[Basis] matrix. If a vector is transformed by an identity quaternion, it " "will not change." msgstr "" -"å•ä½å››å…ƒæ•°ï¼Œä»£è¡¨æ— æ—‹è½¬ã€‚ç‰æ•ˆäºŽå•ä½ [Basis] 矩阵。如果一个å‘é‡è¢«ä¸€ä¸ªå•ä½å››å…ƒæ•°" +"å•ä½å››å…ƒæ•°ï¼Œä»£è¡¨æ— 旋转。相当于å•ä½ [Basis] 矩阵。如果一个å‘é‡è¢«ä¸€ä¸ªå•ä½å››å…ƒæ•°" "å˜æ¢ï¼Œå®ƒä¸ä¼šæ”¹å˜ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "A class for generating pseudo-random numbers." -msgstr "一个用于生æˆä¼ªéšæœºæ•°çš„ç±»ã€‚" +msgstr "用于生æˆä¼ªéšæœºæ•°çš„ç±»ã€‚" #: doc/classes/RandomNumberGenerator.xml msgid "" @@ -63336,8 +63618,8 @@ msgid "" msgstr "" "RandomNumberGenerator 是一个用于生æˆä¼ªéšæœºæ•°çš„ç±»ã€‚å®ƒç›®å‰ä½¿ç”¨ [url=http://www." "pcg-random.org/]PCG32[/url]。\n" -"[b]注:[/b]åº•å±‚ç®—æ³•æ˜¯å®žçŽ°ç»†èŠ‚ã€‚å› æ¤ï¼Œè·¨ Godot 版本的å¯é‡å¤éšæœºæµä¸åº”该ä¾èµ–于" -"æ¤ã€‚\n" +"[b]注æ„:[/b]åº•å±‚ç®—æ³•æ˜¯å®žçŽ°ç»†èŠ‚ã€‚å› æ¤ï¼Œè·¨ Godot 版本的å¯é‡å¤éšæœºæµä¸åº”该ä¾èµ–" +"于æ¤ã€‚\n" "è¦æ ¹æ®æ—¶é—´ç›¸å…³ç§å生æˆéšæœºæµ®ç‚¹æ•°ï¼Œåœ¨ç»™å®šèŒƒå›´å†…ï¼š\n" "[codeblock]\n" "var rng = RandomNumberGenerator.new()\n" @@ -63345,7 +63627,7 @@ msgstr "" " rng.randomize()\n" " var my_random_number = rng.randf_range(-10.0, 10.0)\n" "[/codeblock]\n" -"[b]注:[/b] [member seed] å’Œ [member state] å±žæ€§çš„é»˜è®¤å€¼æ˜¯ä¼ªéšæœºçš„,在调用" +"[b]注æ„:[/b][member seed] å’Œ [member state] å±žæ€§çš„é»˜è®¤å€¼æ˜¯ä¼ªéšæœºçš„,在调用 " "[method randomize] 时会å‘生å˜åŒ–。æ¤å¤„记录的 [code]0[/code] 值是一个å ä½ç¬¦ï¼Œè€Œ" "䏿˜¯å®žé™…的默认ç§å。" @@ -63453,10 +63735,10 @@ msgstr "" "[codeblock]\n" "var rng = RandomNumberGenerator.new()\n" "print(rng.randf())\n" -"var saved_state = rng.state # Store current state.\n" -"print(rng.randf()) # Advance internal state.\n" -"rng.state = saved_state # Restore the state.\n" -"print(rng.randf()) # Prints the same value as in previous.\n" +"var saved_state = rng.state # ä¿å˜å½“å‰çжæ€ã€‚\n" +"print(rng.randf()) # 让内部状æ€å‘生æ¥è¿›ã€‚\n" +"rng.state = saved_state # æ¢å¤çжæ€ã€‚\n" +"print(rng.randf()) # 输出和之å‰ä¸€æ ·çš„值。\n" "[/codeblock]\n" "[b]注æ„:[/b]ä¸è¦å°†çжæ€è®¾ç½®ä¸ºä»»æ„å€¼ï¼Œå› ä¸ºéšæœºæ•°ç”Ÿæˆå™¨è¦æ±‚状æ€å…·æœ‰æŸäº›ç‰¹æ€§æ‰èƒ½" "æ£å¸¸è¿è¡Œã€‚它应该åªè®¾ç½®ä¸ºæ¥è‡ªçжæ€å±žæ€§æœ¬èº«çš„值。è¦ä½¿ç”¨ä»»æ„输入åˆå§‹åŒ–éšæœºæ•°ç”Ÿæˆ" @@ -63495,20 +63777,20 @@ msgstr "使该 [Range] åœæ¢ä¸Žä»»ä½•å…¶ä»– Range 共享其æˆå‘˜å˜é‡ã€‚" #: doc/classes/Range.xml msgid "" "If [code]true[/code], [member value] may be greater than [member max_value]." -msgstr "如果[code]true[/code],[member value]å¯èƒ½å¤§äºŽ[member max_value]。" +msgstr "如果为 [code]true[/code],[member value]å¯èƒ½å¤§äºŽ[member max_value]。" #: doc/classes/Range.xml msgid "" "If [code]true[/code], [member value] may be less than [member min_value]." -msgstr "如果[code]true[/code],[member value]å¯èƒ½å°äºŽ[member min_value]。" +msgstr "如果为 [code]true[/code],[member value]å¯èƒ½å°äºŽ[member min_value]。" #: doc/classes/Range.xml msgid "" "If [code]true[/code], and [code]min_value[/code] is greater than 0, " "[code]value[/code] will be represented exponentially rather than linearly." msgstr "" -"如果[code]true[/code],并且[code]min_value[/code]大于0,[code]value[/code]å°†" -"以指数方å¼è€Œä¸æ˜¯çº¿æ€§æ–¹å¼è¡¨ç¤ºã€‚" +"如果为 [code]true[/code],并且[code]min_value[/code]大于0,[code]value[/code]" +"将以指数方å¼è€Œä¸æ˜¯çº¿æ€§æ–¹å¼è¡¨ç¤ºã€‚" #: doc/classes/Range.xml msgid "" @@ -63542,7 +63824,7 @@ msgid "" "If [code]true[/code], [code]value[/code] will always be rounded to the " "nearest integer." msgstr "" -"如果 [code]true[/code],[code]value[/code] 将始终四èˆäº”入到最接近的整数。" +"如果为 [code]true[/code],[code]value[/code] 将始终四èˆäº”入到最接近的整数。" #: doc/classes/Range.xml msgid "" @@ -63838,7 +64120,7 @@ msgstr "射线的长度。" #: doc/classes/RayShape.xml doc/classes/RayShape2D.xml msgid "If [code]true[/code], allow the shape to return the correct normal." -msgstr "如果 [code]true[/code],则å…许形状返回æ£ç¡®çš„æ³•线。" +msgstr "如果为 [code]true[/code],则å…许形状返回æ£ç¡®çš„æ³•线。" #: doc/classes/RayShape2D.xml msgid "Ray shape for 2D collisions." @@ -64029,7 +64311,7 @@ msgid "" "free references that are no longer in use. This means that unused references " "will linger on for a while before being removed." msgstr "" -"ä»»ä½•ä¿æŒå¼•用计数对象的基类。 [Resource] 和许多其他辅助对象继承了这个类。\n" +"ä»»ä½•ä¿æŒå¼•用计数对象的基类。[Resource] 和许多其他辅助对象继承了这个类。\n" "与其他 [Object] 类型ä¸åŒï¼ŒReference ä¿ç•™ä¸€ä¸ªå†…部引用计数器,以便在ä¸ä½¿ç”¨ä¸”ä»…" "åœ¨é‚£æ—¶è‡ªåŠ¨é‡Šæ”¾ã€‚å› æ¤ï¼Œä¸éœ€è¦ä½¿ç”¨ [method Object.free] 手动释放引用。\n" "在ç»å¤§å¤šæ•°ç”¨ä¾‹ä¸ï¼Œæ‚¨åªéœ€è¦å®žä¾‹åŒ–和使用 [Reference] 派生类型。æ¤ç±»ä¸æä¾›çš„æ–¹æ³•" @@ -64077,8 +64359,8 @@ msgid "" "display a rectangle filled with a solid color, consider using [ColorRect] " "instead." msgstr "" -"矩形框,仅在其矩形周围显示 [member border_color] 边框颜色。 [ReferenceRect] " -"没有填充 [Color]ã€‚å¦‚æžœä½ éœ€è¦æ˜¾ç¤ºå¡«å……纯色的矩形,请考虑使用 [ColorRect] 。" +"矩形框,仅在其矩形周围显示 [member border_color] 边框颜色。[ReferenceRect] 没" +"有填充 [Color]ã€‚å¦‚æžœä½ éœ€è¦æ˜¾ç¤ºå¡«å……纯色的矩形,请考虑使用 [ColorRect] 。" #: doc/classes/ReferenceRect.xml msgid "Sets the border [Color] of the [ReferenceRect]." @@ -64178,8 +64460,8 @@ msgid "" "the reflection probe slower to render; you may want to disable this if using " "the [constant UPDATE_ALWAYS] [member update_mode]." msgstr "" -"如果[code]true[/code],则在å射探测ä¸è®¡ç®—阴影。这使得å射探针渲染更慢;如果想" -"ç¦ç”¨å®ƒ,å¯ä»¥ä½¿ç”¨ [constant UPDATE_ALWAYS] [member update_mode]。" +"如果为 [code]true[/code],则在å射探测ä¸è®¡ç®—阴影。这使得å射探针渲染更慢;如果" +"想ç¦ç”¨å®ƒ,å¯ä»¥ä½¿ç”¨ [constant UPDATE_ALWAYS] [member update_mode]。" #: doc/classes/ReflectionProbe.xml msgid "" @@ -64228,7 +64510,7 @@ msgid "" "lighting is then controlled by the [code]interior_ambient_*[/code] " "properties." msgstr "" -"如果[code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”±" +"如果为 [code]true[/code],å射将忽略天空的贡献。然åŽçŽ¯å¢ƒç…§æ˜Žç”±" "[code]internal_ambient_*[/code]属性控制。" #: doc/classes/ReflectionProbe.xml @@ -64364,61 +64646,63 @@ msgid "" "[b]Tip:[/b] You can use [url=https://regexr.com/]Regexr[/url] to test " "regular expressions online." msgstr "" -"æ£åˆ™è¡¨è¾¾å¼ï¼ˆæˆ–ç§°regex)是一ç§ç´§å‡‘çš„è¯è¨€ï¼Œå¯ç”¨äºŽè¯†åˆ«éµå¾ªç‰¹å®šæ¨¡å¼çš„å—符串,如" -"URLã€ç”µå邮件地å€ã€å®Œæ•´å¥åç‰ã€‚例如,一个[code]ab[0-9][/code]çš„æ£åˆ™è¡¨è¾¾å¼å¯ä»¥" -"找到[code]ab[/code]åŽé¢è·Ÿç€[code]0[/code]到[code]9[/code]的任何数å—çš„å—符串。" -"è¦æƒ³æ›´æ·±å…¥åœ°äº†è§£ï¼Œä½ å¯ä»¥å¾ˆå®¹æ˜“地在互è”网上找到å„ç§æ•™ç¨‹å’Œè¯¦ç»†è§£é‡Šã€‚\n" -"首先,在使用RegEx对象之å‰ï¼Œéœ€è¦ç”¨[method compile] 对其进行æœç´¢æ¨¡å¼çš„编译。\n" +"æ£åˆ™è¡¨è¾¾å¼ï¼ˆæˆ–ç§° regex)是一ç§ç´§å‡‘çš„è¯è¨€ï¼Œå¯ç”¨äºŽè¯†åˆ«éµå¾ªç‰¹å®šæ¨¡å¼çš„å—符串,如 " +"URLã€ç”µå邮件地å€ã€å®Œæ•´å¥åç‰ã€‚例如æ£åˆ™è¡¨è¾¾å¼ [code]ab[0-9][/code] å¯ä»¥æ‰¾åˆ° " +"[code]ab[/code] åŽé¢è·Ÿç€ [code]0[/code] 到 [code]9[/code] 的任何数å—çš„å—符" +"ä¸²ã€‚è¦æƒ³æ›´æ·±å…¥åœ°äº†è§£ï¼Œä½ å¯ä»¥å¾ˆå®¹æ˜“地在互è”网上找到å„ç§æ•™ç¨‹å’Œè¯¦ç»†è§£é‡Šã€‚\n" +"首先,在使用 RegEx 对象之å‰ï¼Œéœ€è¦ç”¨ [method compile] 对其进行æœç´¢æ¨¡å¼çš„ç¼–" +"译。\n" "[codeblock]\n" "var regex = RegEx.new()\n" "regex.compile(\"\\\\w-(\\\\d+)\")\n" "[/codeblock]\n" -"在为表达å¼è½¬ä¹‰ä¹‹å‰ï¼Œå¿…须先为GDScript转义æœç´¢æ¨¡å¼ã€‚例如,[code]compile(\"\\" -"\\d+\")[/code]会被RegEx读æˆ[code]\\d+[/code]ã€‚åŒæ ·ï¼Œ[code]compile(\"\\\"(?:\\" -"\\\\\\.|[^\\\"])*\\\")[/code]会被读作[code]\"(?:\\.|[^\"])*\"[/code]。\n" -"使用 [method search] ï¼Œä½ å¯ä»¥åœ¨ç»™å®šçš„æ–‡æœ¬ä¸åŒ¹é…模å¼ã€‚如果匹é…到一个模å¼ï¼Œå°†è¿”" -"回[RegExMatch]ï¼Œä½ å¯ä»¥ä½¿ç”¨[method RegExMatch.get_string]å’Œ[method RegExMatch." -"get_start]ç‰æ–¹æ³•检索结果的细节。\n" +"在为表达å¼è½¬ä¹‰ä¹‹å‰ï¼Œå¿…须先为 GDScript 转义æœç´¢æ¨¡å¼ã€‚例如,[code]compile(\"\\" +"\\d+\")[/code] 会被 RegEx è¯»æˆ [code]\\d+[/code]ã€‚åŒæ ·ï¼Œ[code]compile(\"\\" +"\"(?:\\\\\\\\.|[^\\\"])*\\\")[/code] 会被读作 [code]\"(?:\\.|[^\"])*\"[/" +"code]。\n" +"使用 [method search]ï¼Œä½ å¯ä»¥åœ¨ç»™å®šçš„æ–‡æœ¬ä¸åŒ¹é…模å¼ã€‚如果匹é…到一个模å¼ï¼Œå°†è¿”" +"回 [RegExMatch]ï¼Œä½ å¯ä»¥ä½¿ç”¨ [method RegExMatch.get_string] å’Œ [method " +"RegExMatch.get_start] ç‰æ–¹æ³•检索结果的细节。\n" "[codeblock]\n" "var regex = RegEx.new()\n" "regex.compile(\"\\\\w-(\\\\d+)\")\n" "var result = regex.search(\"abc n-0123\")\n" "if result:\n" -" print(result.get_string()) # Would print n-0123\n" +" print(result.get_string()) # 会输出 n-0123\n" "[/codeblock]\n" -"æ•获组的结果[code]()[/code]å¯ä»¥é€šè¿‡å‘[RegExMatch]ä¸çš„å„ç§æ–¹æ³•ä¼ é€’ç»„å·æ¥æ£€ç´¢ã€‚" -"默认是组0,并且将总是指整个模å¼ã€‚在上é¢çš„例åä¸ï¼Œè°ƒç”¨[code]result." -"get_string(1)[/code]会得到[code]0123[/code]。\n" -"这个版本的RegEx也支æŒå‘½åçš„æ•获组,åç§°å¯ä»¥ç”¨æ¥æ£€ç´¢ç»“果。如果两个或更多的组有" -"相åŒçš„å称,那么这个åç§°å°†åªæŒ‡ç¬¬ä¸€ä¸ªæœ‰åŒ¹é…的组。\n" +"æ•获组的结果 [code]()[/code] å¯ä»¥é€šè¿‡å‘ [RegExMatch] ä¸çš„å„ç§æ–¹æ³•ä¼ é€’ç»„å·æ¥æ£€" +"索。默认是组 0,并且将总是指整个模å¼ã€‚在上é¢çš„例åä¸ï¼Œè°ƒç”¨ [code]result." +"get_string(1)[/code] 会得到 [code]0123[/code]。\n" +"这个版本的 RegEx 也支æŒå‘½åçš„æ•获组,åç§°å¯ä»¥ç”¨æ¥æ£€ç´¢ç»“果。如果两个或更多的组" +"有相åŒçš„å称,那么这个åç§°å°†åªæŒ‡ç¬¬ä¸€ä¸ªæœ‰åŒ¹é…的组。\n" "[codeblock]\n" "var regex = RegEx.new()\n" "regex.compile(\"d(?<digit>[0-9]+)|x(?<digit>[0-9a-f]+)\")\n" -"var result = regex.search(\"the number is x2f\")\n" +"var result = regex.search(\"æ•°å—æ˜¯ x2f\")\n" "if result:\n" -" print(result.get_string(\"digit\")) # Would print 2f\n" +" print(result.get_string(\"digit\")) # 会输出 2f\n" "[/codeblock]\n" -"å¦‚æžœä½ éœ€è¦å¤„ç†å¤šä¸ªç»“果,[method search_all]会生æˆä¸€ä¸ªæ‰€æœ‰ä¸é‡å 的结果列表。为" -"了方便起è§ï¼Œè¿™å¯ä»¥å’Œä¸€ä¸ª[code]for[/code]循环结åˆèµ·æ¥ã€‚\n" +"å¦‚æžœä½ éœ€è¦å¤„ç†å¤šä¸ªç»“果,[method search_all] 会生æˆä¸€ä¸ªæ‰€æœ‰ä¸é‡å 的结果列表。" +"为了方便起è§ï¼Œè¿™å¯ä»¥å’Œä¸€ä¸ª [code]for[/code] 循环结åˆèµ·æ¥ã€‚\n" "[codeblock]\n" "for result in regex.search_all(\"d01, d03, d0c, x3f and x42\"):\n" " print(result.get_string(\"digit\"))\n" -"# Would print 01 03 0 3f 42\n" +"# 会输出 01 03 0 3f 42\n" "[/codeblock]\n" -"[b]使用RegEx分割å—符串的例å:[/b]\n" +"[b]使用 RegEx 分割å—符串的例å:[/b]\n" "[codeblock]\n" "var regex = RegEx.new()\n" -"regex.compile(\"\\\\S+\") # Negated whitespace character class.\n" +"regex.compile(\"\\\\S+\") # éžç©ºç™½å—符类。\n" "var results = []\n" "for result in regex.search_all(\"One Two \\n\\tThree\"):\n" " results.push_back(result.get_string())\n" -"# The `results` array now contains \"One\", \"Two\", \"Three\".\n" +"# `results` æ•°ç»„åŒ…å« \"One\"ã€\"Two\"ã€\"Three\"。\n" "[/codeblock]\n" -"[b]注æ„:[/b]Godotçš„regex实现是基于[url=https://www.pcre.org/]PCRE2[/url] " -"åº“ã€‚ä½ å¯ä»¥æŸ¥çœ‹å®Œæ•´çš„æ¨¡å¼å‚考[url=https://www.pcre.org/current/doc/html/" +"[b]注æ„:[/b]Godot çš„ regex 实现基于的是 [url=https://www.pcre.org/]PCRE2[/" +"url]ã€‚ä½ å¯ä»¥æŸ¥çœ‹å®Œæ•´çš„æ¨¡å¼å‚考[url=https://www.pcre.org/current/doc/html/" "pcre2pattern.html]这里[/url]。\n" -"[b]æç¤ºï¼š[/b] ä½ å¯ä»¥ä½¿ç”¨[url=https://regexr.com/]Regexr[/url]æ¥åœ¨çº¿æµ‹è¯•æ£åˆ™è¡¨" -"è¾¾å¼ã€‚" +"[b]æç¤ºï¼š[/b] ä½ å¯ä»¥ä½¿ç”¨ [url=https://regexr.com/]Regexr[/url] æ¥åœ¨çº¿æµ‹è¯•æ£åˆ™" +"表达å¼ã€‚" #: modules/regex/doc_classes/RegEx.xml msgid "" @@ -64434,8 +64718,8 @@ msgid "" "compilation is successful. If an error is encountered, details are printed " "to standard output and an error is returned." msgstr "" -"编译并指定è¦ä½¿ç”¨çš„æœç´¢æ¨¡å¼ã€‚如果编译æˆåŠŸï¼Œè¿”å›ž[constant OK]。如果é‡åˆ°é”™è¯¯ï¼Œç»†" -"节将被打å°åˆ°æ ‡å‡†è¾“出,并返回一个错误。" +"编译并指定è¦ä½¿ç”¨çš„æœç´¢æ¨¡å¼ã€‚如果编译æˆåŠŸï¼Œè¿”å›ž [constant OK]。如果é‡åˆ°é”™è¯¯ï¼Œ" +"细节将被打å°åˆ°æ ‡å‡†è¾“出,并返回一个错误。" #: modules/regex/doc_classes/RegEx.xml msgid "Returns the number of capturing groups in compiled pattern." @@ -64463,9 +64747,9 @@ msgid "" "region to search within can be specified without modifying where the start " "and end anchor would be." msgstr "" -"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译åŽçš„æ¨¡å¼ã€‚如果找到,返回第一个匹é…结果的[RegExMatch]容器,å¦" -"则返回 [code]null[/code]。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€å§‹å’Œç»“æŸé”šç‚¹çš„" -"ä½ç½®ã€‚" +"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译åŽçš„æ¨¡å¼ã€‚如果找到,返回第一个匹é…结果的 [RegExMatch] 容器," +"å¦åˆ™è¿”回 [code]null[/code]。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€å§‹å’Œç»“æŸé”šç‚¹" +"çš„ä½ç½®ã€‚" #: modules/regex/doc_classes/RegEx.xml msgid "" @@ -64474,9 +64758,9 @@ msgid "" "empty array is returned instead. The region to search within can be " "specified without modifying where the start and end anchor would be." msgstr "" -"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译过的模å¼ã€‚为æ¯ä¸ªä¸é‡å 的结果返回一个[RegExMatch]容器数组。如" -"果没有å‘现任何结果,则返回一个空数组。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€å§‹" -"和结æŸé”šç‚¹çš„ä½ç½®ã€‚" +"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译过的模å¼ã€‚为æ¯ä¸ªä¸é‡å 的结果返回一个 [RegExMatch] 容器数组。" +"如果没有å‘现任何结果,则返回一个空数组。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€" +"始和结æŸé”šç‚¹çš„ä½ç½®ã€‚" #: modules/regex/doc_classes/RegEx.xml msgid "" @@ -64487,14 +64771,14 @@ msgid "" "replacement). The region to search within can be specified without modifying " "where the start and end anchor would be." msgstr "" -"æœç´¢æ–‡æœ¬ä¸çš„编译模å¼ï¼Œå¹¶å°†å…¶æ›¿æ¢ä¸ºæŒ‡å®šçš„å—符串。诸如[code]$1[/code]å’Œ" -"[code]$name[/code]ç‰è½¬ä¹‰å’Œåå‘å¼•ç”¨ä¼šè¢«å±•å¼€å’Œè§£å†³ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œåªæœ‰ç¬¬ä¸€ä¸ªå®žä¾‹" +"æœç´¢æ–‡æœ¬ä¸çš„编译模å¼ï¼Œå¹¶å°†å…¶æ›¿æ¢ä¸ºæŒ‡å®šçš„å—符串。诸如 [code]$1[/code] å’Œ " +"[code]$name[/code] ç‰è½¬ä¹‰å’Œåå‘å¼•ç”¨ä¼šè¢«å±•å¼€å’Œè§£å†³ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œåªæœ‰ç¬¬ä¸€ä¸ªå®žä¾‹" "被替æ¢ï¼Œä½†å¯ä»¥å¯¹æ‰€æœ‰å®žä¾‹è¿›è¡Œä¿®æ”¹ï¼ˆå…¨å±€æ›¿æ¢ï¼‰ã€‚å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦" "修改开始和结æŸé”šçš„ä½ç½®ã€‚" #: modules/regex/doc_classes/RegExMatch.xml msgid "Contains the results of a [RegEx] search." -msgstr "包å«[RegEx]æœç´¢çš„结果。" +msgstr "åŒ…å« [RegEx] æœç´¢çš„结果。" #: modules/regex/doc_classes/RegExMatch.xml msgid "" @@ -64503,8 +64787,9 @@ msgid "" "and range of the match and its capturing groups, and it can extract its " "substring for you." msgstr "" -"包å«ç”±[method RegEx.search]å’Œ[method RegEx.search_all]返回的å•个[RegEx]匹é…结" -"果。它å¯ä»¥ç”¨æ¥æŸ¥æ‰¾åŒ¹é…çš„ä½ç½®å’ŒèŒƒå›´ä»¥åŠå®ƒçš„æ•èŽ·ç»„ï¼Œå¹¶ä¸”å¯ä»¥æå–å…¶åå—符串。" +"包å«ç”± [method RegEx.search] å’Œ [method RegEx.search_all] 返回的å•个 [RegEx] " +"匹é…结果。它å¯ä»¥ç”¨æ¥æŸ¥æ‰¾åŒ¹é…çš„ä½ç½®å’ŒèŒƒå›´ä»¥åŠå®ƒçš„æ•èŽ·ç»„ï¼Œå¹¶ä¸”å¯ä»¥æå–å…¶åå—符" +"串。" #: modules/regex/doc_classes/RegExMatch.xml msgid "" @@ -64515,8 +64800,8 @@ msgid "" "Returns -1 if the group did not match or doesn't exist." msgstr "" "返回æºå—符串ä¸åŒ¹é…的结æŸä½ç½®ã€‚æ•获组的结æŸä½ç½®å¯ä»¥é€šè¿‡æä¾›å…¶ç»„å·çš„æ•´æ•°æˆ–å…¶å—" -"符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为0,指的是整个表达å¼ã€‚\n" -"å¦‚æžœè¯¥ç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œåˆ™è¿”回-1。" +"符串å称(如果它是一个命åç»„ï¼‰æ¥æ£€ç´¢ã€‚默认值为 0,指的是整个表达å¼ã€‚\n" +"å¦‚æžœè¯¥ç»„æ²¡æœ‰åŒ¹é…æˆ–ä¸å˜åœ¨ï¼Œåˆ™è¿”回 -1。" #: modules/regex/doc_classes/RegExMatch.xml msgid "Returns the number of capturing groups." @@ -64553,8 +64838,8 @@ msgid "" "that were matched are included. If multiple groups have the same name, that " "name would refer to the first matching one." msgstr "" -"一个命å组的å—典和它相应的组å·ã€‚åªæœ‰è¢«åŒ¹é…的组æ‰è¢«åŒ…括在内。如果多个组有相åŒ" -"çš„å称,该å称将指第一个匹é…的组。" +"命å组的å—典和它相应的组å·ã€‚åªæœ‰è¢«åŒ¹é…的组æ‰è¢«åŒ…括在内。如果多个组有相åŒçš„å" +"称,该å称将指第一个匹é…的组。" #: modules/regex/doc_classes/RegExMatch.xml msgid "An [Array] of the match and its capturing groups." @@ -64570,7 +64855,7 @@ msgid "" "RemoteTransform pushes its own [Transform] to another [Spatial] derived Node " "in the scene." msgstr "" -"RemoteTransform将自己的[Transform]推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª[Spatial]派生节点。" +"RemoteTransform 将自己的 [Transform] 推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª [Spatial] 派生节点。" #: doc/classes/RemoteTransform.xml msgid "" @@ -64579,8 +64864,8 @@ msgid "" "It can be set to update another Node's position, rotation and/or scale. It " "can use either global or local coordinates." msgstr "" -"RemoteTransform将自己的[Transform]推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª[Spatial]派生节点(称为远" -"程节点)。\n" +"RemoteTransform 将自己的 [Transform] 推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª [Spatial] 派生节点" +"(称为远程节点)。\n" "它å¯ä»¥è¢«è®¾ç½®ä¸ºæ›´æ–°å¦ä¸€ä¸ªèŠ‚ç‚¹çš„ä½ç½®ã€æ—‹è½¬å’Œ/或比例。它å¯ä»¥ä½¿ç”¨å…¨å±€åæ ‡æˆ–å±€éƒ¨å" "æ ‡ã€‚" @@ -64601,31 +64886,31 @@ msgstr "远程节点的节点ä½ç½® [NodePath],相对于 RemoteTransform åœ¨åœ #: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml msgid "If [code]true[/code], the remote node's position is updated." -msgstr "如果 [code]true[/code],则更新远程节点的ä½ç½®ã€‚" +msgstr "如果为 [code]true[/code],则更新远程节点的ä½ç½®ã€‚" #: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml msgid "If [code]true[/code], the remote node's rotation is updated." -msgstr "如果 [code]true[/code],则更新远程节点的旋转。" +msgstr "如果为 [code]true[/code],则更新远程节点的旋转。" #: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml msgid "If [code]true[/code], the remote node's scale is updated." -msgstr "如果 [code]true[/code],则更新远程节点的比例。" +msgstr "如果为 [code]true[/code],则更新远程节点的比例。" #: doc/classes/RemoteTransform.xml doc/classes/RemoteTransform2D.xml msgid "" "If [code]true[/code], global coordinates are used. If [code]false[/code], " "local coordinates are used." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨å…¨å±€åæ ‡ã€‚如果 [code]false[/code],则使用本地å" -"æ ‡ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨å…¨å±€åæ ‡ã€‚如果 [code]false[/code],则使用本地" +"åæ ‡ã€‚" #: doc/classes/RemoteTransform2D.xml msgid "" "RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " "derived Node in the scene." msgstr "" -"RemoteTransform2D将自己的[Transform2D]推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª[CanvasItem]派生节" -"点。" +"RemoteTransform2D 将自己的 [Transform2D] 推é€åˆ°åœºæ™¯ä¸å¦ä¸€ä¸ª [CanvasItem] 派生" +"节点。" #: doc/classes/RemoteTransform2D.xml msgid "" @@ -64673,12 +64958,12 @@ msgid "" "free resources that are no longer in use. This means that unused resources " "will linger on for a while before being removed." msgstr "" -"èµ„æºæ˜¯æ‰€æœ‰Godot特定资æºç±»åž‹çš„基类,主è¦ä½œä¸ºæ•°æ®å®¹å™¨ã€‚由于它们继承自" +"èµ„æºæ˜¯æ‰€æœ‰ Godot 特定资æºç±»åž‹çš„基类,主è¦ä½œä¸ºæ•°æ®å®¹å™¨ã€‚由于它们继承自 " "[Reference],资æºè¢«å¼•用计数,并在ä¸å†ä½¿ç”¨æ—¶è¢«é‡Šæ”¾ã€‚一旦从ç£ç›˜åŠ è½½ï¼Œå®ƒä»¬ä¹Ÿä¼šè¢«" -"缓å˜ï¼Œå› æ¤ä»»ä½•ä»Žç»™å®šè·¯å¾„åŠ è½½èµ„æºçš„å°è¯•都会返回相åŒçš„引用(这与[Node]相å," -"[Node]没有引用计数,å¯ä»¥æ ¹æ®éœ€è¦ä»Žç£ç›˜å®žä¾‹åŒ–多次)。资æºå¯ä»¥ä»Žå¤–部ä¿å˜åœ¨ç£ç›˜" +"缓å˜ï¼Œå› æ¤ä»»ä½•ä»Žç»™å®šè·¯å¾„åŠ è½½èµ„æºçš„å°è¯•都会返回相åŒçš„引用(这与 [Node] 相å," +"[Node] 没有引用计数,å¯ä»¥æ ¹æ®éœ€è¦ä»Žç£ç›˜å®žä¾‹åŒ–多次)。资æºå¯ä»¥ä»Žå¤–部ä¿å˜åœ¨ç£ç›˜" "上,也å¯ä»¥æ†ç»‘在å¦ä¸€ä¸ªå¯¹è±¡ä¸ï¼Œå¦‚[Node]或å¦ä¸€ä¸ªèµ„æºã€‚\n" -"[b]注æ„:[/b]在C#ä¸ï¼Œèµ„æºä¸å†è¢«ä½¿ç”¨åŽä¸ä¼šç«‹å³è¢«é‡Šæ”¾ã€‚相å,垃圾回收将定期è¿" +"[b]注æ„:[/b]在 C# ä¸ï¼Œèµ„æºä¸å†è¢«ä½¿ç”¨åŽä¸ä¼šç«‹å³è¢«é‡Šæ”¾ã€‚相å,垃圾回收将定期è¿" "行,并释放ä¸å†ä½¿ç”¨çš„资æºã€‚è¿™æ„å‘³ç€æœªä½¿ç”¨çš„资æºåœ¨è¢«åˆ 除之å‰ä¼šåœç•™ä¸€æ®µæ—¶é—´ã€‚" #: doc/classes/Resource.xml @@ -64728,7 +65013,7 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] This method is called automatically for built-in resources." msgstr "" -"å‘出[signal changed]更改信å·ã€‚\n" +"å‘出 [signal changed] 更改信å·ã€‚\n" "如果ä¾èµ–该资æºçš„外部对象应该被更新,那么æ¯å½“该资æºçš„状æ€å‘生å˜åŒ–(如属性的修" "改)时,必须手动调用该方法。\n" "该方法ç‰åŒäºŽã€‚\n" @@ -64844,17 +65129,17 @@ msgid "" "as [code].stex[/code] ([StreamTexture]) first, so they can be loaded with " "better efficiency on the graphics card." msgstr "" -"Godot使用ResourceFormatLoaders在编辑器或导出的游æˆä¸åŠ è½½èµ„æºã€‚它们通过" -"[ResourceLoader]å•ä¾‹è‡ªåŠ¨æŸ¥è¯¢ï¼Œæˆ–è€…åœ¨åŠ è½½å…·æœ‰å†…éƒ¨ä¾èµ–æ€§çš„èµ„æºæ—¶è¢«æŸ¥è¯¢ã€‚æ¯ä¸ªæ–‡" -"件类型å¯ä»¥ä½œä¸ºä¸åŒçš„资æºç±»åž‹åŠ è½½ï¼Œå› æ¤åœ¨å¼•æ“Žä¸æ³¨å†Œäº†å¤šä¸ª" -"ResourceFormatLoaders。\n" +"Godot 使用 ResourceFormatLoader 在编辑器或导出的游æˆä¸åŠ è½½èµ„æºã€‚它们通过 " +"[ResourceLoader] å•ä¾‹è‡ªåŠ¨æŸ¥è¯¢ï¼Œæˆ–è€…åœ¨åŠ è½½å…·æœ‰å†…éƒ¨ä¾èµ–æ€§çš„èµ„æºæ—¶è¢«æŸ¥è¯¢ã€‚æ¯ä¸ªæ–‡" +"件类型å¯ä»¥ä½œä¸ºä¸åŒçš„资æºç±»åž‹åŠ è½½ï¼Œå› æ¤åœ¨å¼•æ“Žä¸æ³¨å†Œäº†å¤šä¸ª " +"ResourceFormatLoader。\n" "扩展这个类å…è®¸ä½ å®šä¹‰ä½ è‡ªå·±çš„åŠ è½½å™¨ã€‚è¯·ç¡®ä¿å°Šé‡æ–‡æ¡£ä¸çš„è¿”å›žç±»åž‹å’Œå€¼ã€‚ä½ åº”è¯¥ç»™" -"它一个带有[code]class_name[/code]的全局类åï¼Œè¿™æ ·å®ƒæ‰èƒ½è¢«æ³¨å†Œã€‚åƒå†…置的" -"ResourceFormatLoadersä¸€æ ·ï¼Œå®ƒå°†åœ¨åŠ è½½å…¶å¤„ç†çš„ç±»åž‹çš„èµ„æºæ—¶è¢«è‡ªåŠ¨è°ƒç”¨ã€‚ä½ ä¹Ÿå¯ä»¥" -"实现一个[ResourceFormatSaver]。\n" -"[b]注æ„:[/b]å¦‚æžœä½ éœ€è¦çš„资æºç±»åž‹å˜åœ¨ï¼Œä½†Godotæ— æ³•åŠ è½½å…¶æ ¼å¼ï¼Œä½ 也å¯ä»¥æ‰©å±•" +"它一个带有 [code]class_name[/code] 的全局类åï¼Œè¿™æ ·å®ƒæ‰èƒ½è¢«æ³¨å†Œã€‚åƒå†…置的 " +"ResourceFormatLoader ä¸€æ ·ï¼Œå®ƒå°†åœ¨åŠ è½½å…¶å¤„ç†çš„ç±»åž‹çš„èµ„æºæ—¶è¢«è‡ªåŠ¨è°ƒç”¨ã€‚ä½ ä¹Ÿå¯ä»¥" +"实现一个 [ResourceFormatSaver]。\n" +"[b]注æ„:[/b]å¦‚æžœä½ éœ€è¦çš„资æºç±»åž‹å˜åœ¨ï¼Œä½†Godotæ— æ³•åŠ è½½å…¶æ ¼å¼ï¼Œä½ 也å¯ä»¥æ‰©å±• " "[EditorImportPlugin]ã€‚é€‰æ‹©ä¸€ç§æ–¹å¼è€Œä¸æ˜¯å¦ä¸€ç§æ–¹å¼ï¼Œå–å†³äºŽè¯¥æ ¼å¼æ˜¯å¦é€‚åˆäºŽæœ€" -"终导出的游æˆã€‚例如,最好先把[code].png[/code]纹ç†å¯¼å…¥ä¸º[code].stex[/code]" +"终导出的游æˆã€‚例如,最好先把 [code].png[/code] 纹ç†å¯¼å…¥ä¸º [code].stex[/code]" "([StreamTexture]ï¼‰ï¼Œè¿™æ ·å®ƒä»¬åœ¨æ˜¾å¡ä¸Šçš„åŠ è½½æ•ˆçŽ‡ä¼šæ›´å¥½ã€‚" #: doc/classes/ResourceFormatLoader.xml @@ -64906,8 +65191,8 @@ msgid "" "Error] constant in case of failure." msgstr "" "当引擎å‘çŽ°è¿™ä¸ªåŠ è½½å™¨æ˜¯å…¼å®¹çš„ï¼Œå°±ä¼šåŠ è½½ä¸€ä¸ªèµ„æºã€‚å¦‚æžœåŠ è½½çš„èµ„æºæ˜¯å¯¼å…¥çš„结果," -"[code]original_path[/code]å°†é’ˆå¯¹æºæ–‡ä»¶ã€‚æˆåŠŸæ—¶è¿”å›žä¸€ä¸ª[Resource]对象,失败时" -"返回一个[enum Error]常é‡ã€‚" +"[code]original_path[/code] å°†é’ˆå¯¹æºæ–‡ä»¶ã€‚æˆåŠŸæ—¶è¿”å›žä¸€ä¸ª [Resource] 对象,失败" +"时返回一个 [enum Error] 常é‡ã€‚" #: doc/classes/ResourceFormatLoader.xml msgid "" @@ -64917,8 +65202,8 @@ msgid "" "Returns [constant OK] on success, or an [enum Error] constant in case of " "failure." msgstr "" -"如果实现,é‡å‘½å给定资æºä¸çš„ä¾èµ–项并ä¿å˜å®ƒã€‚ [code]renames[/code] 是一个将旧" -"çš„ä¾èµ–è·¯å¾„æ˜ å°„åˆ°æ–°çš„è·¯å¾„çš„ [code]{ String => String }[/code]çš„å—å…¸ 。\n" +"如果实现,é‡å‘½å给定资æºä¸çš„ä¾èµ–项并ä¿å˜å®ƒã€‚[code]renames[/code] 是一个将旧的" +"ä¾èµ–è·¯å¾„æ˜ å°„åˆ°æ–°çš„è·¯å¾„çš„ [code]{ String => String }[/code]çš„å—å…¸ 。\n" "æˆåŠŸæ—¶è¿”å›ž [constant OK],失败时返回 [enum Error] 常é‡ã€‚" #: doc/classes/ResourceFormatSaver.xml @@ -64944,8 +65229,8 @@ msgstr "" "默认情况下,Godot 将资æºä¿å˜ä¸º [code].tres[/code](基于文本)ã€[code].res[/" "code]ï¼ˆäºŒè¿›åˆ¶ï¼‰æˆ–å…¶ä»–å†…ç½®æ ¼å¼ï¼Œä½†æ‚¨å¯ä»¥é€‰æ‹©é€šè¿‡æ‰©å±•这个类æ¥åˆ›å»ºè‡ªå·±çš„æ ¼å¼ã€‚请" "务必éµå®ˆè®°å½•çš„è¿”å›žç±»åž‹å’Œå€¼ã€‚ä½ åº”è¯¥ç»™å®ƒä¸€ä¸ªå…¨å±€ç±»å [code]class_name[/code] 以" -"便它被注册。与内置的 ResourceFormatSavers ä¸€æ ·ï¼Œå®ƒä¼šåœ¨ä¿å˜å…¶è¯†åˆ«ç±»åž‹çš„èµ„æºæ—¶" -"è‡ªåŠ¨è°ƒç”¨ã€‚ä½ ä¹Ÿå¯ä»¥å®žçŽ°ä¸€ä¸ª [ResourceFormatLoader]。" +"便它被注册。与内置的 ResourceFormatSaver ä¸€æ ·ï¼Œå®ƒä¼šåœ¨ä¿å˜å…¶è¯†åˆ«ç±»åž‹çš„èµ„æºæ—¶è‡ª" +"åŠ¨è°ƒç”¨ã€‚ä½ ä¹Ÿå¯ä»¥å®žçŽ°ä¸€ä¸ª [ResourceFormatLoader]。" #: doc/classes/ResourceFormatSaver.xml msgid "" @@ -64966,9 +65251,9 @@ msgid "" "Returns [constant OK] on success, or an [enum Error] constant in case of " "failure." msgstr "" -"将给定的资æºå¯¹è±¡ä¿å˜åˆ°ç›®æ ‡[code]path[/code]处的文件。[code]flags[/code]是一个" -"ç”±[enum ResourceSaver.SaverFlags]常é‡ç»„æˆçš„使ީç 。\n" -"æˆåŠŸæ—¶è¿”å›ž[constant OK],失败时返回[enum Error]常é‡ã€‚" +"将给定的资æºå¯¹è±¡ä¿å˜åˆ°ç›®æ ‡ [code]path[/code] 处的文件。[code]flags[/code] 是" +"一个由 [enum ResourceSaver.SaverFlags] 常é‡ç»„æˆçš„使ީç 。\n" +"æˆåŠŸæ—¶è¿”å›ž [constant OK],失败时返回 [enum Error] 常é‡ã€‚" #: doc/classes/ResourceImporter.xml msgid "Base class for the implementation of core resource importers." @@ -65013,21 +65298,20 @@ msgid "" "granularity, which makes it mainly useful for displaying loading bars or " "percentages." msgstr "" -"交互å¼èµ„æº[Resource]åŠ è½½å™¨ã€‚è¿™ä¸ªå¯¹è±¡åœ¨æ‰§è¡Œäº¤äº’å¼åŠ è½½æ—¶ç”±[ResourceLoader]è¿”" -"回。它å…许以高粒度(high granularityï¼‰åŠ è½½èµ„æºï¼Œè¿™ä½¿å¾—它主è¦ç”¨äºŽæ˜¾ç¤ºåŠ è½½æ¡æˆ–" -"百分比。" +"äº¤äº’å¼ [Resource] åŠ è½½å™¨ã€‚è¿™ä¸ªå¯¹è±¡åœ¨æ‰§è¡Œäº¤äº’å¼åŠ è½½æ—¶ç”± [ResourceLoader] è¿”" +"回。它å…è®¸ä»¥é«˜ç²’åº¦åŠ è½½èµ„æºï¼Œè¿™ä½¿å¾—它主è¦ç”¨äºŽæ˜¾ç¤ºåŠ è½½æ¡æˆ–百分比。" #: doc/classes/ResourceInteractiveLoader.xml msgid "" "Returns the loaded resource if the load operation completed successfully, " "[code]null[/code] otherwise." -msgstr "å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”å›žåŠ è½½çš„èµ„æºï¼Œå¦åˆ™ä¸ºç©º[code]null[/code]。" +msgstr "å¦‚æžœåŠ è½½æ“作æˆåŠŸå®Œæˆï¼Œè¿”å›žåŠ è½½çš„èµ„æºï¼Œå¦åˆ™ä¸º [code]null[/code]。" #: doc/classes/ResourceInteractiveLoader.xml msgid "" "Returns the load stage. The total amount of stages can be queried with " "[method get_stage_count]." -msgstr "è¿”å›žåŠ è½½é˜¶æ®µã€‚å¯ä»¥ä½¿ç”¨[method get_stage_count]查询阶段总数。" +msgstr "è¿”å›žåŠ è½½é˜¶æ®µã€‚å¯ä»¥ä½¿ç”¨ [method get_stage_count] 查询阶段总数。" #: doc/classes/ResourceInteractiveLoader.xml msgid "" @@ -65090,14 +65374,14 @@ msgid "" "An optional [code]type_hint[/code] can be used to further specify the " "[Resource] type that should be handled by the [ResourceFormatLoader]." msgstr "" -"返回给定的[code]path[/code]是å¦å˜åœ¨å·²è¯†åˆ«çš„资æºã€‚\n" -"一个å¯é€‰çš„[code]type_hint[/code]å¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š[ResourceFormatLoader]应该" -"处ç†çš„[Resource]类型。" +"返回给定的路径 [code]path[/code] 处是å¦å˜åœ¨å·²è¯†åˆ«çš„资æºã€‚\n" +"一个å¯é€‰çš„ [code]type_hint[/code] å¯ä»¥ç”¨æ¥è¿›ä¸€æ¥æŒ‡å®š [ResourceFormatLoader] " +"应该处ç†çš„ [Resource] 类型。" #: doc/classes/ResourceLoader.xml msgid "" "Returns the dependencies for the resource at the given [code]path[/code]." -msgstr "返回给定[code]path[/code]处资æºçš„ä¾èµ–关系。" +msgstr "返回给定路径 [code]path[/code] 处资æºçš„ä¾èµ–关系。" #: doc/classes/ResourceLoader.xml msgid "Returns the list of recognized extensions for a resource type." @@ -65106,7 +65390,8 @@ msgstr "返回资æºç±»åž‹çš„已识别扩展å列表。" #: doc/classes/ResourceLoader.xml msgid "" "[i]Deprecated method.[/i] Use [method has_cached] or [method exists] instead." -msgstr "[i]废弃的方法。[/i]使用[method has_cached]或[method exists]代替。" +msgstr "" +"[i]废弃的方法。[/i]请使用 [method has_cached] 或 [method exists] 代替。" #: doc/classes/ResourceLoader.xml msgid "" @@ -65290,7 +65575,7 @@ msgstr "ä¸è¦ä¿å˜ç¼–辑器特定的元数æ®ï¼ˆç”±å…¶ [code]__editor[/code] å #: doc/classes/ResourceSaver.xml msgid "Save as big endian (see [member File.endian_swap])." -msgstr "ä¿å˜ä¸ºå¤§ç«¯ï¼ˆå‚阅 [member File.endian_swap])。" +msgstr "ä¿å˜ä¸ºå¤§ç«¯ï¼ˆè§ [member File.endian_swap])。" #: doc/classes/ResourceSaver.xml msgid "" @@ -65304,7 +65589,7 @@ msgstr "" msgid "" "Take over the paths of the saved subresources (see [method Resource." "take_over_path])." -msgstr "接管ä¿å˜çš„å资æºçš„路径(è§[method Resource.take_over_path])。" +msgstr "接管ä¿å˜çš„å资æºçš„è·¯å¾„ï¼ˆè§ [method Resource.take_over_path])。" #: doc/classes/RichTextEffect.xml msgid "A custom effect for use with [RichTextLabel]." @@ -65468,7 +65753,7 @@ msgid "" "Installs a custom effect. [code]effect[/code] should be a valid " "[RichTextEffect]." msgstr "" -"安装自定义效果。 [code]effect[/code] 应该是一个有效的 [RichTextEffect]。" +"安装自定义效果。[code]effect[/code] 应该是一个有效的 [RichTextEffect]。" #: doc/classes/RichTextLabel.xml msgid "Adds a newline tag to the tag stack." @@ -65502,8 +65787,8 @@ msgid "" "Adds an [code][align][/code] tag based on the given [code]align[/code] " "value. See [enum Align] for possible values." msgstr "" -"æ ¹æ®ç»™å®šçš„[code][align][/code]å€¼ï¼Œæ·»åŠ ä¸€ä¸ª[code]align[/code]æ ‡ç¾ã€‚å¯èƒ½çš„值è§" -"[enum Align]。" +"æ ¹æ®ç»™å®šçš„ [code][align][/code] å€¼ï¼Œæ·»åŠ ä¸€ä¸ª [code]align[/code] æ ‡ç¾ã€‚å¯èƒ½çš„" +"å–å€¼è§ [enum Align]。" #: doc/classes/RichTextLabel.xml msgid "" @@ -65629,7 +65914,7 @@ msgid "" "add_text] will reset this to [code]false[/code]. Use instead [method " "append_bbcode] to preserve BBCode formatting." msgstr "" -"如果 [code]true[/code]ï¼Œæ ‡ç¾ä½¿ç”¨ BBCode æ ¼å¼ã€‚\n" +"如果为 [code]true[/code]ï¼Œæ ‡ç¾ä½¿ç”¨ BBCode æ ¼å¼ã€‚\n" "[b]注æ„:[/b]å°è¯•使用 [method add_text] 更改 [RichTextLabel] 的文本会将其é‡ç½®" "为 [code]false[/code]。改用 [method append_bbcode] æ¥ä¿ç•™ BBCode æ ¼å¼ã€‚" @@ -65670,7 +65955,7 @@ msgid "" "[RichTextLabel] in [Container]s, but it's unreliable in some cases and will " "be removed in future versions." msgstr "" -"如果 [code]true[/code]ï¼Œæ ‡ç¾çš„高度将自动更新以适应其内容。\n" +"如果为 [code]true[/code]ï¼Œæ ‡ç¾çš„高度将自动更新以适应其内容。\n" "[b]注æ„:[/b]æ¤å±žæ€§ç”¨ä½œè§£å†³ [Container] ä¸ [RichTextLabel] 问题的解决方法,但" "在æŸäº›æƒ…况下ä¸å¯é ,将在未æ¥ç‰ˆæœ¬ä¸åˆ 除。" @@ -65679,12 +65964,12 @@ msgid "" "If [code]true[/code], the label underlines meta tags such as [code][url]" "{text}[/url][/code]." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™ä¼šåœ¨å…ƒæ ‡ç¾ä¸‹åˆ’线,例如 [code][url]{text}[/url][/" +"如果为 [code]true[/code]ï¼Œåˆ™ä¼šåœ¨å…ƒæ ‡ç¾ä¸‹åˆ’线,例如 [code][url]{text}[/url][/" "code]。" #: doc/classes/RichTextLabel.xml msgid "If [code]true[/code], the label uses the custom font color." -msgstr "如果 [code]true[/code]ï¼Œåˆ™æ ‡ç¾ä½¿ç”¨è‡ªå®šä¹‰å—体颜色。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™æ ‡ç¾ä½¿ç”¨è‡ªå®šä¹‰å—体颜色。" #: doc/classes/RichTextLabel.xml msgid "" @@ -65703,18 +65988,18 @@ msgid "" "If [code]true[/code], the scrollbar is visible. Setting this to [code]false[/" "code] does not block scrolling completely. See [method scroll_to_line]." msgstr "" -"如果 [code]true[/code],则滚动æ¡å¯è§ã€‚å°†æ¤è®¾ç½®ä¸º [code]false[/code] ä¸ä¼šå®Œå…¨" -"é˜»æ¢æ»šåŠ¨ã€‚è§[method scroll_to_line]。" +"如果为 [code]true[/code],则滚动æ¡å¯è§ã€‚å°†æ¤è®¾ç½®ä¸º [code]false[/code] ä¸ä¼šå®Œ" +"å…¨é˜»æ¢æ»šåŠ¨ã€‚è§[method scroll_to_line]。" #: doc/classes/RichTextLabel.xml msgid "" "If [code]true[/code], the window scrolls down to display new content " "automatically." -msgstr "如果 [code]true[/code],则窗å£å‘下滚动以自动显示新内容。" +msgstr "如果为 [code]true[/code],则窗å£å‘下滚动以自动显示新内容。" #: doc/classes/RichTextLabel.xml msgid "If [code]true[/code], the label allows text selection." -msgstr "如果 [code]true[/code]ï¼Œæ ‡ç¾å…许文本选择。" +msgstr "如果为 [code]true[/code]ï¼Œæ ‡ç¾å…许文本选择。" #: doc/classes/RichTextLabel.xml msgid "" @@ -65818,7 +66103,7 @@ msgid "" "The color of selected text, used when [member selection_enabled] is " "[code]true[/code]." msgstr "" -"选定文本的颜色(当[member selection_enabled]为 [code]true[/code] 时使用)。" +"选定文本的颜色(当 [member selection_enabled] 为 [code]true[/code] 时使用)。" #: doc/classes/RichTextLabel.xml msgid "The color of the font's shadow." @@ -65894,16 +66179,16 @@ msgid "" "themselves. They are used by and with the low-level Server classes such as " "[VisualServer]." msgstr "" -"RID类型用于访问资æºçš„唯一整数ID。它们ä¸é€æ˜Žï¼Œè¿™æ„味ç€å…¶æœ¬èº«å¹¶ä¸æŽˆäºˆå¯¹ç›¸å…³èµ„æº" -"的访问。它们被低级别的æœåŠ¡ç±»ä½¿ç”¨ï¼Œå¦‚[VisualServer]。" +"RID 类型用于访问资æºçš„唯一整数 ID。它们ä¸é€æ˜Žï¼Œè¿™æ„味ç€å…¶æœ¬èº«å¹¶ä¸æŽˆäºˆå¯¹ç›¸å…³èµ„" +"æºçš„访问。它们被低级别的æœåŠ¡ç±»ä½¿ç”¨ï¼Œå¦‚ [VisualServer]。" #: doc/classes/RID.xml msgid "" "Creates a new RID instance with the ID of a given resource. When not handed " "a valid resource, silently stores the unused ID 0." msgstr "" -"用给定资æºçš„ID创建一个新的RIDå®žä¾‹ã€‚å½“æ²¡æœ‰å¾—åˆ°ä¸€ä¸ªæœ‰æ•ˆçš„èµ„æºæ—¶ï¼Œé»˜è®¤å˜å‚¨æœªä½¿ç”¨" -"çš„ID 0。" +"用给定资æºçš„ ID 创建一个新的 RID å®žä¾‹ã€‚å½“æ²¡æœ‰å¾—åˆ°ä¸€ä¸ªæœ‰æ•ˆçš„èµ„æºæ—¶ï¼Œé»˜è®¤å˜å‚¨æœª" +"使用的 ID 0。" #: doc/classes/RID.xml msgid "Returns the ID of the referenced resource." @@ -65966,7 +66251,7 @@ msgid "" "This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." msgstr "" "在ä¸å½±å“æ—‹è½¬çš„æƒ…å†µä¸‹æ·»åŠ æ’定的方å‘力(å³åŠ é€Ÿåº¦ï¼‰ã€‚\n" -"这相当于 [code]add_force(force, Vector3(0,0,0))[/code]。" +"相当于 [code]add_force(force, Vector3(0,0,0))[/code]。" #: doc/classes/RigidBody.xml msgid "" @@ -65988,7 +66273,7 @@ msgid "" "This is equivalent to [code]apply_impulse(Vector3(0,0,0), impulse)[/code]." msgstr "" "æ–½åŠ å•一方å‘的冲é‡è€Œä¸å½±å“旋转。\n" -"è¿™ç‰ä»·äºŽ[code]apply_impulse(Vector3(0,0,0), impulse)[/code]。" +"相当于 [code]apply_impulse(Vector3(0,0,0), impulse)[/code]。" #: doc/classes/RigidBody.xml msgid "" @@ -66025,8 +66310,9 @@ msgid "" "For performance, list of collisions is updated once per frame and before the " "physics step. Consider using signals instead." msgstr "" -"返回一个与æ¤ç¢°æ’žçš„ç‰©ä½“çš„åˆ—è¡¨ã€‚è¦æ±‚[member contact_monitor]设置为 [code]true[/" -"code],[member contacts_reported]设置得足够高,以检测所有碰撞。\n" +"返回一个与æ¤ç¢°æ’žçš„ç‰©ä½“çš„åˆ—è¡¨ã€‚è¦æ±‚ [member contact_monitor] 设置为 " +"[code]true[/code],[member contacts_reported] 设置得足够高,以检测所有碰" +"撞。\n" "[b]注æ„:[/b]在移动物体åŽï¼Œè¿™ä¸ªæµ‹è¯•çš„ç»“æžœä¸æ˜¯ç«‹å³çš„。为了性能,碰撞列表æ¯å¸§åœ¨" "物ç†è¿ç®—之剿›´æ–°ä¸€æ¬¡ã€‚å¯ä»¥è€ƒè™‘ä½¿ç”¨ä¿¡å·æ¥ä»£æ›¿ã€‚" @@ -66097,7 +66383,7 @@ msgid "" "[member mode] is [constant MODE_CHARACTER]. It can still be put to sleep " "manually by setting its [member sleeping] property to [code]true[/code]." msgstr "" -"如果[code]true[/code],实体å¯ä»¥åœ¨æ²¡æœ‰è¿åŠ¨çš„æƒ…å†µä¸‹è¿›å…¥ç¡çœ 模å¼ã€‚è§[member " +"如果为 [code]true[/code],实体å¯ä»¥åœ¨æ²¡æœ‰è¿åŠ¨çš„æƒ…å†µä¸‹è¿›å…¥ç¡çœ 模å¼ã€‚è§[member " "sleeping]。\n" "[b]注æ„:[/b]RigidBody3D 的模å¼[member mode] 为常é‡[constant MODE_CHARACTER] " "æ—¶ä¸ä¼šè‡ªåŠ¨è¿›å…¥ä¼‘çœ æ¨¡å¼ã€‚ä»ç„¶å¯ä»¥é€šè¿‡å°†å…¶ [member sleeping] 属性设置为 " @@ -66108,7 +66394,7 @@ msgid "" "If [code]true[/code], the RigidBody will emit signals when it collides with " "another RigidBody. See also [member contacts_reported]." msgstr "" -"如果[code]true[/code],当RigidBody与å¦ä¸€ä¸ªRigidBody碰撞时会å‘出信å·ã€‚å‚阅" +"如果为 [code]true[/code],当RigidBody与å¦ä¸€ä¸ªRigidBody碰撞时会å‘出信å·ã€‚å‚阅" "[member contacts_reported]。" #: doc/classes/RigidBody.xml @@ -66122,7 +66408,7 @@ msgid "" msgstr "" "将被记录的最大接触次数。需è¦å°† [member contact_monitor] 设置为 [code]true[/" "code]。\n" -"[b]注:[/b]接触次数与碰撞次数ä¸åŒã€‚平行边之间的碰撞将导致两个接触(æ¯ç«¯ä¸€" +"[b]注æ„:[/b]接触次数与碰撞次数ä¸åŒã€‚平行边之间的碰撞将导致两个接触(æ¯ç«¯ä¸€" "个),平行é¢ä¹‹é—´çš„碰撞将导致四个接触(æ¯ä¸ªè§’一个)。" #: doc/classes/RigidBody.xml @@ -66134,7 +66420,7 @@ msgid "" "small, fast-moving objects. Not using continuous collision detection is " "faster to compute, but can miss small, fast-moving objects." msgstr "" -"如果 [code]true[/code],则使用连ç»ç¢°æ’žæ£€æµ‹ã€‚\n" +"如果为 [code]true[/code],则使用连ç»ç¢°æ’žæ£€æµ‹ã€‚\n" "连ç»ç¢°æ’žæ£€æµ‹å°è¯•é¢„æµ‹ä¸€ä¸ªç§»åŠ¨çš„ç‰©ä½“ä¼šåœ¨å“ªé‡Œç¢°æ’žï¼Œè€Œä¸æ˜¯ç§»åŠ¨å®ƒå¹¶åœ¨å®ƒå‘生碰撞时" "çº æ£å®ƒçš„è¿åŠ¨ã€‚è¿žç»ç¢°æ’žæ£€æµ‹æ›´ç²¾ç¡®ï¼Œå¹¶ä¸”错过了较å°çš„ã€å¿«é€Ÿç§»åŠ¨çš„ç‰©ä½“çš„æ’žå‡»ã€‚ä¸" "使用连ç»ç¢°æ’žæ£€æµ‹çš„计算速度更快,但å¯èƒ½ä¼šé”™è¿‡å°çš„ã€å¿«é€Ÿç§»åŠ¨çš„ç‰©ä½“ã€‚" @@ -66146,9 +66432,9 @@ msgid "" "body will only move as determined by the [method _integrate_forces] " "function, if defined." msgstr "" -"如果 [code]true[/code],则该物体的内力积分将被ç¦ç”¨ï¼ˆå¦‚é‡åŠ›æˆ–ç©ºæ°”æ‘©æ“¦ï¼‰ã€‚é™¤äº†" -"碰撞å“åº”ä¹‹å¤–ï¼Œç‰©ä½“å°†ä»…æ ¹æ® [method _integrate_forces] 函数确定的方å¼ç§»åŠ¨ï¼ˆå¦‚" -"果已定义)。" +"如果为 [code]true[/code],则该物体的内力积分将被ç¦ç”¨ï¼ˆå¦‚é‡åŠ›æˆ–ç©ºæ°”æ‘©æ“¦ï¼‰ã€‚é™¤" +"了碰撞å“åº”ä¹‹å¤–ï¼Œç‰©ä½“å°†ä»…æ ¹æ® [method _integrate_forces] 函数确定的方å¼ç§»åЍ" +"(如果已定义)。" #: doc/classes/RigidBody.xml msgid "" @@ -66201,7 +66487,7 @@ msgstr "实体的质é‡ã€‚" #: doc/classes/RigidBody.xml msgid "The body mode. See [enum Mode] for possible values." -msgstr "物体的模å¼ã€‚å¯èƒ½çš„值è§[enum Mode]。" +msgstr "物体的模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum Mode]。" #: doc/classes/RigidBody.xml doc/classes/RigidBody2D.xml #: doc/classes/StaticBody.xml doc/classes/StaticBody2D.xml @@ -66220,8 +66506,8 @@ msgid "" "until woken up by another body through, for example, a collision, or by " "using the [method apply_impulse] or [method add_force] methods." msgstr "" -"如果 [code]true[/code],物体ä¸ä¼šç§»åЍ并䏔ä¸ä¼šè®¡ç®—力,直到被å¦ä¸€ä¸ªç‰©ä½“唤醒,例" -"如碰撞,或使用 [method apply_impulse] 或 [method add_force] 方法。" +"如果为 [code]true[/code],物体ä¸ä¼šç§»åЍ并䏔ä¸ä¼šè®¡ç®—力,直到被å¦ä¸€ä¸ªç‰©ä½“唤醒," +"例如碰撞,或使用 [method apply_impulse] 或 [method add_force] 方法。" #: doc/classes/RigidBody.xml msgid "" @@ -66285,22 +66571,23 @@ msgid "" "[ConcavePolygonShape]. Don't use multiple [CollisionShape]s when using a " "[ConcavePolygonShape] with Bullet physics if you need shape indices." msgstr "" -"当[PhysicsBody]或[GridMap]的一个形状[Shape]进入这个区域的一个形状[Shape]æ—¶å‘" -"出的。需è¦å°†ç›‘控[member contact_monitor]设置为 [code]true[/code],且[member " -"contacts_reported]设置的足够高以检测所有碰撞。如果[MeshLibrary]有碰撞形状" -"[Shape],就会检测到[GridMap]。\n" -"[code]body_id[/code]ç”±[PhysicsServer]使用的其他[PhysicsBody]或[MeshLibrary]çš„" -"[CollisionObject]çš„[RID]。\n" -"[code]body[/code] å…¶ä»–[PhysicsBody]或[GridMap]çš„[Node](如果它å˜åœ¨äºŽæ ‘ä¸)。\n" -"[code]body_shape_index[/code] ç”±[PhysicsServer]使用的其他[PhysicsBody]或" -"[GridMap]çš„[Shape]的索引。用 [code]body." -"shape_owner_get_owner(body_shape_index)[/code]èŽ·å– [CollisionShape] 节点。\n" -"[code]local_shape[/code] ç”±[PhysicsServer]使用的这个刚体(RigidBody)çš„[Shape]" -"的索引。用[code]self.shape_owner_get_owner(local_shape_index)[/code]获å–" -"[CollisionShape]节点。\n" -"[b]注æ„:[/b]当使用[ConcavePolygonShape]时,对于å弹的物ç†è¿ç®—æ— æ³•è¯†åˆ«å½¢çŠ¶ç´¢" -"å¼•ã€‚å¦‚æžœä½ éœ€è¦å½¢çŠ¶æŒ‡æ•°ï¼Œåœ¨ä½¿ç”¨[ConcavePolygonShape]和对于å弹的物ç†è¿ç®—时,ä¸" -"è¦ä½¿ç”¨å¤šä¸ª[CollisionShape]。" +"当 [PhysicsBody] 或 [GridMap] 的一个形状 [Shape] 进入这个区域的一个形状 " +"[Shape] æ—¶å‘出的。需è¦å°†ç›‘控 [member contact_monitor] 设置为 [code]true[/" +"code],且 [member contacts_reported] 设置的足够高以检测所有碰撞。如果 " +"[MeshLibrary] 有碰撞形状 [Shape],就会检测到 [GridMap]。\n" +"[code]body_id[/code] ç”± [PhysicsServer] 使用的其他 [PhysicsBody] 或 " +"[MeshLibrary] çš„ [CollisionObject] çš„ [RID]。\n" +"[code]body[/code] å…¶ä»– [PhysicsBody] 或 [GridMap] çš„ [Node](如果它å˜åœ¨äºŽæ ‘" +"ä¸ï¼‰ã€‚\n" +"[code]body_shape_index[/code] ç”± [PhysicsServer] 使用的其他 [PhysicsBody] 或 " +"[GridMap] çš„ [Shape] 的索引。用 [code]body." +"shape_owner_get_owner(body_shape_index)[/code] èŽ·å– [CollisionShape] 节点。\n" +"[code]local_shape[/code] ç”± [PhysicsServer] 使用的这个 RigidBody çš„ [Shape] " +"的索引。用 [code]self.shape_owner_get_owner(local_shape_index)[/code] èŽ·å– " +"[CollisionShape] 节点。\n" +"[b]注æ„:[/b]当使用 [ConcavePolygonShape] 时,对于å弹的物ç†è¿ç®—æ— æ³•è¯†åˆ«å½¢çŠ¶" +"ç´¢å¼•ã€‚å¦‚æžœä½ éœ€è¦å½¢çŠ¶æŒ‡æ•°ï¼Œåœ¨ä½¿ç”¨ [ConcavePolygonShape] 和对于å弹的物ç†è¿ç®—" +"时,ä¸è¦ä½¿ç”¨å¤šä¸ª[CollisionShape]。" #: doc/classes/RigidBody.xml msgid "" @@ -66509,7 +66796,7 @@ msgid "" "[member mode] is [constant MODE_CHARACTER]. It can still be put to sleep " "manually by setting its [member sleeping] property to [code]true[/code]." msgstr "" -"如果[code]true[/code],身体å¯ä»¥åœ¨æ²¡æœ‰è¿åŠ¨çš„æƒ…å†µä¸‹è¿›å…¥ç¡çœ 模å¼ã€‚è§[member " +"如果为 [code]true[/code],身体å¯ä»¥åœ¨æ²¡æœ‰è¿åŠ¨çš„æƒ…å†µä¸‹è¿›å…¥ç¡çœ 模å¼ã€‚è§[member " "sleeping]。\n" "[b]注æ„:[/b]RigidBody2D çš„[member mode] 为[constant MODE_CHARACTER] æ—¶ä¸ä¼šè‡ª" "åŠ¨è¿›å…¥ä¼‘çœ æ¨¡å¼ã€‚ä»ç„¶å¯ä»¥é€šè¿‡å°†å…¶ [member sleeping] 属性设置为 [code]true[/" @@ -66520,7 +66807,7 @@ msgid "" "If [code]true[/code], the body will emit signals when it collides with " "another RigidBody2D. See also [member contacts_reported]." msgstr "" -"如果[code]true[/code],则物体在与å¦ä¸€ä¸ªRigidBody2D碰撞时会å‘出信å·ã€‚å‚阅" +"如果为 [code]true[/code],则物体在与å¦ä¸€ä¸ªRigidBody2D碰撞时会å‘出信å·ã€‚å‚阅" "[member contacts_reported]。" #: doc/classes/RigidBody2D.xml @@ -66556,7 +66843,7 @@ msgid "" "Aside from collision response, the body will only move as determined by the " "[method _integrate_forces] function." msgstr "" -"如果 [code]true[/code],则ç¦ç”¨è¯¥ç‰©ä½“的内力积分。除了碰撞å“应,物体åªä¼šæŒ‰ç…§ " +"如果为 [code]true[/code],则ç¦ç”¨è¯¥ç‰©ä½“的内力积分。除了碰撞å“应,物体åªä¼šæŒ‰ç…§ " "[method _integrate_forces] 函数确定的方å¼ç§»åŠ¨ã€‚" #: doc/classes/RigidBody2D.xml @@ -66654,11 +66941,12 @@ msgid "" "[code]body[/code] the [Node], if it exists in the tree, of the other " "[PhysicsBody2D] or [TileMap]." msgstr "" -"当与å¦ä¸€ä¸ª[PhysicsBody2D]或[TileMap]çš„ç¢°æ’žç»“æŸæ—¶å‘出的。需è¦å°† [member " +"当与å¦ä¸€ä¸ª [PhysicsBody2D] 或 [TileMap] çš„ç¢°æ’žç»“æŸæ—¶å‘出的。需è¦å°† [member " "contact_monitor] 设置为 [code]true[/code] å¹¶å°† [member contacts_reported] 设" -"置为足够高以检测所有碰撞。如果[TileSet]有碰撞[Shape2D],就会检测到" +"置为足够高以检测所有碰撞。如果[TileSet] 有碰撞 [Shape2D],就会检测到 " "[TileMap]。\n" -"[code]body[/code] å…¶ä»–[PhysicsBody2D]或[TileMap]çš„[Node](如果它å˜åœ¨äºŽæ ‘ä¸)。" +"[code]body[/code] å…¶ä»– [PhysicsBody2D] 或 [TileMap] çš„ [Node](如果它å˜åœ¨äºŽæ ‘" +"ä¸ï¼‰ã€‚" #: doc/classes/RigidBody2D.xml msgid "" @@ -66908,7 +67196,7 @@ msgid "" msgstr "" "为了使用入å£é®æŒ¡å‰”除系统,您必须使用 [Room] å’Œ [Portal] æ¥æž„建您的关å¡ã€‚在这" "些å¯ä»¥åœ¨è¿è¡Œæ—¶ä½¿ç”¨ä¹‹å‰ï¼Œå®ƒä»¬å¿…é¡»ç»è¿‡ä¸€ä¸ªç®€çŸçš„转æ¢è¿‡ç¨‹æ¥æž„建 [code]room " -"graph[/code],这是入å£å‰”除所需的è¿è¡Œæ—¶æ•°æ®ã€‚ [code]portal graph[/code] ç”± " +"graph[/code],这是入å£å‰”除所需的è¿è¡Œæ—¶æ•°æ®ã€‚[code]portal graph[/code] ç”± " "[RoomManager] 节点控制,[RoomManager] è¿˜åŒ…å«æ•´ä¸ªå…¥å£ç³»ç»Ÿé€šç”¨çš„设置。" #: doc/classes/RoomManager.xml @@ -67015,7 +67303,7 @@ msgstr "" "请注æ„,已ç»è½¬æ¢ä¸º [Portal] èŠ‚ç‚¹ï¼ˆè€Œä¸æ˜¯ [MeshInstance])的 [Portal] ä»ç„¶éœ€è¦" "éµå¾ªç›¸åŒçš„命åçº¦å®šï¼Œå› ä¸ºå®ƒä»¬åœ¨è½¬æ¢è¿‡ç¨‹ä¸æ¯æ¬¡éƒ½ä¼šé‡æ–°é“¾æŽ¥ã€‚\n" "å»ºè®®æ‚¨ä»…å°†å¯¹è±¡æ”¾ç½®åœ¨å¸Œæœ›ç•™åœ¨è¿™äº›ç©ºé—´å†…çš„ç©ºé—´ä¸ - å³ [code]portal mode[/code]" -"是 [code]STATIC[/code] 或 [code]DYNAMIC[/code](ä¸ç©¿è¶Š Portal)。 " +"是 [code]STATIC[/code] 或 [code]DYNAMIC[/code](ä¸ç©¿è¶Š Portal)。" "[code]GLOBAL[/code] å’Œ [code]ROAMING[/code] å¯¹è±¡æœ€å¥½æ”¾ç½®åœ¨åœºæ™¯æ ‘çš„å¦ä¸€éƒ¨åˆ†ï¼Œ" "以é¿å…混淆。有关portal模å¼çš„完整说明,请å‚阅 [CullInstance]。" @@ -67215,7 +67503,7 @@ msgstr "" #: doc/classes/RoomManager.xml msgid "Shows the [Portal] margins when the portal gizmo is used in the editor." -msgstr "当在编辑器ä¸ä½¿ç”¨portal工具时,显示[Portal]的边界。" +msgstr "当在编辑器ä¸ä½¿ç”¨å…¥å£å·¥å…·æ—¶ï¼Œæ˜¾ç¤º [Portal] 的边界。" #: doc/classes/RoomManager.xml msgid "" @@ -67226,8 +67514,8 @@ msgid "" "Sometimes using the larger gameplay area of the secondary PVS may be " "preferable." msgstr "" -"å½“å¯¹è±¡è¿›å…¥å’Œé€€å‡ºæ¸¸æˆæ—¶æŽ¥æ”¶æ¸¸æˆå›žè°ƒæ—¶ï¼Œ[b]游æˆåŒºåŸŸ[/b]å¯ä»¥ç”±[Room]的主è¦PVS" -"(潜在å¯è§é›†ï¼‰æˆ–次è¦PVS(主è¦PVSåŠå…¶ç›¸é‚»çš„PVS)定义[Room])。\n" +"å½“å¯¹è±¡è¿›å…¥å’Œé€€å‡ºæ¸¸æˆæ—¶æŽ¥æ”¶æ¸¸æˆå›žè°ƒæ—¶ï¼Œ[b]游æˆåŒºåŸŸ[/b]å¯ä»¥ç”± [Room] çš„ä¸»è¦ PVS" +"(潜在å¯è§é›†ï¼‰æˆ–æ¬¡è¦ PVSï¼ˆä¸»è¦ PVS åŠå…¶ç›¸é‚»çš„ PVS)定义 [Room])。\n" "æœ‰æ—¶ä½¿ç”¨æ¬¡è¦ PVS 的较大游æˆåŒºåŸŸå¯èƒ½æ›´å¯å–。" #: doc/classes/RoomManager.xml @@ -67235,8 +67523,8 @@ msgid "" "Use only [Portal]s at runtime to determine visibility. PVS will not be " "generated at [Room]s conversion, and gameplay notifications cannot be used." msgstr "" -"在è¿è¡Œæ—¶ä»…使用 [Portal] æ¥ç¡®å®šå¯è§æ€§ã€‚ [Room] 的转æ¢ä¸ä¼šäº§ç”Ÿ PVSï¼Œæ— æ³•ä½¿ç”¨æ¸¸" -"æˆé€šçŸ¥ã€‚" +"在è¿è¡Œæ—¶ä»…使用 [Portal] æ¥ç¡®å®šå¯è§æ€§ã€‚[Room] 的转æ¢ä¸ä¼šäº§ç”Ÿ PVSï¼Œæ— æ³•ä½¿ç”¨æ¸¸æˆ" +"通知。" #: doc/classes/RoomManager.xml msgid "" @@ -67252,7 +67540,7 @@ msgstr "仅使用 [Room] çš„ PVS(潜在å¯è§é›†ï¼‰æ¥ç¡®å®šå¯è§æ€§ã€‚" #: doc/classes/RootMotionView.xml msgid "Editor-only helper for setting up root motion in [AnimationTree]." -msgstr "在[AnimationTree]ä¸è®¾ç½®æ ¹è¿åŠ¨çš„ä»…ç¼–è¾‘å™¨å¯ç”¨çš„辅助工具。" +msgstr "在 [AnimationTree] ä¸è®¾ç½®æ ¹è¿åŠ¨çš„ä»…ç¼–è¾‘å™¨å¯ç”¨çš„辅助工具。" #: doc/classes/RootMotionView.xml msgid "" @@ -67308,8 +67596,8 @@ msgid "" "([i]local[/i] Y = 0). If [code]false[/code], the points' original Y " "coordinate is preserved." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™ç½‘æ ¼çš„ç‚¹éƒ½å°†ä½äºŽç›¸åŒçš„ Y åæ ‡ä¸Šï¼ˆ[i]local[/i] Y = " -"0)。如果 [code]false[/code],则ä¿ç•™ç‚¹çš„原始 Y åæ ‡ã€‚" +"如果为 [code]true[/code]ï¼Œåˆ™ç½‘æ ¼çš„ç‚¹éƒ½å°†ä½äºŽç›¸åŒçš„ Y åæ ‡ä¸Šï¼ˆ[i]local[/i] Y " +"= 0)。如果 [code]false[/code],则ä¿ç•™ç‚¹çš„原始 Y åæ ‡ã€‚" #: doc/classes/SceneState.xml msgid "A script interface to a scene file's data." @@ -67339,16 +67627,16 @@ msgid "" "get_connection_count() - 1][/code]." msgstr "" "返回场景ä¸çš„ä¿¡å·è¿žæŽ¥æ•°ã€‚\n" -"用于查询其他[code]get_connection_*[/code]方法ä¸çš„连接元数æ®çš„[code]idx[/code]" -"傿•°ï¼Œå…¶é—´é𔿗¶é—´ä¸º[code][0, get_connection_count() - 1][/code]。" +"用于查询其他 [code]get_connection_*[/code] 方法ä¸çš„连接元数æ®çš„ [code]idx[/" +"code] 傿•°ï¼ŒèŒƒå›´æ˜¯ [code][0, get_connection_count() - 1][/code]。" #: doc/classes/SceneState.xml msgid "" "Returns the connection flags for the signal at [code]idx[/code]. See [enum " "Object.ConnectFlags] constants." msgstr "" -"返回 [code]idx[/code] 处的信å·çš„è¿žæŽ¥æ ‡å¿—ã€‚è¯·å‚阅 [enum Object.ConnectFlags] " -"常é‡ã€‚" +"返回 [code]idx[/code] 处的信å·çš„è¿žæŽ¥æ ‡å¿—ã€‚è§ [enum Object.ConnectFlags] 常" +"é‡ã€‚" #: doc/classes/SceneState.xml msgid "Returns the method connected to the signal at [code]idx[/code]." @@ -67362,7 +67650,7 @@ msgstr "返回 [code]idx[/code] 处的信å·å称。" msgid "" "Returns the path to the node that owns the signal at [code]idx[/code], " "relative to the root node." -msgstr "返回拥有[code]idx[/code]处信å·çš„èŠ‚ç‚¹çš„ç›¸å¯¹äºŽæ ¹èŠ‚ç‚¹çš„è·¯å¾„ã€‚" +msgstr "返回拥有 [code]idx[/code] 处信å·çš„èŠ‚ç‚¹çš„ç›¸å¯¹äºŽæ ¹èŠ‚ç‚¹çš„è·¯å¾„ã€‚" #: doc/classes/SceneState.xml msgid "" @@ -67379,8 +67667,8 @@ msgid "" "1][/code]." msgstr "" "返回场景ä¸èŠ‚ç‚¹çš„æ•°é‡ã€‚\n" -"[code]idx[/code]傿•°ç”¨äºŽåœ¨å…¶ä»–[code]get_node_*[/code]æ–¹æ³•ä¸æŸ¥è¯¢èŠ‚ç‚¹æ•°æ®ï¼Œå…¶é—´" -"隔为[code][0, get_node_count() - 1][/code]。" +"[code]idx[/code] 傿•°ç”¨äºŽåœ¨å…¶ä»– [code]get_node_*[/code] æ–¹æ³•ä¸æŸ¥è¯¢èŠ‚ç‚¹æ•°æ®ï¼Œ" +"范围为 [code][0, get_node_count() - 1][/code]。" #: doc/classes/SceneState.xml msgid "" @@ -67550,8 +67838,8 @@ msgstr "" "对给定组的æ¯ä¸ªæˆå‘˜è°ƒç”¨ [code]method[/code]。您å¯ä»¥é€šè¿‡åœ¨æ–¹æ³•è°ƒç”¨ç»“æŸæ—¶æŒ‡å®šå‚" "æ•°æ¥å°†å‚æ•°ä¼ é€’ç»™ [code]method[/code]ã€‚æ¤æ–¹æ³•ç‰æ•ˆäºŽä½¿ç”¨ [constant " "GROUP_CALL_DEFAULT] æ ‡å¿—è°ƒç”¨ [method call_group_flags]。\n" -"[b]注:[/b] [code]method[/code]最多åªèƒ½æœ‰5ä¸ªå‚æ•°ï¼ˆæ€»å…±7ä¸ªå‚æ•°ä¼ 递给这个方" -"法)。\n" +"[b]注æ„:[/b][code]method[/code] 最多åªèƒ½æœ‰ 5 ä¸ªå‚æ•°ï¼ˆæ€»å…± 7 ä¸ªå‚æ•°ä¼ 递给这个" +"方法)。\n" "[b]注æ„:[/b]由于设计é™åˆ¶ï¼Œå¦‚æžœå‚æ•°ä¹‹ä¸€ä¸º [code]null[/code],[method " "call_group] å°†é™é»˜å¤±è´¥ã€‚\n" "[b]注æ„:[/b][method call_group] 将始终调用具有一帧延迟的方法,其方å¼ç±»ä¼¼äºŽ " @@ -67576,8 +67864,8 @@ msgstr "" "对给定组的æ¯ä¸ªæˆå‘˜è°ƒç”¨ [code]method[/code],éµä»Žç»™å®šçš„ [enum " "GroupCallFlags]。您å¯ä»¥é€šè¿‡åœ¨æ–¹æ³•è°ƒç”¨ç»“æŸæ—¶æŒ‡å®šå‚æ•°æ¥å°†å‚æ•°ä¼ é€’ç»™ " "[code]method[/code]。\n" -"[b]注:[/b] [code]method[/code]最多åªèƒ½æœ‰5ä¸ªå‚æ•°ï¼ˆæ€»å…±8ä¸ªå‚æ•°ä¼ 递给这个方" -"法)。\n" +"[b]注æ„:[/b][code]method[/code] 最多åªèƒ½æœ‰ 5 ä¸ªå‚æ•°ï¼ˆæ€»å…± 8 ä¸ªå‚æ•°ä¼ 递给这个" +"方法)。\n" "[b]注æ„:[/b]由于设计é™åˆ¶ï¼Œå¦‚æžœå‚æ•°ä¹‹ä¸€ä¸º [code]null[/code],[method " "call_group_flags] å°†é™é»˜å¤±è´¥ã€‚\n" "[codeblock]\n" @@ -67697,8 +67985,8 @@ msgid "" "Returns [code]true[/code] if the most recent [InputEvent] was marked as " "handled with [method set_input_as_handled]." msgstr "" -"如果最近的 [InputEvent] 被使用 [method set_input_as_handled] 设置为已处ç†ï¼Œè¿”" -"回 [code]true[/code]。" +"如果最近的 [InputEvent] 被使用 [method set_input_as_handled] 设置为已处ç†ï¼Œåˆ™" +"返回 [code]true[/code]。" #: doc/classes/SceneTree.xml msgid "" @@ -67801,14 +68089,15 @@ msgid "" "If [code]true[/code], collision shapes will be visible when running the game " "from the editor for debugging purposes." msgstr "" -"如果 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œç¢°æ’žå½¢çŠ¶å°†æ˜¯å¯è§çš„。" +"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œç¢°æ’žå½¢çŠ¶å°†æ˜¯å¯è§" +"的。" #: doc/classes/SceneTree.xml msgid "" "If [code]true[/code], navigation polygons will be visible when running the " "game from the editor for debugging purposes." msgstr "" -"如果 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œå¯¼èˆªå¤šè¾¹å½¢å°†æ˜¯å¯è§" +"如果为 [code]true[/code],以调试为目的从编辑器è¿è¡Œæ¸¸æˆæ—¶ï¼Œå¯¼èˆªå¤šè¾¹å½¢å°†æ˜¯å¯è§" "的。" #: doc/classes/SceneTree.xml @@ -67829,11 +68118,12 @@ msgid "" "and for manual [Mutex] protection when accessing the [MultiplayerAPI] from " "threads." msgstr "" -"如果 [code]true[/code](默认值),则在 [signal idle_frame] 期间å¯ç”¨æ¤ " +"如果为 [code]true[/code](默认值),则在 [signal idle_frame] 期间å¯ç”¨æ¤ " "SceneTree çš„ [MultiplayerAPI] 自动轮询。\n" -"如果[code]false[/code]ï¼Œåˆ™éœ€è¦æ‰‹åŠ¨è°ƒç”¨[method MultiplayerAPI.poll]æ¥å¤„ç†ç½‘络" -"æ•°æ®åŒ…并投递RPCs/RSETs。这å…许在ä¸åŒçš„循环(例如物ç†ã€çº¿ç¨‹ã€ç‰¹å®šæ—¶é—´æ¥é•¿ï¼‰ä¸" -"è¿è¡Œ RPC/RSET,并在从线程访问 [MultiplayerAPI] 时进行手动 [Mutex] ä¿æŠ¤ã€‚" +"如果为 [code]false[/code]ï¼Œåˆ™éœ€è¦æ‰‹åŠ¨è°ƒç”¨ [method MultiplayerAPI.poll] æ¥å¤„ç†" +"网络数æ®åŒ…并投递 RPC/RSETã€‚è¿™æ ·å°±èƒ½å¤Ÿåœ¨ä¸åŒçš„循环(例如物ç†ã€çº¿ç¨‹ã€ç‰¹å®šæ—¶é—´æ¥" +"长)ä¸è¿è¡Œ RPC/RSET,并在从线程访问 [MultiplayerAPI] 时进行手动 [Mutex] ä¿" +"护。" #: doc/classes/SceneTree.xml msgid "" @@ -67845,11 +68135,11 @@ msgid "" "by default. Handling of networking-related events (connection, " "disconnection, new clients) is done by connecting to [SceneTree]'s signals." msgstr "" -"å¤„ç† RPC 系统的对ç‰å¯¹è±¡ï¼ˆè®¾ç½®åŽæœ‰æ•ˆåœ°å¯ç”¨ç½‘ç»œï¼‰ã€‚æ ¹æ®peer本身的ä¸åŒï¼Œ" -"[SceneTree]å°†æˆä¸ºç½‘络æœåŠ¡å™¨ï¼ˆæ£€æŸ¥[method is_network_server]ï¼‰å¹¶å°†æ ¹èŠ‚ç‚¹çš„ç½‘ç»œ" -"模å¼è®¾ç½®ä¸ºmaster,或者它将æˆä¸ºæ ¹èŠ‚ç‚¹è¢«è®¾ç½®ä¸ºpuppet的普通对ç‰ä½“。所有å节点默" -"认设置为继承网络模å¼ã€‚ä¸Žç½‘ç»œç›¸å…³çš„äº‹ä»¶ï¼ˆè¿žæŽ¥ã€æ–å¼€è¿žæŽ¥ã€æ–°å®¢æˆ·ç«¯ï¼‰çš„å¤„ç†æ˜¯é€š" -"过连接到 [SceneTree] çš„ä¿¡å·æ¥å®Œæˆçš„。" +"å¤„ç† RPC 系统的对ç‰å¯¹è±¡ï¼ˆè®¾ç½®åŽæœ‰æ•ˆåœ°å¯ç”¨ç½‘ç»œï¼‰ã€‚æ ¹æ®å¯¹ç‰ä½“本身的ä¸åŒï¼Œ" +"[SceneTree] å°†æˆä¸ºç½‘络æœåŠ¡å™¨ï¼ˆæ£€æŸ¥ [method is_network_server]ï¼‰å¹¶å°†æ ¹èŠ‚ç‚¹çš„ç½‘" +"络模å¼è®¾ç½®ä¸º master,或者它将æˆä¸ºæ ¹èŠ‚ç‚¹è¢«è®¾ç½®ä¸º puppet 的普通对ç‰ä½“。所有å节" +"点默认设置为继承网络模å¼ã€‚ä¸Žç½‘ç»œç›¸å…³çš„äº‹ä»¶ï¼ˆè¿žæŽ¥ã€æ–å¼€è¿žæŽ¥ã€æ–°å®¢æˆ·ç«¯ï¼‰çš„处ç†" +"是通过连接到 [SceneTree] çš„ä¿¡å·æ¥å®Œæˆçš„。" #: doc/classes/SceneTree.xml msgid "" @@ -67860,9 +68150,9 @@ msgid "" "- [method Node._process], [method Node._physics_process] and [method Node." "_input] will not be called anymore in nodes." msgstr "" -"如果[code]true[/code],[SceneTree]会暂åœã€‚è¿™æ ·åšä¼šæœ‰ä»¥ä¸‹è¡Œä¸º:\n" -"- 2Då’Œ3D物ç†å°†åœæ¢ã€‚这包括信å·å’Œç¢°æ’žæ£€æµ‹ã€‚\n" -"- 节点ä¸å†è°ƒç”¨[method Node._process]ã€[method Node._physics_process]å’Œ" +"如果为 [code]true[/code],[SceneTree] 会暂åœã€‚è¿™æ ·åšä¼šæœ‰ä»¥ä¸‹è¡Œä¸ºï¼š\n" +"- 2D å’Œ 3D 物ç†å°†åœæ¢ï¼ŒåŒ…括信å·å’Œç¢°æ’žæ£€æµ‹ã€‚\n" +"- 节点ä¸å†è°ƒç”¨ [method Node._process]ã€[method Node._physics_process] å’Œ " "[method Node._input]。" #: doc/classes/SceneTree.xml @@ -67890,8 +68180,8 @@ msgid "" "If [code]true[/code], the [SceneTree]'s [member network_peer] refuses new " "incoming connections." msgstr "" -"如果 [code]true[/code],则 [SceneTree] çš„ [member network_peer] æ‹’ç»æ–°çš„ä¼ å…¥" -"连接。" +"如果为 [code]true[/code],则 [SceneTree] çš„ [member network_peer] æ‹’ç»æ–°çš„ä¼ " +"入连接。" #: doc/classes/SceneTree.xml msgid "The [SceneTree]'s root [Viewport]." @@ -67927,16 +68217,16 @@ msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] successfully " "connected to a server. Only emitted on clients." msgstr "" -"当这个[SceneTree]çš„[member network_peer]æˆåŠŸè¿žæŽ¥åˆ°ä¸€ä¸ªæœåŠ¡å™¨æ—¶å‘出。åªåœ¨å®¢æˆ·" -"端å‘出。" +"æ¯å½“这个 [SceneTree] çš„ [member network_peer] æˆåŠŸè¿žæŽ¥åˆ°æœåŠ¡å™¨æ—¶å‘出。åªä¼šåœ¨" +"客户端å‘出。" #: doc/classes/SceneTree.xml msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] fails to establish " "a connection to a server. Only emitted on clients." msgstr "" -"æ¯å½“æ¤ [SceneTree] çš„ [member network_peer] æ— æ³•ä¸ŽæœåŠ¡å™¨å»ºç«‹è¿žæŽ¥æ—¶å‘出。仅在" -"客户端上å‘出。" +"æ¯å½“这个 [SceneTree] çš„ [member network_peer] æ— æ³•å»ºç«‹ä¸ŽæœåŠ¡å™¨çš„è¿žæŽ¥æ—¶å‘出。" +"åªä¼šåœ¨å®¢æˆ·ç«¯å‘出。" #: doc/classes/SceneTree.xml msgid "" @@ -67955,7 +68245,8 @@ msgstr "æ¯å½“å•击全局èœå•项时触å‘。" msgid "" "Emitted immediately before [method Node._process] is called on every node in " "the [SceneTree]." -msgstr "在对[SceneTree]ä¸çš„æ¯ä¸ªèŠ‚ç‚¹è°ƒç”¨[method Node._process]之å‰ç«‹å³å‘出。" +msgstr "" +"在对 [SceneTree] ä¸çš„æ¯ä¸ªèŠ‚ç‚¹è°ƒç”¨ [method Node._process] 之å‰ç«‹å³å‘出。" #: doc/classes/SceneTree.xml msgid "" @@ -67964,9 +68255,9 @@ msgid "" "clients connect to the same server. Upon connecting to a server, a client " "also receives this signal for the server (with ID being 1)." msgstr "" -"当这个[SceneTree]çš„[member network_peer]与一个新的对ç‰ä½“连接时å‘出。ID是新对" -"ç‰ä½“的对ç‰ä½“ID。当其他客户端连接到åŒä¸€ä¸ªæœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¼šå¾—åˆ°é€šçŸ¥ã€‚å½“è¿žæŽ¥åˆ°" -"一个æœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¹Ÿä¼šæ”¶åˆ°è¯¥æœåŠ¡å™¨çš„è¿™ä¸ªä¿¡å·ï¼ˆID为1)。" +"æ¯å½“这个 [SceneTree] çš„ [member network_peer] 连上一个新的对ç‰ä½“æ—¶å‘出。ID 是" +"新对ç‰ä½“的对ç‰ä½“ ID。当有其他客户端连接到åŒä¸€ä¸ªæœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¼šå¾—åˆ°é€šçŸ¥ã€‚å½“" +"连接到æœåŠ¡å™¨æ—¶ï¼Œå®¢æˆ·ç«¯ä¹Ÿä¼šæ”¶åˆ°é’ˆå¯¹è¯¥æœåŠ¡å™¨çš„è¿™ä¸ªä¿¡å·ï¼ˆID 为 1)。" #: doc/classes/SceneTree.xml msgid "" @@ -67974,8 +68265,8 @@ msgid "" "peer. Clients get notified when other clients disconnect from the same " "server." msgstr "" -"æ¯å½“æ¤ [SceneTree] çš„ [member network_peer] ä¸Žå¯¹ç‰æ–¹æ–开连接时å‘出。当其他客" -"户端与åŒä¸€æœåС噍æ–开连接时,客户端会收到通知。" +"æ¯å½“这个 [SceneTree] çš„ [member network_peer] æ–开与对ç‰ä½“的连接时å‘出。当其" +"他客户端与åŒä¸€æœåС噍æ–开连接时,客户端会收到通知。" #: doc/classes/SceneTree.xml msgid "Emitted whenever a node is added to the [SceneTree]." @@ -68130,6 +68421,7 @@ msgid "" msgstr "通过脚本进行通用动画的轻é‡çº§å¯¹è±¡ï¼Œä½¿ç”¨ [Tweener]。" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -68144,24 +68436,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -68170,8 +68461,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -68179,16 +68471,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -68200,7 +68492,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" "[SceneTreeTween] æ˜¯ç”±åœºæ™¯æ ‘ç®¡ç†çš„补间动画。与 [Tween] 相对,ä¸éœ€è¦å®žä¾‹åŒ–节" "点。\n" @@ -68301,15 +68593,18 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" "使用给定的增é‡ç§’æ•° [code]delta[/code] 处ç†è¯¥ [SceneTreeTween]。最常è§çš„用法是" "在该 [SceneTreeTween] æš‚åœæ—¶å¯¹å…¶è¿›è¡Œæ‰‹åŠ¨æŽ§åˆ¶ã€‚ä¹Ÿå¯ç”¨äºŽç«‹å³åœæ¢è¯¥ " @@ -68320,10 +68615,12 @@ msgstr "" "[method stop] 将其ä¿ç•™å¹¶é‡ç½®ã€‚" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -68372,14 +68669,14 @@ msgid "" msgstr "返回该 [SceneTreeTween] ç›®å‰æ˜¯å¦æ£åœ¨æ‰§è¡Œï¼Œå³æœªæš‚åœä¸”未完æˆã€‚" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" "返回该 [SceneTreeTween] æ˜¯å¦æœ‰æ•ˆã€‚有效的 [SceneTreeTween] æ˜¯ç”±åœºæ™¯æ ‘åŒ…å«çš„ " "[SceneTreeTween]ï¼ˆå³ [method SceneTree.get_processed_tweens] 返回的数组ä¸åŒ…å«" @@ -68432,19 +68729,19 @@ msgstr "" "的默认缓动类型。" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" "è¿™åªè¯¥è¡¥é—´åºåˆ—çš„é‡å¤æ¬¡æ•°ï¼Œå³ [code]set_loops(2)[/code] 会让动画执行两次。\n" "调用这个方法时如果ä¸å¸¦å‚数,那么该 [SceneTreeTween] ä¼šæ— é™æ‰§è¡Œï¼Œç›´åˆ°è¢« " @@ -68537,12 +68834,13 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -68633,12 +68931,13 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -68688,14 +68987,14 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" "在该 [SceneTreeTween] å®Œæˆæ‰€æœ‰è¡¥é—´æ—¶è§¦å‘。该 [SceneTreeTween] è¢«è®¾ä¸ºæ— é™å¾ªçޝ" "æ—¶ä¸ä¼šè§¦å‘ï¼ˆè§ [method set_loops])。\n" @@ -68704,19 +69003,21 @@ msgstr "" "留该 [SceneTreeTween]。" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" "完æˆä¸€æ¬¡å¾ªçŽ¯æ—¶è§¦å‘ï¼ˆè§ [method set_loops]),会æä¾›è¯¥å¾ªçŽ¯çš„ç´¢å¼•å·ã€‚这个信å·ä¸" "会在最åŽä¸€æ¬¡å¾ªçޝåŽè§¦å‘ï¼Œè¿™ç§æƒ…况请使用 [signal finished] 代替。" #: doc/classes/SceneTreeTween.xml +#, fuzzy msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" "完æˆè¯¥ [SceneTreeTween] 的一æ¥å®ŒæˆåŽè§¦å‘,会æä¾›è¿™ä¸€æ¥çš„索引å·ã€‚ä¸€æ¥æŒ‡çš„æ˜¯å•" "个 [Tweener] 或一组并行执行的 [Tweener]。" @@ -68845,9 +69146,9 @@ msgstr "" "调用 [method Popup.popup] 方法之å‰é…ç½®å…¶å—æ®µã€‚\n" "[codeblock]\n" "func _ready():\n" -" dialog.config(\"Node\", \"res://new_node.gd\") # For in-engine types\n" +" dialog.config(\"Node\", \"res://new_node.gd\") # 引擎内置类型\n" " dialog.config(\"\\\"res://base_node.gd\\\"\", \"res://derived_node.gd\") " -"# For script types\n" +"# 脚本类型\n" " dialog.popup_centered()\n" "[/codeblock]" @@ -68857,19 +69158,19 @@ msgstr "é¢„å¡«å¿…å¡«å—æ®µä»¥é…ç½® ScriptCreateDialog 以供使用。" #: doc/classes/ScriptCreateDialog.xml msgid "Emitted when the user clicks the OK button." -msgstr "当用户点击OK按钮时å‘出。" +msgstr "当用户点击确定按钮时å‘出。" #: doc/classes/ScriptEditor.xml msgid "Godot editor's script editor." -msgstr "Godot编辑器的脚本编辑器。" +msgstr "Godot 编辑器的脚本编辑器。" #: doc/classes/ScriptEditor.xml msgid "" "[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " "the singleton using [method EditorInterface.get_script_editor]." msgstr "" -"[b]注æ„:[/b]这个类ä¸åº”该被直接实例化。相å,使用[method EditorInterface." -"get_script_editor]æ¥è®¿é—®è¿™ä¸ªå•例。" +"[b]注æ„:[/b]这个类ä¸åº”该被直接实例化。相å,使用 [method EditorInterface." +"get_script_editor] æ¥è®¿é—®è¿™ä¸ªå•例。" #: doc/classes/ScriptEditor.xml msgid "Returns a [Script] that is currently active in editor." @@ -68891,8 +69192,8 @@ msgid "" "code]. The file extension can be omitted from [code]base_path[/code]. It " "will be added based on the selected scripting language." msgstr "" -"æ‰“å¼€åˆ›å»ºè„šæœ¬çš„å¯¹è¯æ¡†ã€‚脚本将扩展[code]base_name[/code]。文件扩展åå¯ä»¥ä»Ž" -"[code]base_path[/code]ä¸çœç•¥ã€‚å®ƒå°†æ ¹æ®æ‰€é€‰æ‹©çš„脚本è¯è¨€æ·»åŠ ã€‚" +"æ‰“å¼€åˆ›å»ºè„šæœ¬çš„å¯¹è¯æ¡†ã€‚脚本将扩展 [code]base_name[/code]。文件扩展åå¯ä»¥ä»Ž " +"[code]base_path[/code] ä¸çœç•¥ã€‚å®ƒå°†æ ¹æ®æ‰€é€‰æ‹©çš„脚本è¯è¨€æ·»åŠ ã€‚" #: doc/classes/ScriptEditor.xml msgid "" @@ -68922,8 +69223,8 @@ msgid "" "size of the page). Horizontal ([HScrollBar]) and Vertical ([VScrollBar]) " "versions are available." msgstr "" -"æ»šåŠ¨æ¡æ˜¯åŸºäºŽ [Range] çš„ [Control]ï¼Œæ˜¾ç¤ºå¯æ‹–动区域(页é¢å¤§å°ï¼‰ã€‚æä¾›æ°´å¹³ " -"([HScrollBar]) 和垂直 ([VScrollBar]) 版本。" +"æ»šåŠ¨æ¡æ˜¯åŸºäºŽ [Range] çš„ [Control]ï¼Œæ˜¾ç¤ºå¯æ‹–动区域(页é¢å¤§å°ï¼‰ã€‚æä¾›æ°´å¹³" +"([HScrollBar])和垂直([VScrollBar])版本。" #: doc/classes/ScrollBar.xml msgid "" @@ -68954,13 +69255,13 @@ msgid "" "they will upscale to the ScrollContainer's size if it's larger (scroll is " "invisible for the chosen dimension)." msgstr "" -"æ»šåŠ¨å®¹å™¨èŠ‚ç‚¹ï¼Œç”¨äºŽåŒ…å« [Control] å节点。 æ»šåŠ¨å®¹å™¨å°†åœ¨éœ€è¦æ—¶è‡ªåŠ¨åˆ›å»ºæ»šåŠ¨æ¡å" -"项([HScrollBar]ã€[VScrollBar] 或两者),且仅在滚动容器区域内绘制控件。滚动æ¡" -"将自动绘制在å³ä¾§æˆ–底部,å³åž‚直或水平,并å…许拖动以在滚动容器内移动å¯è§†æŽ§ä»¶åŠ" -"å…¶å项。滚动æ¡è¿˜å°†æ ¹æ®æŽ§ä»¶ç›¸å¯¹äºŽæ»šåŠ¨å®¹å™¨çš„ [member Control.rect_min_size] 自" -"动调整抓å–器的大å°ã€‚与 [Panel] 控件é…åˆä½¿ç”¨æ•ˆæžœå¾ˆå¥½ã€‚您å¯ä»¥å°†åé¡¹çš„å¤§å°æ ‡å¿—设" -"置为 [code]EXPAND[/code]ï¼Œå½“æ»šåŠ¨å®¹å™¨çš„å¤§å°æ›´å¤§ï¼ˆæ»šåŠ¨å¯¹äºŽæ‰€é€‰ç»´åº¦ä¸å¯è§ï¼‰ï¼Œå®ƒ" -"们将放大到滚动容器的大å°ã€‚" +"æ»šåŠ¨å®¹å™¨èŠ‚ç‚¹ï¼Œç”¨äºŽåŒ…å« [Control] åèŠ‚ç‚¹ã€‚æ»šåŠ¨å®¹å™¨å°†åœ¨éœ€è¦æ—¶è‡ªåŠ¨åˆ›å»ºæ»šåŠ¨æ¡å项" +"([HScrollBar]ã€[VScrollBar] 或两者),且仅在滚动容器区域内绘制控件。滚动æ¡å°†" +"自动绘制在å³ä¾§æˆ–底部,å³åž‚直或水平,并å…许拖动以在滚动容器内移动å¯è§†æŽ§ä»¶åŠå…¶" +"å项。滚动æ¡è¿˜å°†æ ¹æ®æŽ§ä»¶ç›¸å¯¹äºŽæ»šåŠ¨å®¹å™¨çš„ [member Control.rect_min_size] 自动" +"调整抓å–器的大å°ã€‚与 [Panel] 控件é…åˆä½¿ç”¨æ•ˆæžœå¾ˆå¥½ã€‚您å¯ä»¥å°†åé¡¹çš„å¤§å°æ ‡å¿—设置" +"为 [code]EXPAND[/code]ï¼Œå½“æ»šåŠ¨å®¹å™¨çš„å¤§å°æ›´å¤§ï¼ˆæ»šåŠ¨å¯¹äºŽæ‰€é€‰ç»´åº¦ä¸å¯è§ï¼‰ï¼Œå®ƒä»¬" +"将放大到滚动容器的大å°ã€‚" #: doc/classes/ScrollContainer.xml msgid "" @@ -69017,8 +69318,8 @@ msgid "" "focused children (including indirect children) to make sure they are fully " "visible." msgstr "" -"如果 [code]true[/code],则 ScrollContainer 将自动滚动到获得焦点的å项(包括间" -"接å项)以确ä¿å®ƒä»¬å®Œå…¨å¯è§ã€‚" +"如果为 [code]true[/code],则 ScrollContainer 将自动滚动到获得焦点的å项(包括" +"间接å项)以确ä¿å®ƒä»¬å®Œå…¨å¯è§ã€‚" #: doc/classes/ScrollContainer.xml msgid "The current horizontal scroll value." @@ -69026,7 +69327,7 @@ msgstr "当剿°´å¹³æ»šåŠ¨å€¼ã€‚" #: doc/classes/ScrollContainer.xml msgid "If [code]true[/code], enables horizontal scrolling." -msgstr "如果 [code]true[/code],å¯ç”¨æ°´å¹³æ»šåŠ¨ã€‚" +msgstr "如果为 [code]true[/code],å¯ç”¨æ°´å¹³æ»šåŠ¨ã€‚" #: doc/classes/ScrollContainer.xml msgid "The current vertical scroll value." @@ -69034,7 +69335,7 @@ msgstr "当å‰åž‚直滚动值。" #: doc/classes/ScrollContainer.xml msgid "If [code]true[/code], enables vertical scrolling." -msgstr "如果 [code]true[/code],则å¯ç”¨åž‚直滚动。" +msgstr "如果为 [code]true[/code],则å¯ç”¨åž‚直滚动。" #: doc/classes/ScrollContainer.xml msgid "Emitted when scrolling stops." @@ -69056,7 +69357,7 @@ msgstr "2D 碰撞的分段形状。" msgid "" "Segment shape for 2D collisions. Consists of two points, [code]a[/code] and " "[code]b[/code]." -msgstr "2D 碰撞的分段形状。由[code]a[/code] å’Œ [code]b[/code]两点组æˆã€‚" +msgstr "2D 碰撞的分段形状。由 [code]a[/code] å’Œ [code]b[/code] 两点组æˆã€‚" #: doc/classes/SegmentShape2D.xml msgid "The segment's first point position." @@ -69160,8 +69461,8 @@ msgid "" "[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " "code exactly." msgstr "" -"如果ç€è‰²å™¨åœ¨å…¶ä»£ç ä¸æŠŠè¿™ä¸ªå‚æ•°å®šä¹‰ä¸ºuniform,则返回 [code]true[/code]。\n" -"[b]注æ„:[/b][code]param[/code] 必须与代ç ä¸çš„uniformå称完全匹é…。" +"如果ç€è‰²å™¨åœ¨å…¶ä»£ç ä¸æŠŠè¿™ä¸ªå‚æ•°å®šä¹‰ä¸º uniform,则返回 [code]true[/code]。\n" +"[b]注æ„:[/b][code]param[/code] 必须与代ç ä¸çš„ uniform å称完全匹é…。" #: doc/classes/Shader.xml msgid "" @@ -69188,9 +69489,9 @@ msgid "" "[b]Note:[/b] Custom defines are not validated by the Godot shader parser, so " "care should be taken when using them." msgstr "" -"返回该ç€è‰²å™¨çš„自定义。自定义å¯ä»¥åœ¨Godotä¸ç”¨äºŽæ·»åŠ ç€è‰²å™¨é€»è¾‘所需的GLSLé¢„å¤„ç†æŒ‡" -"令(例如:扩展)。\n" -"[b]注æ„:[/b]自定义没有ç»è¿‡Godotç€è‰²å™¨è§£æžå™¨çš„验è¯ï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" +"返回该ç€è‰²å™¨çš„自定义。自定义å¯ä»¥åœ¨ Godot ä¸ç”¨äºŽæ·»åŠ ç€è‰²å™¨é€»è¾‘所需的 GLSL 预处" +"ç†æŒ‡ä»¤ï¼ˆä¾‹å¦‚:扩展)。\n" +"[b]注æ„:[/b]自定义没有ç»è¿‡ Godot ç€è‰²å™¨è§£æžå™¨çš„验è¯ï¼Œæ‰€ä»¥ä½¿ç”¨æ—¶è¦æ³¨æ„。" #: doc/classes/Shader.xml msgid "Mode used to draw all 3D objects." @@ -69228,14 +69529,15 @@ msgstr "" #: doc/classes/ShaderMaterial.xml msgid "" "Returns the current value set for this material of a uniform in the shader." -msgstr "返回在ç€è‰²å™¨ä¸æ¤uniformæè´¨çš„当å‰å€¼ã€‚" +msgstr "返回在ç€è‰²å™¨ä¸æ¤ uniform æè´¨çš„当å‰å€¼ã€‚" #: doc/classes/ShaderMaterial.xml msgid "" "Returns [code]true[/code] if the property identified by [code]name[/code] " "can be reverted to a default value." msgstr "" -"如果由[code]name[/code]æ ‡è¯†çš„å±žæ€§å¯ä»¥æ¢å¤åˆ°é»˜è®¤å€¼ï¼Œåˆ™è¿”回 [code]true[/code]。" +"如果由 [code]name[/code] æ ‡è¯†çš„å±žæ€§å¯ä»¥æ¢å¤åˆ°é»˜è®¤å€¼ï¼Œåˆ™è¿”回 [code]true[/" +"code]。" #: doc/classes/ShaderMaterial.xml msgid "" @@ -69249,8 +69551,8 @@ msgid "" "[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " "code exactly." msgstr "" -"改å˜ç€è‰²å™¨ä¸æè´¨çš„uniform值。\n" -"[b]注æ„:[/b][code]param[/code]必须与代ç ä¸çš„uniformå称完全匹é…。" +"改å˜ç€è‰²å™¨ä¸æè´¨çš„ uniform 值。\n" +"[b]注æ„:[/b][code]param[/code] 必须与代ç ä¸çš„ uniform å称完全匹é…。" #: doc/classes/ShaderMaterial.xml msgid "The [Shader] program used to render this material." @@ -69265,7 +69567,8 @@ msgid "" "Base class for all 3D shape resources. Nodes that inherit from this can be " "used as shapes for a [PhysicsBody] or [Area] objects." msgstr "" -"所有3D形状资æºçš„基类。继承于æ¤çš„节点å¯ä»¥ä½œä¸º[PhysicsBody]或[Area]对象的形状。" +"所有3D形状资æºçš„基类。继承于æ¤çš„节点å¯ä»¥ä½œä¸º [PhysicsBody] 或 [Area] 对象的形" +"状。" #: doc/classes/Shape.xml msgid "" @@ -69288,11 +69591,11 @@ msgstr "" #: doc/classes/Shape2D.xml msgid "Base class for all 2D shapes." -msgstr "所有2D形状的基类。" +msgstr "所有 2D 形状的基类。" #: doc/classes/Shape2D.xml msgid "Base class for all 2D shapes. All 2D shape types inherit from this." -msgstr "所有2D形状的基类。所有的2D形状类型都继承于æ¤ã€‚" +msgstr "所有 2D 形状的基类。所有的 2D 形状类型都继承于æ¤ã€‚" #: doc/classes/Shape2D.xml msgid "" @@ -69419,7 +69722,7 @@ msgstr "" #: doc/classes/ShortCut.xml msgid "If [code]true[/code], this shortcut is valid." -msgstr "如果 [code]true[/code],则æ¤å¿«æ·æ–¹å¼æœ‰æ•ˆã€‚" +msgstr "如果为 [code]true[/code],则æ¤å¿«æ·æ–¹å¼æœ‰æ•ˆã€‚" #: doc/classes/ShortCut.xml msgid "" @@ -69445,8 +69748,8 @@ msgid "" "with respect to skeleton, so it not the actual global/world transform of the " "bone." msgstr "" -"骨架为管ç†éª¨éª¼æä¾›äº†åˆ†å±‚的界é¢ï¼ŒåŒ…æ‹¬å§¿åŠ¿ã€æ”¾æ¾å’ŒåŠ¨ç”»ï¼ˆè¯·å‚阅 [Animation])。" -"它还å¯ä»¥ä½¿ç”¨å¸ƒå¨ƒå¨ƒç‰©ç†ã€‚\n" +"骨架为管ç†éª¨éª¼æä¾›äº†åˆ†å±‚的界é¢ï¼ŒåŒ…æ‹¬å§¿åŠ¿ã€æ”¾æ¾å’ŒåŠ¨ç”»ï¼ˆè§ [Animation])。它还" +"å¯ä»¥ä½¿ç”¨å¸ƒå¨ƒå¨ƒç‰©ç†ã€‚\n" "éª¨éª¼ç›¸å¯¹äºŽéª¨æž¶çš„æ•´ä½“å˜æ¢æ˜¯ç”±ä»¥ä¸‹å±‚次顺åºå†³å®šçš„:放æ¾å§¿åŠ¿ã€è‡ªå®šä¹‰å§¿åŠ¿å’Œå§¿" "势。\n" "注æ„,下é¢çš„â€œå…¨å±€å§¿åŠ¿â€æ˜¯æŒ‡éª¨éª¼ç›¸å¯¹äºŽéª¨æž¶çš„æ•´ä½“å˜æ¢ï¼Œæ‰€ä»¥å®ƒä¸æ˜¯éª¨éª¼çš„实际全局" @@ -69457,7 +69760,7 @@ msgid "" "Adds a bone, with name [code]name[/code]. [method get_bone_count] will " "become the bone index." msgstr "" -"æ·»åŠ ä¸€ä¸ªéª¨éª¼ï¼Œå称为 [code]name[/code]。 [method get_bone_count] å°†æˆä¸ºéª¨éª¼ç´¢" +"æ·»åŠ ä¸€ä¸ªéª¨éª¼ï¼Œå称为 [code]name[/code]。[method get_bone_count] å°†æˆä¸ºéª¨éª¼ç´¢" "引。" #: doc/classes/Skeleton.xml @@ -69511,9 +69814,9 @@ msgid "" "[b]Note:[/b] The parent bone returned will always be less than " "[code]bone_idx[/code]." msgstr "" -"返回在[code]bone_idx[/code]处的骨骼的父级索引。如果是-1,那么骨骼就没有父骨" -"骼。\n" -"[b]注æ„:[/b]返回的父骨骼将总是å°äºŽ[code]bone_idx[/code]。" +"返回在 [code]bone_idx[/code] 处的骨骼的父级索引。如果是 -1,那么骨骼就没有父" +"骨骼。\n" +"[b]注æ„:[/b]返回的父骨骼将总是å°äºŽ [code]bone_idx[/code]。" #: doc/classes/Skeleton.xml msgid "" @@ -69543,7 +69846,7 @@ msgstr "设置骨骼 [code]bone_idx[/code] çš„å§¿åŠ¿å˜æ¢ã€‚" #: doc/classes/Skeleton.xml msgid "Sets the rest transform for bone [code]bone_idx[/code]." -msgstr "为骨骼[code]bone_idx[/code]设置休æ¯å˜æ¢ã€‚" +msgstr "为骨骼 [code]bone_idx[/code] 设置休æ¯å˜æ¢ã€‚" #: doc/classes/Skeleton2D.xml msgid "Skeleton for 2D characters and animated objects." @@ -69696,7 +69999,7 @@ msgid "" "disable the SkeletonIK. A value at or below [code]0.01[/code] also calls " "[method Skeleton.clear_bones_global_pose_override]." msgstr "" -"IK 效果应用于当å‰éª¨æž¶éª¨éª¼é“¾çš„æ’å€¼ã€‚ [code]1.0[/code] 的值将完全覆盖所有骨架骨" +"IK 效果应用于当å‰éª¨æž¶éª¨éª¼é“¾çš„æ’å€¼ã€‚[code]1.0[/code] 的值将完全覆盖所有骨架骨" "éª¼å˜æ¢ï¼Œè€Œ [code]0.0[/code] 的值将在视觉上ç¦ç”¨ SkeletonIK。ç‰äºŽæˆ–低于 " "[code]0.01[/code] 的值也调用 [method Skeleton." "clear_bones_global_pose_override]。" @@ -69732,12 +70035,12 @@ msgid "" "If [code]true[/code] overwrites the rotation of the tip bone with the " "rotation of the [member target] (or [member target_node] if defined)." msgstr "" -"如果[code]true[/code],则用 [member target] (或者如果定义了[member " +"如果为 [code]true[/code],则用 [member target](或者如果定义了 [member " "target_node]])的旋转覆盖尖端骨骼的旋转。" #: doc/classes/SkeletonIK.xml msgid "The name of the current root bone, the first bone in the IK chain." -msgstr "当剿 ¹éª¨çš„å称,å³IK链ä¸çš„第一个骨。" +msgstr "当å‰çš„æ ¹éª¨éª¼çš„åç§°ï¼Œå³ IK 链ä¸çš„第一æ¡éª¨éª¼ã€‚" #: doc/classes/SkeletonIK.xml msgid "" @@ -69755,8 +70058,8 @@ msgid "" "Target node [NodePath] for the IK chain. If available, the node's current " "[Transform] is used instead of the [member target] property." msgstr "" -"IKé“¾çš„ç›®æ ‡èŠ‚ç‚¹[NodePath]。如果有的è¯ï¼Œå°†ä½¿ç”¨èŠ‚ç‚¹å½“å‰çš„[Transform]ï¼Œè€Œä¸æ˜¯" -"[member target]属性。" +"IK é“¾çš„ç›®æ ‡èŠ‚ç‚¹ [NodePath]。如果有的è¯ï¼Œå°†ä½¿ç”¨èŠ‚ç‚¹å½“å‰çš„ [Transform]ï¼Œè€Œä¸æ˜¯ " +"[member target] 属性。" #: doc/classes/SkeletonIK.xml msgid "" @@ -69772,8 +70075,8 @@ msgid "" "magnet target (pole target) when calculating the bone chain. Use the magnet " "position (pole target) to control the bending of the IK chain." msgstr "" -"如果[code]true[/code],指示IK求解器在解算器链时考虑次è¦ç£é“ç›®æ ‡ï¼ˆæžç‚¹ç›®æ ‡ï¼‰ã€‚" -"使用ç£é“ä½ç½®ï¼ˆç£æžç›®æ ‡ï¼‰æ¥æŽ§åˆ¶IK链的弯曲。" +"如果为 [code]true[/code],指示 IK 求解器在解算器链时考虑次è¦ç£é“ç›®æ ‡ï¼ˆæžç‚¹ç›®" +"æ ‡ï¼‰ã€‚ä½¿ç”¨ç£é“ä½ç½®ï¼ˆç£æžç›®æ ‡ï¼‰æ¥æŽ§åˆ¶ IK 链的弯曲。" #: doc/classes/Sky.xml msgid "The base class for [PanoramaSky] and [ProceduralSky]." @@ -69825,8 +70128,8 @@ msgid "" "as it is known to cause GPU hangs on certain systems." msgstr "" "è¾å°„纹ç†å°ºå¯¸ä¸º1024×1024åƒç´ 。\n" -"[b]注æ„:[/b][constant RADIANCE_SIZE_1024]åœ¨æ£€æŸ¥å™¨ä¸æ²¡æœ‰å…¬å¼€ï¼Œå› 为它在æŸäº›ç³»" -"统上会导致GPU挂起。" +"[b]注æ„:[/b][constant RADIANCE_SIZE_1024] åœ¨æ£€æŸ¥å™¨ä¸æ²¡æœ‰å…¬å¼€ï¼Œå› 为它在æŸäº›ç³»" +"统上会导致 GPU 挂起。" #: doc/classes/Sky.xml msgid "" @@ -69835,12 +70138,12 @@ msgid "" "as it is known to cause GPU hangs on certain systems." msgstr "" "è¾å°„纹ç†å°ºå¯¸ä¸º2048×2048åƒç´ 。\n" -"[b]注æ„:[/b][constant RADIANCE_SIZE_2048]没有在检查器ä¸å…¬å¼€ï¼Œå› 为它在æŸäº›ç³»" -"统上会导致GPU挂起。" +"[b]注æ„:[/b][constant RADIANCE_SIZE_2048] 没有在检查器ä¸å…¬å¼€ï¼Œå› 为它在æŸäº›ç³»" +"统上会导致 GPU 挂起。" #: doc/classes/Sky.xml msgid "Represents the size of the [enum RadianceSize] enum." -msgstr "代表[enum RadianceSize]枚举的大å°ã€‚" +msgstr "代表 [enum RadianceSize] 枚举的大å°ã€‚" #: doc/classes/Slider.xml msgid "Base class for GUI sliders." @@ -69899,7 +70202,7 @@ msgstr "3D ä¸ï¼Œä¸¤ä¸ª PhysicsBody 之间的滑动æ¡ã€‚" #: doc/classes/SliderJoint.xml msgid "" "Slides across the X axis of the pivot object. See also [Generic6DOFJoint]." -msgstr "在轴心对象的 X 轴上滑动。å‚阅 [Generic6DOFJoint]。" +msgstr "在轴心对象的 X 轴上滑动。å¦è¯·å‚阅 [Generic6DOFJoint]。" #: doc/classes/SliderJoint.xml msgid "" @@ -69941,8 +70244,8 @@ msgid "" "linear_limit/lower_distance] and [member linear_limit/upper_distance] is " "surpassed." msgstr "" -"一旦超过[member linear_limit/lower_distance]å’Œ[member linear_limit/" -"upper_distance]所定义的æžé™ï¼Œå°±ä¼šäº§ç”Ÿçš„阻尼é‡ã€‚" +"一旦超过 [member linear_limit/lower_distance] å’Œ [member linear_limit/" +"upper_distance] 所定义的æžé™ï¼Œå°±ä¼šäº§ç”Ÿçš„阻尼é‡ã€‚" #: doc/classes/SliderJoint.xml msgid "" @@ -70025,7 +70328,7 @@ msgid "" "If [code]true[/code], the [SoftBody] is simulated in physics. Can be set to " "[code]false[/code] to pause the physics simulation." msgstr "" -"为 [code]true[/code] æ—¶ [SoftBody] ä¼šè¿›è¡Œç‰©ç†æ¨¡æ‹Ÿã€‚å¯ä»¥é€šè¿‡è®¾ç½®ä¸º " +"为 [code]true[/code] 时该 [SoftBody] ä¼šè¿›è¡Œç‰©ç†æ¨¡æ‹Ÿã€‚å¯ä»¥é€šè¿‡è®¾ç½®ä¸º " "[code]false[/code] æ¥æš‚åœç‰©ç†æ¨¡æ‹Ÿã€‚" #: doc/classes/SoftBody.xml @@ -70208,15 +70511,15 @@ msgstr "" msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." -msgstr "围绕轴(一个å•ä½[Vector3]ï¼‰æ—‹è½¬å±€éƒ¨å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。" +msgstr "围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬å±€éƒ¨å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。" #: doc/classes/Spatial.xml msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians. The rotation axis is in object-local coordinate system." msgstr "" -"围绕轴(一个å•ä½[Vector3]ï¼‰æ—‹è½¬æœ¬åœ°å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本" -"åœ°åæ ‡ç³»ä¸ã€‚" +"围绕轴(å•ä½ [Vector3]ï¼‰æ—‹è½¬æœ¬åœ°å˜æ¢ï¼ŒæŒ‡å®šè§’度(弧度)。旋转轴是在物体的本地" +"åæ ‡ç³»ä¸ã€‚" #: doc/classes/Spatial.xml msgid "Rotates the local transformation around the X axis by angle in radians." @@ -70248,8 +70551,8 @@ msgid "" "transformation scale. Changes to the local transformation scale are " "preserved." msgstr "" -"设置节点是å¦ä½¿ç”¨[code](1, 1, 1)[/code]çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°å˜æ¢æ¯”ä¾‹ã€‚å¯¹æœ¬åœ°å˜æ¢æ¯”例" -"的改å˜ä¼šè¢«ä¿ç•™ä¸‹æ¥ã€‚" +"设置节点是å¦ä½¿ç”¨ [code](1, 1, 1)[/code] çš„æ¯”ä¾‹æˆ–å…¶æœ¬åœ°å˜æ¢æ¯”ä¾‹ã€‚å¯¹æœ¬åœ°å˜æ¢æ¯”" +"例的改å˜ä¼šè¢«ä¿ç•™ä¸‹æ¥ã€‚" #: doc/classes/Spatial.xml msgid "" @@ -70268,7 +70571,7 @@ msgid "" "Sets whether the node notifies about its local transformation changes. " "[Spatial] will not propagate this by default." msgstr "" -"设置节点是å¦é€šçŸ¥å®ƒçš„å±€éƒ¨å˜æ¢å˜åŒ–。默认情况下,[Spatial]ä¸ä¼šä¼ æ’这一点。" +"设置节点是å¦é€šçŸ¥å®ƒçš„å±€éƒ¨å˜æ¢å˜åŒ–。默认情况下,[Spatial] ä¸ä¼šä¼ æ’这一点。" #: doc/classes/Spatial.xml msgid "" @@ -70276,26 +70579,26 @@ msgid "" "changes. [Spatial] will not propagate this by default, unless it is in the " "editor context and it has a valid gizmo." msgstr "" -"设置节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨å˜æ¢çš„å˜åŒ–。[Spatial]默认情况下ä¸ä¼šä¼ æ’ï¼Œé™¤éžæ˜¯åœ¨" -"编辑器上下文ä¸ï¼Œå¹¶ä¸”它有一个有效的gizmo。" +"设置节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨å˜æ¢çš„å˜åŒ–。[Spatial] 默认情况下ä¸ä¼šä¼ æ’ï¼Œé™¤éžæ˜¯" +"在编辑器上下文ä¸ï¼Œå¹¶ä¸”它有一个有效的控制器。" #: doc/classes/Spatial.xml msgid "" "Enables rendering of this node. Changes [member visible] to [code]true[/" "code]." -msgstr "å¯ç”¨æ¤èŠ‚ç‚¹çš„å‘ˆçŽ°ã€‚å°†[member visible]更改为 [code]true[/code]。" +msgstr "å¯ç”¨æ¤èŠ‚ç‚¹çš„å‘ˆçŽ°ã€‚å°† [member visible] 更改为 [code]true[/code]。" #: doc/classes/Spatial.xml msgid "" "Transforms [code]local_point[/code] from this node's local space to world " "space." -msgstr "å°†[code]local_point[/code]从该节点的本地空间转æ¢ä¸ºä¸–界空间。" +msgstr "å°† [code]local_point[/code] 从该节点的本地空间转æ¢ä¸ºä¸–界空间。" #: doc/classes/Spatial.xml msgid "" "Transforms [code]global_point[/code] from world space to this node's local " "space." -msgstr "å°†[code]global_point[/code]从世界空间转æ¢åˆ°è¿™ä¸ªèŠ‚ç‚¹çš„æœ¬åœ°ç©ºé—´ã€‚" +msgstr "å°† [code]global_point[/code] 从世界空间转æ¢åˆ°è¿™ä¸ªèŠ‚ç‚¹çš„æœ¬åœ°ç©ºé—´ã€‚" #: doc/classes/Spatial.xml msgid "" @@ -70305,15 +70608,15 @@ msgid "" "offset of [code](2, 0, 0)[/code] would actually add 20 ([code]2 * 10[/code]) " "to the X coordinate." msgstr "" -"通过给定的åç§»é‡[Vector3]改å˜èŠ‚ç‚¹çš„ä½ç½®ã€‚\n" -"注æ„,平移[code]offset[/code]å—èŠ‚ç‚¹æ¯”ä¾‹å› å(scale)的影å“,所以如果按例如" -"[code](10,1,1)[/code]进行缩放,平移[code](2,0,0)[/code]实际上会在Xåæ ‡ä¸Šå¢žåŠ " +"通过给定的åç§»é‡ [Vector3] 改å˜èŠ‚ç‚¹çš„ä½ç½®ã€‚\n" +"注æ„,平移 [code]offset[/code] å—节点缩放的影å“,所以如果按例如 [code]" +"(10,1,1)[/code] 进行缩放,平移 [code](2,0,0)[/code] 实际上会在 X åæ ‡ä¸Šå¢žåŠ " "20 ([code]2 * 10[/code])。" #: doc/classes/Spatial.xml msgid "" "Changes the node's position by the given offset [Vector3] in local space." -msgstr "通过给定的åç§»é‡[Vector3]改å˜èŠ‚ç‚¹åœ¨å±€éƒ¨ç©ºé—´ä¸çš„ä½ç½®ã€‚" +msgstr "通过给定的åç§»é‡ [Vector3] 改å˜èŠ‚ç‚¹åœ¨å±€éƒ¨ç©ºé—´ä¸çš„ä½ç½®ã€‚" #: doc/classes/Spatial.xml msgid "Updates the [SpatialGizmo] of this node." @@ -70343,17 +70646,18 @@ msgid "" "point numbers. Therefore, applying affine operations on the rotation " "\"vector\" is not meaningful." msgstr "" -"å±€éƒ¨å˜æ¢çš„æ—‹è½¬éƒ¨åˆ†ä»¥å¼§åº¦è¡¨ç¤ºï¼Œä»¥YXZ-Euler角的形å¼è¡¨ç¤º(Xè§’ã€Yè§’ã€Zè§’)。\n" -"[b]注:[/b]åœ¨æ•°å¦æ„ä¹‰ä¸Šï¼Œæ—‹è½¬æ˜¯ä¸€ä¸ªçŸ©é˜µè€Œä¸æ˜¯ä¸€ä¸ªå‘é‡ã€‚这三个欧拉角是旋转矩阵" -"æ¬§æ‹‰è§’å‚æ•°åŒ–çš„ä¸‰ä¸ªç‹¬ç«‹å‚æ•°ï¼Œå˜å‚¨åœ¨[Vector3]æ•°æ®ç»“æž„ä¸å¹¶ä¸æ˜¯å› 为旋转是一个矢" -"é‡ï¼Œè€Œæ˜¯å› 为[Vector3]æ˜¯ä¸€ç§æ–¹ä¾¿å˜å‚¨3个浮点数的数æ®ç»“æž„ã€‚å› æ¤ï¼Œå¯¹æ—‹è½¬â€œå‘é‡â€åº”" -"用仿射æ“作是没有æ„义的。" +"å±€éƒ¨å˜æ¢çš„æ—‹è½¬éƒ¨åˆ†ä»¥å¼§åº¦è¡¨ç¤ºï¼Œä»¥ YXZ-Euler 角的形å¼è¡¨ç¤ºï¼ˆX è§’ã€Y è§’ã€Z " +"角)。\n" +"[b]注æ„:[/b]åœ¨æ•°å¦æ„ä¹‰ä¸Šï¼Œæ—‹è½¬æ˜¯ä¸€ä¸ªçŸ©é˜µè€Œä¸æ˜¯ä¸€ä¸ªå‘é‡ã€‚这三个欧拉角是旋转矩" +"é˜µæ¬§æ‹‰è§’å‚æ•°åŒ–çš„ä¸‰ä¸ªç‹¬ç«‹å‚æ•°ï¼Œå˜å‚¨åœ¨ [Vector3] æ•°æ®ç»“æž„ä¸å¹¶ä¸æ˜¯å› 为旋转是一个" +"矢é‡ï¼Œè€Œæ˜¯å› 为 [Vector3] æ˜¯ä¸€ç§æ–¹ä¾¿å˜å‚¨ 3 个浮点数的数æ®ç»“æž„ã€‚å› æ¤ï¼Œå¯¹æ—‹è½¬â€œå‘" +"é‡â€åº”用仿射æ“作是没有æ„义的。" #: doc/classes/Spatial.xml msgid "" "Rotation part of the local transformation in degrees, specified in terms of " "YXZ-Euler angles in the format (X angle, Y angle, Z angle)." -msgstr "æ—‹è½¬éƒ¨åˆ†å±€éƒ¨å˜æ¢ä¸ºåº¦ï¼ŒæŒ‰YXZ-Eulerè§’æ ¼å¼æŒ‡å®š(Xè§’ã€Yè§’ã€Zè§’)。" +msgstr "æ—‹è½¬éƒ¨åˆ†å±€éƒ¨å˜æ¢ä¸ºåº¦ï¼ŒæŒ‰ YXZ-Euler è§’æ ¼å¼æŒ‡å®šï¼ˆX è§’ã€Y è§’ã€Z 角)。" #: doc/classes/Spatial.xml msgid "" @@ -70369,7 +70673,7 @@ msgstr "" #: doc/classes/Spatial.xml msgid "Local space [Transform] of this node, with respect to the parent node." -msgstr "该节点相对于父节点的局部空间[Transform]。" +msgstr "该节点相对于父节点的局部空间 [Transform]。" #: doc/classes/Spatial.xml msgid "Local translation of this node." @@ -70381,8 +70685,8 @@ msgid "" "its antecedents are visible as well (in other words, [method " "is_visible_in_tree] must return [code]true[/code])." msgstr "" -"如果[code]true[/code],这个节点就会被画出æ¥ã€‚åªæœ‰å½“它的所有å‰é¡¹ä¹Ÿæ˜¯å¯è§çš„æ—¶" -"å€™ï¼Œè¿™ä¸ªèŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree]必须返回 " +"如果为 [code]true[/code],这个节点就会被画出æ¥ã€‚åªæœ‰å½“它的所有å‰é¡¹ä¹Ÿæ˜¯å¯è§çš„" +"æ—¶å€™ï¼Œè¿™ä¸ªèŠ‚ç‚¹æ‰æ˜¯å¯è§çš„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree] 必须返回 " "[code]true[/code])。" #: doc/classes/Spatial.xml @@ -70481,7 +70785,7 @@ msgid "" "way the cost for using the feature is only incurred when specified. Features " "can also be enabled by setting the corresponding member to [code]true[/code]." msgstr "" -"如果 [code]true[/code],则å¯ç”¨æŒ‡å®šçš„ [enum Feature]。 [SpatialMaterial]s ä¸å¯" +"如果为 [code]true[/code],则å¯ç”¨æŒ‡å®šçš„ [enum Feature]。[SpatialMaterial] ä¸å¯" "用的许多功能需è¦åœ¨ä½¿ç”¨å‰å¯ç”¨ã€‚è¿™æ ·ï¼Œåªæœ‰åœ¨æŒ‡å®šæ—¶æ‰ä¼šäº§ç”Ÿä½¿ç”¨è¯¥åŠŸèƒ½çš„æˆæœ¬ã€‚也" "å¯ä»¥é€šè¿‡å°†ç›¸åº”çš„æˆå‘˜è®¾ç½®ä¸º [code]true[/code] æ¥å¯ç”¨åŠŸèƒ½ã€‚" @@ -70573,8 +70877,8 @@ msgid "" "If [code]true[/code], ambient occlusion is enabled. Ambient occlusion " "darkens areas based on the [member ao_texture]." msgstr "" -"如果 [code]true[/code],å¯ç”¨çŽ¯å¢ƒé®æŒ¡ã€‚çŽ¯å¢ƒé®æŒ¡æ ¹æ® [member ao_texture] 使区域" -"å˜æš—。" +"如果为 [code]true[/code],å¯ç”¨çŽ¯å¢ƒé®æŒ¡ã€‚çŽ¯å¢ƒé®æŒ¡æ ¹æ® [member ao_texture] 使区" +"åŸŸå˜æš—。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70593,8 +70897,8 @@ msgid "" "If [code]true[/code], use [code]UV2[/code] coordinates to look up from the " "[member ao_texture]." msgstr "" -"如果 [code]true[/code],请使用 [code]UV2[/code] åæ ‡ä»Ž[member ao_texture]䏿Ÿ¥" -"找。" +"如果为 [code]true[/code],请使用 [code]UV2[/code] åæ ‡ä»Ž [member ao_texture] " +"䏿Ÿ¥æ‰¾ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70641,9 +70945,9 @@ msgid "" "[b]Note:[/b] Clearcoat rendering is not visible if the material has [member " "flags_unshaded] set to [code]true[/code]." msgstr "" -"如果 [code]true[/code],则å¯ç”¨æ¸…æ¼†æ¸²æŸ“ã€‚åœ¨ç…§æ˜Žè®¡ç®—ä¸æ·»åŠ äºŒçº§é€æ˜Žé€šè·¯ï¼Œä»Žè€Œå¯¼" -"è‡´æ·»åŠ é•œé¢å射斑点。这使得æè´¨çœ‹èµ·æ¥å¥½åƒæœ‰ä¸€å±‚逿˜Žå±‚,å¯ä»¥æ˜¯æœ‰å…‰æ³½çš„也å¯ä»¥æ˜¯" -"粗糙的。\n" +"如果为 [code]true[/code],则å¯ç”¨æ¸…æ¼†æ¸²æŸ“ã€‚åœ¨ç…§æ˜Žè®¡ç®—ä¸æ·»åŠ äºŒçº§é€æ˜Žé€šè·¯ï¼Œä»Žè€Œ" +"å¯¼è‡´æ·»åŠ é•œé¢å射斑点。这使得æè´¨çœ‹èµ·æ¥å¥½åƒæœ‰ä¸€å±‚逿˜Žå±‚,å¯ä»¥æ˜¯æœ‰å…‰æ³½çš„也å¯ä»¥" +"是粗糙的。\n" "[b]注æ„:[/b]如果æè´¨å°† [member flags_unshaded] 设置为 [code]true[/code],则" "逿˜Žæ¶‚层渲染ä¸å¯è§ã€‚" @@ -70670,8 +70974,8 @@ msgid "" "along the view ray to determine occlusion and parrallax. This can be very " "performance demanding, but results in more realistic looking depth mapping." msgstr "" -"如果 [code]true[/code],ç€è‰²å™¨å°†åœ¨æ²¿è§†å›¾å°„çº¿çš„å¤šä¸ªç‚¹ä¸Šè¯»å–æ·±åº¦çº¹ç†ä»¥ç¡®å®šé®æŒ¡" -"和视差。这å¯èƒ½å¯¹æ€§èƒ½è¦æ±‚å¾ˆé«˜ï¼Œä½†ä¼šäº§ç”Ÿæ›´é€¼çœŸçš„æ·±åº¦æ˜ å°„ã€‚" +"如果为 [code]true[/code],ç€è‰²å™¨å°†åœ¨æ²¿è§†å›¾å°„çº¿çš„å¤šä¸ªç‚¹ä¸Šè¯»å–æ·±åº¦çº¹ç†ä»¥ç¡®å®šé®" +"挡和视差。这å¯èƒ½å¯¹æ€§èƒ½è¦æ±‚å¾ˆé«˜ï¼Œä½†ä¼šäº§ç”Ÿæ›´é€¼çœŸçš„æ·±åº¦æ˜ å°„ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70681,8 +70985,8 @@ msgid "" "the same material. The value of [member depth_enabled] will be ignored if " "[member uv1_triplanar] is enabled." msgstr "" -"如果 [code]true[/code],则å¯ç”¨æ·±åº¦æ˜ å°„ï¼ˆä¹Ÿç§°ä¸ºâ€œè§†å·®æ˜ å°„â€æˆ–â€œé«˜åº¦æ˜ å°„â€ï¼‰ã€‚å¦è§ " -"[member normal_enabled]。\n" +"如果为 [code]true[/code],则å¯ç”¨æ·±åº¦æ˜ å°„ï¼ˆä¹Ÿç§°ä¸ºâ€œè§†å·®æ˜ å°„â€æˆ–â€œé«˜åº¦æ˜ å°„â€ï¼‰ã€‚å¦" +"è§ [member normal_enabled]。\n" "[b]注æ„:[/b]如果在åŒä¸€æè´¨ä¸Šä½¿ç”¨ä¸‰å¹³é¢è´´å›¾ï¼Œåˆ™ä¸æ”¯æŒæ·±åº¦è´´å›¾ã€‚如果å¯ç”¨ " "[member uv1_triplanar],则 [member depth_enabled] 的值将被忽略。" @@ -70692,8 +70996,8 @@ msgid "" "the depth effect. This may be necessary if you have encoded your binormals " "in a way that is conflicting with the depth effect." msgstr "" -"如果 [code]true[/code],则在深度效果ä¸ä½¿ç”¨ä¹‹å‰ä¼šç¿»è½¬å‰¯æ³•线的方å‘ã€‚å¦‚æžœä½ å¯¹ä½ " -"çš„å‰¯æ³•çº¿çš„ç¼–ç æ–¹å¼ä¸Žæ·±åº¦æ•ˆæžœæœ‰å†²çªï¼Œè¿™å¯èƒ½æ˜¯å¿…è¦çš„。" +"如果为 [code]true[/code],则在深度效果ä¸ä½¿ç”¨ä¹‹å‰ä¼šç¿»è½¬å‰¯æ³•线的方å‘ã€‚å¦‚æžœä½ å¯¹" +"ä½ çš„å‰¯æ³•çº¿çš„ç¼–ç æ–¹å¼ä¸Žæ·±åº¦æ•ˆæžœæœ‰å†²çªï¼Œè¿™å¯èƒ½æ˜¯å¿…è¦çš„。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70701,8 +71005,8 @@ msgid "" "the depth effect. This may be necessary if you have encoded your tangents in " "a way that is conflicting with the depth effect." msgstr "" -"如果 [code]true[/code],切线方å‘在深度效果ä¸ä½¿ç”¨å‰ä¼šç¿»è½¬ã€‚å¦‚æžœä½ å¯¹åˆ‡çº¿çš„ç¼–ç " -"æ–¹å¼ä¸Žæ·±åº¦æ•ˆæžœæœ‰å†²çªï¼Œè¿™å¯èƒ½æ˜¯å¿…è¦çš„。" +"如果为 [code]true[/code],切线方å‘在深度效果ä¸ä½¿ç”¨å‰ä¼šç¿»è½¬ã€‚å¦‚æžœä½ å¯¹åˆ‡çº¿çš„ç¼–" +"ç æ–¹å¼ä¸Žæ·±åº¦æ•ˆæžœæœ‰å†²çªï¼Œè¿™å¯èƒ½æ˜¯å¿…è¦çš„。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70753,9 +71057,9 @@ msgid "" "detail_mask]. This can be used to add variation to objects, or to blend " "between two different albedo/normal textures." msgstr "" -"如果[code]true[/code],å¯ç”¨ç»†èŠ‚å åŠ ã€‚Detail是基于[member detail_mask]在对象表" -"颿··åˆçš„第二个纹ç†ã€‚è¿™å¯ä»¥ç”¨æ¥ç»™ç‰©ä½“å¢žåŠ å˜åŒ–,或者在两ç§ä¸åŒçš„å射率/法线纹ç†" -"之间进行混åˆã€‚" +"如果为 [code]true[/code],å¯ç”¨ç»†èŠ‚å åŠ ã€‚Detail是基于[member detail_mask]在对" +"è±¡è¡¨é¢æ··åˆçš„第二个纹ç†ã€‚è¿™å¯ä»¥ç”¨æ¥ç»™ç‰©ä½“å¢žåŠ å˜åŒ–,或者在两ç§ä¸åŒçš„å射率/法线" +"纹ç†ä¹‹é—´è¿›è¡Œæ··åˆã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70782,7 +71086,7 @@ msgid "" "Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail " "layer. See [enum DetailUV] for options." msgstr "" -"指定细节层是使用[code]UV[/code]还是[code]UV2[/code]。选项请å‚阅[enum " +"指定细节层是使用 [code]UV[/code] 还是 [code]UV2[/code]。选项请å‚阅 [enum " "DetailUV]。" #: doc/classes/SpatialMaterial.xml @@ -70820,11 +71124,11 @@ msgstr "" msgid "" "Specifies which type of fade to use. Can be any of the [enum " "DistanceFadeMode]s." -msgstr "指定è¦ä½¿ç”¨çš„æ·¡å…¥æ·¡å‡ºç±»åž‹ã€‚å¯ä»¥æ˜¯ä»»ä½•一个[enum DistanceFadeMode]。" +msgstr "指定è¦ä½¿ç”¨çš„æ·¡å…¥æ·¡å‡ºç±»åž‹ã€‚å¯ä»¥æ˜¯ä»»ä½•一个 [enum DistanceFadeMode]。" #: doc/classes/SpatialMaterial.xml msgid "The emitted light's color. See [member emission_enabled]." -msgstr "å‘出的光的颜色。å‚阅[member emission_enabled]。" +msgstr "å‘出的光的颜色。å‚阅 [member emission_enabled]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70833,25 +71137,25 @@ msgid "" "[GIProbe] or [BakedLightmap] is used and this object is used in baked " "lighting." msgstr "" -"如果 [code]true[/code],物体会å‘光。å‘å…‰ä½¿ç‰©ä½“çœ‹èµ·æ¥æ›´äº®ã€‚如果使用 [GIProbe] " -"或 [BakedLightmap] 并且æ¤å¯¹è±¡ç”¨äºŽçƒ˜ç„™ç…§æ˜Žï¼Œåˆ™è¯¥å¯¹è±¡è¿˜å¯ä»¥å°†å…‰æŠ•射到其他对象" -"上。" +"如果为 [code]true[/code],物体会å‘光。å‘å…‰ä½¿ç‰©ä½“çœ‹èµ·æ¥æ›´äº®ã€‚如果使用 " +"[GIProbe] 或 [BakedLightmap] 并且æ¤å¯¹è±¡ç”¨äºŽçƒ˜ç„™ç…§æ˜Žï¼Œåˆ™è¯¥å¯¹è±¡è¿˜å¯ä»¥å°†å…‰æŠ•射到" +"其他对象上。" #: doc/classes/SpatialMaterial.xml msgid "The emitted light's strength. See [member emission_enabled]." -msgstr "å‘出的光的强度。å‚阅[member emission_enabled]。" +msgstr "å‘å‡ºçš„å…‰çš„å¼ºåº¦ã€‚è§ [member emission_enabled]。" #: doc/classes/SpatialMaterial.xml msgid "Use [code]UV2[/code] to read from the [member emission_texture]." -msgstr "使用[code]UV2[/code]从[member emission_texture]ä¸è¯»å–。" +msgstr "使用 [code]UV2[/code] 从 [member emission_texture] ä¸è¯»å–。" #: doc/classes/SpatialMaterial.xml msgid "" "Sets how [member emission] interacts with [member emission_texture]. Can " "either add or multiply. See [enum EmissionOperator] for options." msgstr "" -"设置[member emission]与[member emission_texture]的交互方å¼ã€‚å¯ä»¥æ˜¯åŠ æ³•æˆ–ä¹˜" -"法。选项å‚阅 [enum EmissionOperator] 。" +"设置 [member emission] 与 [member emission_texture] 的交互方å¼ã€‚å¯ä»¥æ˜¯åŠ æ³•æˆ–" +"乘法。å¯é€‰å€¼è§ [enum EmissionOperator] 。" #: doc/classes/SpatialMaterial.xml msgid "Texture that specifies how much surface emits light at a given point." @@ -70869,13 +71173,13 @@ msgstr "å¯ç”¨æœ‰ç¬¦å·è·ç¦»åœºæ¸²æŸ“ç€è‰²å™¨ã€‚" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the object receives no ambient light." -msgstr "如果[code]true[/code]ï¼Œåˆ™å¯¹è±¡ä¸æŽ¥æ”¶çŽ¯å¢ƒå…‰ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™å¯¹è±¡ä¸æŽ¥æ”¶çŽ¯å¢ƒå…‰ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], the object receives no shadow that would otherwise be " "cast onto it." -msgstr "如果[code]true[/code],则对象ä¸ä¼šæ”¶åˆ°æŠ•射到其上的阴影。" +msgstr "如果为 [code]true[/code],则对象ä¸ä¼šæ”¶åˆ°æŠ•射到其上的阴影。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70883,25 +71187,26 @@ msgid "" "the normal stays correct when using a non-uniform scale. Only enable if " "using non-uniform scaling." msgstr "" -"如果 [code]true[/code],ç€è‰²å™¨å°†è®¡ç®—é¢å¤–çš„æ“作,以确ä¿åœ¨ä½¿ç”¨éžå‡åŒ€æ¯”例时法线" -"ä¿æŒæ£ç¡®ã€‚仅在使用éžå‡åŒ€ç¼©æ”¾æ—¶å¯ç”¨ã€‚" +"如果为 [code]true[/code],ç€è‰²å™¨å°†è®¡ç®—é¢å¤–çš„æ“作,以确ä¿åœ¨ä½¿ç”¨éžå‡åŒ€æ¯”例时法" +"çº¿ä¿æŒæ£ç¡®ã€‚仅在使用éžå‡åŒ€ç¼©æ”¾æ—¶å¯ç”¨ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], the object is rendered at the same size regardless of " "distance." -msgstr "如果[code]true[/code]ï¼Œåˆ™æ— è®ºè·ç¦»è¿œè¿‘,对象都以相åŒçš„尺寸呈现。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™æ— è®ºè·ç¦»è¿œè¿‘,对象都以相åŒçš„尺寸呈现。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], transparency is enabled on the body. See also [member " "params_blend_mode]." msgstr "" -"如果[code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å‚阅 [member params_blend_mode]。" +"如果为 [code]true[/code],则å¯ç”¨ç‰©ä½“çš„é€æ˜Žåº¦ã€‚å‚阅 [member " +"params_blend_mode]。" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the object is unaffected by lighting." -msgstr "如果 [code]true[/code],则物体ä¸å—光照影å“。" +msgstr "如果为 [code]true[/code],则物体ä¸å—光照影å“。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70909,8 +71214,8 @@ msgid "" "[b]Note:[/b] This is only effective for objects whose geometry is point-" "based rather than triangle-based. See also [member params_point_size]." msgstr "" -"如果[code]true[/code],å¯ä»¥æ”¹å˜æ¸²æŸ“点的大å°ã€‚\n" -"[b]注æ„:[/b]è¿™åªå¯¹å‡ ä½•ä½“æ˜¯åŸºäºŽç‚¹è€Œä¸æ˜¯åŸºäºŽä¸‰è§’形的对象有效。å‚阅[member " +"如果为 [code]true[/code],则å¯ä»¥æ”¹å˜æ¸²æŸ“点的大å°ã€‚\n" +"[b]注æ„:[/b]è¿™åªå¯¹å‡ ä½•ä½“æ˜¯åŸºäºŽç‚¹è€Œä¸æ˜¯åŸºäºŽä¸‰è§’å½¢çš„å¯¹è±¡æœ‰æ•ˆã€‚è§ [member " "params_point_size]。" #: doc/classes/SpatialMaterial.xml @@ -70920,8 +71225,8 @@ msgid "" "areas are transparent. Useful for overlaying shadows onto a camera feed in " "AR." msgstr "" -"如果 [code]true[/code],å¯ç”¨ \"阴影到ä¸é€æ˜Žåº¦ \"的渲染模å¼ï¼Œåœ¨è¯¥æ¨¡å¼ä¸‹ï¼Œå…‰ç…§" -"会修改 alpha,使阴影区域ä¸é€æ˜Žï¼Œéžé˜´å½±åŒºåŸŸé€æ˜Žã€‚对于在ARä¸æŠŠé˜´å½±å åŠ åˆ°ç›¸æœºç”»" +"如果为 [code]true[/code],å¯ç”¨â€œé˜´å½±åˆ°ä¸é€æ˜Žåº¦â€çš„æ¸²æŸ“模å¼ï¼Œåœ¨è¯¥æ¨¡å¼ä¸‹ï¼Œå…‰ç…§ä¼š" +"修改 Alpha,使阴影区域ä¸é€æ˜Žï¼Œéžé˜´å½±åŒºåŸŸé€æ˜Žã€‚对于在 AR ä¸æŠŠé˜´å½±å åŠ åˆ°ç›¸æœºç”»" "é¢ä¸Šå¾ˆæœ‰ç”¨ã€‚" #: doc/classes/SpatialMaterial.xml @@ -70960,8 +71265,8 @@ msgid "" "If [code]true[/code], triplanar mapping is calculated in world space rather " "than object local space. See also [member uv1_triplanar]." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™åœ¨ä¸–ç•Œç©ºé—´è€Œä¸æ˜¯ç‰©ä½“局部空间ä¸è®¡ç®—䏉平颿˜ 射。å¦è§ " -"[member uv1_triplanar]。" +"如果为 [code]true[/code]ï¼Œåˆ™åœ¨ä¸–ç•Œç©ºé—´è€Œä¸æ˜¯ç‰©ä½“局部空间ä¸è®¡ç®—䏉平颿˜ 射。å¦" +"è§ [member uv1_triplanar]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -70991,13 +71296,13 @@ msgid "" msgstr "" "设置镜é¢åå°„å…‰å¶çš„大å°ã€‚镜é¢å射光嶿˜¯å…‰æºå射的亮点。\n" "[b]注æ„:[/b]这与 [member metallic] ä¸åŒï¼Œèƒ½é‡ä¸å®ˆæ’,所以在大多数情况下,应" -"该将其ä¿ç•™åœ¨ [code]0.5[/code]。请å‚阅 [member roughness]。" +"该将其ä¿ç•™åœ¨ [code]0.5[/code]。å¦è¯·å‚阅 [member roughness]。" #: doc/classes/SpatialMaterial.xml msgid "" "Texture used to specify metallic for an object. This is multiplied by " "[member metallic]." -msgstr "用于指定对象的金属质感。æ¤å€¼ä¹˜[member metallic]。" +msgstr "用于指定对象的金属质感。æ¤å€¼ä¹˜ [member metallic]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71013,7 +71318,7 @@ msgstr "" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], normal mapping is enabled." -msgstr "如果[code]true[/code],则å¯ç”¨æ³•çº¿æ˜ å°„ã€‚" +msgstr "如果为 [code]true[/code],则å¯ç”¨æ³•çº¿æ˜ å°„ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The strength of the normal map's effect." @@ -71054,9 +71359,9 @@ msgid "" "Otherwise the scale is lost when billboarding. Only applies when [member " "params_billboard_mode] is [constant BILLBOARD_ENABLED]." msgstr "" -"如果 [code]true[/code],ç€è‰²å™¨å°†ä¿æŒä¸ºç½‘æ ¼ç¼©æ”¾è®¾ç½®ã€‚å¦åˆ™ï¼Œå½“åšå¹¿å‘Šç‰Œæ—¶ï¼Œç¼©æ”¾" -"会丢失。仅在 [member params_billboard_mode] 为 [constant BILLBOARD_ENABLED] " -"时适用。" +"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¿æŒä¸ºç½‘æ ¼ç¼©æ”¾è®¾ç½®ã€‚å¦åˆ™ï¼Œå½“åšå¹¿å‘Šç‰Œæ—¶ï¼Œç¼©" +"放会丢失。仅在 [member params_billboard_mode] 为 [constant " +"BILLBOARD_ENABLED] 时适用。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71085,27 +71390,27 @@ msgstr "" msgid "" "Which side of the object is not drawn when backfaces are rendered. See [enum " "CullMode]." -msgstr "æ¸²æŸ“èƒŒé¢æ—¶ï¼Œä¸ç»˜åˆ¶å¯¹è±¡çš„哪一é¢ã€‚å‚阅 [enum CullMode]。" +msgstr "æ¸²æŸ“èƒŒé¢æ—¶ï¼Œä¸ç»˜åˆ¶å¯¹è±¡çš„哪一é¢ã€‚è§ [enum CullMode]。" #: doc/classes/SpatialMaterial.xml msgid "" "Determines when depth rendering takes place. See [enum DepthDrawMode]. See " "also [member flags_transparent]." msgstr "" -"确定深度渲染å‘生的时间。请å‚é˜…æ·±åº¦ç»˜åˆ¶æ¨¡å¼ [enum DepthDrawMode] 。å¦è§" +"确定深度渲染å‘生的时间。请å‚é˜…æ·±åº¦ç»˜åˆ¶æ¨¡å¼ [enum DepthDrawMode] 。å¦è¯·å‚阅 " "[member flags_transparent]。" #: doc/classes/SpatialMaterial.xml msgid "" "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." -msgstr "用于漫å射光散射的算法。å‚è§ [enum DiffuseMode]。" +msgstr "用于漫åå°„å…‰æ•£å°„çš„ç®—æ³•ã€‚è§ [enum DiffuseMode]。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." msgstr "" -"如果[code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚å‚è§[member params_grow_amount]。" +"如果为 [code]true[/code],å¯ç”¨é¡¶ç‚¹ç”Ÿé•¿è®¾ç½®ã€‚å‚è§[member params_grow_amount]。" #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -71128,7 +71433,7 @@ msgid "" "If [code]true[/code], the shader will discard all pixels that have an alpha " "value less than [member params_alpha_scissor_threshold]." msgstr "" -"如果[code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰alpha值å°äºŽ[member " +"如果为 [code]true[/code],ç€è‰²å™¨å°†ä¸¢å¼ƒæ‰€æœ‰alpha值å°äºŽ[member " "params_alpha_scissor_threshold]çš„åƒç´ 。" #: doc/classes/SpatialMaterial.xml @@ -71145,7 +71450,7 @@ msgid "" "If [code]true[/code], particle animations are looped. Only enabled when " "using [constant BILLBOARD_PARTICLES]. See [member params_billboard_mode]." msgstr "" -"如果 [code]true[/code],循环粒å动画。仅在使用 [constant " +"如果为 [code]true[/code],循环粒å动画。仅在使用 [constant " "BILLBOARD_PARTICLES] æ—¶å¯ç”¨ã€‚å‚阅[member params_billboard_mode]。" #: doc/classes/SpatialMaterial.xml @@ -71168,8 +71473,8 @@ msgid "" "If [code]true[/code], the proximity fade effect is enabled. The proximity " "fade effect fades out each pixel based on its distance to another object." msgstr "" -"如果[code]true[/code],则å¯ç”¨æŽ¥è¿‘æ·¡å‡ºæ•ˆæžœã€‚é‚»è¿‘æ·¡å‡ºæ•ˆæžœä¼šæ ¹æ®æ¯ä¸ªåƒç´ 与å¦ä¸€ä¸ª" -"对象的è·ç¦»æ·¡å‡ºã€‚" +"如果为 [code]true[/code],则å¯ç”¨æŽ¥è¿‘æ·¡å‡ºæ•ˆæžœã€‚é‚»è¿‘æ·¡å‡ºæ•ˆæžœä¼šæ ¹æ®æ¯ä¸ªåƒç´ 与å¦" +"一个对象的è·ç¦»æ·¡å‡ºã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71178,9 +71483,9 @@ msgid "" "backend, the material's roughness value will affect the blurriness of the " "refraction. Higher roughness values will make the refraction look blurrier." msgstr "" -"如果[code]true[/code],则å¯ç”¨æŠ˜å°„æ•ˆæžœã€‚æŠ˜å°„æ˜¯æ ¹æ®æ¥è‡ªç‰©ä½“åŽé¢çš„å…‰çº¿æ¥æ‰æ›²é€æ˜Ž" -"度的。当使用GLES3åŽç«¯æ—¶ï¼Œæè´¨çš„ç²—ç³™åº¦å€¼ä¼šå½±å“æŠ˜å°„çš„æ¨¡ç³Šåº¦ã€‚è¾ƒé«˜çš„ç²—ç³™åº¦å€¼ä¼šä½¿" -"æŠ˜å°„çœ‹èµ·æ¥æ›´æ¨¡ç³Šã€‚" +"如果为 [code]true[/code],则å¯ç”¨æŠ˜å°„æ•ˆæžœã€‚æŠ˜å°„æ˜¯æ ¹æ®æ¥è‡ªç‰©ä½“åŽé¢çš„å…‰çº¿æ¥æ‰æ›²" +"逿˜Žåº¦çš„。当使用GLES3åŽç«¯æ—¶ï¼Œæè´¨çš„ç²—ç³™åº¦å€¼ä¼šå½±å“æŠ˜å°„çš„æ¨¡ç³Šåº¦ã€‚è¾ƒé«˜çš„ç²—ç³™åº¦å€¼" +"ä¼šä½¿æŠ˜å°„çœ‹èµ·æ¥æ›´æ¨¡ç³Šã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71217,7 +71522,7 @@ msgid "" "[b]Note:[/b] Rim lighting is not visible if the material has [member " "flags_unshaded] set to [code]true[/code]." msgstr "" -"如果 [code]true[/code],则å¯ç”¨è¾¹ç¼˜æ•ˆæžœã€‚è¾¹ç¼˜ç…§æ˜Žå¢žåŠ äº†ç‰©ä½“ä¸ŠæŽ è¿‡è§’åº¦çš„äº®" +"如果为 [code]true[/code],则å¯ç”¨è¾¹ç¼˜æ•ˆæžœã€‚è¾¹ç¼˜ç…§æ˜Žå¢žåŠ äº†ç‰©ä½“ä¸ŠæŽ è¿‡è§’åº¦çš„äº®" "度。\n" "[b]注æ„:[/b]如果æè´¨å°† [member flags_unshaded] 设置为 [code]true[/code],则" "边缘光照ä¸å¯è§ã€‚" @@ -71226,7 +71531,7 @@ msgstr "" msgid "" "Texture used to set the strength of the rim lighting effect per-pixel. " "Multiplied by [member rim]." -msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。乘以[member rim]。" +msgstr "纹ç†ç”¨äºŽè®¾ç½®æ¯ä¸ªåƒç´ 的边缘光照效果的强度。乘以 [member rim]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71234,8 +71539,8 @@ msgid "" "[code]0[/code] the light color is used, while [code]1[/code] means albedo " "color is used. An intermediate value generally works best." msgstr "" -"渲染边缘效果时,混åˆå…‰ç…§è‰²å’Œå射色的数é‡ã€‚如果[code]0[/code]表示使用光色," -"[code]1[/code]表示使用å照色。一般æ¥è¯´ï¼Œä¸é—´å€¼çš„æ•ˆæžœæœ€å¥½ã€‚" +"渲染边缘效果时,混åˆå…‰ç…§è‰²å’Œå射色的数é‡ã€‚如果 [code]0[/code] 表示使用光色," +"[code]1[/code] 表示使用å照色。一般æ¥è¯´ï¼Œä¸é—´å€¼çš„æ•ˆæžœæœ€å¥½ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71244,21 +71549,21 @@ msgid "" "[member metallic]." msgstr "" "表é¢å射。[code]0[/code] 值表示一é¢å®Œç¾Žçš„镜åƒï¼Œè€Œ [code]1[/code] 值则完全模糊" -"了å射。å¦è¯·å‚阅[member metallic]。" +"了å射。å¦è¯·å‚阅 [member metallic]。" #: doc/classes/SpatialMaterial.xml msgid "" "Texture used to control the roughness per-pixel. Multiplied by [member " "roughness]." -msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚乘以[member roughness]。" +msgstr "用于控制æ¯ä¸ªåƒç´ 粗糙度的纹ç†ã€‚乘以 [member roughness]。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], subsurface scattering is enabled. Emulates light that " "penetrates an object's surface, is scattered, and then emerges." msgstr "" -"如果[code]true[/code],则å¯ç”¨æ¬¡è¡¨é¢æ•£å°„。模拟光线穿é€ç‰©ä½“表é¢ï¼Œè¢«æ•£å°„,然åŽå‡º" -"现。" +"如果为 [code]true[/code],则å¯ç”¨æ¬¡è¡¨é¢æ•£å°„。模拟光线穿é€ç‰©ä½“表é¢ï¼Œè¢«æ•£å°„,然" +"åŽå‡ºçŽ°ã€‚" #: doc/classes/SpatialMaterial.xml msgid "The strength of the subsurface scattering effect." @@ -71269,7 +71574,7 @@ msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" -"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚乘以[member " +"ç”¨äºŽæŽ§åˆ¶æ¬¡è¡¨é¢æ•£å°„强度的纹ç†ã€‚å˜å‚¨åœ¨çº¢è‰²çº¹ç†é€šé“ä¸ã€‚乘以 [member " "subsurf_scatter_strength]。" #: doc/classes/SpatialMaterial.xml @@ -71280,13 +71585,13 @@ msgstr "ä¼ è¾“æ•ˆæžœä½¿ç”¨çš„é¢œè‰²ã€‚è¡¨ç¤ºç©¿è¿‡ç‰©ä½“çš„å…‰ã€‚" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the transmission effect is enabled." -msgstr "如果 [code]true[/code],则å¯ç”¨ä¼ 输效果。" +msgstr "如果为 [code]true[/code],则å¯ç”¨ä¼ 输效果。" #: doc/classes/SpatialMaterial.xml msgid "" "Texture used to control the transmission effect per-pixel. Added to [member " "transmission]." -msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚æ·»åŠ åˆ°[member transmission]。" +msgstr "纹ç†ç”¨äºŽæŽ§åˆ¶æ¯ä¸ªåƒç´ çš„ä¼ è¾“æ•ˆæžœã€‚æ·»åŠ åˆ° [member transmission]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71302,7 +71607,7 @@ msgid "" "How much to scale the [code]UV[/code] coordinates. This is multiplied by " "[code]UV[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„[code]UV[/code]。" +"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71317,12 +71622,12 @@ msgid "" "because it is blending the texture between the three axes, it is unsuitable " "when you are trying to achieve crisp texturing." msgstr "" -"如果 [code]true[/code],纹ç†å°†ä¸ä½¿ç”¨ [code]UV[/code],而是使用三平é¢çº¹ç†æŸ¥æ‰¾" -"æ¥ç¡®å®šå¦‚何应用纹ç†ã€‚三平é¢çº¹ç†ä½¿ç”¨å¯¹è±¡è¡¨é¢çš„æ–¹å‘æ¥æ··åˆçº¹ç†åæ ‡ä¹‹é—´ã€‚å®ƒä»Žæºçº¹" -"ç†ä¸è¯»å–3次,æ¯ä¸ªè½´ä¸€æ¬¡ï¼Œç„¶åŽæ ¹æ®åƒç´ 与æ¯ä¸ªè½´çš„紧密程度在结果之间进行混åˆã€‚è¿™" -"通常用于自然特å¾ï¼Œä»¥èŽ·å¾—çœŸå®žçš„æè´¨æ··åˆã€‚由于三平é¢çº¹ç†å¤„ç†æ¯ä¸€ä¸ªåƒç´ éœ€è¦æ›´å¤š" -"的纹ç†è¯»å–,所以它比普通的UV纹ç†å¤„ç†è¦æ…¢å¾—多。æ¤å¤–,由于它是在三个轴之间混åˆ" -"纹ç†ï¼Œæ‰€ä»¥å½“ä½ è¯•å›¾å®žçŽ°æ¸…æ™°çš„çº¹ç†æ—¶ï¼Œå®ƒæ˜¯ä¸åˆé€‚的。" +"如果为 [code]true[/code],纹ç†å°†ä¸ä½¿ç”¨ [code]UV[/code],而是使用三平é¢çº¹ç†æŸ¥" +"找æ¥ç¡®å®šå¦‚何应用纹ç†ã€‚三平é¢çº¹ç†ä½¿ç”¨å¯¹è±¡è¡¨é¢çš„æ–¹å‘æ¥æ··åˆçº¹ç†åæ ‡ä¹‹é—´ã€‚å®ƒä»Žæº" +"纹ç†ä¸è¯»å–3次,æ¯ä¸ªè½´ä¸€æ¬¡ï¼Œç„¶åŽæ ¹æ®åƒç´ 与æ¯ä¸ªè½´çš„紧密程度在结果之间进行混åˆã€‚" +"这通常用于自然特å¾ï¼Œä»¥èŽ·å¾—çœŸå®žçš„æè´¨æ··åˆã€‚由于三平é¢çº¹ç†å¤„ç†æ¯ä¸€ä¸ªåƒç´ éœ€è¦æ›´" +"多的纹ç†è¯»å–,所以它比普通的UV纹ç†å¤„ç†è¦æ…¢å¾—多。æ¤å¤–,由于它是在三个轴之间混" +"åˆçº¹ç†ï¼Œæ‰€ä»¥å½“ä½ è¯•å›¾å®žçŽ°æ¸…æ™°çš„çº¹ç†æ—¶ï¼Œå®ƒæ˜¯ä¸åˆé€‚的。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71336,7 +71641,7 @@ msgid "" "added to [code]UV2[/code] in the vertex function. This can be used to offset " "a texture." msgstr "" -"[code]UV2[/code]åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV2[/code] " +"[code]UV2[/code] åæ ‡çš„åç§»é‡ã€‚这个é‡å°†è¢«æ·»åŠ åˆ°é¡¶ç‚¹å‡½æ•°ä¸çš„ [code]UV2[/code] " "ä¸ã€‚è¿™å¯ä»¥ç”¨æ¥å移纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml @@ -71344,7 +71649,7 @@ msgid "" "How much to scale the [code]UV2[/code] coordinates. This is multiplied by " "[code]UV2[/code] in the vertex function." msgstr "" -"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„[code]UV[/code]。" +"缩放 [code]UV[/code] åæ ‡çš„多少。这个值乘以顶点函数ä¸çš„ [code]UV[/code]。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71359,21 +71664,21 @@ msgid "" "because it is blending the texture between the three axes, it is unsuitable " "when you are trying to achieve crisp texturing." msgstr "" -"如果 [code]true[/code],纹ç†å°†ä¸ä½¿ç”¨ [code]UV[/code],而是使用三平é¢çº¹ç†æŸ¥æ‰¾" -"æ¥ç¡®å®šå¦‚何应用纹ç†ã€‚三平é¢çº¹ç†ä½¿ç”¨å¯¹è±¡è¡¨é¢çš„æ–¹å‘æ¥æ··åˆçº¹ç†åæ ‡ä¹‹é—´ã€‚å®ƒä»Žæºçº¹" -"ç†ä¸è¯»å– 3 次,æ¯ä¸ªè½´ä¸€æ¬¡ï¼Œç„¶åŽæ ¹æ®åƒç´ 与æ¯ä¸ªè½´çš„紧密程度在结果之间进行混åˆã€‚" -"这通常用于自然特å¾ï¼Œä»¥èŽ·å¾—çœŸå®žçš„æè´¨æ··åˆã€‚由于三平é¢çº¹ç†å¤„ç†æ¯ä¸€ä¸ªåƒç´ éœ€è¦æ›´" -"多的纹ç†è¯»å–,所以它比普通的 UV 纹ç†å¤„ç†è¦æ…¢å¾—多。æ¤å¤–,由于它是在三个轴之间" -"æ··åˆçº¹ç†ï¼Œæ‰€ä»¥å½“ä½ è¯•å›¾å®žçŽ°æ¸…æ™°çš„çº¹ç†æ—¶ï¼Œå®ƒæ˜¯ä¸åˆé€‚的。" +"如果为 [code]true[/code],纹ç†å°†ä¸ä½¿ç”¨ [code]UV[/code],而是使用三平é¢çº¹ç†æŸ¥" +"找æ¥ç¡®å®šå¦‚何应用纹ç†ã€‚三平é¢çº¹ç†ä½¿ç”¨å¯¹è±¡è¡¨é¢çš„æ–¹å‘æ¥æ··åˆçº¹ç†åæ ‡ä¹‹é—´ã€‚å®ƒä»Žæº" +"纹ç†ä¸è¯»å– 3 次,æ¯ä¸ªè½´ä¸€æ¬¡ï¼Œç„¶åŽæ ¹æ®åƒç´ 与æ¯ä¸ªè½´çš„紧密程度在结果之间进行混" +"åˆã€‚这通常用于自然特å¾ï¼Œä»¥èŽ·å¾—çœŸå®žçš„æè´¨æ··åˆã€‚由于三平é¢çº¹ç†å¤„ç†æ¯ä¸€ä¸ªåƒç´ 需" +"è¦æ›´å¤šçš„纹ç†è¯»å–,所以它比普通的 UV 纹ç†å¤„ç†è¦æ…¢å¾—多。æ¤å¤–,由于它是在三个轴" +"之间混åˆçº¹ç†ï¼Œæ‰€ä»¥å½“ä½ è¯•å›¾å®žçŽ°æ¸…æ™°çš„çº¹ç†æ—¶ï¼Œå®ƒæ˜¯ä¸åˆé€‚的。" #: doc/classes/SpatialMaterial.xml msgid "" "If [code]true[/code], the model's vertex colors are processed as sRGB mode." -msgstr "如果[code]true[/code],则模型的顶点颜色将作为 sRGB 模å¼å¤„ç†ã€‚" +msgstr "如果为 [code]true[/code],则模型的顶点颜色将作为 sRGB 模å¼å¤„ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "If [code]true[/code], the vertex color is used as albedo color." -msgstr "如果[code]true[/code],则使用顶点颜色作为å射率颜色。" +msgstr "如果为 [code]true[/code],则使用顶点颜色作为å射率颜色。" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel color." @@ -71407,7 +71712,7 @@ msgstr "指定æ¯åƒç´ 清漆值的纹ç†ã€‚" msgid "" "Texture specifying per-pixel flowmap direction for use with [member " "anisotropy]." -msgstr "指定æ¯ä¸ªåƒç´ æµå›¾æ–¹å‘的纹ç†ï¼Œç”¨äºŽ[member anisotropy]。" +msgstr "指定æ¯ä¸ªåƒç´ æµå›¾æ–¹å‘的纹ç†ï¼Œç”¨äºŽ [member anisotropy]。" #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel ambient occlusion value." @@ -71443,15 +71748,15 @@ msgstr "指定æ¯ä¸ªåƒç´ 细节法线的纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Represents the size of the [enum TextureParam] enum." -msgstr "表示[enum TextureParam]枚举的大å°ã€‚" +msgstr "表示 [enum TextureParam] 枚举的大å°ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Use [code]UV[/code] with the detail texture." -msgstr "使用[code]UV[/code]与细节纹ç†ã€‚" +msgstr "使用 [code]UV[/code] 与细节纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Use [code]UV2[/code] with the detail texture." -msgstr "使用[code]UV2[/code]与细节纹ç†ã€‚" +msgstr "使用 [code]UV2[/code] 与细节纹ç†ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member flags_transparent]." @@ -71459,19 +71764,19 @@ msgstr "用于设置 [member flags_transparent] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member emission_enabled]." -msgstr "用于设置[member emission_enabled]的常é‡ã€‚" +msgstr "用于设置 [member emission_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member normal_enabled]." -msgstr "用于设置[member normal_enabled]的常é‡ã€‚" +msgstr "用于设置 [member normal_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member rim_enabled]." -msgstr "用于设置[member rim_enabled]的常é‡ã€‚" +msgstr "用于设置 [member rim_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member clearcoat_enabled]." -msgstr "用于设置[member clearcoat_enabled]的常é‡ã€‚" +msgstr "用于设置 [member clearcoat_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member anisotropy_enabled]." @@ -71479,7 +71784,7 @@ msgstr "用于设置 [member anisotropy_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member ao_enabled]." -msgstr "用于设置[member ao_enabled]的常é‡ã€‚" +msgstr "用于设置 [member ao_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member depth_enabled]." @@ -71487,7 +71792,7 @@ msgstr "用于设置 [member depth_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member subsurf_scatter_enabled]." -msgstr "用于设置[member subsurf_scatter_enabled]的常é‡ã€‚" +msgstr "用于设置 [member subsurf_scatter_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member transmission_enabled]." @@ -71495,11 +71800,11 @@ msgstr "用于设置 [member transmission_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member refraction_enabled]." -msgstr "用于设置[member refraction_enabled]的常é‡ã€‚" +msgstr "用于设置 [member refraction_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Constant for setting [member detail_enabled]." -msgstr "用于设置[member detail_enabled]的常é‡ã€‚" +msgstr "用于设置 [member detail_enabled] 的常é‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71571,7 +71876,7 @@ msgstr "å°† [code]ALBEDO[/code] è®¾ç½®ä¸ºç½‘æ ¼ä¸æŒ‡å®šçš„æ¯é¡¶ç‚¹é¢œè‰²ã€‚" msgid "" "Vertex color is in sRGB space and needs to be converted to linear. Only " "applies in the GLES3 renderer." -msgstr "顶点颜色在sRGB空间,需è¦è½¬æˆçº¿æ€§ã€‚仅适用于 GLES3 渲染器。" +msgstr "顶点颜色在 sRGB 空间,需è¦è½¬æˆçº¿æ€§ã€‚仅适用于 GLES3 渲染器。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71600,28 +71905,28 @@ msgstr "" msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV[/code]." -msgstr "对所有通常会使用[code]UV[/code]çš„çº¹ç†æŸ¥æ‰¾ä½¿ç”¨ä¸‰å¹³é¢çº¹ç†æŸ¥æ‰¾ã€‚" +msgstr "对所有通常会使用 [code]UV[/code] çš„çº¹ç†æŸ¥æ‰¾ä½¿ç”¨ä¸‰å¹³é¢çº¹ç†æŸ¥æ‰¾ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" "Use triplanar texture lookup for all texture lookups that would normally use " "[code]UV2[/code]." -msgstr "对所有通常会使用[code]UV2[/code]çš„çº¹ç†æŸ¥æ‰¾ä½¿ç”¨ä¸‰å¹³é¢çº¹ç†æŸ¥æ‰¾ã€‚" +msgstr "对所有通常会使用 [code]UV2[/code] çš„çº¹ç†æŸ¥æ‰¾ä½¿ç”¨ä¸‰å¹³é¢çº¹ç†æŸ¥æ‰¾ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" "Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." -msgstr "使用[code]UV2[/code]åæ ‡ä»Ž[member ao_texture]䏿Ÿ¥æ‰¾ã€‚" +msgstr "使用 [code]UV2[/code] åæ ‡ä»Ž [member ao_texture] 䏿Ÿ¥æ‰¾ã€‚" #: doc/classes/SpatialMaterial.xml msgid "" "Use [code]UV2[/code] coordinates to look up from the [member " "emission_texture]." -msgstr "使用[code]UV2[/code]åæ ‡ï¼Œä»Ž[member emission_texture]䏿Ÿ¥æ‰¾ã€‚" +msgstr "使用 [code]UV2[/code] åæ ‡ä»Ž [member emission_texture] 䏿Ÿ¥æ‰¾ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Use alpha scissor. Set by [member params_use_alpha_scissor]." -msgstr "使用alpha剪刀。由 [member params_use_alpha_scissor] 设置。" +msgstr "使用 Alpha è£å‰ªã€‚ç”± [member params_use_alpha_scissor] 设置。" #: doc/classes/SpatialMaterial.xml msgid "" @@ -71631,7 +71936,7 @@ msgstr "在三平é¢çº¹ç†æŸ¥æ‰¾ä¸ä½¿ç”¨ä¸–ç•Œåæ ‡è€Œä¸æ˜¯å±€éƒ¨åæ ‡ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Forces the shader to convert albedo from sRGB space to linear space." -msgstr "强制ç€è‰²å™¨å°†å射率从sRGB空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" +msgstr "强制ç€è‰²å™¨å°†å射率从 sRGB 空间转æ¢ä¸ºçº¿æ€§ç©ºé—´ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Disables receiving shadows from other objects." @@ -71659,7 +71964,7 @@ msgstr "漫散射忽略了粗糙度。" #: doc/classes/SpatialMaterial.xml msgid "Extends Lambert to cover more than 90 degrees when roughness increases." -msgstr "å½“ç²—ç³™åº¦å¢žåŠ æ—¶ï¼Œå°†Lambert延伸到90度以上。" +msgstr "å½“ç²—ç³™åº¦å¢žåŠ æ—¶ï¼Œå°† Lambert 延伸到 90 度以上。" #: doc/classes/SpatialMaterial.xml msgid "Attempts to use roughness to emulate microsurfacing." @@ -71704,10 +72009,10 @@ msgid "" "The [member ParticlesMaterial.anim_speed] or [member CPUParticles." "anim_speed] should also be set to a positive value for the animation to play." msgstr "" -"当分é…ç»™[Particles]å’Œ[CPUParticles]节点时用于粒å系统。å¯ç”¨" -"[code]particles_anim_*[/code]属性。\n" -"ä¸ºäº†æ’æ”¾åŠ¨ç”»ï¼Œ[member ParticlesMaterial.anim_speed]或[member CPUParticles." -"anim_speed]也应该被设置为æ£å€¼ã€‚" +"当分é…ç»™ [Particles] å’Œ [CPUParticles] 节点时用于粒å系统。å¯ç”¨ " +"[code]particles_anim_*[/code] 属性。\n" +"ä¸ºäº†æ’æ”¾åŠ¨ç”»ï¼Œ[member ParticlesMaterial.anim_speed] 或 [member CPUParticles." +"anim_speed] 也应该被设置为æ£å€¼ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Used to read from the red channel of a texture." @@ -71723,7 +72028,7 @@ msgstr "用æ¥è¯»å–纹ç†çš„è“色通é“。" #: doc/classes/SpatialMaterial.xml msgid "Used to read from the alpha channel of a texture." -msgstr "用æ¥è¯»å–纹ç†çš„alpha通é“。" +msgstr "用æ¥è¯»å–纹ç†çš„ Alpha 通é“。" #: doc/classes/SpatialMaterial.xml msgid "Adds the emission color to the color from the emission texture." @@ -71804,8 +72109,8 @@ msgid "" "[b]Note:[/b] To get a regular hemisphere, the height and radius of the " "sphere must be equal." msgstr "" -"如果 [code]true[/code],则创建一个åŠçƒè€Œä¸æ˜¯ä¸€ä¸ªå®Œæ•´çš„çƒä½“。\n" -"[b]注:[/b]è¦å¾—到一个规则的åŠçƒï¼Œçƒä½“的高度和åŠå¾„必须相ç‰ã€‚" +"如果为 [code]true[/code],则创建一个åŠçƒè€Œä¸æ˜¯ä¸€ä¸ªå®Œæ•´çš„çƒä½“。\n" +"[b]注æ„:[/b]è¦å¾—到一个规则的åŠçƒï¼Œçƒä½“的高度和åŠå¾„必须相ç‰ã€‚" #: doc/classes/SphereMesh.xml msgid "Number of radial segments on the sphere." @@ -71902,7 +72207,7 @@ msgid "" "If [code]true[/code], the [SpinBox] will be editable. Otherwise, it will be " "read only." msgstr "" -"如果 [code]true[/code],则 [SpinBox] 将是å¯ç¼–辑的。å¦åˆ™ï¼Œå®ƒå°†æ˜¯åªè¯»çš„。" +"如果为 [code]true[/code],则 [SpinBox] 将是å¯ç¼–辑的。å¦åˆ™ï¼Œå®ƒå°†æ˜¯åªè¯»çš„。" #: doc/classes/SpinBox.xml msgid "" @@ -71942,7 +72247,7 @@ msgid "" "If [code]true[/code], the area of the first [Control] will be collapsed and " "the dragger will be disabled." msgstr "" -"如果 [code]true[/code],第一个 [Control] 的区域将被折å 并且拖动器将被ç¦ç”¨ã€‚" +"如果为 [code]true[/code],第一个 [Control] 的区域将被折å 并且拖动器将被ç¦ç”¨ã€‚" #: doc/classes/SplitContainer.xml msgid "" @@ -72165,7 +72470,7 @@ msgstr "" #: doc/classes/Sprite.xml msgid "If [code]true[/code], texture is centered." -msgstr "如果 [code]true[/code],纹ç†å±…ä¸ã€‚" +msgstr "如果为 [code]true[/code],纹ç†å±…ä¸ã€‚" #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "" @@ -72206,19 +72511,19 @@ msgid "" "If [code]true[/code], texture is cut from a larger atlas texture. See " "[member region_rect]." msgstr "" -"如果 [code]true[/code],则从较大的图集纹ç†ä¸å‰ªåˆ‡çº¹ç†ã€‚å‚阅 [member " +"如果为 [code]true[/code],则从较大的图集纹ç†ä¸å‰ªåˆ‡çº¹ç†ã€‚è§ [member " "region_rect]。" #: doc/classes/Sprite.xml msgid "If [code]true[/code], the outermost pixels get blurred out." -msgstr "如果 [code]true[/code],最外é¢çš„åƒç´ 会å˜å¾—模糊。" +msgstr "如果为 [code]true[/code],最外é¢çš„åƒç´ 会å˜å¾—模糊。" #: doc/classes/Sprite.xml doc/classes/Sprite3D.xml msgid "" "The region of the atlas texture to display. [member region_enabled] must be " "[code]true[/code]." msgstr "" -"è¦æ˜¾ç¤ºçš„图集纹ç†åŒºåŸŸã€‚ [member region_enabled] 必须是 [code]true[/code]。" +"è¦æ˜¾ç¤ºçš„图集纹ç†åŒºåŸŸã€‚[member region_enabled] 必须是 [code]true[/code]。" #: doc/classes/Sprite.xml msgid "[Texture] object to draw." @@ -72254,7 +72559,7 @@ msgid "" "If [code]true[/code], texture will be cut from a larger atlas texture. See " "[member region_rect]." msgstr "" -"如果 [code]true[/code],纹ç†å°†ä»Žè¾ƒå¤§çš„图集纹ç†ä¸å‰ªåˆ‡ã€‚å‚阅 [member " +"如果为 [code]true[/code],纹ç†å°†ä»Žè¾ƒå¤§çš„图集纹ç†ä¸å‰ªåˆ‡ã€‚å‚阅 [member " "region_rect]。" #: doc/classes/Sprite3D.xml @@ -72360,14 +72665,14 @@ msgstr "" msgid "" "If [code]true[/code], the [Light] in the [Environment] has effects on the " "sprite." -msgstr "如果 [code]true[/code],则 [Environment] ä¸çš„ [Light] å¯¹ç²¾çµæœ‰å½±å“。" +msgstr "如果为 [code]true[/code],则 [Environment] ä¸çš„ [Light] å¯¹ç²¾çµæœ‰å½±å“。" #: doc/classes/SpriteBase3D.xml msgid "" "If [code]true[/code], the texture's transparency and the opacity are used to " "make those parts of the sprite invisible." msgstr "" -"如果 [code]true[/code],纹ç†çš„逿˜Žåº¦å’Œä¸é€æ˜Žåº¦ç”¨äºŽä½¿ç²¾çµçš„这些部分ä¸å¯è§ã€‚" +"如果为 [code]true[/code],纹ç†çš„逿˜Žåº¦å’Œä¸é€æ˜Žåº¦ç”¨äºŽä½¿ç²¾çµçš„这些部分ä¸å¯è§ã€‚" #: doc/classes/SpriteBase3D.xml msgid "" @@ -72915,7 +73220,7 @@ msgstr "一ç§é”™è¯¯çжæ€ï¼Œæ˜¾ç¤ºä¸»æœºæäº¤çš„SSLè¯ä¹¦åŸŸä¸Žè¯·æ±‚验è¯çš„ #: doc/classes/StreamPeerTCP.xml msgid "TCP stream peer." -msgstr "TCPæµå¯¹ç‰ä½“。" +msgstr "TCP æµå¯¹ç‰ä½“。" #: doc/classes/StreamPeerTCP.xml msgid "" @@ -72989,11 +73294,11 @@ msgstr "表示处于错误状æ€çš„ [StreamPeerTCP] 的状æ€ã€‚" #: doc/classes/StreamTexture.xml msgid "A [code].stex[/code] texture." -msgstr "[code].stex[/code]纹ç†." +msgstr "[code].stex[/code] 纹ç†ã€‚" #: doc/classes/StreamTexture.xml msgid "A texture that is loaded from a [code].stex[/code] file." -msgstr "从[code].stex[/code]æ–‡ä»¶åŠ è½½çš„çº¹ç†ã€‚" +msgstr "从 [code].stex[/code] æ–‡ä»¶åŠ è½½çš„çº¹ç†ã€‚" #: doc/classes/StreamTexture.xml msgid "Loads the texture from the given path." @@ -73556,14 +73861,15 @@ msgstr "" "[/codeblock]" #: doc/classes/String.xml +#, fuzzy msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" "如果该å—ç¬¦ä¸²åŒ…å«æœ‰æ•ˆçš„æ•´æ•°ï¼Œåˆ™è¿”回 [code]true[/code]\n" @@ -73752,7 +74058,7 @@ msgstr "æ ¼å¼åŒ–æ•°å—ï¼Œåœ¨å°æ•°ç‚¹å‰å…·æœ‰ [code]digits[/code] 的确切数 #: doc/classes/String.xml msgid "Decode a percent-encoded string. See [method percent_encode]." -msgstr "è§£ç 一个百分比编ç çš„å—符串。å‚阅[method percent_encode]。" +msgstr "è§£ç 一个百分比编ç çš„å—ç¬¦ä¸²ã€‚è§ [method percent_encode]。" #: doc/classes/String.xml msgid "" @@ -73768,7 +74074,7 @@ msgid "" "the string as a subpath. E.g. [code]\"this/is\".plus_file(\"path\") == " "\"this/is/path\"[/code]." msgstr "" -"如果å—符串是路径,则在å—符串末尾连接 [code]file[/code] 作为å路径。例如。 " +"如果å—符串是路径,则在å—符串末尾连接 [code]file[/code] 作为å路径。例如。" "[code]\"this/is\".plus_file(\"path\") == \"this/is/path\"[/code]。" #: doc/classes/String.xml @@ -73915,7 +74221,7 @@ msgid "" "If you need to split strings with more complex rules, use the [RegEx] class " "instead." msgstr "" -"通过 [code]delimiter[/code] å—符串拆分å—符串并返回åå—符串数组。 " +"通过 [code]delimiter[/code] å—符串拆分å—符串并返回åå—符串数组。" "[code]delimiter[/code] å¯ä»¥æ˜¯ä»»æ„长度。\n" "如果指定了 [code]maxsplit[/code],它定义了从左边到 [code]maxsplit[/code] 的分" "割次数。默认值 [code]0[/code] 表示所有项目都被拆分。\n" @@ -74098,9 +74404,9 @@ msgid "" "[code]focus[/code] [StyleBox] more reusable across different nodes." msgstr "" "æ ·å¼ç›’ StyleBox æ˜¯ä¸€ç§ [Resource],它æä¾›äº†ä¸€ä¸ªæŠ½è±¡åŸºç±»ï¼Œç”¨äºŽä¸º UI ç»˜åˆ¶é£Žæ ¼åŒ–" -"的框。 StyleBox è¢«ç”¨äºŽç»˜åˆ¶æŒ‰é’®çš„æ ·å¼ã€è¡Œç¼–è¾‘æ¡†çš„èƒŒæ™¯ã€æ ‘的背景ç‰ï¼Œä¹Ÿè¢«ç”¨ä½œæµ‹" -"试指针信å·çš„逿˜ŽæŽ©ç 。将 StyleBox æŒ‡å®šä¸ºæŽ§ä»¶çš„æŽ©ç æ—¶ï¼Œå¦‚æžœåœ¨æŽ©ç æµ‹è¯•失败,点" -"击和è¿åŠ¨ä¿¡å·å°†é€è¿‡å®ƒä¼ 递至下层控件。\n" +"的框。StyleBox è¢«ç”¨äºŽç»˜åˆ¶æŒ‰é’®çš„æ ·å¼ã€è¡Œç¼–è¾‘æ¡†çš„èƒŒæ™¯ã€æ ‘的背景ç‰ï¼Œä¹Ÿè¢«ç”¨ä½œæµ‹è¯•" +"指针信å·çš„逿˜ŽæŽ©ç 。将 StyleBox æŒ‡å®šä¸ºæŽ§ä»¶çš„æŽ©ç æ—¶ï¼Œå¦‚æžœåœ¨æŽ©ç æµ‹è¯•失败,点击" +"å’Œè¿åŠ¨ä¿¡å·å°†é€è¿‡å®ƒä¼ 递至下层控件。\n" "[b]注æ„:[/b]对于有 [i]主题属性[/i] çš„ [Control] 控件,å为 [code]focus[/" "code] çš„ [StyleBox] 会显示在å为 [code]normal[/code]ã€[code]hover[/code]ã€" "[code]pressed[/code] çš„ [StyleBox]ä¹‹ä¸Šã€‚è¿™æ ·çš„è¡Œä¸ºæœ‰åŠ©äºŽ [code]focus[/code] " @@ -74273,8 +74579,7 @@ msgid "" "Returns the given [code]margin[/code]'s border width. See [enum Margin] for " "possible values." msgstr "" -"返回给定的 [code]margin[/code] 的边框宽度。有关å¯èƒ½çš„值,请å‚阅 [enum " -"Margin]。" +"返回给定的 [code]margin[/code] 的边框宽度。å¯èƒ½çš„å–å€¼è§ [enum Margin]。" #: doc/classes/StyleBoxFlat.xml msgid "Returns the smallest border width out of all four borders." @@ -74284,23 +74589,22 @@ msgstr "è¿”å›žæ‰€æœ‰å››ä¸ªè¾¹ç•Œä¸æœ€å°çš„边框宽度。" msgid "" "Returns the given [code]corner[/code]'s radius. See [enum Corner] for " "possible values." -msgstr "" -"返回给定的 [code]corner[/code] çš„åŠå¾„。有关å¯èƒ½çš„值,请å‚阅 [enum Corner]。" +msgstr "返回给定的 [code]corner[/code] çš„åŠå¾„。å¯èƒ½çš„å–å€¼è§ [enum Corner]。" #: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml msgid "" "Returns the size of the given [code]margin[/code]'s expand margin. See [enum " "Margin] for possible values." msgstr "" -"返回给定的[code]margin[/code]的扩展边è·çš„大å°ã€‚å¯èƒ½çš„值è§[enum Margin]。" +"返回给定的 [code]margin[/code] 的扩展边è·çš„大å°ã€‚å¯èƒ½çš„å–å€¼è§ [enum Margin]。" #: doc/classes/StyleBoxFlat.xml msgid "" "Sets the border width to [code]width[/code] pixels for the given " "[code]margin[/code]. See [enum Margin] for possible values." msgstr "" -"用给定的[code]margin[/code]设置边界宽度为[code]width[/code]åƒç´ 。å¯èƒ½çš„值è§" -"[enum Margin]。" +"用给定的 [code]margin[/code] 设置边界宽度为 [code]width[/code] åƒç´ 。å¯èƒ½çš„å–" +"å€¼è§ [enum Margin]。" #: doc/classes/StyleBoxFlat.xml msgid "Sets the border width to [code]width[/code] pixels for all margins." @@ -74311,8 +74615,8 @@ msgid "" "Sets the corner radius to [code]radius[/code] pixels for the given " "[code]corner[/code]. See [enum Corner] for possible values." msgstr "" -"用给定的[code]corner[/code]设置角的åŠå¾„为[code]radius[/code]åƒç´ 。å¯èƒ½çš„值è§" -"[enum Corner]。" +"用给定的 [code]corner[/code] 设置角的åŠå¾„为 [code]radius[/code] åƒç´ 。å¯èƒ½çš„" +"å–å€¼è§ [enum Corner]。" #: doc/classes/StyleBoxFlat.xml msgid "Sets the corner radius to [code]radius[/code] pixels for all corners." @@ -74333,8 +74637,8 @@ msgid "" "Sets the expand margin to [code]size[/code] pixels for the given " "[code]margin[/code]. See [enum Margin] for possible values." msgstr "" -"将给定的 [code]margin[/code] 的扩展边è·è®¾ç½®ä¸º [code]size[/code] åƒç´ 。有关å¯" -"能的值,请å‚阅 [enum Margin]。" +"将给定的 [code]margin[/code] 的扩展边è·è®¾ç½®ä¸º [code]size[/code] åƒç´ 。å¯èƒ½çš„" +"å–å€¼è§ [enum Margin]。" #: doc/classes/StyleBoxFlat.xml doc/classes/StyleBoxTexture.xml msgid "Sets the expand margin to [code]size[/code] pixels for all margins." @@ -74377,7 +74681,7 @@ msgstr "StyleBox的背景颜色。" #: doc/classes/StyleBoxFlat.xml msgid "If [code]true[/code], the border will fade into the background color." -msgstr "如果[code]true[/code],边框会淡入背景色。" +msgstr "如果为 [code]true[/code],边框会淡入背景色。" #: doc/classes/StyleBoxFlat.xml msgid "Sets the color of the border." @@ -74385,7 +74689,7 @@ msgstr "设置边框的颜色。" #: doc/classes/StyleBoxFlat.xml msgid "Border width for the bottom border." -msgstr "底部边框的宽度。" +msgstr "底边框的宽度。" #: doc/classes/StyleBoxFlat.xml msgid "Border width for the left border." @@ -74397,7 +74701,7 @@ msgstr "å³è¾¹æ¡†çš„宽度。" #: doc/classes/StyleBoxFlat.xml msgid "Border width for the top border." -msgstr "顶部边框的宽度。" +msgstr "顶边框的宽度。" #: doc/classes/StyleBoxFlat.xml msgid "" @@ -74421,27 +74725,27 @@ msgstr "" msgid "" "The bottom-left corner's radius. If [code]0[/code], the corner is not " "rounded." -msgstr "左下角的åŠå¾„。如果[code]0[/code],则角ä¸åœ†æ»‘。" +msgstr "左下角的åŠå¾„。如果为 [code]0[/code],则该角ä¸åœ†æ»‘。" #: doc/classes/StyleBoxFlat.xml msgid "" "The bottom-right corner's radius. If [code]0[/code], the corner is not " "rounded." -msgstr "å³ä¸‹è§’çš„åŠå¾„。如果[code]0[/code],则角ä¸åœ†æ»‘。" +msgstr "å³ä¸‹è§’çš„åŠå¾„。如果为 [code]0[/code],则该角ä¸åœ†æ»‘。" #: doc/classes/StyleBoxFlat.xml msgid "" "The top-left corner's radius. If [code]0[/code], the corner is not rounded." -msgstr "左上角的åŠå¾„。如果[code]0[/code],则角ä¸åœ†æ»‘。" +msgstr "左上角的åŠå¾„。如果为 [code]0[/code],则该角ä¸åœ†æ»‘。" #: doc/classes/StyleBoxFlat.xml msgid "" "The top-right corner's radius. If [code]0[/code], the corner is not rounded." -msgstr "å³ä¸Šè§’çš„åŠå¾„。如果[code]0[/code],则角ä¸åœ†æ»‘。" +msgstr "å³ä¸Šè§’çš„åŠå¾„。如果为 [code]0[/code],则该角ä¸åœ†æ»‘。" #: doc/classes/StyleBoxFlat.xml msgid "Toggles drawing of the inner part of the stylebox." -msgstr "切æ¢ç»˜åˆ¶StyleBox的内部部分。" +msgstr "切æ¢ç»˜åˆ¶ StyleBox 的内部部分。" #: doc/classes/StyleBoxFlat.xml msgid "" @@ -74590,12 +74894,12 @@ msgid "" "If [code]true[/code], the line will be vertical. If [code]false[/code], the " "line will be horizontal." msgstr "" -"如果 [code]true[/code],则该线将是垂直的。如果 [code]false[/code],该线将是水" -"平的。" +"如果为 [code]true[/code],则该线将是垂直的。如果 [code]false[/code],该线将是" +"水平的。" #: doc/classes/StyleBoxTexture.xml msgid "Texture-based nine-patch [StyleBox]." -msgstr "基于纹ç†çš„ä¹å®«æ ¼[StyleBox]。" +msgstr "基于纹ç†çš„ä¹å®«æ ¼ [StyleBox]。" #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74612,37 +74916,34 @@ msgstr "" msgid "" "Returns the size of the given [code]margin[/code]. See [enum Margin] for " "possible values." -msgstr "" -"返回给定 [code]margin[/code] 的大å°ã€‚有关å¯èƒ½çš„值,请å‚阅 [enum Margin]。" +msgstr "返回给定 [code]margin[/code] 的大å°ã€‚å¯èƒ½çš„å–å€¼è§ [enum Margin]。" #: doc/classes/StyleBoxTexture.xml msgid "" "Sets the margin to [code]size[/code] pixels for the given [code]margin[/" "code]. See [enum Margin] for possible values." msgstr "" -"将给定的 [code]margin[/code] 的边è·è®¾ç½®ä¸º [code]size[/code] åƒç´ 。有关å¯èƒ½çš„" -"值,请å‚阅 [enum Margin]。" +"将给定的 [code]margin[/code] 的边è·è®¾ç½®ä¸º [code]size[/code] åƒç´ 。å¯èƒ½çš„å–值" +"è§ [enum Margin]。" #: doc/classes/StyleBoxTexture.xml msgid "" "Controls how the stylebox's texture will be stretched or tiled horizontally. " "See [enum AxisStretchMode] for possible values." msgstr "" -"æŽ§åˆ¶å¦‚ä½•æ°´å¹³æ‹‰ä¼¸æˆ–å¹³é“ºæ ·å¼ç›’的纹ç†ã€‚有关å¯èƒ½çš„值,请å‚阅 [enum " -"AxisStretchMode]。" +"æŽ§åˆ¶å¦‚ä½•æ°´å¹³æ‹‰ä¼¸æˆ–å¹³é“ºæ ·å¼ç›’的纹ç†ã€‚å¯èƒ½çš„å–å€¼è§ [enum AxisStretchMode]。" #: doc/classes/StyleBoxTexture.xml msgid "" "Controls how the stylebox's texture will be stretched or tiled vertically. " "See [enum AxisStretchMode] for possible values." msgstr "" -"控制如何垂直拉伸或平铺StyleBox的纹ç†ã€‚有关å¯èƒ½çš„值,请å‚阅 [enum " -"AxisStretchMode]。" +"控制如何垂直拉伸或平铺 StyleBox 的纹ç†ã€‚å¯èƒ½çš„å–å€¼è§ [enum AxisStretchMode]。" #: doc/classes/StyleBoxTexture.xml msgid "" "If [code]true[/code], the nine-patch texture's center tile will be drawn." -msgstr "如果[code]true[/code],将绘制ä¹å®«æ ¼çº¹ç†çš„ä¸å¿ƒç“¦ç‰‡ã€‚" +msgstr "如果为 [code]true[/code],将绘制ä¹å®«æ ¼çº¹ç†çš„ä¸å¿ƒå›¾å—。" #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74676,9 +74977,10 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_bottom] if it is negative." msgstr "" -"å¢žåŠ 3×3 StyleBox的底边è·ã€‚\n" -"更高的值æ„å‘³ç€æ›´å¤šçš„æºçº¹ç†è¢«è®¤ä¸ºæ˜¯3×3 box的底边的一部分。\n" -"如果[member StyleBox.content_margin_bottom]为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" +"å¢žåŠ 3×3 StyleBox 的底边è·ã€‚\n" +"更高的值æ„å‘³ç€æ›´å¤šçš„æºçº¹ç†è¢«è®¤ä¸ºæ˜¯ 3×3 box的底边的一部分。\n" +"如果 [member StyleBox.content_margin_bottom] 为负值,这个值也是作为åŽå¤‡å€¼ä½¿" +"用。" #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74688,9 +74990,9 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_left] if it is negative." msgstr "" -"å¢žåŠ 3×3 StyleBox的左边è·ã€‚\n" +"å¢žåŠ 3×3 StyleBox 的左边è·ã€‚\n" "较高的值æ„å‘³ç€æ›´å¤šçš„æºçº¹ç†è¢«è®¤ä¸ºæ˜¯ 3×3 box左边框的一部分。\n" -"如果[member StyleBox.content_margin_left]为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" +"如果 [member StyleBox.content_margin_left] 为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74700,9 +75002,10 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_right] if it is negative." msgstr "" -"å¢žåŠ 3×3 StyleBoxçš„å³è¾¹è·ã€‚\n" +"å¢žåŠ 3×3 StyleBox çš„å³è¾¹è·ã€‚\n" "较高的值æ„å‘³ç€æ›´å¤šçš„æºçº¹ç†è¢«è®¤ä¸ºæ˜¯ 3×3 boxå³è¾¹æ¡†çš„一部分。\n" -"如果[member StyleBox.content_margin_right]为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" +"如果 [member StyleBox.content_margin_right] 为负值,这个值也是作为åŽå¤‡å€¼ä½¿" +"用。" #: doc/classes/StyleBoxTexture.xml msgid "" @@ -74712,9 +75015,9 @@ msgid "" "This is also the value used as fallback for [member StyleBox." "content_margin_top] if it is negative." msgstr "" -"å¢žåŠ 3×3 StyleBox的上边è·ã€‚\n" +"å¢žåŠ 3×3 StyleBox 的上边è·ã€‚\n" "较高的值æ„å‘³ç€æ›´å¤šçš„æºçº¹ç†è¢«è®¤ä¸ºæ˜¯ 3×3 box上边框的一部分。\n" -"如果[member StyleBox.content_margin_top]为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" +"如果 [member StyleBox.content_margin_top] 为负值,这个值也是作为åŽå¤‡å€¼ä½¿ç”¨ã€‚" #: doc/classes/StyleBoxTexture.xml msgid "Modulates the color of the texture when this style box is drawn." @@ -74833,8 +75136,7 @@ msgid "" "Specifies an array of bones to use for the [i]next[/i] vertex. [code]bones[/" "code] must contain 4 integers." msgstr "" -"指定[i]下一个[/i]顶点所使用的骨骼数组。 [code]bones[/code] å¿…é¡»åŒ…å« 4 个整" -"数。" +"指定[i]下一个[/i]顶点所使用的骨骼数组。[code]bones[/code] å¿…é¡»åŒ…å« 4 个整数。" #: doc/classes/SurfaceTool.xml msgid "" @@ -74921,9 +75223,9 @@ msgid "" "set and you fail to submit it for the first vertex, this information may not " "be used at all." msgstr "" -"指定[i]下一个[/i]顶点所使用的æƒé‡å€¼ã€‚ [code]weights[/code] å¿…é¡»åŒ…å« 4 个值。" -"如果æ¯ä¸ªé¡¶ç‚¹éƒ½éœ€è¦è®¾ç½®æ¤ä¿¡æ¯ï¼Œè€Œæ‚¨æœªèƒ½ä¸ºç¬¬ä¸€ä¸ªé¡¶ç‚¹æäº¤æ¤ä¿¡æ¯ï¼Œæ¤ä¿¡æ¯å¯èƒ½æ ¹æœ¬" -"å°±ä¸ä¼šè¢«ä½¿ç”¨ã€‚" +"指定[i]下一个[/i]顶点所使用的æƒé‡å€¼ã€‚[code]weights[/code] å¿…é¡»åŒ…å« 4 个值。如" +"æžœæ¯ä¸ªé¡¶ç‚¹éƒ½éœ€è¦è®¾ç½®æ¤ä¿¡æ¯ï¼Œè€Œæ‚¨æœªèƒ½ä¸ºç¬¬ä¸€ä¸ªé¡¶ç‚¹æäº¤æ¤ä¿¡æ¯ï¼Œæ¤ä¿¡æ¯å¯èƒ½æ ¹æœ¬å°±" +"ä¸ä¼šè¢«ä½¿ç”¨ã€‚" #: doc/classes/SurfaceTool.xml msgid "" @@ -75006,7 +75308,7 @@ msgid "" "be set to [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" "ä»Žé¡¶ç‚¹ç”Ÿæˆæ³•çº¿ï¼Œå› æ¤æ‚¨ä¸å¿…手动执行。如果 [code]flip[/code] 为 [code]true[/" -"code],则生æˆçš„æ³•线将被å转。 [method generate_normals] 应在生æˆå‡ 何体[i]之åŽ" +"code],则生æˆçš„æ³•线将被å转。[method generate_normals] 应在生æˆå‡ 何体[i]之åŽ" "[/i] 调用,在[i]之å‰[/i]使用 [method commit] 或 [method commit_to_arrays] æ" "äº¤ç½‘æ ¼ã€‚ä¸ºäº†æ£ç¡®æ˜¾ç¤ºæ³•线贴图表é¢ï¼Œæ‚¨è¿˜å¿…须使用 [method generate_tangents] 生" "æˆåˆ‡çº¿ã€‚\n" @@ -75187,7 +75489,7 @@ msgstr "" #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "If [code]true[/code], tabs can be rearranged with mouse drag." -msgstr "如果 [code]true[/code],å¯ä»¥é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’列选项å¡ã€‚" +msgstr "如果为 [code]true[/code],å¯ä»¥é€šè¿‡é¼ æ ‡æ‹–åŠ¨é‡æ–°æŽ’列选项å¡ã€‚" #: doc/classes/TabContainer.xml msgid "" @@ -75201,8 +75503,8 @@ msgid "" "If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content " "and titles are hidden." msgstr "" -"如果 [code]true[/code],选项å¡å¯è§ã€‚如果 [code]false[/code],选项å¡çš„å†…å®¹å’Œæ ‡" -"题被éšè—。" +"如果为 [code]true[/code],选项å¡å¯è§ã€‚如果 [code]false[/code],选项å¡çš„内容和" +"æ ‡é¢˜è¢«éšè—。" #: doc/classes/TabContainer.xml msgid "" @@ -75210,8 +75512,8 @@ msgid "" "minimum size take into account in the total, instead of only the currently " "visible one." msgstr "" -"如果 [code]true[/code],éšè—çš„å [Control] 节点在总数ä¸è€ƒè™‘其最å°å¤§å°ï¼Œè€Œä¸æ˜¯" -"仅考虑当å‰å¯è§çš„一个。" +"如果为 [code]true[/code],éšè—çš„å [Control] 节点在总数ä¸è€ƒè™‘其最å°å¤§å°ï¼Œè€Œä¸" +"是仅考虑当å‰å¯è§çš„一个。" #: doc/classes/TabContainer.xml msgid "" @@ -75301,13 +75603,13 @@ msgstr "" #: doc/classes/TabContainer.xml msgid "The icon for the menu button (see [method set_popup])." -msgstr "èœå•æŒ‰é’®çš„å›¾æ ‡ï¼ˆè§[method set_popup])。" +msgstr "èœå•æŒ‰é’®çš„å›¾æ ‡ï¼ˆè§ [method set_popup])。" #: doc/classes/TabContainer.xml msgid "" "The icon for the menu button (see [method set_popup]) when it's being " "hovered with the cursor." -msgstr "å½“å…‰æ ‡æ‚¬åœæ—¶èœå•æŒ‰é’®çš„å›¾æ ‡ï¼ˆå‚阅 [method set_popup])。" +msgstr "å½“å…‰æ ‡æ‚¬åœæ—¶èœå•æŒ‰é’®çš„å›¾æ ‡ï¼ˆè§ [method set_popup])。" #: doc/classes/TabContainer.xml msgid "The style for the background fill." @@ -75334,7 +75636,7 @@ msgid "" "Simple tabs control, similar to [TabContainer] but is only in charge of " "drawing tabs, not interacting with children." msgstr "" -"简å•çš„é€‰é¡¹å¡æŽ§åˆ¶ï¼Œç±»ä¼¼äºŽ[TabContainer],但åªè´Ÿè´£ç»˜åˆ¶é€‰é¡¹å¡ï¼Œä¸ä¸Žå节点互动。" +"简å•çš„é€‰é¡¹å¡æŽ§åˆ¶ï¼Œç±»ä¼¼äºŽ [TabContainer],但åªè´Ÿè´£ç»˜åˆ¶é€‰é¡¹å¡ï¼Œä¸ä¸Žå节点互动。" #: doc/classes/Tabs.xml msgid "Adds a new tab." @@ -75383,7 +75685,7 @@ msgstr "åˆ é™¤ç´¢å¼• [code]tab_idx[/code] 处的选项å¡ã€‚" #: doc/classes/Tabs.xml msgid "" "If [code]true[/code], enables selecting a tab with the right mouse button." -msgstr "如果 [code]true[/code],å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©é€‰é¡¹å¡ã€‚" +msgstr "如果为 [code]true[/code],å¯ç”¨é¼ æ ‡å³é”®é€‰æ‹©é€‰é¡¹å¡ã€‚" #: doc/classes/Tabs.xml msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." @@ -75410,7 +75712,7 @@ msgstr "选择索引 [code]tab_idx[/code] 处的选项å¡ã€‚" msgid "" "if [code]true[/code], the mouse's scroll wheel can be used to navigate the " "scroll view." -msgstr "如果 [code]true[/code]ï¼Œé¼ æ ‡çš„æ»šè½®å¯ç”¨äºŽå¯¼èˆªæ»šåŠ¨è§†å›¾ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œé¼ æ ‡çš„æ»šè½®å¯ç”¨äºŽå¯¼èˆªæ»šåŠ¨è§†å›¾ã€‚" #: doc/classes/Tabs.xml msgid "The alignment of all tabs. See [enum TabAlign] for details." @@ -75474,7 +75776,7 @@ msgstr "选项å¡ä¹‹é—´çš„æ°´å¹³é—´éš”。" #: doc/classes/Tabs.xml msgid "The icon for the close button (see [member tab_close_display_policy])." -msgstr "关闿Œ‰é’®çš„å›¾æ ‡ï¼ˆå‚阅 [member tab_close_display_policy])。" +msgstr "关闿Œ‰é’®çš„å›¾æ ‡ï¼ˆè§ [member tab_close_display_policy])。" #: doc/classes/Tabs.xml msgid "Background of the close button when it's being hovered with the cursor." @@ -75643,11 +75945,11 @@ msgstr "å–æ¶ˆå½“å‰é€‰æ‹©ã€‚" #: doc/classes/TextEdit.xml msgid "Folds all lines that are possible to be folded (see [method can_fold])." -msgstr "æŠ˜å æ‰€æœ‰å¯èƒ½è¢«æŠ˜å 的行(å‚阅 [method can_fold])。" +msgstr "æŠ˜å æ‰€æœ‰å¯èƒ½è¢«æŠ˜å çš„è¡Œï¼ˆè§ [method can_fold])。" #: doc/classes/TextEdit.xml msgid "Folds the given line, if possible (see [method can_fold])." -msgstr "如果å¯èƒ½ï¼ŒæŠ˜å 给定的行(å‚阅 [method can_fold])。" +msgstr "如果å¯èƒ½ï¼ŒæŠ˜å ç»™å®šçš„è¡Œï¼ˆè§ [method can_fold])。" #: doc/classes/TextEdit.xml msgid "Returns an array containing the line number of each breakpoint." @@ -75911,7 +76213,7 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "If [code]true[/code], hides the line of the specified index." -msgstr "如果 [code]true[/code],éšè—指定索引的行。" +msgstr "如果为 [code]true[/code],éšè—指定索引的行。" #: doc/classes/TextEdit.xml msgid "" @@ -75973,43 +76275,43 @@ msgstr "为 [code]true[/code] æ—¶å³é”®å•击会显示上下文èœå•。" msgid "" "If [code]true[/code], the \"space\" character will have a visible " "representation." -msgstr "如果 [code]true[/code]ï¼Œâ€œç©ºæ ¼â€å—符将具有å¯è§è¡¨ç¤ºå½¢å¼ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œâ€œç©ºæ ¼â€å—符将具有å¯è§è¡¨ç¤ºå½¢å¼ã€‚" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], the \"tab\" character will have a visible " "representation." -msgstr "如果 [code]true[/code],“制表符â€å—符将具有å¯è§è¡¨ç¤ºå½¢å¼ã€‚" +msgstr "如果为 [code]true[/code],“制表符â€å—符将具有å¯è§è¡¨ç¤ºå½¢å¼ã€‚" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], the fold gutter is visible. This enables folding " "groups of indented lines." -msgstr "如果 [code]true[/code]ï¼Œåˆ™æŠ˜å æ å¯è§ã€‚è¿™å…许折å 缩进行。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™æŠ˜å æ å¯è§ã€‚è¿™å…许折å 缩进行。" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], all lines that have been set to hidden by [method " "set_line_as_hidden], will not be visible." msgstr "" -"如果 [code]true[/code],所有已被 [method set_line_as_hidden] 设置为éšè—的行将" -"ä¸å¯è§ã€‚" +"如果为 [code]true[/code],所有已被 [method set_line_as_hidden] 设置为éšè—的行" +"å°†ä¸å¯è§ã€‚" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], all occurrences of the selected text will be " "highlighted." -msgstr "如果 [code]true[/code],所选文本的所有匹é…项都将çªå‡ºæ˜¾ç¤ºã€‚" +msgstr "如果为 [code]true[/code],所选文本的所有匹é…项都将çªå‡ºæ˜¾ç¤ºã€‚" #: doc/classes/TextEdit.xml msgid "If [code]true[/code], the line containing the cursor is highlighted." -msgstr "如果 [code]true[/code],则包å«å…‰æ ‡çš„行会çªå‡ºæ˜¾ç¤ºã€‚" +msgstr "如果为 [code]true[/code],则包å«å…‰æ ‡çš„行会çªå‡ºæ˜¾ç¤ºã€‚" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], a minimap is shown, providing an outline of your " "source code." -msgstr "如果 [code]true[/code],则显示å°åœ°å›¾ï¼Œæä¾›æºä»£ç 的概è¦ã€‚" +msgstr "如果为 [code]true[/code],则显示å°åœ°å›¾ï¼Œæä¾›æºä»£ç 的概è¦ã€‚" #: doc/classes/TextEdit.xml msgid "The width, in pixels, of the minimap." @@ -76020,16 +76322,16 @@ msgid "" "If [code]true[/code], custom [code]font_color_selected[/code] will be used " "for selected text." msgstr "" -"如果 [code]true[/code],自定义 [code]font_color_selected[/code] 将用于所选文" -"本。" +"如果为 [code]true[/code],自定义 [code]font_color_selected[/code] 将用于所选" +"文本。" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], read-only mode is enabled. Existing text cannot be " "modified and new text cannot be added." msgstr "" -"如果[code]true[/code],å¯ç”¨åªè¯»æ¨¡å¼ã€‚现有的文本ä¸èƒ½è¢«ä¿®æ”¹ï¼Œæ–°çš„æ–‡æœ¬ä¸èƒ½è¢«æ·»" -"åŠ ã€‚" +"如果为 [code]true[/code],å¯ç”¨åªè¯»æ¨¡å¼ã€‚现有的文本ä¸èƒ½è¢«ä¿®æ”¹ï¼Œæ–°çš„æ–‡æœ¬ä¸èƒ½è¢«" +"æ·»åŠ ã€‚" #: doc/classes/TextEdit.xml msgid "" @@ -76050,9 +76352,9 @@ msgid "" "If [code]false[/code], text can not be selected by the user or by the " "[method select] or [method select_all] methods." msgstr "" -"如果[code]true[/code],文本å¯ä»¥è¢«é€‰æ‹©ã€‚\n" -"如果[code]false[/code],用户或使用[method select]或[method select_all]方法都" -"ä¸èƒ½é€‰æ‹©æ–‡æœ¬ã€‚" +"如果为 [code]true[/code],文本å¯ä»¥è¢«é€‰æ‹©ã€‚\n" +"如果为 [code]false[/code],用户或使用[method select]或[method select_all]方法" +"都ä¸èƒ½é€‰æ‹©æ–‡æœ¬ã€‚" #: doc/classes/TextEdit.xml msgid "" @@ -76065,22 +76367,22 @@ msgstr "" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], line numbers are displayed to the left of the text." -msgstr "如果 [code]true[/code]ï¼Œè¡Œå·æ˜¾ç¤ºåœ¨æ–‡æœ¬çš„左侧。" +msgstr "如果为 [code]true[/code]ï¼Œè¡Œå·æ˜¾ç¤ºåœ¨æ–‡æœ¬çš„左侧。" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], sets the [code]step[/code] of the scrollbars to " "[code]0.25[/code] which results in smoother scrolling." msgstr "" -"如果 [code]true[/code],将滚动æ¡çš„æ¥é•¿ [code]step[/code] 设置为 [code]0.25[/" -"code]ï¼Œä»Žè€Œä½¿æ»šåŠ¨æ›´åŠ å¹³æ»‘ã€‚" +"如果为 [code]true[/code],将滚动æ¡çš„æ¥é•¿ [code]step[/code] 设置为 " +"[code]0.25[/code]ï¼Œä»Žè€Œä½¿æ»šåŠ¨æ›´åŠ å¹³æ»‘ã€‚" #: doc/classes/TextEdit.xml msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" -"如果 [code]true[/code]ï¼Œä¸ºæ¤ [TextEdit] 设置的任何自定义颜色属性都将å¯è§ã€‚" +"如果为 [code]true[/code]ï¼Œä¸ºæ¤ [TextEdit] 设置的任何自定义颜色属性都将å¯è§ã€‚" #: doc/classes/TextEdit.xml msgid "String value of the [TextEdit]." @@ -76094,7 +76396,7 @@ msgstr "åž‚ç›´æ»šåŠ¨çš„çµæ•度。" msgid "" "If [code]true[/code], enables text wrapping when it goes beyond the edge of " "what is visible." -msgstr "如果 [code]true[/code],当文本超出å¯è§è¾¹ç¼˜æ—¶å¯ç”¨æ–‡æœ¬æ¢è¡Œã€‚" +msgstr "如果为 [code]true[/code],当文本超出å¯è§è¾¹ç¼˜æ—¶å¯ç”¨æ–‡æœ¬æ¢è¡Œã€‚" #: doc/classes/TextEdit.xml msgid "Emitted when a breakpoint is placed via the breakpoint gutter." @@ -76302,16 +76604,16 @@ msgid "" "canvas_item_add_texture_rect] with a rect at [code]position[/code] and the " "size of this [Texture]." msgstr "" -"在指定的ä½ç½®[code]position[/code]使用[VisualServer]APIçš„[CanvasItem]æ¥ç»˜åˆ¶çº¹" -"ç†ã€‚相当于[method VisualServer.canvas_item_add_texture_rect],在ä½ç½®" -"[code]position[/code]有一个矩形,尺寸为这个[Texture]。" +"在指定的ä½ç½® [code]position[/code] 使用 [VisualServer] API çš„ [CanvasItem] æ¥" +"绘制纹ç†ã€‚相当于 [method VisualServer.canvas_item_add_texture_rect],在ä½ç½® " +"[code]position[/code] 有一个矩形,尺寸为这个 [Texture]。" #: doc/classes/Texture.xml msgid "" "Draws the texture using a [CanvasItem] with the [VisualServer] API. " "Equivalent to [method VisualServer.canvas_item_add_texture_rect]." msgstr "" -"使用 [VisualServer] API çš„ [CanvasItem] æ¥ç»˜åˆ¶çº¹ç†ã€‚相当于方法 [method " +"使用 [VisualServer] API çš„ [CanvasItem] æ¥ç»˜åˆ¶çº¹ç†ã€‚相当于 [method " "VisualServer.canvas_item_add_texture_rect]。" #: doc/classes/Texture.xml @@ -76319,16 +76621,16 @@ msgid "" "Draws a part of the texture using a [CanvasItem] with the [VisualServer] " "API. Equivalent to [method VisualServer.canvas_item_add_texture_rect_region]." msgstr "" -"使用 [VisualServer] API çš„ [CanvasItem] æ¥ç»˜åˆ¶çº¹ç†çš„一个部分。相当于方法 " -"[method VisualServer.canvas_item_add_texture_rect_region]。" +"使用 [VisualServer] API çš„ [CanvasItem] æ¥ç»˜åˆ¶çº¹ç†çš„一个部分。相当于 [method " +"VisualServer.canvas_item_add_texture_rect_region]。" #: doc/classes/Texture.xml msgid "" "Returns an [Image] that is a copy of data from this [Texture]. [Image]s can " "be accessed and manipulated directly." msgstr "" -"返回一个 [Image]ï¼Œå®ƒæ˜¯æ¤ [Texture] 䏿•°æ®çš„副本。 [Image] 图åƒå¯ä»¥ç›´æŽ¥è®¿é—®å’Œ" -"æ“作。" +"返回一个 [Image]ï¼Œå®ƒæ˜¯æ¤ [Texture] 䏿•°æ®çš„副本。[Image] 图åƒå¯ä»¥ç›´æŽ¥è®¿é—®å’Œæ“" +"作。" #: doc/classes/Texture.xml msgid "Returns the texture height." @@ -76662,7 +76964,7 @@ msgstr "返回纹ç†çš„æ·±åº¦ã€‚深度是第三个维度(通常是 Z 轴)。 msgid "" "Returns the current format being used by this texture. See [enum Image." "Format] for details." -msgstr "返回纹ç†å½“å‰ä½¿ç”¨çš„æ ¼å¼ã€‚详情è§[enum Image.Format]。" +msgstr "返回纹ç†å½“å‰ä½¿ç”¨çš„æ ¼å¼ã€‚è¯¦æƒ…è§ [enum Image.Format]。" #: doc/classes/TextureLayered.xml msgid "" @@ -76689,8 +76991,8 @@ msgid "" "the texture. The [code]image[/code] must fit within the texture." msgstr "" "通过使用指定的[code]image[/code]的数æ®è¦†ç›–æ¥éƒ¨åˆ†è®¾ç½®æŒ‡å®šçš„[code]layer[/code]" -"的数æ®ã€‚ [code]x_offset[/code] å’Œ [code]y_offset[/code] 确定 [Image] 在纹ç†ä¸Š" -"\"stamped\" æ ‡è®°çš„ä½ç½®ã€‚ [code]image[/code] 必须适åˆçº¹ç†ã€‚" +"的数æ®ã€‚[code]x_offset[/code] å’Œ [code]y_offset[/code] 确定 [Image] 在纹ç†ä¸Š" +"\"stamped\" æ ‡è®°çš„ä½ç½®ã€‚[code]image[/code] 必须适åˆçº¹ç†ã€‚" #: doc/classes/TextureLayered.xml msgid "" @@ -76711,7 +77013,7 @@ msgid "" "Default flags for [TextureArray]. [constant FLAG_MIPMAPS], [constant " "FLAG_REPEAT] and [constant FLAG_FILTER] are enabled." msgstr "" -"[TextureArray] çš„é»˜è®¤æ ‡è®°ã€‚ å¯ç”¨ [constant FLAG_MIPMAPS]ã€[constant " +"[TextureArray] çš„é»˜è®¤æ ‡è®°ã€‚å¯ç”¨ [constant FLAG_MIPMAPS]ã€[constant " "FLAG_REPEAT] å’Œ [constant FLAG_FILTER]。" #: doc/classes/TextureLayered.xml @@ -76724,7 +77026,7 @@ msgstr "纹ç†å°†åœ¨åˆ›å»ºæ—¶ç”Ÿæˆå¤šçº§æ¸è¿œçº¹ç†ã€‚" #: doc/classes/TextureLayered.xml msgid "Texture will repeat when UV used is outside the 0-1 range." -msgstr "当使用的UV超出0-1范围时,纹ç†å°†é‡å¤ã€‚" +msgstr "当使用的 UV 超出 0-1 范围时,纹ç†å°†é‡å¤ã€‚" #: doc/classes/TextureLayered.xml msgid "" @@ -76747,12 +77049,12 @@ msgid "" "of Godot's [Theme] resource. It can be used to create horizontal, vertical " "and radial progress bars." msgstr "" -"TextureProgress的工作原ç†ä¸Ž[ProgressBar]类似,但最多使用3个纹ç†ï¼Œè€Œä¸æ˜¯Godot" -"çš„[Theme]资æºã€‚它å¯ä»¥ç”¨æ¥åˆ›å»ºæ°´å¹³ã€åž‚直和径å‘的进度æ¡ã€‚" +"TextureProgress 的工作原ç†ä¸Ž [ProgressBar] 类似,但最多使用 3 个纹ç†ï¼Œè€Œä¸æ˜¯ " +"Godot çš„ [Theme] 资æºã€‚它å¯ä»¥ç”¨æ¥åˆ›å»ºæ°´å¹³ã€åž‚直和径å‘的进度æ¡ã€‚" #: doc/classes/TextureProgress.xml msgid "The fill direction. See [enum FillMode] for possible values." -msgstr "å¡«å……æ–¹å‘。有关å¯èƒ½çš„值,å‚阅[enum FillMode]。" +msgstr "å¡«å……æ–¹å‘。å¯èƒ½çš„å–å€¼è§ [enum FillMode]。" #: doc/classes/TextureProgress.xml msgid "" @@ -76761,9 +77063,10 @@ msgid "" "[member stretch_margin_bottom] to set up the nine patch's 3×3 grid. When " "using a radial [member fill_mode], this setting will enable stretching." msgstr "" -"如果[code]true[/code],Godot会åƒåœ¨[NinePatchRect]ä¸é‚£æ ·å¤„ç†æ¡å½¢çº¹ç†ã€‚使用" -"[code]stretch_margin_*[/code]属性,如[member stretch_margin_bottom]æ¥è®¾ç½®ä¹å®«" -"æ ¼çš„3×3ç½‘æ ¼ã€‚å½“ä½¿ç”¨å¾„å‘çš„[member fill_mode]时,这个设置将å¯ç”¨æ‹‰ä¼¸åŠŸèƒ½ã€‚" +"如果为 [code]true[/code],Godot 会åƒåœ¨ [NinePatchRect] ä¸é‚£æ ·å¤„ç†æ¡å½¢çº¹ç†ã€‚使" +"用 [code]stretch_margin_*[/code] 属性,如 [member stretch_margin_bottom] æ¥è®¾" +"ç½®ä¹å®«æ ¼çš„ 3×3 ç½‘æ ¼ã€‚å½“ä½¿ç”¨å¾„å‘çš„ [member fill_mode] 时,这个设置将å¯ç”¨æ‹‰ä¼¸åŠŸ" +"能。" #: doc/classes/TextureProgress.xml msgid "" @@ -76806,8 +77109,8 @@ msgid "" "bottom corners and side will have a height of 16 pixels. You can set all 4 " "margin values individually to create panels with non-uniform borders." msgstr "" -"ä¹å®«æ ¼åº•行的高度。边è·ä¸º16æ„味ç€ä¹å®«æ ¼çš„底角和侧é¢å°†æœ‰16åƒç´ çš„é«˜åº¦ã€‚ä½ å¯ä»¥å•" -"独设置所有4个边è·å€¼ï¼Œæ¥åˆ›å»ºå…·æœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" +"ä¹å®«æ ¼åº•行的高度。边è·ä¸º 16 æ„味ç€ä¹å®«æ ¼çš„底角和侧é¢å°†æœ‰ 16 åƒç´ çš„é«˜åº¦ã€‚ä½ å¯" +"以å•独设置所有 4 个边è·å€¼ï¼Œæ¥åˆ›å»ºå…·æœ‰éžç»Ÿä¸€è¾¹æ¡†çš„颿¿ã€‚" #: doc/classes/TextureProgress.xml msgid "The width of the 9-patch's left column." @@ -76838,12 +77141,12 @@ msgid "" "The [code]value[/code] property comes from [Range]. See [member Range." "value], [member Range.min_value], [member Range.max_value]." msgstr "" -"基于节点的[code]value[/code]å’Œ[member fill_mode]进行è£å‰ª[Texture]。éšç€" -"[code]value[/code]çš„å¢žåŠ ï¼Œçº¹ç†ä¼šè¢«å¡«æ»¡ã€‚当[code]value[/code]达到" -"[code]max_value[/code]时,它完全显示。如果[code]value[/code]ç‰äºŽ" +"基于节点的 [code]value[/code] å’Œ [member fill_mode] 进行è£å‰ª [Texture]。éšç€ " +"[code]value[/code] çš„å¢žåŠ ï¼Œçº¹ç†ä¼šè¢«å¡«æ»¡ã€‚当 [code]value[/code] 达到 " +"[code]max_value[/code] 时,它完全显示。如果 [code]value[/code] ç‰äºŽ " "[code]min_value[/code]ï¼Œå®ƒå°±å®Œå…¨ä¸æ˜¾ç¤ºäº†ã€‚\n" -"[code]value[/code]属性æ¥è‡ª[Range]。å‚阅[member Range.value], [member Range." -"min_value], [member Range.max_value]。" +"[code]value[/code] 属性æ¥è‡ª [Range]ã€‚è§ [member Range.value]ã€[member Range." +"min_value]ã€[member Range.max_value]。" #: doc/classes/TextureProgress.xml msgid "" @@ -76851,12 +77154,12 @@ msgid "" "and [member texture_under] with fancy borders, to avoid transparent margins " "in your progress texture." msgstr "" -"[member texture_progress]çš„åç§»é‡ã€‚对于带有花哨的边框的[member texture_over]" -"å’Œ[member texture_under]很有用,å¯ä»¥é¿å…进度纹ç†çš„è¾¹ç¼˜é€æ˜Žã€‚" +"[member texture_progress] çš„åç§»é‡ã€‚对于带有花哨的边框的 [member " +"texture_over] å’Œ [member texture_under] 很有用,å¯ä»¥é¿å…进度纹ç†çš„è¾¹ç¼˜é€æ˜Žã€‚" #: doc/classes/TextureProgress.xml msgid "[Texture] that draws under the progress bar. The bar's background." -msgstr "在进度æ¡ä¸‹é¢ç»˜åˆ¶çš„[Texture]。å³èƒŒæ™¯ã€‚" +msgstr "在进度æ¡ä¸‹é¢ç»˜åˆ¶çš„ [Texture]。å³èƒŒæ™¯ã€‚" #: doc/classes/TextureProgress.xml msgid "" @@ -76878,7 +77181,7 @@ msgstr "å°†æ¡å½¢çš„ [code]texture_under[/code] 纹ç†çš„颜色相乘。" #: doc/classes/TextureProgress.xml msgid "The [member texture_progress] fills from left to right." -msgstr "[member texture_progress]从左到å³å¡«å……。" +msgstr "[member texture_progress] 从左到å³å¡«å……。" #: doc/classes/TextureProgress.xml msgid "The [member texture_progress] fills from right to left." @@ -76964,7 +77267,7 @@ msgstr "如果为 [code]true[/code],纹ç†ç¼©æ”¾ä»¥é€‚åˆå…¶è¾¹ç•ŒçŸ©å½¢ã€‚" msgid "" "Controls the texture's behavior when resizing the node's bounding rectangle. " "See [enum StretchMode]." -msgstr "控件纹ç†åœ¨è°ƒæ•´èŠ‚ç‚¹è¾¹ç•ŒçŸ©å½¢æ—¶çš„è¡Œä¸ºã€‚å‚阅[enum StretchMode]。" +msgstr "控件纹ç†åœ¨è°ƒæ•´èŠ‚ç‚¹è¾¹ç•ŒçŸ©å½¢æ—¶çš„è¡Œä¸ºã€‚è§ [enum StretchMode]。" #: doc/classes/TextureRect.xml msgid "The node's [Texture] resource." @@ -77100,14 +77403,14 @@ msgid "" "Returns all the [Color] types as a [PoolStringArray] filled with unique type " "names, for use in [method get_color] and/or [method get_color_list]." msgstr "" -"返回所有的[Color]类型为[PoolStringArray],其ä¸å¡«å……了唯一类型å称,供[method " -"get_color]å’Œ/或[method get_color_list]使用。" +"返回所有的 [Color] 类型为 [PoolStringArray],其ä¸å¡«å……了唯一类型å称,供 " +"[method get_color] å’Œ/或 [method get_color_list] 使用。" #: doc/classes/Theme.xml msgid "" "Returns the constant at [code]name[/code] if the theme has [code]node_type[/" "code]." -msgstr "如果主题有[code]node_type[/code],返回 [code]name[/code]处的常é‡ã€‚" +msgstr "如果主题有 [code]node_type[/code],返回 [code]name[/code] 处的常é‡ã€‚" #: doc/classes/Theme.xml msgid "" @@ -77115,8 +77418,8 @@ msgid "" "name, for use in [method get_constant], if the theme has [code]node_type[/" "code]." msgstr "" -"如果主题有[code]node_type[/code],将所有常é‡ä½œä¸º[PoolStringArray]返回,并填充" -"æ¯ä¸ªå¸¸é‡çš„å称,以供[method get_constant]使用。" +"如果主题有 [code]node_type[/code],将所有常é‡ä½œä¸º [PoolStringArray] 返回,并" +"å¡«å……æ¯ä¸ªå¸¸é‡çš„å称,以供 [method get_constant] 使用。" #: doc/classes/Theme.xml msgid "" @@ -77142,8 +77445,8 @@ msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " "name, for use in [method get_font], if the theme has [code]node_type[/code]." msgstr "" -"如果主题有[code]node_type[/code],将所有的[Font]作为[PoolStringArray]返回,并" -"å¡«å…¥æ¯ä¸ª[Font]çš„å称,以供[method get_font]使用。" +"如果主题有 [code]node_type[/code],将所有的 [Font] 作为 [PoolStringArray] è¿”" +"回,并填入æ¯ä¸ª [Font] çš„å称,以供 [method get_font] 使用。" #: doc/classes/Theme.xml msgid "" @@ -77332,9 +77635,9 @@ msgid "" "[code]name[/code] is in [code]node_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]node_type[/code]." msgstr "" -"如果一个[code]data_type[/code]的主题项目与[code]name[/code]在" -"[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。\n" -"如果该主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果一个 [code]data_type[/code] 的主题项目与 [code]name[/code] 在 " +"[code]node_type[/code] ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。\n" +"如果该主题没有 [code]node_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml msgid "" @@ -77352,7 +77655,7 @@ msgid "" "themes together without modifying either one, create a new empty theme and " "merge the other two into it one after another." msgstr "" -"用[code]other[/code][Theme]çš„å€¼æ·»åŠ ç¼ºå¤±çš„ï¼Œå’Œè¦†ç›–çŽ°æœ‰çš„å®šä¹‰ã€‚\n" +"用 [code]other[/code] [Theme]çš„å€¼æ·»åŠ ç¼ºå¤±çš„ï¼Œå’Œè¦†ç›–çŽ°æœ‰çš„å®šä¹‰ã€‚\n" "[b]注æ„:[/b]这将修改当å‰çš„ä¸»é¢˜ã€‚å¦‚æžœä½ æƒ³åœ¨ä¸ä¿®æ”¹ä»»ä½•一个主题的情况下将两个主" "题åˆå¹¶åœ¨ä¸€èµ·ï¼Œè¯·åˆ›å»ºä¸€ä¸ªæ–°çš„空主题,然åŽå°†å¦å¤–两个主题é€ä¸ªåˆå¹¶åˆ°å…¶ä¸ã€‚" @@ -77371,8 +77674,8 @@ msgid "" "theme has [code]node_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有[code]node_type[/code],则将[code]old_name[/code]çš„[Color]é‡å‘½å为" -"[code]name[/code]。如果[code]name[/code]å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•将失败。" +"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Color] é‡å‘½" +"å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•将失败。" #: doc/classes/Theme.xml msgid "" @@ -77380,8 +77683,8 @@ msgid "" "theme has [code]node_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有[code]node_type[/code],则将[code]old_name[/code]的常é‡é‡å‘½å为" -"[code]name[/code]。如果[code]name[/code]å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" +"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] 的常é‡é‡å‘½å为 " +"[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml msgid "" @@ -77389,8 +77692,8 @@ msgid "" "theme has [code]node_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有[code]node_type[/code],则将[code]old_name[/code]çš„[Font]é‡å‘½å为" -"[code]name[/code]。如果[code]name[/code]å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" +"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Font] é‡å‘½" +"å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml msgid "" @@ -77398,8 +77701,8 @@ msgid "" "has [code]node_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" -"如果主题有[code]node_type[/code],将[code]old_name[/code]çš„å›¾æ ‡é‡å‘½å为" -"[code]name[/code]。如果[code]name[/code]å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" +"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„å›¾æ ‡é‡å‘½å为 " +"[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml msgid "" @@ -77407,8 +77710,8 @@ msgid "" "theme has [code]node_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有[code]node_type[/code],则将[StyleBox]在[code]old_name[/code]é‡å‘½å" -"为[code]name[/code]。如果[code]name[/code]å·²ç»è¢«å ç”¨ï¼Œæ¤æ–¹æ³•会失败。" +"如果主题有 [code]node_type[/code],则将 [StyleBox] 在 [code]old_name[/code] " +"é‡å‘½å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œæ¤æ–¹æ³•会失败。" #: doc/classes/Theme.xml msgid "" @@ -77426,7 +77729,7 @@ msgid "" "[code]node_type[/code].\n" "Creates [code]node_type[/code] if the theme does not have it." msgstr "" -"在[code]node_type[/code]ä¸çš„[code]name[/code]处,设置主题的[Color]为" +"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,设置主题的[Color]为" "[code]color[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" @@ -77436,7 +77739,7 @@ msgid "" "[code]node_type[/code].\n" "Creates [code]node_type[/code] if the theme does not have it." msgstr "" -"在[code]node_type[/code]ä¸çš„[code]name[/code]处,将主题的常é‡è®¾ç½®ä¸º" +"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,将主题的常é‡è®¾ç½®ä¸º" "[code]constant[/code]。\n" "如果主题没有,则创建[code]node_type[/code]。" @@ -77446,7 +77749,7 @@ msgid "" "[code]node_type[/code].\n" "Creates [code]node_type[/code] if the theme does not have it." msgstr "" -"在[code]node_type[/code]ä¸çš„[code]name[/code]处将主题的 [Font] 设置为" +"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处将主题的 [Font] 设置为" "[code]font[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" @@ -77456,7 +77759,7 @@ msgid "" "in [code]node_type[/code].\n" "Creates [code]node_type[/code] if the theme does not have it." msgstr "" -"在[code]node_type[/code]ä¸çš„[code]name[/code]å¤„è®¾ç½®ä¸»é¢˜çš„å›¾æ ‡[Texture]为" +"在 [code]node_type[/code] ä¸çš„ [code]name[/code] å¤„è®¾ç½®ä¸»é¢˜çš„å›¾æ ‡[Texture]为" "[code]texture[/code]。\n" "如果主题没有[code]node_type[/code],则创建该节点。" @@ -77531,11 +77834,11 @@ msgstr "主题的 [Font] å—体项类型。" #: doc/classes/Theme.xml msgid "Theme's icon [Texture] item type." -msgstr "ä¸»é¢˜çš„å›¾æ ‡[Texture]项类型。" +msgstr "ä¸»é¢˜çš„å›¾æ ‡ [Texture] 项类型。" #: doc/classes/Theme.xml msgid "Theme's [StyleBox] item type." -msgstr "主题的[StyleBox]项目类型。" +msgstr "主题的 [StyleBox] 项目类型。" #: doc/classes/Theme.xml msgid "Maximum value for the DataType enum." @@ -77633,7 +77936,7 @@ msgstr "" #: doc/classes/Thread.xml msgid "A thread running with lower priority than normally." -msgstr "一个线程以比æ£å¸¸æƒ…况下更低的优先级è¿è¡Œã€‚" +msgstr "线程以比æ£å¸¸æƒ…况下更低的优先级è¿è¡Œã€‚" #: doc/classes/Thread.xml msgid "A thread with a standard priority." @@ -77794,7 +78097,7 @@ msgstr "" "[codeblock]\n" "func set_cell(x, y, tile, flip_x=false, flip_y=false, transpose=false, " "autotile_coord=Vector2()):\n" -" # åœ¨è¿™é‡Œå†™ä¸‹ä½ çš„è‡ªå®šä¹‰é€»è¾‘ã€‚ \n" +" # åœ¨è¿™é‡Œå†™ä¸‹ä½ çš„è‡ªå®šä¹‰é€»è¾‘ã€‚\n" " # 调用默认方法:\n" " .set_cell(x, y, tile, flip_x, flip_y, transpose, autotile_coord)\n" "[/codeblock]" @@ -77872,17 +78175,17 @@ msgstr "如果为 [code]true[/code],这个 TileMap 会烘焙导航地区。" #: doc/classes/TileMap.xml msgid "If [code]true[/code], the cell's UVs will be clipped." -msgstr "如果[code]true[/code],å•å…ƒæ ¼çš„UV将被剪è£ã€‚" +msgstr "如果为 [code]true[/code],å•å…ƒæ ¼çš„ UV 将被剪è£ã€‚" #: doc/classes/TileMap.xml msgid "The custom [Transform2D] to be applied to the TileMap's cells." -msgstr "将应用到图å—地图的,å•å…ƒæ ¼çš„è‡ªå®šä¹‰[Transform2D]。" +msgstr "将应用到 TileMap 的,å•å…ƒæ ¼çš„è‡ªå®šä¹‰ [Transform2D]。" #: doc/classes/TileMap.xml msgid "" "Amount to offset alternating tiles. See [enum HalfOffset] for possible " "values." -msgstr "便¬¡æŽ’列的图å—çš„åç§»é‡ã€‚有关å¯èƒ½çš„值,å‚阅[enum HalfOffset]。" +msgstr "便¬¡æŽ’列的图å—çš„åç§»é‡ã€‚å¯èƒ½çš„å–å€¼è§ [enum HalfOffset]。" #: doc/classes/TileMap.xml msgid "" @@ -77896,13 +78199,13 @@ msgstr "图å—地图的å•元大å°ã€‚" #: doc/classes/TileMap.xml msgid "Position for tile origin. See [enum TileOrigin] for possible values." -msgstr "图å—åŽŸç‚¹çš„åæ ‡ã€‚有关å¯èƒ½çš„值,å‚阅[enum TileOrigin]。" +msgstr "图å—åŽŸç‚¹çš„åæ ‡ã€‚å¯èƒ½çš„å–å€¼è§ [enum TileOrigin]。" #: doc/classes/TileMap.xml msgid "" "If [code]true[/code], the TileMap's direct children will be drawn in order " "of their Y coordinate." -msgstr "如果[code]true[/code],图å—地图的直接å节点将按其Yåæ ‡é¡ºåºç»˜åˆ¶ã€‚" +msgstr "如果为 [code]true[/code],TileMap 的直接å节点将按其 Y åæ ‡é¡ºåºç»˜åˆ¶ã€‚" #: doc/classes/TileMap.xml msgid "" @@ -77914,12 +78217,12 @@ msgid "" "If [code]false[/code], the texture position start in the top-left corner " "unless [member compatibility_mode] is enabled." msgstr "" -"如果[code]true[/code],纹ç†å°†è¢«é›†ä¸åœ¨æ¯ä¸ªå›¾å—çš„ä¸é—´ã€‚这对æŸäº›ç‰è·æˆ–上å¸è§†è§’çš„" -"模å¼å¾ˆæœ‰ç”¨ï¼Œå½“纹ç†è¢«åšå¾—比图å—å¤§æˆ–å°æ—¶ï¼Œä¾‹å¦‚,为了é¿å…ç“·ç –è¾¹ç¼˜çš„é—ªçƒã€‚åç§»é‡" -"ä»è¢«åº”用,但从瓦片的ä¸å¿ƒå¼€å§‹ã€‚如果使用,[member compatibility_mode]会被忽" -"略。\n" -"如果[code]false[/code],纹ç†åæ ‡ä»Žå·¦ä¸Šè§’å¼€å§‹ï¼Œé™¤éž[member compatibility_mode]" -"被å¯ç”¨ã€‚" +"如果为 [code]true[/code],纹ç†å°†è¢«é›†ä¸åœ¨æ¯ä¸ªå›¾å—çš„ä¸é—´ã€‚这对æŸäº›ç‰è·æˆ–上å¸è§†" +"角的模å¼å¾ˆæœ‰ç”¨ï¼Œå½“纹ç†è¢«åšå¾—比图å—å¤§æˆ–å°æ—¶ï¼Œä¾‹å¦‚,为了é¿å…图å—边缘的闪çƒã€‚å" +"ç§»é‡ä»è¢«åº”用,但从图å—çš„ä¸å¿ƒå¼€å§‹ã€‚如果使用,[member compatibility_mode] 会被" +"忽略。\n" +"如果为 [code]false[/code],纹ç†åæ ‡ä»Žå·¦ä¸Šè§’å¼€å§‹ï¼Œé™¤éž [member " +"compatibility_mode] 被å¯ç”¨ã€‚" #: doc/classes/TileMap.xml msgid "" @@ -77960,16 +78263,16 @@ msgid "" "If [code]true[/code], TileMap collisions will be handled as a kinematic " "body. If [code]false[/code], collisions will be handled as static body." msgstr "" -"如果[code]true[/code],图å—地图的碰撞将被当作è¿åЍ体处ç†ã€‚如果[code]false[/" -"code]ï¼Œç¢°æ’žå°†è¢«å½“ä½œé™æ€ä½“æ¥å¤„ç†ã€‚" +"如果为 [code]true[/code],图å—地图的碰撞将被当作è¿åЍ体处ç†ã€‚如果为 " +"[code]false[/code]ï¼Œç¢°æ’žå°†è¢«å½“ä½œé™æ€ä½“æ¥å¤„ç†ã€‚" #: doc/classes/TileMap.xml msgid "" "If [code]true[/code], this tilemap's collision shape will be added to the " "collision shape of the parent. The parent has to be a [CollisionObject2D]." msgstr "" -"如果[code]true[/code],这个图å—åœ°å›¾çš„ç¢°æ’žå½¢çŠ¶å°†è¢«æ·»åŠ åˆ°çˆ¶çº§çš„ç¢°æ’žå½¢çŠ¶ä¸ã€‚父级" -"必须是一个[CollisionObject2D]。" +"如果为 [code]true[/code],这个图å—åœ°å›¾çš„ç¢°æ’žå½¢çŠ¶å°†è¢«æ·»åŠ åˆ°çˆ¶çº§çš„ç¢°æ’žå½¢çŠ¶ä¸ã€‚" +"父级必须是一个[CollisionObject2D]。" #: doc/classes/TileMap.xml msgid "" @@ -78000,7 +78303,7 @@ msgstr "" #: doc/classes/TileMap.xml msgid "The TileMap orientation mode. See [enum Mode] for possible values." -msgstr "图å—åœ°å›¾çš„æ–¹å‘æ¨¡å¼ã€‚有关å¯èƒ½çš„值,å‚阅[enum Mode]。" +msgstr "图å—åœ°å›¾çš„æ–¹å‘æ¨¡å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum Mode]。" #: doc/classes/TileMap.xml msgid "The navigation layers the TileMap generates its navigation regions in." @@ -78022,9 +78325,9 @@ msgid "" "runtime, enable [b]Visible Collision Shapes[/b] in the [b]Debug[/b] menu " "instead." msgstr "" -"如果[code]true[/code]ï¼Œç¢°æ’žå½¢çŠ¶åœ¨ç¼–è¾‘å™¨ä¸æ˜¯å¯è§çš„。ä¸å½±å“碰撞形状在è¿è¡Œæ—¶çš„å¯" -"è§æ€§ã€‚è¦åœ¨è¿è¡Œæ—¶æ˜¾ç¤ºç¢°æ’žå½¢çŠ¶ï¼Œè¯·åœ¨[b]调试[/b]èœå•ä¸å¯ç”¨[b]å¯è§çš„碰撞形状[/" -"b]。" +"如果为 [code]true[/code]ï¼Œç¢°æ’žå½¢çŠ¶åœ¨ç¼–è¾‘å™¨ä¸æ˜¯å¯è§çš„。ä¸å½±å“碰撞形状在è¿è¡Œæ—¶" +"çš„å¯è§æ€§ã€‚è¦åœ¨è¿è¡Œæ—¶æ˜¾ç¤ºç¢°æ’žå½¢çŠ¶ï¼Œè¯·åœ¨[b]调试[/b]èœå•ä¸å¯ç”¨[b]å¯è§çš„碰撞形状" +"[/b]。" #: doc/classes/TileMap.xml msgid "The assigned [TileSet]." @@ -78188,7 +78491,7 @@ msgstr "" #: doc/classes/TileSet.xml msgid "Sets the [enum BitmaskMode] of the autotile." -msgstr "设置自动图å—çš„[enum BitmaskMode]ä½æŽ©ç æ¨¡å¼ã€‚" +msgstr "设置自动图å—çš„ [enum BitmaskMode] ä½æŽ©ç æ¨¡å¼ã€‚" #: doc/classes/TileSet.xml msgid "" @@ -78323,7 +78626,7 @@ msgstr "返回图å—形状的å•å‘碰撞值。" #: doc/classes/TileSet.xml msgid "Returns the [Transform2D] of a tile's shape." -msgstr "返回图å—形状的[Transform2D]。" +msgstr "返回图å—形状的 [Transform2D]。" #: doc/classes/TileSet.xml msgid "" @@ -78361,7 +78664,7 @@ msgstr "返回图å—的纹ç†åç§»é‡ã€‚" #: doc/classes/TileSet.xml msgid "Returns the tile's [enum TileMode]." -msgstr "返回图å—çš„[enum TileMode]。" +msgstr "返回图å—çš„ [enum TileMode]。" #: doc/classes/TileSet.xml msgid "Returns the tile's Z index (drawing layer)." @@ -78572,7 +78875,7 @@ msgid "" "with the exception of Daylight Savings Time as it cannot be determined from " "the epoch." msgstr "" -"将给定的 Unix 时间戳转æ¢ä¸ºå—典,包å«çš„键为: [code]year[/code]ã€[code]month[/" +"将给定的 Unix 时间戳转æ¢ä¸ºå—典,包å«çš„键为:[code]year[/code]ã€[code]month[/" "code]ã€[code]day[/code]ã€[code]weekday[/code]。\n" "如果 Unix æ—¶é—´æˆ³ä¸ºå½“å‰æ—¶é—´ï¼Œè¿”回的 Dictionary 的值与 [method " "get_datetime_dict_from_system] 相åŒï¼ŒåŒºåˆ«æ˜¯æ— æ³•æ ¹æ®çºªå…ƒæŽ¨å®šå¤ä»¤æ—¶ã€‚" @@ -78592,7 +78895,7 @@ msgid "" "the middle." msgstr "" "将给定的时间值å—典转æ¢ä¸º ISO 8601 日期和时间å—符串(YYYY-MM-DDTHH:MM:SS)。\n" -"给定的å—å…¸å¯ä»¥åŒ…å«ä»¥ä¸‹é”®ï¼š [code]year[/code]ã€[code]month[/code]ã€[code]day[/" +"给定的å—å…¸å¯ä»¥åŒ…å«ä»¥ä¸‹é”®ï¼š[code]year[/code]ã€[code]month[/code]ã€[code]day[/" "code]ã€[code]hour[/code]ã€[code]minute[/code]ã€[code]second[/code]。其他的记" "录(包括 [code]dst[/code])都会被忽略。\n" "å—典为空时将返回 [code]0[/code]。如果çœç•¥äº†éƒ¨åˆ†é”®ï¼Œé»˜è®¤ä½¿ç”¨ Unix 纪元时间戳 0" @@ -78711,7 +79014,7 @@ msgid "" "given datetime dictionary." msgstr "" "将时间值å—典转æ¢ä¸º Unix 时间戳。\n" -"给定的å—å…¸å¯ä»¥åŒ…å«ä»¥ä¸‹é”®ï¼š [code]year[/code]ã€[code]month[/code]ã€[code]day[/" +"给定的å—å…¸å¯ä»¥åŒ…å«ä»¥ä¸‹é”®ï¼š[code]year[/code]ã€[code]month[/code]ã€[code]day[/" "code]ã€[code]hour[/code]ã€[code]minute[/code]ã€[code]second[/code]。其他的记" "录(包括 [code]dst[/code])都会被忽略。\n" "å—典为空时将返回 [code]0[/code]。如果çœç•¥äº†éƒ¨åˆ†é”®ï¼Œé»˜è®¤ä½¿ç”¨ Unix 纪元时间戳 0" @@ -78855,9 +79158,9 @@ msgid "" "[code]wait_time[/code].\n" "[b]Note:[/b] This method will not resume a paused timer. See [member paused]." msgstr "" -"å¯åŠ¨å®šæ—¶å™¨ã€‚å¦‚æžœ[code]time_sec>0[/code],将[code]wait_time[/code]设置为" -"[code]time_sec[/code]。这也会将剩余时间é‡ç½®ä¸º[code]wait_time[/code]。\n" -"[b]注æ„:[/b]这个方法ä¸ä¼šæ¢å¤ä¸€ä¸ªæš‚åœçš„定时器。å‚阅 [member paused]。" +"å¯åŠ¨å®šæ—¶å™¨ã€‚å¦‚æžœ [code]time_sec > 0[/code],将 [code]wait_time[/code] 设置为 " +"[code]time_sec[/code]。这也会将剩余时间é‡ç½®ä¸º [code]wait_time[/code]。\n" +"[b]注æ„:[/b]这个方法ä¸ä¼šæ¢å¤å·²æš‚åœçš„å®šæ—¶å™¨ã€‚è§ [member paused]。" #: doc/classes/Timer.xml msgid "Stops the timer." @@ -78870,7 +79173,7 @@ msgid "" "[b]Note:[/b] This property is automatically set to [code]false[/code] after " "the timer enters the scene tree and starts." msgstr "" -"如果[code]true[/code]ï¼Œå®šæ—¶å™¨å°†åœ¨è¿›å…¥åœºæ™¯æ ‘æ—¶è‡ªåŠ¨å¯åŠ¨ã€‚\n" +"如果为 [code]true[/code]ï¼Œå®šæ—¶å™¨å°†åœ¨è¿›å…¥åœºæ™¯æ ‘æ—¶è‡ªåŠ¨å¯åŠ¨ã€‚\n" "[b]注æ„:[/b]åœ¨å®šæ—¶å™¨è¿›å…¥åœºæ™¯æ ‘å¹¶å¯åЍåŽï¼Œè¯¥å±žæ€§ä¼šè‡ªåŠ¨è®¾ç½®ä¸º [code]false[/" "code]。" @@ -78879,20 +79182,20 @@ msgid "" "If [code]true[/code], the timer will stop when reaching 0. If [code]false[/" "code], it will restart." msgstr "" -"如果[code]true[/code],定时器将在达到0æ—¶åœæ¢ã€‚ 如果[code]false[/code],它将é‡" -"æ–°å¯åŠ¨ã€‚" +"如果为 [code]true[/code],定时器将在达到 0 æ—¶åœæ¢ã€‚如果为 [code]false[/" +"code]ï¼Œå®ƒå°†é‡æ–°å¯åŠ¨ã€‚" #: doc/classes/Timer.xml msgid "" "If [code]true[/code], the timer is paused and will not process until it is " "unpaused again, even if [method start] is called." msgstr "" -"如果[code]true[/code],定时器会被暂åœï¼Œå¹¶ä¸”ä¸å†å¤„ç†ï¼Œå³ä½¿è°ƒç”¨[method start]," -"ç›´åˆ°å®ƒè¢«å–æ¶ˆæš‚åœã€‚" +"如果为 [code]true[/code],定时器会被暂åœï¼Œå¹¶ä¸”ä¸å†å¤„ç†ï¼Œå³ä½¿è°ƒç”¨ [method " +"start]ï¼Œç›´åˆ°å®ƒè¢«å–æ¶ˆæš‚åœã€‚" #: doc/classes/Timer.xml msgid "Processing mode. See [enum TimerProcessMode]." -msgstr "å¤„ç†æ¨¡å¼ã€‚å‚阅[enum TimerProcessMode]。" +msgstr "å¤„ç†æ¨¡å¼ã€‚è§ [enum TimerProcessMode]。" #: doc/classes/Timer.xml msgid "" @@ -78900,8 +79203,9 @@ msgid "" "[b]Note:[/b] You cannot set this value. To change the timer's remaining " "time, use [method start]." msgstr "" -"定时器的剩余时间,å•使˜¯ç§’ã€‚å¦‚æžœå®šæ—¶å™¨å¤„äºŽéžæ¿€æ´»çжæ€ï¼Œåˆ™è¿”回0。\n" -"[b]注æ„:[/b]ä½ ä¸èƒ½è®¾ç½®è¿™ä¸ªå€¼ã€‚è¦æ”¹å˜å®šæ—¶å™¨çš„剩余时间,请使用[method start]。" +"定时器的剩余时间,å•使˜¯ç§’ã€‚å¦‚æžœå®šæ—¶å™¨å¤„äºŽéžæ¿€æ´»çжæ€ï¼Œåˆ™è¿”回 0。\n" +"[b]注æ„:[/b]ä½ ä¸èƒ½è®¾ç½®è¿™ä¸ªå€¼ã€‚è¦æ”¹å˜å®šæ—¶å™¨çš„剩余时间,请使用 [method " +"start]。" #: doc/classes/Timer.xml msgid "" @@ -78943,8 +79247,8 @@ msgid "" "btn.flat = true\n" "[/codeblock]" msgstr "" -"这是一个辅助类,用于生æˆä¸€ä¸ªæ‰å¹³çš„[Button],å‚阅 [member Button.flat],创建一" -"个[ToolButton]就相当于:\n" +"这是一个辅助类,用于生æˆä¸€ä¸ªæ‰å¹³çš„ [Button]ï¼ˆè§ [member Button.flat]),创建" +"一个 [ToolButton] 就相当于:\n" "[codeblock]\n" "var btn = Button.new()\n" "btn.flat = true\n" @@ -78952,11 +79256,11 @@ msgstr "" #: doc/classes/ToolButton.xml msgid "Default text [Color] of the [ToolButton]." -msgstr "[ToolButton] 的默认文本 [Color]颜色。" +msgstr "[ToolButton] 的默认文本 [Color] 颜色。" #: doc/classes/ToolButton.xml msgid "Text [Color] used when the [ToolButton] is disabled." -msgstr "ç¦ç”¨ [ToolButton] 时使用的文本 [Color]颜色。" +msgstr "ç¦ç”¨ [ToolButton] 时使用的文本 [Color] 颜色。" #: doc/classes/ToolButton.xml msgid "" @@ -78969,11 +79273,11 @@ msgstr "" #: doc/classes/ToolButton.xml msgid "Text [Color] used when the [ToolButton] is being hovered." -msgstr "[ToolButton] æ‚¬åœæ—¶ä½¿ç”¨çš„æ–‡æœ¬ [Color]颜色。" +msgstr "[ToolButton] æ‚¬åœæ—¶ä½¿ç”¨çš„æ–‡æœ¬ [Color] 颜色。" #: doc/classes/ToolButton.xml msgid "Text [Color] used when the [ToolButton] is being pressed." -msgstr "按下 [ToolButton] 时使用的文本 [Color]颜色。" +msgstr "按下 [ToolButton] 时使用的文本 [Color] 颜色。" #: doc/classes/ToolButton.xml msgid "The horizontal space between [ToolButton]'s icon and text." @@ -78981,11 +79285,11 @@ msgstr "[ToolButton] çš„å›¾æ ‡å’Œæ–‡æœ¬ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" #: doc/classes/ToolButton.xml msgid "[Font] of the [ToolButton]'s text." -msgstr "[ToolButton]的文本的[Font]å—体。" +msgstr "[ToolButton] 的文本的 [Font] å—体。" #: doc/classes/ToolButton.xml msgid "[StyleBox] used when the [ToolButton] is disabled." -msgstr "当[ToolButton]被ç¦ç”¨æ—¶ä½¿ç”¨çš„[StyleBox]。" +msgstr "当 [ToolButton] 被ç¦ç”¨æ—¶ä½¿ç”¨çš„ [StyleBox]。" #: doc/classes/ToolButton.xml msgid "" @@ -78998,7 +79302,7 @@ msgstr "" #: doc/classes/ToolButton.xml msgid "[StyleBox] used when the [ToolButton] is being hovered." -msgstr "当[ToolButton]è¢«æ‚¬åœæ—¶ä½¿ç”¨çš„[StyleBox]。" +msgstr "当 [ToolButton] è¢«æ‚¬åœæ—¶ä½¿ç”¨çš„ [StyleBox]。" #: doc/classes/ToolButton.xml msgid "Default [StyleBox] for the [ToolButton]." @@ -79006,7 +79310,7 @@ msgstr "[ToolButton] 的默认 [StyleBox]。" #: doc/classes/ToolButton.xml msgid "[StyleBox] used when the [ToolButton] is being pressed." -msgstr "当[ToolButton]被按下时使用的[StyleBox]。" +msgstr "当 [ToolButton] 被按下时使用的 [StyleBox]。" #: doc/classes/TouchScreenButton.xml msgid "Button for touch screen devices for gameplay use." @@ -79026,14 +79330,14 @@ msgid "" "You can configure TouchScreenButton to be visible only on touch devices, " "helping you develop your game both for desktop and mobile devices." msgstr "" -"TouchScreenButtonå…è®¸ä½ ä¸ºè§¦æ‘¸è®¾å¤‡åˆ›å»ºå±å¹•上的按钮。其为游æˆä½¿ç”¨ï¼Œæ¯”如在必须触" -"摸æ‰èƒ½ç§»åŠ¨çš„è®¾å¤‡ã€‚ä¸Ž[Button]ä¸åŒï¼ŒTouchScreenButton原生支æŒå¤šç‚¹è§¦æ‘¸ã€‚å‡ ä¸ª" -"TouchScreenButtonå¯ä»¥é€šè¿‡è§¦æ‘¸è¾“å…¥åŒæ—¶è¢«æŒ‰ä¸‹ã€‚\n" -"这个节点继承自[Node2D]。与[Control]节点ä¸åŒï¼Œä½ ä¸èƒ½åœ¨å®ƒä¸Šé¢è®¾ç½®é”šç‚¹ã€‚如果è¦åˆ›" -"建èœå•或用户界é¢ï¼Œå¯ç”¨[Button]节点代替。为了使按钮节点对触摸事件作出å应,å¯" -"在项目设置ä¸å¯ç”¨æ¨¡æ‹Ÿé¼ æ ‡é€‰é¡¹ã€‚\n" -"å¯å°†TouchScreenButtoné…置为åªåœ¨è§¦æ‘¸è®¾å¤‡ä¸Šå¯è§ï¼Œæœ‰åŠ©ä½ åŒæ—¶ä¸ºæ¡Œé¢å’Œç§»åŠ¨è®¾å¤‡å¼€å‘" -"游æˆã€‚" +"TouchScreenButton å…è®¸ä½ ä¸ºè§¦æ‘¸è®¾å¤‡åˆ›å»ºå±å¹•上的按钮。其为游æˆä½¿ç”¨ï¼Œæ¯”如在必须" +"触摸æ‰èƒ½ç§»åŠ¨çš„è®¾å¤‡ã€‚ä¸Ž [Button] ä¸åŒï¼ŒTouchScreenButton 原生支æŒå¤šç‚¹è§¦æ‘¸ã€‚å‡ " +"个 TouchScreenButton å¯ä»¥é€šè¿‡è§¦æ‘¸è¾“å…¥åŒæ—¶è¢«æŒ‰ä¸‹ã€‚\n" +"这个节点继承自 [Node2D]。与 [Control] 节点ä¸åŒï¼Œä½ ä¸èƒ½åœ¨å®ƒä¸Šé¢è®¾ç½®é”šç‚¹ã€‚如果" +"è¦åˆ›å»ºèœå•或用户界é¢ï¼Œå¯ç”¨ [Button] 节点代替。为了使按钮节点对触摸事件作出å" +"应,å¯åœ¨é¡¹ç›®è®¾ç½®ä¸å¯ç”¨æ¨¡æ‹Ÿé¼ æ ‡é€‰é¡¹ã€‚\n" +"å¯å°† TouchScreenButton é…置为åªåœ¨è§¦æ‘¸è®¾å¤‡ä¸Šå¯è§ï¼Œæœ‰åŠ©ä½ åŒæ—¶ä¸ºæ¡Œé¢å’Œç§»åŠ¨è®¾å¤‡å¼€" +"呿¸¸æˆã€‚" #: doc/classes/TouchScreenButton.xml msgid "Returns [code]true[/code] if this button is currently pressed." @@ -79041,11 +79345,11 @@ msgstr "如果这个按钮当å‰è¢«æŒ‰ä¸‹ï¼Œåˆ™è¿”回 [code]true[/code]。" #: doc/classes/TouchScreenButton.xml msgid "The button's action. Actions can be handled with [InputEventAction]." -msgstr "按钮的动作。动作å¯ä»¥ç”¨[InputEventAction]æ¥å¤„ç†ã€‚" +msgstr "按钮的动作。动作å¯ä»¥ç”¨ [InputEventAction] æ¥å¤„ç†ã€‚" #: doc/classes/TouchScreenButton.xml msgid "The button's bitmask." -msgstr "按钮的bit使ީç 。" +msgstr "æŒ‰é’®çš„ä½æŽ©ç 。" #: doc/classes/TouchScreenButton.xml msgid "The button's texture for the normal state." @@ -79058,8 +79362,8 @@ msgid "" "pressure started outside the active area of the button.\n" "[b]Note:[/b] This is a \"pass-by\" (not \"bypass\") press mode." msgstr "" -"如果[code]true[/code],åªè¦æŒ‰ä¸‹çš„æ‰‹æŒ‡è¿›å‡ºæŒ‰é’®ï¼Œå°±ä¼šå‘出 [signal pressed] å’Œ" -"[signal released] ]ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" +"如果为 [code]true[/code],åªè¦æŒ‰ä¸‹çš„æ‰‹æŒ‡è¿›å‡ºæŒ‰é’®ï¼Œå°±ä¼šå‘出 [signal pressed] " +"å’Œ[signal released] ]ä¿¡å·ï¼Œå³ä½¿åŽ‹åŠ›å¼€å§‹äºŽæŒ‰é’®çš„æœ‰æ•ˆåŒºåŸŸä¹‹å¤–ã€‚\n" "[b]注æ„:[/b]è¿™æ˜¯ä¸€ç§ \"pass-by\" çš„æŒ‰åŽ‹æ¨¡å¼ ï¼Œè€Œä¸æ˜¯ \"bypass\"。" #: doc/classes/TouchScreenButton.xml @@ -79075,17 +79379,17 @@ msgid "" "If [code]true[/code], the button's shape is centered in the provided " "texture. If no texture is used, this property has no effect." msgstr "" -"如果[code]true[/code],按钮的形状会在æä¾›çš„纹ç†ä¸å±…ä¸ã€‚如果没有使用纹ç†ï¼Œè¿™ä¸ª" -"属性就没有效果。" +"如果为 [code]true[/code],按钮的形状会在æä¾›çš„纹ç†ä¸å±…ä¸ã€‚如果没有使用纹ç†ï¼Œ" +"这个属性就没有效果。" #: doc/classes/TouchScreenButton.xml msgid "If [code]true[/code], the button's shape is visible." -msgstr "如果[code]true[/code],按钮的形状是å¯è§çš„。" +msgstr "如果为 [code]true[/code],按钮的形状是å¯è§çš„。" #: doc/classes/TouchScreenButton.xml msgid "" "The button's visibility mode. See [enum VisibilityMode] for possible values." -msgstr "按钮的å¯è§æ€§æ¨¡å¼ã€‚有关å¯èƒ½çš„值,å‚阅[enum VisibilityMode]。" +msgstr "按钮的å¯è§æ€§æ¨¡å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum VisibilityMode]。" #: doc/classes/TouchScreenButton.xml msgid "Emitted when the button is pressed (down)." @@ -79161,7 +79465,7 @@ msgid "" "given [code]weight[/code] (on the range of 0.0 to 1.0)." msgstr "" "返回在æ¤å˜æ¢å’Œå¦ä¸€ä¸ªå˜æ¢ä¹‹é—´é€šè¿‡ç»™å®šçš„[code]weight[/code]æ’å€¼çš„å˜æ¢ï¼ŒèŒƒå›´ä¸º" -"0.0到1.0。" +"0.0 到 1.0。" #: doc/classes/Transform.xml doc/classes/Transform2D.xml msgid "" @@ -79190,9 +79494,9 @@ msgid "" "perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" "Operations take place in global space." msgstr "" -"返回一个旋转åŽçš„å˜æ¢å‰¯æœ¬ï¼Œä½¿å…¶-Z轴指å‘[code]target[/code]ä½ç½®ã€‚\n" -"å˜æ¢å°†é¦–先围绕给定的[code]up[/code]å‘釿—‹è½¬ï¼Œç„¶åŽè¿›ä¸€æ¥é€šè¿‡å›´ç»•垂直于" -"[code]target[/code]å’Œ[code]up[/code]å‘é‡çš„轴旋转,æ¥å®Œå…¨ä¸Žç›®æ ‡å¯¹é½ã€‚\n" +"返回一个旋转åŽçš„å˜æ¢å‰¯æœ¬ï¼Œä½¿å…¶ -Z è½´æŒ‡å‘ [code]target[/code] ä½ç½®ã€‚\n" +"å˜æ¢å°†é¦–先围绕给定的 [code]up[/code] å‘釿—‹è½¬ï¼Œç„¶åŽè¿›ä¸€æ¥é€šè¿‡å›´ç»•垂直于 " +"[code]target[/code] å’Œ [code]up[/code] å‘é‡çš„轴旋转,æ¥å®Œå…¨ä¸Žç›®æ ‡å¯¹é½ã€‚\n" "æ“作是在全局空间进行的。" #: doc/classes/Transform.xml doc/classes/Transform2D.xml @@ -79248,7 +79552,7 @@ msgid "" "method." msgstr "" "将给定的 [Vector3]ã€[Plane]ã€[AABB]ã€[PoolVector3Array] åšè¯¥å˜æ¢çš„é€†å˜æ¢ï¼Œå‰" -"æå‡è®¾æ˜¯è¯¥å˜æ¢ä»…由旋转和平移构æˆï¼ˆä¸åŒ…括缩放)。ç‰ä»·äºŽè°ƒç”¨è¯¥å˜æ¢çš„ " +"æå‡è®¾æ˜¯è¯¥å˜æ¢ä»…由旋转和平移构æˆï¼ˆä¸åŒ…æ‹¬ç¼©æ”¾ï¼‰ã€‚ç›¸å½“äºŽè°ƒç”¨è¯¥å˜æ¢çš„ " "[code]inverse().xform(v)[/code]ã€‚ä»¿å°„å˜æ¢ï¼ˆå³åŒ…å«ç¼©æ”¾ï¼‰è¯·å‚阅 [method " "affine_inverse] 方法。" @@ -79265,7 +79569,7 @@ msgstr "" msgid "" "The translation offset of the transform (column 3, the fourth column). " "Equivalent to array index [code]3[/code]." -msgstr "å˜æ¢çš„平移åç§»é‡ï¼Œå³ç¬¬3ã€4列。相当于数组索引[code]3[/code]。" +msgstr "å˜æ¢çš„平移åç§»é‡ï¼Œå³ç¬¬ 3ã€4 列。相当于数组索引 [code]3[/code]。" #: doc/classes/Transform.xml msgid "" @@ -79306,7 +79610,7 @@ msgstr "" #: doc/classes/Transform2D.xml msgid "Constructs the transform from a 3D [Transform]." -msgstr "从一个 3D [Transform] æž„å»ºå˜æ¢ã€‚" +msgstr "从 3D [Transform] æž„å»ºå˜æ¢ã€‚" #: doc/classes/Transform2D.xml msgid "" @@ -79386,7 +79690,7 @@ msgid "" "scaling) see [method affine_inverse] method." msgstr "" "将给定的 [Vector2]ã€[Rect2]ã€[PoolVector2Array] åšè¯¥å˜æ¢çš„é€†å˜æ¢ï¼Œå‰æå‡è®¾æ˜¯" -"è¯¥å˜æ¢ä»…由旋转和平移构æˆï¼ˆä¸åŒ…括缩放)。ç‰ä»·äºŽè°ƒç”¨è¯¥å˜æ¢çš„ [code]inverse()." +"è¯¥å˜æ¢ä»…由旋转和平移构æˆï¼ˆä¸åŒ…æ‹¬ç¼©æ”¾ï¼‰ã€‚ç›¸å½“äºŽè°ƒç”¨è¯¥å˜æ¢çš„ [code]inverse()." "xform(v)[/code]ã€‚ä»¿å°„å˜æ¢ï¼ˆå³åŒ…å«ç¼©æ”¾ï¼‰è¯·å‚阅 [method affine_inverse] 方法。" #: doc/classes/Transform2D.xml @@ -79517,6 +79821,7 @@ msgid "Control to show a tree of items." msgstr "ä»¥æ ‘çŠ¶å½¢å¼æ˜¾ç¤ºé¡¹ç›®çš„æŽ§ä»¶ã€‚" #: doc/classes/Tree.xml +#, fuzzy msgid "" "This shows a tree of items that can be selected, expanded and collapsed. The " "tree can have multiple columns with custom controls like text editing, " @@ -79538,7 +79843,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" "这展示了一个å¯ä»¥é€‰æ‹©ã€å±•开和折å çš„é¡¹ç›®æ ‘ã€‚è¯¥æ ‘å¯ä»¥æœ‰å¤šåˆ—的自定义控件,如文本" "ç¼–è¾‘ã€æŒ‰é’®å’Œå¼¹å‡ºçª—å£ã€‚它对于结构化显示和互动很有用。\n" @@ -79584,9 +79900,9 @@ msgid "" "editable with [method TreeItem.set_editable]. Returns [code]true[/code] if " "the item could be edited. Fails if no item is selected." msgstr "" -"编辑选ä¸çš„æ ‘项,就åƒå®ƒè¢«ç‚¹å‡»ä¸€æ ·ã€‚该项必须通过[method TreeItem.set_editable]" -"设置为å¯ç¼–辑。其å¯è¢«ç¼–辑,则返回 [code]true[/code]。如果没有项被选ä¸ï¼Œåˆ™å¤±" -"败。" +"编辑选ä¸çš„æ ‘项,就åƒå®ƒè¢«ç‚¹å‡»ä¸€æ ·ã€‚该项必须通过 [method TreeItem." +"set_editable] 设置为å¯ç¼–辑。其å¯è¢«ç¼–辑,则返回 [code]true[/code]。如果没有项" +"被选ä¸ï¼Œåˆ™å¤±è´¥ã€‚" #: doc/classes/Tree.xml msgid "" @@ -79598,8 +79914,8 @@ msgid "" "only visible in [constant SELECT_MULTI] mode." msgstr "" "使当å‰èŽ·å¾—ç„¦ç‚¹çš„å•å…ƒå¯è§ã€‚\n" -"如果有必è¦ï¼Œå°†æ»šåŠ¨æ ‘ã€‚åœ¨[constant SELECT_ROW]模å¼ä¸‹ï¼Œä¸ä¼šåšæ°´å¹³æ»šåŠ¨ï¼Œå› ä¸ºæ‰€é€‰" -"行ä¸çš„æ‰€æœ‰å•元都按逻辑获得焦点。\n" +"如果有必è¦ï¼Œå°†æ»šåŠ¨æ ‘ã€‚åœ¨ [constant SELECT_ROW] 模å¼ä¸‹ï¼Œä¸ä¼šåšæ°´å¹³æ»šåŠ¨ï¼Œå› ä¸ºæ‰€" +"选行ä¸çš„æ‰€æœ‰å•元都按逻辑获得焦点。\n" "[b]注æ„:[/b]尽管这个方法的åç§°æ˜¯è¿™æ ·çš„ï¼Œä½†ç„¦ç‚¹å…‰æ ‡æœ¬èº«åªåœ¨ [constant " "SELECT_MULTI] 模å¼ä¸‹å¯è§ã€‚" @@ -79718,9 +80034,10 @@ msgid "" "To get the currently selected item(s), use [method get_next_selected]." msgstr "" "返回当å‰çš„焦点项,如果没有焦点项,则返回 [code]null[/code]。\n" -"在[constant SELECT_ROW]å’Œ[constant SELECT_SINGLE]模å¼ä¸‹ï¼Œç„¦ç‚¹é¡¹ä¸Žé€‰æ‹©é¡¹ç›¸åŒã€‚" -"在[constant SELECT_MULTI]模å¼ä¸‹ï¼Œç„¦ç‚¹é¡¹æ˜¯ç„¦ç‚¹å…‰æ ‡ä¸‹çš„项目,ä¸ä¸€å®šè¢«é€‰ä¸ã€‚\n" -"è¦è޷得当å‰é€‰ä¸é¡¹ï¼Œè¯·ä½¿ç”¨[method get_next_selected]。" +"在 [constant SELECT_ROW] å’Œ [constant SELECT_SINGLE] 模å¼ä¸‹ï¼Œç„¦ç‚¹é¡¹ä¸Žé€‰æ‹©é¡¹ç›¸" +"åŒã€‚在 [constant SELECT_MULTI] 模å¼ä¸‹ï¼Œç„¦ç‚¹é¡¹æ˜¯ç„¦ç‚¹å…‰æ ‡ä¸‹çš„项目,ä¸ä¸€å®šè¢«é€‰" +"ä¸ã€‚\n" +"è¦è޷得当å‰é€‰ä¸é¡¹ï¼Œè¯·ä½¿ç”¨ [method get_next_selected]。" #: doc/classes/Tree.xml msgid "" @@ -79732,11 +80049,11 @@ msgid "" "To tell whether a column of an item is selected, use [method TreeItem." "is_selected]." msgstr "" -"返回当å‰èŽ·å¾—ç„¦ç‚¹çš„åˆ—ï¼Œå¦‚æžœæ²¡æœ‰ç„¦ç‚¹åˆ—ï¼Œåˆ™è¿”å›ž-1。\n" -"在[constant SELECT_SINGLE]模å¼ä¸‹ï¼Œç„¦ç‚¹åˆ—是被选ä¸çš„列。在[constant SELECT_ROW]" -"模å¼ä¸‹ï¼Œå¦‚果有任æ„项被选ä¸ï¼Œç„¦ç‚¹åˆ—总是0。在[constant SELECT_MULTI]模å¼ä¸‹ï¼Œç„¦" -"ç‚¹åˆ—æ˜¯ç„¦ç‚¹å…‰æ ‡ä¸‹çš„åˆ—ï¼Œä½†ä¸ä¸€å®šæœ‰åˆ—被选ä¸ã€‚\n" -"è¦åˆ¤æ–一个项的æŸä¸€åˆ—是å¦è¢«é€‰ä¸ï¼Œè¯·ä½¿ç”¨[method TreeItem.is_selected]。" +"返回当å‰èŽ·å¾—ç„¦ç‚¹çš„åˆ—ï¼Œå¦‚æžœæ²¡æœ‰ç„¦ç‚¹åˆ—ï¼Œåˆ™è¿”å›ž -1。\n" +"在[constant SELECT_SINGLE] 模å¼ä¸‹ï¼Œç„¦ç‚¹åˆ—是被选ä¸çš„列。在 [constant " +"SELECT_ROW] 模å¼ä¸‹ï¼Œå¦‚果有任æ„项被选ä¸ï¼Œç„¦ç‚¹åˆ—总是 0。在 [constant " +"SELECT_MULTI] 模å¼ä¸‹ï¼Œç„¦ç‚¹åˆ—æ˜¯ç„¦ç‚¹å…‰æ ‡ä¸‹çš„åˆ—ï¼Œä½†ä¸ä¸€å®šæœ‰åˆ—被选ä¸ã€‚\n" +"è¦åˆ¤æ–一个项的æŸä¸€åˆ—是å¦è¢«é€‰ä¸ï¼Œè¯·ä½¿ç”¨ [method TreeItem.is_selected]。" #: doc/classes/Tree.xml msgid "Causes the [Tree] to jump to the specified [TreeItem]." @@ -79748,8 +80065,8 @@ msgid "" "Columns that have the \"Expand\" flag will use their \"min_width\" in a " "similar fashion to [member Control.size_flags_stretch_ratio]." msgstr "" -"如果 [code]true[/code],该列将拥有 [Control] 的“Expandâ€æ ‡å¿—。拥有“Expandâ€æ ‡å¿—" -"的列,将以类似于 [member Control.size_flags_stretch_ratio] 的方å¼ä½¿ç”¨" +"如果为 [code]true[/code],该列将拥有 [Control] 的“Expandâ€æ ‡å¿—。拥有“Expandâ€æ ‡" +"志的列,将以类似于 [member Control.size_flags_stretch_ratio] 的方å¼ä½¿ç”¨" "其“min_widthâ€æœ€å°å®½åº¦ã€‚" #: doc/classes/Tree.xml @@ -79768,15 +80085,15 @@ msgstr "è®¾ç½®ä¸€ä¸ªåˆ—çš„æ ‡é¢˜ã€‚" #: doc/classes/Tree.xml msgid "" "If [code]true[/code], the currently selected cell may be selected again." -msgstr "如果[code]true[/code],å¯ä»¥å†æ¬¡é€‰æ‹©å½“å‰é€‰å®šçš„å•元。" +msgstr "如果为 [code]true[/code],å¯ä»¥å†æ¬¡é€‰æ‹©å½“å‰é€‰å®šçš„å•元。" #: doc/classes/Tree.xml msgid "If [code]true[/code], a right mouse button click can select items." -msgstr "如果[code]true[/code]ï¼Œé¼ æ ‡å³é”®ç‚¹å‡»å¯ä»¥é€‰æ‹©é¡¹ç›®ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œé¼ æ ‡å³é”®ç‚¹å‡»å¯ä»¥é€‰æ‹©é¡¹ç›®ã€‚" #: doc/classes/Tree.xml msgid "If [code]true[/code], column titles are visible." -msgstr "如果[code]true[/code]ï¼Œåˆ—æ ‡é¢˜å¯è§ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œåˆ—æ ‡é¢˜å¯è§ã€‚" #: doc/classes/Tree.xml msgid "The number of columns." @@ -79790,29 +80107,29 @@ msgid "" "This controls the drop sections, i.e. the decision and drawing of possible " "drop locations based on the mouse position." msgstr "" -"ä½œä¸ºä¸€ä¸ªæ ‡å¿—çš„OR组åˆçš„æ”¾ç½®æ¨¡å¼ã€‚å‚阅[enum DropModeFlags]常é‡ã€‚一旦拖动完æˆï¼Œ" -"å°†æ¢å¤åˆ°[constant DROP_MODE_DISABLED]。建议在[method Control.can_drop_data]ä¸" -"设置这个。\n" +"ä½œä¸ºä¸€ä¸ªæ ‡å¿—çš„ OR 组åˆçš„æ”¾ç½®æ¨¡å¼ã€‚è§ [enum DropModeFlags] 常é‡ã€‚一旦拖动完" +"æˆï¼Œå°†æ¢å¤åˆ° [constant DROP_MODE_DISABLED]。建议在 [method Control." +"can_drop_data] ä¸è®¾ç½®è¿™ä¸ªã€‚\n" "æŽ§ä»¶æ”¾ç½®éƒ¨åˆ†ï¼Œå³æ ¹æ®é¼ æ ‡ä½ç½®å†³å®šå’Œç»˜åˆ¶å¯èƒ½çš„æ”¾ç½®ä½ç½®ã€‚" #: doc/classes/Tree.xml msgid "If [code]true[/code], the folding arrow is hidden." -msgstr "如果[code]true[/code],éšè—折å ç®å¤´ã€‚" +msgstr "如果为 [code]true[/code],éšè—折å ç®å¤´ã€‚" #: doc/classes/Tree.xml msgid "If [code]true[/code], the tree's root is hidden." -msgstr "如果[code]true[/code],则éšè—æ ‘çš„æ ¹èŠ‚ç‚¹ã€‚" +msgstr "如果为 [code]true[/code],则éšè—æ ‘çš„æ ¹èŠ‚ç‚¹ã€‚" #: doc/classes/Tree.xml msgid "" "Allows single or multiple selection. See the [enum SelectMode] constants." -msgstr "å…许å•选或多选。å‚阅[enum SelectMode]常é‡ã€‚" +msgstr "å…许å•é€‰æˆ–å¤šé€‰ã€‚è§ [enum SelectMode] 常é‡ã€‚" #: doc/classes/Tree.xml msgid "" "Emitted when a button on the tree was pressed (see [method TreeItem." "add_button])." -msgstr "å½“æ ‘ä¸æŒ‰é’®è¢«æŒ‰ä¸‹æ—¶è§¦å‘,å‚阅[method TreeItem.add_button]。" +msgstr "å½“æ ‘ä¸æŒ‰é’®è¢«æŒ‰ä¸‹æ—¶è§¦å‘ï¼ˆè§ [method TreeItem.add_button])。" #: doc/classes/Tree.xml msgid "Emitted when a cell is selected." @@ -79827,7 +80144,7 @@ msgid "" "Emitted when a cell with the [constant TreeItem.CELL_MODE_CUSTOM] is clicked " "to be edited." msgstr "" -"当具有[constant TreeItem.CELL_MODE_CUSTOM]çš„å•å…ƒæ ¼è¢«ç‚¹å‡»ï¼Œè¿›è¡Œç¼–è¾‘æ—¶è§¦å‘。" +"当具有 [constant TreeItem.CELL_MODE_CUSTOM] çš„å•å…ƒæ ¼è¢«ç‚¹å‡»ï¼Œè¿›è¡Œç¼–è¾‘æ—¶è§¦å‘。" #: doc/classes/Tree.xml msgid "" @@ -79854,8 +80171,8 @@ msgid "" "Emitted when a custom button is pressed (i.e. in a [constant TreeItem." "CELL_MODE_CUSTOM] mode cell)." msgstr "" -"当自定义按钮被按下时触å‘,å³åœ¨[constant TreeItem.CELL_MODE_CUSTOM]模å¼å•å…ƒæ ¼" -"ä¸ã€‚" +"当自定义按钮被按下时触å‘(å³åœ¨ [constant TreeItem.CELL_MODE_CUSTOM] 模å¼å•å…ƒ" +"æ ¼ä¸ï¼‰ã€‚" #: doc/classes/Tree.xml msgid "Emitted when an item's icon is double-clicked." @@ -79882,7 +80199,7 @@ msgid "" "Emitted instead of [code]item_selected[/code] if [code]select_mode[/code] is " "[constant SELECT_MULTI]." msgstr "" -"如果[code]select_mode[/code]是[constant SELECT_MULTI],则触å‘代替" +"如果 [code]select_mode[/code] 是 [constant SELECT_MULTI],则触å‘代替 " "[code]item_selected[/code]。" #: doc/classes/Tree.xml @@ -79936,8 +80253,8 @@ msgid "" "[b]Note:[/b] This is the default flag, it has no effect when combined with " "other flags." msgstr "" -"ç¦ç”¨æ‰€æœ‰æ”¾ç½®éƒ¨åˆ†ï¼Œä½†ä»ç„¶å…许通过[method get_drop_section_at_position]检测 " -"\"物å“上\" 的放置部分。\n" +"ç¦ç”¨æ‰€æœ‰æ”¾ç½®éƒ¨åˆ†ï¼Œä½†ä»ç„¶å…许通过 [method get_drop_section_at_position] 检" +"测“物å“上â€çš„æ”¾ç½®éƒ¨åˆ†ã€‚\n" "[b]注æ„:[/b]è¿™æ˜¯é»˜è®¤çš„æ ‡å¿—ï¼Œå½“ä¸Žå…¶ä»–æ ‡å¿—ç»“åˆæ—¶ï¼Œå®ƒæ²¡æœ‰æ•ˆæžœã€‚" #: doc/classes/Tree.xml @@ -79947,9 +80264,9 @@ msgid "" "When combined with [constant DROP_MODE_INBETWEEN], this drop section halves " "the height and stays centered vertically." msgstr "" -"å¯ç”¨ \"项目上\" 的放置部分。这个放置部分覆盖整个项。\n" -"当与[constant DROP_MODE_INBETWEEN]结åˆä½¿ç”¨æ—¶ï¼Œè¿™ä¸ªæ”¾ç½®éƒ¨åˆ†çš„高度å‡åŠï¼Œå¹¶ä¿æŒ" -"垂直居ä¸ã€‚" +"å¯ç”¨â€œé¡¹ç›®ä¸Šâ€çš„æ”¾ç½®éƒ¨åˆ†ã€‚这个放置部分覆盖整个项。\n" +"当与 [constant DROP_MODE_INBETWEEN] 结åˆä½¿ç”¨æ—¶ï¼Œè¿™ä¸ªæ”¾ç½®éƒ¨åˆ†çš„高度å‡åŠï¼Œå¹¶ä¿" +"æŒåž‚ç›´å±…ä¸ã€‚" #: doc/classes/Tree.xml msgid "" @@ -79959,41 +80276,42 @@ msgid "" "When combined with [constant DROP_MODE_ON_ITEM], these drop sections halves " "the height and stays on top / bottom accordingly." msgstr "" -"å¯ç”¨ \"项目上方\" å’Œ \"项目下方\" 的放置部分。\"项目上方\" 的放置部分覆盖项目" -"的上åŠéƒ¨åˆ†ï¼Œ\"项目下方\" 的放置部分覆盖下åŠéƒ¨åˆ†ã€‚\n" -"当与[constant DROP_MODE_ON_ITEM]ç»“åˆæ—¶ï¼Œè¿™äº›æ”¾ç½®éƒ¨åˆ†çš„高度å‡åŠï¼Œå¹¶ç›¸åº”地åœç•™" -"在顶部或底部。" +"å¯ç”¨â€œé¡¹ç›®ä¸Šæ–¹â€å’Œâ€œé¡¹ç›®ä¸‹æ–¹â€çš„æ”¾ç½®éƒ¨åˆ†ã€‚“项目上方â€çš„æ”¾ç½®éƒ¨åˆ†è¦†ç›–项目的上åŠéƒ¨" +"分,“项目下方â€çš„æ”¾ç½®éƒ¨åˆ†è¦†ç›–下åŠéƒ¨åˆ†ã€‚\n" +"当与 [constant DROP_MODE_ON_ITEM] ç»“åˆæ—¶ï¼Œè¿™äº›æ”¾ç½®éƒ¨åˆ†çš„高度å‡åŠï¼Œå¹¶ç›¸åº”地åœ" +"留在顶部或底部。" #: doc/classes/Tree.xml msgid "" "Text [Color] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " "hovered." msgstr "" -"当[constant TreeItem.CELL_MODE_CUSTOM]模å¼çš„å•å…ƒæ ¼è¢«æ‚¬åœæ—¶çš„æ–‡æœ¬[Color]颜色。" +"当 [constant TreeItem.CELL_MODE_CUSTOM] 模å¼çš„å•å…ƒæ ¼è¢«æ‚¬åœæ—¶çš„æ–‡æœ¬ [Color] 颜" +"色。" #: doc/classes/Tree.xml msgid "" "[Color] used to draw possible drop locations. See [enum DropModeFlags] " "constants for further description of drop locations." msgstr "" -"用于绘制å¯èƒ½çš„æ”¾ç½®ä½ç½®çš„[Color]颜色。有关放置ä½ç½®çš„æè¿°ï¼Œå‚阅[enum " -"DropModeFlags]常é‡ã€‚" +"用于绘制å¯èƒ½çš„æ”¾ç½®ä½ç½®çš„ [Color] 颜色。有关放置ä½ç½®çš„æè¿°ï¼Œå‚阅 [enum " +"DropModeFlags] 常é‡ã€‚" #: doc/classes/Tree.xml msgid "[Color] of the guideline." -msgstr "å‚考线的[Color]颜色。" +msgstr "å‚考线的 [Color] 颜色。" #: doc/classes/Tree.xml msgid "[Color] of the relationship lines." -msgstr "关系线的[Color]颜色。" +msgstr "关系线的 [Color] 颜色。" #: doc/classes/Tree.xml msgid "Default text [Color] of the title button." -msgstr "æ ‡é¢˜æŒ‰é’®çš„é»˜è®¤æ–‡æœ¬[Color]颜色。" +msgstr "æ ‡é¢˜æŒ‰é’®çš„é»˜è®¤æ–‡æœ¬ [Color] 颜色。" #: doc/classes/Tree.xml msgid "The horizontal space between each button in a cell." -msgstr "一个å•å…ƒä¸æ¯ä¸ªæŒ‰é’®ä¹‹é—´çš„æ°´å¹³ç©ºé—´ã€‚" +msgstr "å•å…ƒæ ¼ä¸æŒ‰é’®ä¹‹é—´çš„æ°´å¹³é—´è·ã€‚" #: doc/classes/Tree.xml msgid "" @@ -80102,8 +80420,7 @@ msgstr "当 [Tree] 未获èšç„¦æ—¶ï¼Œç”¨äºŽå…‰æ ‡çš„ [StyleBox]。" #: doc/classes/Tree.xml msgid "" "Default [StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell." -msgstr "" -"为 [constant TreeItem.CELL_MODE_CUSTOM] 模å¼çš„å•å…ƒæ ¼é»˜è®¤çš„ [StyleBox]。" +msgstr "[constant TreeItem.CELL_MODE_CUSTOM] 模å¼çš„å•å…ƒæ ¼é»˜è®¤çš„ [StyleBox]。" #: doc/classes/Tree.xml msgid "" @@ -80122,7 +80439,7 @@ msgstr "" #: doc/classes/Tree.xml msgid "" "[StyleBox] for the selected items, used when the [Tree] is not being focused." -msgstr "所选项目的 [StyleBox],当 [Tree] 没有获得焦点时使用。" +msgstr "所选项目的 [StyleBox],在 [Tree] 没有获得焦点时使用。" #: doc/classes/Tree.xml msgid "" @@ -80151,7 +80468,7 @@ msgid "" "styled as well as contain buttons.\n" "You can remove a [TreeItem] by using [method Object.free]." msgstr "" -"控件 [Tree] ä¸çš„å•个项目。å¯ä»¥æœ‰å级 [TreeItem], æ ·å¼ï¼Œ 以åŠåŒ…嫿Œ‰é’®ã€‚\n" +"控件 [Tree] ä¸çš„å•个项目。å¯ä»¥æœ‰å级 [TreeItem]ã€æ ·å¼ã€åŒ…嫿Œ‰é’®ã€‚\n" "您å¯ä»¥ä½¿ç”¨ [method Object.free] åˆ é™¤ [TreeItem]。" #: doc/classes/TreeItem.xml @@ -80162,7 +80479,7 @@ msgid "" "get_button_count] immediately before this method. Optionally, the button can " "be [code]disabled[/code] and have a [code]tooltip[/code]." msgstr "" -"在 [code]column[/code] åˆ—æ·»åŠ ä¸€ä¸ªå¸¦æœ‰ [Texture] [code]button[/code] 的按钮。 " +"在 [code]column[/code] åˆ—æ·»åŠ ä¸€ä¸ªå¸¦æœ‰ [Texture] [code]button[/code] 的按钮。" "[code]id[/code] ç”¨äºŽæ ‡è¯†æŒ‰é’®ã€‚å¦‚æžœæœªæŒ‡å®šï¼Œåˆ™ä½¿ç”¨ä¸‹ä¸€ä¸ªå¯ç”¨ç´¢å¼•,å¯ä»¥åœ¨æ¤æ–¹æ³•" "之å‰è°ƒç”¨ [method get_button_count] æ¥èŽ·å–该索引。å¦å¤–,该按钮还å¯ä»¥é€šè¿‡ " "[code]disabled[/code] ç¦ç”¨ã€é€šè¿‡ [code]tooltip[/code] 设置工具æç¤ºã€‚" @@ -80172,8 +80489,8 @@ msgid "" "Calls the [code]method[/code] on the actual TreeItem and its children " "recursively. Pass parameters as a comma separated list." msgstr "" -"在实际的TreeItemæ ‘é¡¹åŠå…¶å项上递归地调用[code]method[/code]。以逗å·åˆ†éš”的列表" -"å½¢å¼ä¼ 递傿•°ã€‚" +"在实际的 TreeItem æ ‘é¡¹åŠå…¶å项上递归地调用 [code]method[/code]。以逗å·åˆ†éš”çš„" +"列表形å¼ä¼ 递傿•°ã€‚" #: doc/classes/TreeItem.xml msgid "Resets the background color for the given column to default." @@ -80191,7 +80508,7 @@ msgstr "å–æ¶ˆé€‰æ‹©æŒ‡å®šåˆ—。" msgid "" "Removes the button at index [code]button_idx[/code] in column [code]column[/" "code]." -msgstr "åˆ é™¤åˆ—[code]column[/code]ä¸ç´¢å¼•[code]button_idx[/code]处的按钮。" +msgstr "åˆ é™¤åˆ— [code]column[/code] ä¸ç´¢å¼• [code]button_idx[/code] 处的按钮。" #: doc/classes/TreeItem.xml msgid "" @@ -80239,15 +80556,15 @@ msgstr "返回 TreeItem æ ‘é¡¹çš„ç¬¬ä¸€ä¸ªåé¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žä¸€ä¸ #: doc/classes/TreeItem.xml msgid "Returns the custom background color of column [code]column[/code]." -msgstr "返回列[code]column[/code]的自定义背景颜色。" +msgstr "返回列 [code]column[/code] 的自定义背景颜色。" #: doc/classes/TreeItem.xml msgid "Returns the custom color of column [code]column[/code]." -msgstr "返回列[code]column[/code]的自定义颜色。" +msgstr "返回列 [code]column[/code] 的自定义颜色。" #: doc/classes/TreeItem.xml msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." -msgstr "如果设置了[code]expand_right[/code],返回 [code]true[/code]。" +msgstr "如果设置了 [code]expand_right[/code],则返回 [code]true[/code]。" #: doc/classes/TreeItem.xml msgid "Returns the given column's icon [Texture]. Error if no icon is set." @@ -80259,7 +80576,7 @@ msgstr "è¿”å›žåˆ—çš„å›¾æ ‡çš„æœ€å¤§å®½åº¦ã€‚" #: doc/classes/TreeItem.xml msgid "Returns the [Color] modulating the column's icon." -msgstr "è¿”å›žè°ƒåˆ¶åˆ—çš„å›¾æ ‡çš„[Color]颜色。" +msgstr "è¿”å›žè°ƒåˆ¶åˆ—çš„å›¾æ ‡çš„ [Color] 颜色。" #: doc/classes/TreeItem.xml msgid "Returns the icon [Texture] region as [Rect2]." @@ -80274,7 +80591,7 @@ msgstr "返回使用 [method set_metadata] 为指定列设置的元数æ®ã€‚" #: doc/classes/TreeItem.xml msgid "" "Returns the next TreeItem in the tree or a null object if there is none." -msgstr "è¿”å›žæ ‘ä¸çš„下一个TreeItemæ ‘é¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žä¸€ä¸ªç©ºå¯¹è±¡ã€‚" +msgstr "è¿”å›žæ ‘ä¸çš„下一个 TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml msgid "" @@ -80284,18 +80601,18 @@ msgid "" "visible element in the tree when called on the last visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"è¿”å›žæ ‘ä¸ä¸‹ä¸€ä¸ªå¯è§çš„TreeItemæ ‘é¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žç©ºå¯¹è±¡ã€‚\n" -"如果[code]wrap[/code]被å¯ç”¨ï¼Œå½“在最åŽä¸€ä¸ªå¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘ä¸" -"的第一个å¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" +"è¿”å›žæ ‘ä¸ä¸‹ä¸€ä¸ªå¯è§çš„ TreeItem,如果没有,则返回空对象。\n" +"如果 [code]wrap[/code] 被å¯ç”¨ï¼Œå½“在最åŽä¸€ä¸ªå¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘" +"ä¸çš„第一个å¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" #: doc/classes/TreeItem.xml msgid "Returns the parent TreeItem or a null object if there is none." -msgstr "返回父级TreeItemæ ‘é¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žä¸€ä¸ªç©ºå¯¹è±¡ã€‚" +msgstr "返回父级 TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml msgid "" "Returns the previous TreeItem in the tree or a null object if there is none." -msgstr "è¿”å›žæ ‘ä¸çš„å‰ä¸€ä¸ªTreeItemæ ‘é¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žä¸€ä¸ªç©ºå¯¹è±¡ã€‚" +msgstr "è¿”å›žæ ‘ä¸çš„å‰ä¸€ä¸ª TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml msgid "" @@ -80305,9 +80622,9 @@ msgid "" "visible element in the tree when called on the first visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"è¿”å›žæ ‘ä¸å‰ä¸€ä¸ªå¯è§çš„TreeItemæ ‘é¡¹ï¼Œå¦‚æžœæ²¡æœ‰ï¼Œåˆ™è¿”å›žnull对象。\n" -"如果[code]wrap[/code]被å¯ç”¨ï¼Œå½“在第一个å¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘ä¸æœ€" -"åŽä¸€ä¸ªå¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" +"è¿”å›žæ ‘ä¸å‰ä¸€ä¸ªå¯è§çš„ TreeItem,如果没有,则返回 null 对象。\n" +"如果 [code]wrap[/code] 被å¯ç”¨ï¼Œå½“在第一个å¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘ä¸" +"最åŽä¸€ä¸ªå¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" #: doc/classes/TreeItem.xml msgid "Returns the value of a [constant CELL_MODE_RANGE] column." @@ -80317,8 +80634,7 @@ msgstr "返回 [constant CELL_MODE_RANGE] 列的值。" msgid "" "Returns a dictionary containing the range parameters for a given column. The " "keys are \"min\", \"max\", \"step\", and \"expr\"." -msgstr "" -"返回包å«ç»™å®šåˆ—çš„èŒƒå›´å‚æ•°çš„å—典。键是 \"min\"ã€\"max\"ã€\"step \"å’Œ \"expr\"。" +msgstr "返回包å«ç»™å®šåˆ—çš„èŒƒå›´å‚æ•°çš„å—典。键是“minâ€ã€â€œmaxâ€ã€â€œstepâ€å’Œâ€œexprâ€ã€‚" #: doc/classes/TreeItem.xml msgid "Gets the suffix string shown after the column value." @@ -80341,7 +80657,7 @@ msgid "" "Returns [code]true[/code] if the button at index [code]button_idx[/code] for " "the given column is disabled." msgstr "" -"如果给定列的索引[code]button_idx[/code]处的按钮被ç¦ç”¨ï¼Œè¿”回 [code]true[/" +"如果给定列的索引 [code]button_idx[/code] 处的按钮被ç¦ç”¨ï¼Œè¿”回 [code]true[/" "code]。" #: doc/classes/TreeItem.xml @@ -80350,23 +80666,23 @@ msgstr "如果给定的列被选ä¸ï¼Œè¿”回 [code]true[/code]。" #: doc/classes/TreeItem.xml msgid "Returns [code]true[/code] if column [code]column[/code] is editable." -msgstr "如果列[code]column[/code]是å¯ç¼–辑的,则返回 [code]true[/code]。" +msgstr "如果列 [code]column[/code] 是å¯ç¼–辑的,则返回 [code]true[/code]。" #: doc/classes/TreeItem.xml msgid "Returns [code]true[/code] if column [code]column[/code] is selectable." -msgstr "如果列[code]column[/code]是å¯é€‰æ‹©çš„,则返回 [code]true[/code]。" +msgstr "如果列 [code]column[/code] 是å¯é€‰æ‹©çš„,则返回 [code]true[/code]。" #: doc/classes/TreeItem.xml msgid "Returns [code]true[/code] if column [code]column[/code] is selected." -msgstr "如果列[code]column[/code]被选ä¸ï¼Œè¿”回 [code]true[/code]。" +msgstr "如果列 [code]column[/code] 被选ä¸ï¼Œè¿”回 [code]true[/code]。" #: doc/classes/TreeItem.xml msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy." -msgstr "å°†æ¤TreeItemæ ‘é¡¹ç§»åŠ¨åˆ°[Tree]层次结构的底部。" +msgstr "将这个 TreeItem 移动到 [Tree] 层次结构的底部。" #: doc/classes/TreeItem.xml msgid "Moves this TreeItem to the top in the [Tree] hierarchy." -msgstr "å°†æ¤TreeItemæ ‘é¡¹ç§»åŠ¨åˆ°[Tree]æ ‘å±‚æ¬¡ç»“æž„çš„é¡¶éƒ¨ã€‚" +msgstr "将这个 TreeItem 移动到 [Tree] 层次结构的顶部。" #: doc/classes/TreeItem.xml msgid "" @@ -80374,27 +80690,28 @@ msgid "" "Note that it doesn't free the item from memory, so it can be reused later. " "To completely remove a [TreeItem] use [method Object.free]." msgstr "" -"将给定的å项[TreeItem]和它的所有å项从[Tree]ä¸ç§»é™¤ã€‚注æ„,它并未从内å˜ä¸é‡Šæ”¾" -"该项,所以之åŽå¯é‡æ–°ä½¿ç”¨ã€‚è¦å®Œå…¨åˆ 除一个[TreeItem],请使用[method Object." -"free]。" +"将给定的å项 [TreeItem] 和它的所有å项从 [Tree] ä¸ç§»é™¤ã€‚注æ„,它并未从内å˜ä¸" +"释放该项,所以之åŽå¯é‡æ–°ä½¿ç”¨ã€‚è¦å®Œå…¨åˆ 除一个 [TreeItem],请使用 [method " +"Object.free]。" #: doc/classes/TreeItem.xml msgid "Selects the column [code]column[/code]." -msgstr "选择列[code]column[/code]。" +msgstr "选择列 [code]column[/code]。" #: doc/classes/TreeItem.xml msgid "" "Sets the given column's button [Texture] at index [code]button_idx[/code] to " "[code]button[/code]." msgstr "" -"设置索引[code]button_idx[/code]的给定列的按钮[code]button[/code]çš„[Texture]。" +"设置索引 [code]button_idx[/code] 的给定列的按钮 [code]button[/code] çš„ " +"[Texture]。" #: doc/classes/TreeItem.xml msgid "" "If [code]true[/code], disables the button at index [code]button_idx[/code] " "in column [code]column[/code]." msgstr "" -"如果[code]true[/code],则ç¦ç”¨åˆ—[code]column[/code]ä¸ç´¢å¼•[code]button_idx[/" +"如果为 [code]true[/code],则ç¦ç”¨åˆ—[code]column[/code]ä¸ç´¢å¼•[code]button_idx[/" "code]的按钮。" #: doc/classes/TreeItem.xml @@ -80402,11 +80719,11 @@ msgid "" "Sets the given column's cell mode to [code]mode[/code]. See [enum " "TreeCellMode] constants." msgstr "" -"设置给定列的å•å…ƒæ ¼æ¨¡å¼ä¸º[code]mode[/code]。å‚阅[enum TreeCellMode]常é‡ã€‚" +"设置给定列的å•å…ƒæ ¼æ¨¡å¼ä¸º [code]mode[/code]ã€‚è§ [enum TreeCellMode] 常é‡ã€‚" #: doc/classes/TreeItem.xml msgid "If [code]true[/code], the column [code]column[/code] is checked." -msgstr "如果[code]true[/code],则选ä¸[code]column[/code]。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™é€‰ä¸ [code]column[/code]。" #: doc/classes/TreeItem.xml msgid "" @@ -80425,10 +80742,10 @@ msgid "" "The [code]callback[/code] should accept two arguments: the [TreeItem] that " "is drawn and its position and size as a [Rect2]." msgstr "" -"设置给定列的自定义绘制回调到[code]object[/code]上的[code]callback[/code]回调" -"方法。\n" -"[code]callback[/code]应该接å—ä¸¤ä¸ªå‚æ•°ï¼šè¢«ç»˜åˆ¶çš„[TreeItem]æ ‘é¡¹ä»¥åŠå®ƒçš„ä½ç½®å’Œå¤§" -"å°æ˜¯ä¸€ä¸ª[Rect2]。" +"设置给定列的自定义绘制回调到 [code]object[/code] 上的 [code]callback[/code] " +"回调方法。\n" +"[code]callback[/code] 应该接å—ä¸¤ä¸ªå‚æ•°ï¼šè¢«ç»˜åˆ¶çš„ [TreeItem] 以åŠå®ƒçš„ä½ç½®å’Œå¤§" +"å°æ˜¯ä¸€ä¸ª [Rect2]。" #: doc/classes/TreeItem.xml msgid "If [code]true[/code], column [code]column[/code] is editable." @@ -80449,7 +80766,7 @@ msgstr "è®¾ç½®ç»™å®šåˆ—å›¾æ ‡çš„æœ€å¤§å®½åº¦ã€‚" #: doc/classes/TreeItem.xml msgid "Modulates the given column's icon with [code]modulate[/code]." -msgstr "用[code]modulate[/code]è°ƒåˆ¶ç»™å®šåˆ—çš„å›¾æ ‡ã€‚" +msgstr "用 [code]modulate[/code] è°ƒåˆ¶ç»™å®šåˆ—çš„å›¾æ ‡ã€‚" #: doc/classes/TreeItem.xml msgid "Sets the given column's icon's texture region." @@ -80476,18 +80793,18 @@ msgid "" "exponential scale as with [member Range.exp_edit]." msgstr "" "è®¾ç½®åˆ—çš„å¯æŽ¥å—值的范围。该列必须处于 [constant CELL_MODE_RANGE] 模å¼ã€‚\n" -"如果 [code]expr[/code] 是 [code]true[/code]ï¼Œç¼–è¾‘æ¨¡å¼æ»‘å—将使用指数刻度,与 " +"如果 [code]expr[/code] 为 [code]true[/code]ï¼Œç¼–è¾‘æ¨¡å¼æ»‘å—将使用指数刻度,与 " "[member Range.exp_edit] ä¸€æ ·ã€‚" #: doc/classes/TreeItem.xml msgid "If [code]true[/code], the given column is selectable." -msgstr "如果[code]true[/code],给定的列是å¯é€‰æ‹©çš„。" +msgstr "如果为 [code]true[/code],给定的列是å¯é€‰ä¸çš„。" #: doc/classes/TreeItem.xml msgid "" "Sets a string to be shown after a column's value (for example, a unit " "abbreviation)." -msgstr "设置å—符串,显示在列的值之åŽï¼Œä¾‹å¦‚,å•ä½çš„缩写。" +msgstr "设置å—符串,显示在列的值之åŽï¼ˆä¾‹å¦‚,å•ä½çš„缩写)。" #: doc/classes/TreeItem.xml msgid "Sets the given column's text value." @@ -80497,7 +80814,7 @@ msgstr "设置给定列的文本值。" msgid "" "Sets the given column's text alignment. See [enum TextAlign] for possible " "values." -msgstr "è®¾ç½®ç»™å®šåˆ—çš„æ–‡æœ¬å¯¹é½æ–¹å¼ã€‚å¯èƒ½çš„值,å‚阅[enum TextAlign]。" +msgstr "è®¾ç½®ç»™å®šåˆ—çš„æ–‡æœ¬å¯¹é½æ–¹å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum TextAlign]。" #: doc/classes/TreeItem.xml msgid "Sets the given column's tooltip text." @@ -80505,7 +80822,7 @@ msgstr "设置给定列的工具æç¤ºæ–‡æœ¬ã€‚" #: doc/classes/TreeItem.xml msgid "If [code]true[/code], the TreeItem is collapsed." -msgstr "如果[code]true[/code],TreeItemæ ‘é¡¹è¢«æŠ˜å 。" +msgstr "如果为 [code]true[/code],则该 TreeItem 被折å 。" #: doc/classes/TreeItem.xml msgid "The custom minimum height." @@ -80513,7 +80830,7 @@ msgstr "自定义最å°é«˜åº¦ã€‚" #: doc/classes/TreeItem.xml msgid "If [code]true[/code], folding is disabled for this TreeItem." -msgstr "如果[code]true[/code],则TreeItemæ ‘é¡¹ç¦ç”¨æŠ˜å 。" +msgstr "如果为 [code]true[/code],则这个 TreeItem ç¦ç”¨æŠ˜å 。" #: doc/classes/TreeItem.xml msgid "Cell contains a string." @@ -80533,15 +80850,15 @@ msgstr "å•元包å«å›¾æ ‡ã€‚" #: doc/classes/TreeItem.xml msgid "Align text to the left. See [code]set_text_align()[/code]." -msgstr "将文本å‘左对é½ã€‚å‚阅[code]set_text_align()[/code]。" +msgstr "将文本å‘左对é½ã€‚è§ [code]set_text_align()[/code]。" #: doc/classes/TreeItem.xml msgid "Center text. See [code]set_text_align()[/code]." -msgstr "将文本居ä¸ã€‚å‚阅[code]set_text_align()[/code]。" +msgstr "将文本居ä¸ã€‚è§ [code]set_text_align()[/code]。" #: doc/classes/TreeItem.xml msgid "Align text to the right. See [code]set_text_align()[/code]." -msgstr "将文本å‘å³å¯¹é½ã€‚å‚阅[code]set_text_align()[/code]。" +msgstr "将文本å‘å³å¯¹é½ã€‚è§ [code]set_text_align()[/code]。" #: doc/classes/TriangleMesh.xml msgid "Internal mesh type." @@ -80851,7 +81168,7 @@ msgstr "è¿”å›žè¡¥é—´çš„å½“å‰æ—¶é—´ã€‚" #: doc/classes/Tween.xml msgid "The tween's animation process thread. See [enum TweenProcessMode]." -msgstr "补间动画处ç†çº¿ç¨‹ã€‚å‚阅[enum TweenProcessMode]。" +msgstr "补间动画处ç†çº¿ç¨‹ã€‚è§ [enum TweenProcessMode]。" #: doc/classes/Tween.xml msgid "" @@ -80866,7 +81183,7 @@ msgstr "" #: doc/classes/Tween.xml msgid "If [code]true[/code], the tween loops." -msgstr "如果[code]true[/code],补间循环。" +msgstr "如果为 [code]true[/code],则补间循环。" #: doc/classes/Tween.xml msgid "Emitted when all processes in a tween end." @@ -80890,7 +81207,7 @@ msgstr "补间通过 [code]_physics_process[/code] 回调进行更新。" #: doc/classes/Tween.xml msgid "The tween updates with the [code]_process[/code] callback." -msgstr "补间通过[code]_process[/code]回调进行更新。" +msgstr "补间通过 [code]_process[/code] 回调进行更新。" #: doc/classes/Tween.xml msgid "The animation is interpolated linearly." @@ -80903,23 +81220,23 @@ msgstr "动画使用æ£å¼¦å‡½æ•°è¿›è¡Œæ’值。" #: doc/classes/Tween.xml msgid "" "The animation is interpolated with a quintic (to the power of 5) function." -msgstr "动画是用五次方,å³5的幂函数进行æ’值的。" +msgstr "åŠ¨ç”»æ˜¯ç”¨äº”æ¬¡æ–¹ï¼Œå³ 5 的幂函数进行æ’值的。" #: doc/classes/Tween.xml msgid "" "The animation is interpolated with a quartic (to the power of 4) function." -msgstr "动画是用一个四次方,å³4的幂函数æ’值的。" +msgstr "åŠ¨ç”»æ˜¯ç”¨ä¸€ä¸ªå››æ¬¡æ–¹ï¼Œå³ 4 的幂函数æ’值的。" #: doc/classes/Tween.xml msgid "" "The animation is interpolated with a quadratic (to the power of 2) function." -msgstr "动画是用二次方,å³2的幂函数æ’值的。" +msgstr "åŠ¨ç”»æ˜¯ç”¨äºŒæ¬¡æ–¹ï¼Œå³ 2 的幂函数æ’值的。" #: doc/classes/Tween.xml msgid "" "The animation is interpolated with an exponential (to the power of x) " "function." -msgstr "动画是用一个指数,å³x的幂函数æ’值的。" +msgstr "åŠ¨ç”»æ˜¯ç”¨ä¸€ä¸ªæŒ‡æ•°ï¼Œå³ x 的幂函数æ’值的。" #: doc/classes/Tween.xml msgid "" @@ -80929,7 +81246,7 @@ msgstr "动画弹性æ’值,在边缘摆动。" #: doc/classes/Tween.xml msgid "" "The animation is interpolated with a cubic (to the power of 3) function." -msgstr "动画是用一个立方,å³3的幂函数æ’值的。" +msgstr "åŠ¨ç”»æ˜¯ç”¨ä¸€ä¸ªç«‹æ–¹ï¼Œå³ 3 的幂函数æ’值的。" #: doc/classes/Tween.xml msgid "The animation is interpolated with a function using square roots." @@ -80961,7 +81278,7 @@ msgstr "[constant EASE_IN] å’Œ [constant EASE_OUT] 的组åˆã€‚两端的æ’å€¼æœ msgid "" "A combination of [constant EASE_IN] and [constant EASE_OUT]. The " "interpolation is fastest at both ends." -msgstr "[constant EASE_IN] and [constant EASE_OUT]的组åˆã€‚两端的æ’值最快。" +msgstr "[constant EASE_IN] å’Œ [constant EASE_OUT] 的组åˆã€‚两端的æ’值最快。" #: doc/classes/Tweener.xml msgid "Abstract class for all Tweeners used by [SceneTreeTween]." @@ -81041,8 +81358,8 @@ msgid "" " connected = true\n" "[/codeblock]" msgstr "" -"一个简å•çš„æœåŠ¡å™¨ï¼Œå®ƒæ‰“å¼€ä¸€ä¸ª UDP 套接å—,并在收到新的数æ®åŒ…时,返回连接的 " -"[PacketPeerUDP]。请å‚阅 [method PacketPeerUDP.connect_to_host]。\n" +"简å•çš„æœåŠ¡å™¨ï¼Œå®ƒæ‰“å¼€ä¸€ä¸ª UDP 套接å—,并在收到新的数æ®åŒ…时,返回连接的 " +"[PacketPeerUDP]。å¦è¯·å‚阅 [method PacketPeerUDP.connect_to_host]。\n" "å¯åЍæœåС噍åŽï¼ˆ[method listen]ï¼‰ï¼Œä½ å°†éœ€è¦å®šæœŸ [method poll] 它(例如在 " "[method Node._process] 内),æ‰ä¼šå¤„ç†æ–°çš„æ•°æ®åŒ…ã€å°†å®ƒä»¬ä¼ 递给适当的 " "[PacketPeerUDP]ã€æŽ¥å—æ–°è¿žæŽ¥ã€‚\n" @@ -81147,8 +81464,8 @@ msgid "" "also [method is_connection_available], [method PacketPeerUDP." "connect_to_host]." msgstr "" -"返回第一个挂起的连接,注,连接到适当的地å€åŠç«¯å£ã€‚如果没有新的连接å¯ç”¨ï¼Œå°†è¿”" -"回 [code]null[/code]。å‚阅[method is_connection_available], [method " +"返回第一个挂起的连接(连接到适当的地å€åŠç«¯å£ï¼‰ã€‚如果没有新的连接å¯ç”¨ï¼Œå°†è¿”回 " +"[code]null[/code]。å¦è¯·å‚阅 [method is_connection_available]ã€[method " "PacketPeerUDP.connect_to_host]。" #: doc/classes/UDPServer.xml @@ -81204,9 +81521,9 @@ msgstr "" "在编辑器或自定义工具ä¸ç®¡ç†æ’¤é”€åŠé‡åšæ“ä½œçš„è¾…åŠ©å·¥å…·ã€‚å®ƒçš„å·¥ä½œåŽŸç†æ˜¯" "在“actionâ€ï¼ˆåŠ¨ä½œï¼‰ä¸æ³¨å†Œæ–¹æ³•和属性的å˜åŒ–。\n" "常è§çš„è¡Œä¸ºæ˜¯é¦–å…ˆåˆ›å»ºä¸€ä¸ªåŠ¨ä½œï¼Œç„¶åŽæ·»åŠ ç”¨äºŽ do/undo(执行/撤销)的方法调用或属" -"æ€§æ›´æ”¹ï¼Œç„¶åŽæäº¤åŠ¨ä½œã€‚ \n" +"æ€§æ›´æ”¹ï¼Œç„¶åŽæäº¤åŠ¨ä½œã€‚\n" "䏋颿˜¯ä¸€ä¸ªæ’ä»¶ä¸ä¾‹å,展示如何在 Godot 编辑器自己的 [UndoRedo] 䏿·»åŠ ä¸€ä¸ªåŠ¨" -"作。 \n" +"作。\n" "[codeblock]\n" "var undo_redo = get_undo_redo() # EditorPlugin 的方法。\n" "\n" @@ -81506,10 +81823,10 @@ msgid "" "[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " "return values." msgstr "" -"åˆ é™¤é»˜è®¤ç½‘å…³ä¸Šç»™å®šç«¯å£å’Œå议组åˆçš„ç«¯å£æ˜ 射,如果å˜åœ¨çš„è¯ã€‚[code]port[/code]å¿…" -"须是1到65535之间的有效端å£ï¼Œ[code]proto[/code]å¯ä»¥æ˜¯[code]TCP[/code]或" -"[code]UDP[/code]。å¯èƒ½çš„返回值,å‚阅[enum UPNPResult]。å‚阅[method " -"get_gateway]。" +"如果默认网关上å˜åœ¨ç»™å®šçš„端å£å’Œå议组åˆçš„ç«¯å£æ˜ å°„ï¼ˆè§ [method get_gateway])," +"åˆ™å°†å…¶åˆ é™¤ã€‚[code]port[/code] 必须是 1 到 65535 之间的有效端å£ï¼Œ[code]proto[/" +"code] å¯ä»¥æ˜¯ [code]TCP[/code] 或 [code]UDP[/code]。å¯èƒ½çš„è¿”å›žå€¼è§ [enum " +"UPNPResult]。" #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -81529,11 +81846,11 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Returns the [UPNPDevice] at the given [code]index[/code]." -msgstr "返回给定[code]index[/code]处的[UPNPDevice]。" +msgstr "返回给定 [code]index[/code] 处的 [UPNPDevice]。" #: modules/upnp/doc_classes/UPNP.xml msgid "Returns the number of discovered [UPNPDevice]s." -msgstr "返回已å‘现的[UPNPDevice]的数é‡ã€‚" +msgstr "返回已å‘现的 [UPNPDevice] 的数é‡ã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -81548,24 +81865,25 @@ msgid "" "Returns the external [IP] address of the default gateway (see [method " "get_gateway]) as string. Returns an empty string on error." msgstr "" -"返回默认网关的外部[IP]地å€å—符串。错误时返回一个空å—符串。å‚阅[method " -"get_gateway]。" +"返回默认网关的外部 [IP] 地å€å—ç¬¦ä¸²ï¼ˆè§ [method get_gateway])。错误时返回空å—" +"符串。" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Removes the device at [code]index[/code] from the list of discovered devices." -msgstr "å°†[code]index[/code]处的设备从已å‘现的设备列表ä¸ç§»é™¤ã€‚" +msgstr "å°† [code]index[/code] 处的设备从已å‘现的设备列表ä¸ç§»é™¤ã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Sets the device at [code]index[/code] from the list of discovered devices to " "[code]device[/code]." msgstr "" -"å°†[code]index[/code]处的设备从已å‘现的设备列表ä¸è®¾ç½®ä¸º[code]device[/code]。" +"å°† [code]index[/code] 处的设备从已å‘现的设备列表ä¸è®¾ç½®ä¸º [code]device[/" +"code]。" #: modules/upnp/doc_classes/UPNP.xml msgid "If [code]true[/code], IPv6 is used for [UPNPDevice] discovery." -msgstr "如果[code]true[/code],则IPv6用于[UPNPDevice]å‘现。" +msgstr "如果为 [code]true[/code],则 IPv6 用于 [UPNPDevice] å‘现。" #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -81574,8 +81892,8 @@ msgid "" "the source port 1900 (same as destination port). Otherwise, the value will " "be used as the port." msgstr "" -"如果[code]0[/code],系统会自动选择用于å‘现的本地端å£ã€‚如果[code]1[/code],将" -"从æºç«¯å£1900进行å‘现,注,与目的端å£ç›¸åŒã€‚å¦åˆ™ï¼Œå°†ä½¿ç”¨è¯¥å€¼ä½œä¸ºç«¯å£ã€‚" +"如果为 [code]0[/code],系统会自动选择用于å‘现的本地端å£ã€‚如果为 [code]1[/" +"code],将从æºç«¯å£ 1900 进行å‘现(与目的端å£ç›¸åŒï¼‰ã€‚å¦åˆ™ï¼Œå°†ä½¿ç”¨è¯¥å€¼ä½œä¸ºç«¯å£ã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -81585,21 +81903,21 @@ msgstr "用于å‘çŽ°çš„å¤šæ’æŽ¥å£ã€‚å¦‚æžœä¸ºç©ºï¼Œåˆ™ä½¿ç”¨é»˜è®¤çš„å¤šæ’æŽ¥ #: modules/upnp/doc_classes/UPNP.xml msgid "UPNP command or discovery was successful." -msgstr "UPNP命令或å‘现æˆåŠŸã€‚" +msgstr "UPNP 命令或å‘现æˆåŠŸã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "" "Not authorized to use the command on the [UPNPDevice]. May be returned when " "the user disabled UPNP on their router." msgstr "" -"未授æƒåœ¨[UPNPDevice]上使用该命令。当用户在其路由器上ç¦ç”¨UPNP时,å¯èƒ½ä¼šè¢«è¿”" -"回。" +"未授æƒåœ¨ [UPNPDevice] 上使用该命令。当用户在其路由器上ç¦ç”¨ UPNP 时,å¯èƒ½ä¼šè¢«" +"返回。" #: modules/upnp/doc_classes/UPNP.xml msgid "" "No port mapping was found for the given port, protocol combination on the " "given [UPNPDevice]." -msgstr "在给定的[UPNPDevice]上没有找到给定端å£ã€å议组åˆçš„ç«¯å£æ˜ 射。" +msgstr "在给定的 [UPNPDevice] 上没有找到给定端å£ã€å议组åˆçš„ç«¯å£æ˜ 射。" #: modules/upnp/doc_classes/UPNP.xml msgid "Inconsistent parameters." @@ -81610,8 +81928,8 @@ msgid "" "No such entry in array. May be returned if a given port, protocol " "combination is not found on an [UPNPDevice]." msgstr "" -"æ•°ç»„ä¸æ²¡æœ‰æ¤æ¡ç›®ã€‚如果在[UPNPDevice]上没有找到给定的端å£ã€å议组åˆï¼Œå¯èƒ½ä¼šè¢«" -"返回。" +"æ•°ç»„ä¸æ²¡æœ‰æ¤æ¡ç›®ã€‚如果在 [UPNPDevice] 上没有找到给定的端å£ã€å议组åˆï¼Œå¯èƒ½ä¼š" +"被返回。" #: modules/upnp/doc_classes/UPNP.xml msgid "The action failed." @@ -81620,15 +81938,15 @@ msgstr "æ“作失败。" #: modules/upnp/doc_classes/UPNP.xml msgid "" "The [UPNPDevice] does not allow wildcard values for the source IP address." -msgstr "[UPNPDevice]ä¸å…许æºIP地å€çš„通é…符值。" +msgstr "[UPNPDevice] ä¸å…è®¸æº IP 地å€çš„通é…符值。" #: modules/upnp/doc_classes/UPNP.xml msgid "The [UPNPDevice] does not allow wildcard values for the external port." -msgstr "[UPNPDevice]ä¸å…许外部端å£çš„通é…符值。" +msgstr "[UPNPDevice] ä¸å…许外部端å£çš„通é…符值。" #: modules/upnp/doc_classes/UPNP.xml msgid "The [UPNPDevice] does not allow wildcard values for the internal port." -msgstr "[UPNPDevice]ä¸å…许内部端å£çš„通é…符值。" +msgstr "[UPNPDevice] ä¸å…许内部端å£çš„通é…符值。" #: modules/upnp/doc_classes/UPNP.xml msgid "The remote host value must be a wildcard." @@ -81665,7 +81983,8 @@ msgstr "外部和内部端å£å€¼å¿…须相åŒã€‚" msgid "" "Only permanent leases are supported. Do not use the [code]duration[/code] " "parameter when adding port mappings." -msgstr "åªæ”¯æŒæ°¸ä¹…ç§Ÿç”¨ã€‚åœ¨æ·»åŠ ç«¯å£æ˜ 射时,ä¸è¦ä½¿ç”¨[code]duration[/code]傿•°ã€‚" +msgstr "" +"åªæ”¯æŒæ°¸ä¹…ç§Ÿç”¨ã€‚åœ¨æ·»åŠ ç«¯å£æ˜ 射时,ä¸è¦ä½¿ç”¨ [code]duration[/code] 傿•°ã€‚" #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid gateway." @@ -81697,7 +82016,7 @@ msgstr "æ— æ•ˆå‚æ•°ã€‚" #: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml msgid "HTTP error." -msgstr "HTTP错误。" +msgstr "HTTP 错误。" #: modules/upnp/doc_classes/UPNP.xml msgid "Socket error." @@ -81712,16 +82031,16 @@ msgid "" "No gateway available. You may need to call [method discover] first, or " "discovery didn't detect any valid IGDs (InternetGatewayDevices)." msgstr "" -"没有å¯ç”¨çš„ç½‘å…³ã€‚ä½ å¯èƒ½éœ€è¦å…ˆè°ƒç”¨[method discover] ,å¦åˆ™å‘现没有检测到任何有" -"效的IGD(InternetGatewayDevices)。" +"没有å¯ç”¨çš„ç½‘å…³ã€‚ä½ å¯èƒ½éœ€è¦å…ˆè°ƒç”¨ [method discover] ,å¦åˆ™å‘现没有检测到任何有" +"效的 IGD(InternetGatewayDevices)。" #: modules/upnp/doc_classes/UPNP.xml msgid "" "No devices available. You may need to call [method discover] first, or " "discovery didn't detect any valid [UPNPDevice]s." msgstr "" -"没有å¯ç”¨çš„è®¾å¤‡ã€‚ä½ å¯èƒ½éœ€è¦å…ˆè°ƒç”¨[method discover],或者å‘现没有检测到任何有效" -"çš„[UPNPDevice]。" +"没有å¯ç”¨çš„è®¾å¤‡ã€‚ä½ å¯èƒ½éœ€è¦å…ˆè°ƒç”¨ [method discover],或者å‘现没有检测到任何有" +"效的 [UPNPDevice]。" #: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml msgid "Unknown error." @@ -81739,9 +82058,9 @@ msgid "" "and external IP address and status). Note that methods on this class are " "synchronous and block the calling thread." msgstr "" -"UPNP设备。å‚阅 [UPNP] 了解UPNPå‘现和实用功能。æä¾›å¯¹UPNP控制命令的低层访问。" -"å…许管ç†ç«¯å£æ˜ 射(端å£è½¬å‘)和查询设备的网络信æ¯ï¼Œå¦‚本地和外部IP地å€å’Œçжæ€ã€‚" -"请注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻塞调用线程。" +"UPNP 设备。å‚阅 [UPNP] 了解 UPNP å‘现和实用功能。æä¾›å¯¹ UPNP 控制命令的低层访" +"问。å…许管ç†ç«¯å£æ˜ 射(端å£è½¬å‘)和查询设备的网络信æ¯ï¼Œå¦‚本地和外部IP地å€å’Œçж" +"æ€ã€‚请注æ„ï¼Œè¿™ä¸ªç±»çš„æ–¹æ³•æ˜¯åŒæ¥çš„,会阻塞调用线程。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" @@ -81749,15 +82068,15 @@ msgid "" "for the given protocol to the local machine. See [method UPNP." "add_port_mapping]." msgstr "" -"æ·»åŠ ä¸€ä¸ªç«¯å£æ˜ 射,将这个[UPNPDevice]上给定的外部端å£è½¬å‘到本地机器上,以给定" -"çš„å议。å‚阅 [method UPNP.add_port_mapping]。" +"æ·»åŠ ä¸€ä¸ªç«¯å£æ˜ 射,将这个 [UPNPDevice] 上给定的外部端å£è½¬å‘到本地机器上,以给" +"定的åè®®ã€‚è§ [method UPNP.add_port_mapping]。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Deletes the port mapping identified by the given port and protocol " "combination on this device. See [method UPNP.delete_port_mapping]." msgstr "" -"åˆ é™¤è¯¥è®¾å¤‡ä¸Šç”±ç»™å®šçš„ç«¯å£å’Œå议组åˆç¡®å®šçš„ç«¯å£æ˜ 射。å‚阅[method UPNP." +"åˆ é™¤è¯¥è®¾å¤‡ä¸Šç”±ç»™å®šçš„ç«¯å£å’Œå议组åˆç¡®å®šçš„ç«¯å£æ˜ å°„ã€‚è§ [method UPNP." "delete_port_mapping]。" #: modules/upnp/doc_classes/UPNPDevice.xml @@ -81765,35 +82084,35 @@ msgid "" "Returns [code]true[/code] if this is a valid IGD (InternetGatewayDevice) " "which potentially supports port forwarding." msgstr "" -"如果这是一个有效的IGD(InternetGatewayDevice),å¯èƒ½æ”¯æŒç«¯å£è½¬å‘,则返回 " +"如果这是一个有效的 IGD(InternetGatewayDevice),å¯èƒ½æ”¯æŒç«¯å£è½¬å‘,则返回 " "[code]true[/code]。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Returns the external IP address of this [UPNPDevice] or an empty string." -msgstr "返回这个[UPNPDevice]的外部IPåœ°å€æˆ–空å—符串。" +msgstr "返回这个 [UPNPDevice] 的外部 IP åœ°å€æˆ–空å—符串。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "URL to the device description." -msgstr "设备æè¿°çš„URL。" +msgstr "设备æè¿°çš„ URL。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "IDG control URL." -msgstr "IDG控件URL。" +msgstr "IDG 控件 URL。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "" "Address of the local machine in the network connecting it to this " "[UPNPDevice]." -msgstr "将其连接到该[UPNPDevice]的网络ä¸çš„æœ¬åœ°æœºå™¨çš„地å€ã€‚" +msgstr "将其连接到该 [UPNPDevice] 的网络ä¸çš„æœ¬åœ°æœºå™¨çš„地å€ã€‚" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "IGD service type." -msgstr "IGDæœåŠ¡ç±»åž‹ã€‚" +msgstr "IGD æœåŠ¡ç±»åž‹ã€‚" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "IGD status. See [enum IGDStatus]." -msgstr "IGD状æ€ã€‚å‚阅[enum IGDStatus]。" +msgstr "IGD 状æ€ã€‚è§ [enum IGDStatus]。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Service type." @@ -81805,11 +82124,11 @@ msgstr "OK。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Empty HTTP response." -msgstr "空的HTTPå“应。" +msgstr "空的 HTTP å“应。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Returned response contained no URLs." -msgstr "返回的å“应ä¸åŒ…å«ä»»ä½•URL。" +msgstr "返回的å“应ä¸åŒ…å«ä»»ä½• URL。" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Not a valid IGD." @@ -81995,7 +82314,7 @@ msgstr "垂直盒å¼å®¹å™¨ã€‚请å‚阅 [BoxContainer]。" #: doc/classes/VBoxContainer.xml msgid "The vertical space between the [VBoxContainer]'s elements." -msgstr "[VBoxContainer]çš„å…ƒç´ ä¹‹é—´çš„åž‚ç›´ç©ºé—´ã€‚" +msgstr "[VBoxContainer] çš„å…ƒç´ ä¹‹é—´çš„åž‚ç›´ç©ºé—´ã€‚" #: doc/classes/Vector2.xml msgid "Vector used for 2D math." @@ -82040,14 +82359,15 @@ msgid "" "Equivalent to the result of [method @GDScript.atan2] when called with the " "vector's [member y] and [member x] as parameters: [code]atan2(y, x)[/code]." msgstr "" -"返回这个å‘é‡ç›¸å¯¹äºŽæ£X轴的角度,或[code](1, 0)[/code]å‘é‡ï¼Œå•ä½ä¸ºå¼§åº¦ã€‚\n" -"例如,[code]Vector2.RIGHT.angle()[/code]将返回0,[code]Vector2.DOWN.angle()[/" -"code]将返回 [code]PI / 2[/code](四分之一转,或90度),[code]Vector2(1, -1)." -"angle()[/code]将返回 [code]-PI / 4[/code] (负八分之一转,或-45度)。\n" +"返回这个å‘é‡ç›¸å¯¹äºŽæ£ X 轴的角度,或 [code](1, 0)[/code] å‘é‡ï¼Œå•ä½ä¸ºå¼§åº¦ã€‚\n" +"例如,[code]Vector2.RIGHT.angle()[/code] 将返回 0,[code]Vector2.DOWN.angle()" +"[/code] 将返回 [code]PI / 2[/code](四分之一转,或 90 度),[code]Vector2(1, " +"-1).angle()[/code] 将返回 [code]-PI / 4[/code] (负八分之一转,或 -45 " +"度)。\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "vector2_angle.png]返回角度的说明。[/url]\n" -"相当于以å‘é‡çš„[member y] å’Œ [member x]ä¸ºå‚æ•°è°ƒç”¨[method @GDScript.atan2]æ—¶çš„" -"结果。[code]atan2(y, x)[/code]。" +"相当于以å‘é‡çš„ [member y] å’Œ [member x] ä¸ºå‚æ•°è°ƒç”¨ [method @GDScript.atan2] " +"时的结果。[code]atan2(y, x)[/code]。" #: doc/classes/Vector2.xml msgid "" @@ -82074,7 +82394,7 @@ msgstr "" msgid "" "Returns the aspect ratio of this vector, the ratio of [member x] to [member " "y]." -msgstr "返回这个å‘é‡çš„长宽比,å³[member x] 与[member y]的比例。" +msgstr "返回这个å‘é‡çš„é•¿å®½æ¯”ï¼Œå³ [member x] 与 [member y] 的比例。" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -82123,14 +82443,14 @@ msgid "" msgstr "" "用[code]pre_a[/code]å’Œ[code]post_b[/code]ä½œä¸ºå¥æŸ„,在这个å‘é‡å’Œ[code]b[/code]" "之间进行三次æ’值,并在[code]weight[/code]ä½ç½®è¿”回结果。[code]weight[/code]çš„" -"范围是0.0到1.0,表示æ’值的é‡ã€‚" +"范围是0.0 到 1.0,表示æ’值的é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns the normalized vector pointing from this vector to [code]b[/code]. " "This is equivalent to using [code](b - a).normalized()[/code]." msgstr "" -"返回从这个å‘釿Œ‡å‘[code]b[/code]的归一化å‘é‡ã€‚这相当于使用[code](b-a)." +"返回从这个å‘釿Œ‡å‘ [code]b[/code] 的归一化å‘é‡ã€‚相当于使用 [code](b-a)." "normalized()[/code]。" #: doc/classes/Vector2.xml doc/classes/Vector3.xml @@ -82139,9 +82459,9 @@ msgid "" "This method runs faster than [method distance_to], so prefer it if you need " "to compare vectors or need the squared distance for some formula." msgstr "" -"返回这个å‘é‡ä¸Ž[code]b[/code]之间的平方è·ç¦»ã€‚\n" -"这个方法比[method distance_to]è¿è¡Œå¾—æ›´å¿«ï¼Œæ‰€ä»¥å¦‚æžœä½ éœ€è¦æ¯”较å‘釿ˆ–需è¦ä¸€äº›å…¬" -"å¼çš„平方è·ç¦»ï¼Œåˆ™æ›´å–œæ¬¢å®ƒã€‚" +"返回这个å‘é‡ä¸Ž [code]b[/code] 之间的平方è·ç¦»ã€‚\n" +"这个方法比 [method distance_to] è¿è¡Œå¾—æ›´å¿«ï¼Œæ‰€ä»¥å¦‚æžœä½ éœ€è¦æ¯”较å‘釿ˆ–需è¦ä¸€äº›" +"å…¬å¼çš„平方è·ç¦»ï¼Œåˆ™æ›´å–œæ¬¢å®ƒã€‚" #: doc/classes/Vector2.xml msgid "Returns the distance between this vector and [code]to[/code]." @@ -82161,13 +82481,13 @@ msgid "" "aligned.\n" "[b]Note:[/b] [code]a.dot(b)[/code] is equivalent to [code]b.dot(a)[/code]." msgstr "" -"返回æ¤å‘é‡ä¸Ž[code]with[/code]的点积。这å¯ä»¥ç”¨æ¥æ¯”较两个å‘é‡ä¹‹é—´çš„角度。例如," -"è¿™å¯ä»¥ç”¨æ¥ç¡®å®šä¸€ä¸ªæ•Œäººæ˜¯å¦æ£æœå‘玩家。\n" -"对于直角90度,点积将是[code]0[/code],对于窄于90度的角度,点积大于0,对于宽于" -"90度的角度,点积å°äºŽ0。\n" -"当使用归一化å•ä½å‘釿—¶ï¼Œå½“å‘釿œå‘ç›¸åæ–¹å‘时,结果总是在[code]-1.0[/code]" -"(180度角)和[code]1.0[/code](0度角)之间,当å‘é‡å¯¹é½ã€‚\n" -"[b]注æ„:[/b][code]a.dot(b)[/code]ç‰åŒäºŽ[code]b.dot(a)[/code]。" +"返回æ¤å‘é‡ä¸Ž [code]with[/code] 的点积。这å¯ä»¥ç”¨æ¥æ¯”较两个å‘é‡ä¹‹é—´çš„角度。例" +"如,这å¯ä»¥ç”¨æ¥ç¡®å®šä¸€ä¸ªæ•Œäººæ˜¯å¦æ£æœå‘玩家。\n" +"对于直角 90 度,点积将是 [code]0[/code],对于窄于 90 度的角度,点积大于 0,对" +"于宽于 90 度的角度,点积å°äºŽ 0。\n" +"当使用归一化å•ä½å‘釿—¶ï¼Œå½“å‘釿œå‘ç›¸åæ–¹å‘时,结果总是在 [code]-1.0[/code]" +"(180 度角)和 [code]1.0[/code](0 度角)之间,当å‘é‡å¯¹é½ã€‚\n" +"[b]注æ„:[/b][code]a.dot(b)[/code] 与 [code]b.dot(a)[/code] ç‰ä»·ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -82181,8 +82501,8 @@ msgid "" "approximately equal, by running [method @GDScript.is_equal_approx] on each " "component." msgstr "" -"通过对æ¯ä¸ªåˆ†é‡è¿è¡Œ[method @GDScript.is_equal_approx],如果这个å‘é‡å’Œ[code]v[/" -"code]近似相ç‰ï¼Œè¿”回 [code]true[/code]。" +"通过对æ¯ä¸ªåˆ†é‡è¿è¡Œ [method @GDScript.is_equal_approx],如果这个å‘é‡å’Œ " +"[code]v[/code] 近似相ç‰ï¼Œè¿”回 [code]true[/code]。" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -82202,14 +82522,14 @@ msgid "" "compare vectors or need the squared distance for some formula." msgstr "" "返回这个å‘é‡çš„平方长度,å³å¹³æ–¹å¤§å°ã€‚\n" -"这个方法比[method length]è¿è¡Œå¾—æ›´å¿«ï¼Œæ‰€ä»¥å¦‚æžœä½ éœ€è¦æ¯”较å‘釿ˆ–需è¦ä¸€äº›å…¬å¼çš„å¹³" -"æ–¹è·ç¦»æ—¶ï¼Œæ›´å–œæ¬¢ç”¨å®ƒã€‚" +"这个方法比 [method length] è¿è¡Œå¾—æ›´å¿«ï¼Œæ‰€ä»¥å¦‚æžœä½ éœ€è¦æ¯”较å‘釿ˆ–需è¦ä¸€äº›å…¬å¼çš„" +"平方è·ç¦»æ—¶ï¼Œæ›´å–œæ¬¢ç”¨å®ƒã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns the vector with a maximum length by limiting its length to " "[code]length[/code]." -msgstr "通过é™åˆ¶å…¶é•¿åº¦ä¸º[code]length[/code],返回具有最大长度的å‘é‡ã€‚" +msgstr "通过é™åˆ¶å…¶é•¿åº¦ä¸º [code]length[/code],返回具有最大长度的å‘é‡ã€‚" #: doc/classes/Vector2.xml msgid "" @@ -82217,8 +82537,8 @@ msgid "" "[code]to[/code] by amount [code]weight[/code]. [code]weight[/code] is on the " "range of 0.0 to 1.0, representing the amount of interpolation." msgstr "" -"返回这个å‘é‡ä¸Ž[code]to[/code]之间线性æ’值的结果,æ’值é‡ä¸º[code]weight[/" -"code]。[code]weight[/code]的范围是0.0到1.0,表示æ’值的数é‡ã€‚" +"返回这个å‘é‡ä¸Ž [code]to[/code] 之间线性æ’值的结果,æ’值é‡ä¸º [code]weight[/" +"code]。[code]weight[/code] 的范围是 0.0 到 1.0,表示æ’值的数é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -82232,15 +82552,15 @@ msgstr "" msgid "" "Returns the vector scaled to unit length. Equivalent to [code]v / v.length()" "[/code]." -msgstr "返回缩放为å•ä½é•¿åº¦çš„å‘é‡ã€‚相当于[code]v/v.length()[/code]。" +msgstr "返回缩放为å•ä½é•¿åº¦çš„å‘é‡ã€‚相当于 [code]v/v.length()[/code]。" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" "Returns a vector composed of the [method @GDScript.fposmod] of this vector's " "components and [code]mod[/code]." msgstr "" -"返回一个由这个å‘é‡åˆ†é‡çš„[method @GDScript.fposmod]å’Œ[code]mod[/code]组æˆçš„å‘" -"é‡ã€‚" +"返回一个由这个å‘é‡åˆ†é‡çš„ [method @GDScript.fposmod] å’Œ [code]mod[/code] 组æˆ" +"çš„å‘é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -82294,7 +82614,7 @@ msgid "" "[b]Note:[/b] Both vectors must be normalized." msgstr "" "返回这个å‘é‡ä¸Ž[code]to[/code]之间的çƒé¢çº¿æ€§æ’值的结果,按[code]weight[/code]" -"的数é‡ã€‚[code]weight[/code]的范围是0.0到1.0,表示æ’值的数é‡ã€‚\n" +"的数é‡ã€‚[code]weight[/code]的范围是0.0 到 1.0,表示æ’值的数é‡ã€‚\n" "[b]注æ„:[/b]两个å‘é‡éƒ½å¿…须被归一化。" #: doc/classes/Vector2.xml doc/classes/Vector3.xml @@ -82380,7 +82700,7 @@ msgid "" msgstr "" "3 å…ƒç´ ç»“æž„ï¼Œå¯ç”¨äºŽè¡¨ç¤º 3D 空间ä¸çš„ä½ç½®æˆ–任何其他数值三元组。\n" "[b]注æ„:[/b]在布尔上下文ä¸ï¼Œå¦‚æžœ Vector3 ç‰äºŽ [code]Vector3(0, 0, 0)[/" -"code],将评估为 [code]false[/code]。å¦åˆ™ï¼Œ Vector3 将始终评估为 [code]true[/" +"code],将评估为 [code]false[/code]。å¦åˆ™ï¼ŒVector3 将始终评估为 [code]true[/" "code]。" #: doc/classes/Vector3.xml @@ -82430,7 +82750,7 @@ msgstr "" "于宽于 90 度的角度,点积å°äºŽ 0。\n" "当使用归一化å•ä½å‘é‡ï¼Œå‘釿œå‘ç›¸åæ–¹å‘时,结果总是在 [code]-1.0[/code](180 " "度角)和 [code]1.0[/code](0 度角)之间,当å‘é‡å¯¹é½ã€‚\n" -"[b]注æ„:[/b][code]a.dot(b)[/code] ç‰åŒäºŽ [code]b.dot(a)[/code]。" +"[b]注æ„:[/b][code]a.dot(b)[/code] 与 [code]b.dot(a)[/code] ç‰ä»·ã€‚" #: doc/classes/Vector3.xml msgid "" @@ -82500,7 +82820,7 @@ msgid "" "components set as the scale." msgstr "" "返回一个以该å‘é‡ä¸ºä¸»å¯¹è§’线的对角线矩阵。\n" -"这相当于一个没有旋转或剪切的 Basis,这个å‘é‡çš„分é‡è¢«è®¾å®šä¸ºç¼©æ”¾ã€‚" +"相当于一个没有旋转或剪切的 Basis,这个å‘é‡çš„分é‡è¢«è®¾å®šä¸ºç¼©æ”¾ã€‚" #: doc/classes/Vector3.xml msgid "" @@ -82766,7 +83086,7 @@ msgid "" "0.1 and 0.3 depending on the type of car." msgstr "" "这是悬架å¯ä»¥ç§»åŠ¨çš„è·ç¦»ã€‚由于Godot çš„å•ä½ç›¸å½“äºŽç±³ï¼Œæ‰€ä»¥ä¿æŒè¿™ä¸ªè®¾ç½®ç›¸å¯¹è¾ƒä½Žã€‚" -"æ ¹æ®æ±½è½¦çš„类型,试试0.1å’Œ0.3之间的值。" +"æ ¹æ®æ±½è½¦çš„类型,试试 0.1 å’Œ 0.3 之间的值。" #: doc/classes/VehicleWheel.xml msgid "" @@ -82774,7 +83094,7 @@ msgid "" "value is used in conjunction with [member VehicleBody.steering] and ignored " "if you are using the per-wheel [member steering] value instead." msgstr "" -"如果[code]true[/code]ï¼Œå½“æ±½è½¦è½¬å‘æ—¶ï¼Œå…¶è½®å将被转动。æ¤å€¼å’Œ[member " +"如果为 [code]true[/code]ï¼Œå½“æ±½è½¦è½¬å‘æ—¶ï¼Œå…¶è½®å将被转动。æ¤å€¼å’Œ[member " "VehicleBody.steering]一起使用,如果使用æ¯ä¸ªè½®åçš„[member steering]值æ¥ä»£æ›¿ï¼Œ" "则会被忽略。" @@ -82785,9 +83105,9 @@ msgid "" "VehicleBody.engine_force] and ignored if you are using the per-wheel [member " "engine_force] value instead." msgstr "" -"如果[code]true[/code],æ¤è½®åå°†å¼•æ“ŽåŠ›ä¼ é€’ç»™åœ°é¢ï¼ŒæŽ¨åŠ¨è½¦è¾†å‰è¿›ã€‚æ¤å€¼å’Œ[member " -"VehicleBody.engine_force]一起使用,如果使用æ¯ä¸ªè½®åçš„[member engine_force]" -"值,则忽略该值。" +"如果为 [code]true[/code],æ¤è½®åå°†å¼•æ“ŽåŠ›ä¼ é€’ç»™åœ°é¢ï¼ŒæŽ¨åŠ¨è½¦è¾†å‰è¿›ã€‚æ¤å€¼å’Œ" +"[member VehicleBody.engine_force]一起使用,如果使用æ¯ä¸ªè½®åçš„[member " +"engine_force]值,则忽略该值。" #: doc/classes/VehicleWheel.xml msgid "" @@ -82901,7 +83221,7 @@ msgstr "è¦æ’放的嵌入å¼éŸ³è½¨ã€‚" #: doc/classes/VideoPlayer.xml msgid "If [code]true[/code], playback starts when the scene loads." -msgstr "如果[code]true[/code]ï¼Œå½“åœºæ™¯åŠ è½½æ—¶å¼€å§‹æ’æ”¾ã€‚" +msgstr "如果为 [code]true[/code]ï¼Œå½“åœºæ™¯åŠ è½½æ—¶å¼€å§‹æ’æ”¾ã€‚" #: doc/classes/VideoPlayer.xml msgid "Amount of time in milliseconds to store in buffer while playing." @@ -82917,12 +83237,12 @@ msgid "" "control minimum size will be automatically adjusted to match the video " "stream's dimensions." msgstr "" -"如果[code]true[/code],视频会缩放到控件的尺寸。å¦åˆ™ï¼ŒæŽ§ä»¶çš„æœ€å°å°ºå¯¸å°†è¢«è‡ªåŠ¨è°ƒ" -"整以匹é…视频æµçš„尺寸。" +"如果为 [code]true[/code],视频会缩放到控件的尺寸。å¦åˆ™ï¼ŒæŽ§ä»¶çš„æœ€å°å°ºå¯¸å°†è¢«è‡ª" +"动调整以匹é…视频æµçš„尺寸。" #: doc/classes/VideoPlayer.xml msgid "If [code]true[/code], the video is paused." -msgstr "如果[code]true[/code],则暂åœè§†é¢‘。" +msgstr "如果为 [code]true[/code],则暂åœè§†é¢‘。" #: doc/classes/VideoPlayer.xml msgid "The assigned video stream. See description for supported formats." @@ -83006,15 +83326,16 @@ msgid "" "extension, you will have to rename the extension to [code].ogv[/code] to use " "those videos within Godot." msgstr "" -"[VideoStream]资æºå¤„ç†[url=https://www.theora.org/]Ogg Theora[/url]è§†é¢‘æ ¼å¼ï¼Œ" -"扩展å为[code].ogv[/code]。Theoraç¼–è§£ç 器比[VideoStreamWebm]çš„VP8å’ŒVP9效率" -"低,但它以较少的CPUèµ„æºæ¥è§£ç 。Theoraç¼–è§£ç 器是在CPU上解ç 。\n" -"[b]注æ„:[/b]虽然Ogg Theora视频也å¯ä»¥æœ‰[code].ogg[/code]扩展å,但必须将扩展" -"åæ”¹ä¸º[code].ogv[/code],以便在Godot内使用。" +"[VideoStream] 资æºå¤„ç† [url=https://www.theora.org/]Ogg Theora[/url] è§†é¢‘æ ¼" +"å¼ï¼Œæ‰©å±•å为 [code].ogv[/code]。Theora ç¼–è§£ç 器比 [VideoStreamWebm] çš„ VP8 " +"å’Œ VP9 效率低,但它以较少的 CPU èµ„æºæ¥è§£ç 。Theora ç¼–è§£ç 器是在 CPU 上解" +"ç 。\n" +"[b]注æ„:[/b]虽然 Ogg Theora 视频也å¯ä»¥æœ‰ [code].ogg[/code] 扩展å,但必须将" +"æ‰©å±•åæ”¹ä¸º [code].ogv[/code],以便在 Godot 内使用。" #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." -msgstr "返回由这个[VideoStreamTheora]处ç†çš„Ogg Theora视频文件。" +msgstr "返回由这个 [VideoStreamTheora] 处ç†çš„ Ogg Theora 视频文件。" #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "" @@ -83022,12 +83343,12 @@ msgid "" "handles. The [code]file[/code] name should have the [code].ogv[/code] " "extension." msgstr "" -"设置该[VideoStreamTheora]资æºå¤„ç†çš„Ogg Theora视频文件。[code]file[/code]çš„å" -"称应该有[code].ogv[/code]扩展å。" +"设置该 [VideoStreamTheora] 资æºå¤„ç†çš„ Ogg Theora 视频文件。[code]file[/code] " +"çš„å称应该有 [code].ogv[/code] 扩展å。" #: modules/webm/doc_classes/VideoStreamWebm.xml msgid "[VideoStream] resource for WebM videos." -msgstr "[VideoStream] WebM视频的资æºã€‚" +msgstr "[VideoStream] WebM 视频的资æºã€‚" #: modules/webm/doc_classes/VideoStreamWebm.xml msgid "" @@ -83839,11 +84160,11 @@ msgstr "设置由给定的[enum Enabler]常é‡è¯†åˆ«çš„å¯ç”¨ç¨‹åºçš„æ´»åŠ¨çŠ¶æ #: doc/classes/VisibilityEnabler.xml msgid "If [code]true[/code], [RigidBody] nodes will be paused." -msgstr "如果[code]true[/code],[RigidBody]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[RigidBody]节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." -msgstr "如果[code]true[/code],[AnimationPlayer]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[AnimationPlayer]节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "This enabler will pause [AnimationPlayer] nodes." @@ -83882,26 +84203,27 @@ msgstr "" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." -msgstr "如果[code]true[/code],[RigidBody2D]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[RigidBody2D]节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [AnimatedSprite] nodes will be paused." -msgstr "如果[code]true[/code],[AnimatedSprite]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[AnimatedSprite]节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [Particles2D] nodes will be paused." -msgstr "如果[code]true[/code],[Particles2D]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[Particles2D]节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "" "If [code]true[/code], the parent's [method Node._physics_process] will be " "stopped." -msgstr "如果[code]true[/code],父级的[method Node._physics_process]å°†è¢«åœæ¢ã€‚" +msgstr "" +"如果为 [code]true[/code],父级的[method Node._physics_process]å°†è¢«åœæ¢ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "" "If [code]true[/code], the parent's [method Node._process] will be stopped." -msgstr "如果[code]true[/code],父级的[method Node._process]å°†è¢«åœæ¢ã€‚" +msgstr "如果为 [code]true[/code],父级的[method Node._process]å°†è¢«åœæ¢ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will freeze [RigidBody2D] nodes." @@ -83912,15 +84234,13 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢ [Particles2D] 节点。" #: doc/classes/VisibilityEnabler2D.xml -#, fuzzy msgid "This enabler will stop the parent's [method Node._process] function." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ _process 函数。" +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ [method Node._process] 函数。" #: doc/classes/VisibilityEnabler2D.xml -#, fuzzy msgid "" "This enabler will stop the parent's [method Node._physics_process] function." -msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ _physics_process 函数。" +msgstr "这个å¯ç”¨ç¨‹åºå°†åœæ¢çˆ¶ç±»çš„ [method Node._physics_process] 函数。" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [AnimatedSprite] nodes animations." @@ -83960,7 +84280,7 @@ msgid "" "right after it is instantiated, even if it will be on screen in the draw " "pass." msgstr "" -"如果[code]true[/code],则边界框在å±å¹•上。\n" +"如果为 [code]true[/code],则边界框在å±å¹•上。\n" "[b]注æ„:[/b]ä¸€æ—¦æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸ï¼Œéœ€è¦ä¸€å¸§æ¥è®¡ç®—节点的å¯è§æ€§ï¼Œæ‰€ä»¥è¿™ä¸ªæ–¹æ³•将在" "它被实例化åŽç«‹å³è¿”回 [code]false[/code],å³ä½¿å±å¹•在绘制过程ä¸ã€‚" @@ -84025,7 +84345,7 @@ msgid "" "right after it is instantiated, even if it will be on screen in the draw " "pass." msgstr "" -"如果[code]true[/code],则边界矩形在å±å¹•上。\n" +"如果为 [code]true[/code],则边界矩形在å±å¹•上。\n" "[b]注æ„:[/b]ä¸€æ—¦æ·»åŠ åˆ°åœºæ™¯æ ‘ä¸ï¼Œéœ€è¦ä¸€å¸§æ¥è®¡ç®—节点的å¯è§æ€§ï¼Œæ‰€ä»¥è¿™ä¸ªæ–¹æ³•将在" "它被实例化åŽç«‹å³è¿”回 [code]false[/code],å³ä½¿å±å¹•在绘制过程ä¸ã€‚" @@ -84119,8 +84439,8 @@ msgid "" "changes how the engine handles the [VisualInstance] under the hood. " "Equivalent to [method VisualServer.instance_set_base]." msgstr "" -"设置由该[VisualInstance]实例化的资æºï¼Œè¿™å°†æ”¹å˜å¼•擎对该[VisualInstance]的处ç†" -"æ–¹å¼ã€‚相当于[method VisualServer.instance_set_base]。" +"设置由该 [VisualInstance] 实例化的资æºï¼Œè¿™å°†æ”¹å˜å¼•擎对该 [VisualInstance] çš„" +"å¤„ç†æ–¹å¼ã€‚相当于 [method VisualServer.instance_set_base]。" #: doc/classes/VisualInstance.xml msgid "Enables a particular layer in [member layers]." @@ -84351,7 +84671,7 @@ msgstr "å½“èŠ‚ç‚¹ç«¯å£æ›´æ”¹æ—¶è§¦å‘。" #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "A Visual Script node representing a constant from the base types." -msgstr "一个 Visual Script 节点,表示基本类型ä¸çš„一个常é‡ã€‚" +msgstr "Visual Script 节点,表示基本类型ä¸çš„一个常é‡ã€‚" #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "" @@ -84504,8 +84824,8 @@ msgid "" "ease-in, 1+ is ease out. Negative values are in-out/out in." msgstr "" "缓动函数,基于指数。[code]s[/code]是函数的x值,[code]curve[/code]为0时,函数" -"为常é‡å‡½æ•°ï¼Œ1是线性函数,0到1是缓入,1+是缓出。0到-1是缓出å†ç¼“入,低于-1是缓" -"å…¥å†ç¼“出。" +"为常é‡å‡½æ•°ï¼Œ1是线性函数,0 到 1是缓入,1+是缓出。0到-1是缓出å†ç¼“入,低于-1是" +"缓入å†ç¼“出。" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" @@ -84558,8 +84878,8 @@ msgid "" "Return a random floating-point value between 0 and 1. To obtain a random " "value between 0 to N, you can use it with multiplication." msgstr "" -"返回一个介于0到1ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ0到Nä¹‹é—´çš„éšæœºå€¼ï¼Œå¯ä»¥å°†å…¶ä¸Ž" -"乘法结åˆä½¿ç”¨ã€‚" +"返回一个介于0 到 1ä¹‹é—´çš„éšæœºæµ®ç‚¹å€¼ã€‚è¦èŽ·å¾—ä¸€ä¸ªä»‹äºŽ0到Nä¹‹é—´çš„éšæœºå€¼ï¼Œå¯ä»¥å°†å…¶" +"与乘法结åˆä½¿ç”¨ã€‚" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return a random floating-point value between the two inputs." @@ -84603,7 +84923,7 @@ msgid "" "never outside it. Equivalent to [code]min(max(input, range_low), range_high)" "[/code]." msgstr "" -"返回é™å®šåœ¨ç»™å®šèŒƒå›´å†…的输入,确ä¿ç»“果永远ä¸ä¼šè¶…出该范围。相当于" +"返回é™å®šåœ¨ç»™å®šèŒƒå›´å†…的输入,确ä¿ç»“果永远ä¸ä¼šè¶…出该范围。相当于 " "[code]min(max(input, range_low), range_high)[/code]。" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml @@ -85168,7 +85488,7 @@ msgstr "" msgid "" "If [code]false[/code], call errors (e.g. wrong number of arguments) will be " "ignored." -msgstr "如果[code]false[/code]ï¼Œè°ƒç”¨é”™è¯¯å°†è¢«å¿½ç•¥ï¼Œä¾‹å¦‚å‚æ•°æ•°é‡é”™è¯¯ã€‚" +msgstr "如果为 [code]false[/code]ï¼Œè°ƒç”¨é”™è¯¯å°†è¢«å¿½ç•¥ï¼Œä¾‹å¦‚å‚æ•°æ•°é‡é”™è¯¯ã€‚" #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "The method will be called on this [Object]." @@ -85340,8 +85660,7 @@ msgstr "图内å¯ç¼–辑节点的 Visual Script 虚类。" msgid "" "A Visual Script virtual class that defines the shape and the default " "behavior of the nodes that have to be in-graph editable nodes." -msgstr "" -"一个 Visual Script å¯è§†åŒ–类,用于定义必须是图形内å¯ç¼–辑节点的形状和默认行为。" +msgstr "Visual Script 虚类,用于定义必须是图形内å¯ç¼–辑节点的形状和默认行为。" #: modules/visual_script/doc_classes/VisualScriptLists.xml msgid "Adds an input port to the Visual Script node." @@ -85525,7 +85844,7 @@ msgstr "当å¯ç”¨çš„输入/è¾“å‡ºç«¯å£æ›´æ”¹æ—¶è§¦å‘。" #: modules/visual_script/doc_classes/VisualScriptOperator.xml msgid "A Visual Script node that performs an operation on two values." -msgstr "一个 Visual Script 节点,对两个值执行æ“作。" +msgstr "Visual Script 节点,对两个值执行æ“作。" #: modules/visual_script/doc_classes/VisualScriptOperator.xml msgid "" @@ -85577,7 +85896,7 @@ msgstr "è¦åŠ è½½çš„[Resource]资æºã€‚" #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "A Visual Script node returning a value of a property from an [Object]." -msgstr "一个Visual Script节点,从[Object]返回属性值。" +msgstr "Visual Script 节点,返回 [Object] çš„æŸä¸ªå±žæ€§çš„值。" #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" @@ -86038,7 +86357,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptYield.xml msgid "A Visual Script node used to pause a function execution." -msgstr "一个Visual Script节点,用于暂åœå‡½æ•°çš„æ‰§è¡Œã€‚" +msgstr "Visual Script 节点,用于暂åœå‡½æ•°çš„æ‰§è¡Œã€‚" #: modules/visual_script/doc_classes/VisualScriptYield.xml msgid "" @@ -86067,11 +86386,11 @@ msgstr "物ç†å¸§æœŸé—´Yield。" #: modules/visual_script/doc_classes/VisualScriptYield.xml msgid "Yields a function and waits the given time." -msgstr "一个函数Yieldså¹¶ç‰å¾…给定的时间。" +msgstr "将函数 Yield å¹¶ç‰å¾…给定的时间。" #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A Visual Script node yielding for a signal." -msgstr "一个Visual Script节点yieldä¿¡å·ã€‚" +msgstr "Visual Script 节点,用于 yield ä¿¡å·ã€‚" #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "" @@ -86177,8 +86496,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"åˆ›å»ºä¸€ä¸ªç›¸æœºå¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的RID进行访问。这个RID" -"将用于所有[code]camera_*[/code] VisualServer函数。\n" +"åˆ›å»ºä¸€ä¸ªç›¸æœºå¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的RID进行访问。这个" +"RID将用于所有[code]camera_*[/code] VisualServer函数。\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œä½ 将需è¦ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释" "放RID。" @@ -86188,14 +86507,14 @@ msgid "" "which 3D layers are rendered by this camera. Equivalent to [member Camera." "cull_mask]." msgstr "" -"设置与æ¤ç›¸æœºç›¸å…³çš„剔除é®ç½©ã€‚剔除é®ç½©æè¿°äº†æ¤ç›¸æœºæ¸²æŸ“çš„ 3D 层。相当于[member " +"设置与æ¤ç›¸æœºç›¸å…³çš„剔除é®ç½©ã€‚剔除é®ç½©æè¿°äº†æ¤ç›¸æœºæ¸²æŸ“çš„ 3D 层。相当于 [member " "Camera.cull_mask]。" #: doc/classes/VisualServer.xml msgid "" "Sets the environment used by this camera. Equivalent to [member Camera." "environment]." -msgstr "设置æ¤ç›¸æœºæ‰€ä½¿ç”¨çš„环境。ç‰åŒäºŽ[member Camera.environment]。" +msgstr "设置æ¤ç›¸æœºæ‰€ä½¿ç”¨çš„环境。相当于 [member Camera.environment]。" #: doc/classes/VisualServer.xml msgid "" @@ -86231,8 +86550,9 @@ msgid "" "the vertical aspect ratio which is equivalent to [constant Camera." "KEEP_HEIGHT]." msgstr "" -"如果 [code]true[/code], ä¿ç•™æ°´å¹³é•¿å®½æ¯”,相当于 [constant Camera.KEEP_WIDTH]。" -"如果[code]false[/code],ä¿ç•™åž‚直长宽比,相当于[constant Camera.KEEP_HEIGHT]。" +"如果 [code]true[/code],ä¿ç•™æ°´å¹³é•¿å®½æ¯”,相当于 [constant Camera.KEEP_WIDTH]。" +"如果为 [code]false[/code],ä¿ç•™åž‚直长宽比,相当于 [constant Camera." +"KEEP_HEIGHT]。" #: doc/classes/VisualServer.xml msgid "" @@ -86368,7 +86688,7 @@ msgstr "设置 [CanvasItem] 的索引。" #: doc/classes/VisualServer.xml msgid "" "The light mask. See [LightOccluder2D] for more information on light masks." -msgstr "光线é®ç½©ã€‚关于其更多信æ¯ï¼Œè¯·å‚阅[LightOccluder2D]。" +msgstr "光线é®ç½©ã€‚详情请å‚阅 [LightOccluder2D]。" #: doc/classes/VisualServer.xml msgid "Sets a new material to the [CanvasItem]." @@ -86449,8 +86769,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"创建ç¯å…‰é®æŒ¡å™¨å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯" -"用于所有[code]canvas_light_ocluder_*[/code] VisualServer函数。\n" +"创建ç¯å…‰é®æŒ¡å™¨å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RID" +"å¯ç”¨äºŽæ‰€æœ‰[code]canvas_light_ocluder_*[/code] VisualServer函数。\n" "一旦完æˆäº†RID处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -86534,13 +86854,13 @@ msgstr "使阴影å˜å¾—平滑。数值越低越光滑。" #: doc/classes/VisualServer.xml msgid "" "Sets texture to be used by light. Equivalent to [member Light2D.texture]." -msgstr "设置ç¯å…‰ä½¿ç”¨çš„纹ç†ã€‚ç‰åŒäºŽ[member Light2D.texture]。" +msgstr "设置ç¯å…‰ä½¿ç”¨çš„纹ç†ã€‚相当于 [member Light2D.texture]。" #: doc/classes/VisualServer.xml msgid "" "Sets the offset of the light's texture. Equivalent to [member Light2D." "offset]." -msgstr "设置ç¯å…‰çº¹ç†çš„åç§»é‡ã€‚ç‰åŒäºŽ[member Light2D.offset]。" +msgstr "设置ç¯å…‰çº¹ç†çš„åç§»é‡ã€‚相当于 [member Light2D.offset]。" #: doc/classes/VisualServer.xml msgid "Sets the canvas light's [Transform2D]." @@ -86562,8 +86882,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"创建新的光é®è”½å™¨å¤šè¾¹å½¢å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚è¿™" -"个RIDå¯ç”¨äºŽæ‰€æœ‰[code]canvas_occluder_polygon_*[/code] VisualServer函数。\n" +"创建新的光é®è”½å™¨å¤šè¾¹å½¢å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚" +"这个RIDå¯ç”¨äºŽæ‰€æœ‰[code]canvas_occluder_polygon_*[/code] VisualServer函数。\n" "一旦完æˆäº†RID处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -86621,8 +86941,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"åˆ›å»ºä¸€ä¸ªçŽ¯å¢ƒå¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯åœ¨" -"所有[code]environment_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" +"åˆ›å»ºä¸€ä¸ªçŽ¯å¢ƒå¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯" +"在所有[code]environment_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -86639,7 +86959,8 @@ msgstr "è®¾ç½®çŽ¯å¢ƒå…‰å‚æ•°ã€‚详情请å‚阅 [Environment]。" msgid "" "Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." "background_mode]." -msgstr "设置环境的[i]BGMode[/i]。相当于[member Environment.background_mode]。" +msgstr "" +"设置环境的 [i]BGMode[/i]。相当于 [member Environment.background_mode]。" #: doc/classes/VisualServer.xml msgid "" @@ -86774,7 +87095,7 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" -"返回视频适é…器的å称(例如:\"GeForce GTX 1080/PCIe/SSE2\")。\n" +"返回视频适é…器的å称(例如 \"GeForce GTX 1080/PCIe/SSE2\")。\n" "[b]注æ„:[/b]当è¿è¡Œä¸€ä¸ªç²¾ç®€æˆ–æœåС噍坿‰§è¡Œæ–‡ä»¶æ—¶ï¼Œè¿™ä¸ªå‡½æ•°è¿”回一个空å—符串。" #: doc/classes/VisualServer.xml @@ -86783,12 +87104,12 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" -"返回视频适é…器的供应商(例如,\"NVIDIA Corporation\")。\n" +"返回视频适é…器的供应商(例如 \"NVIDIA Corporation\")。\n" "[b]注æ„:[/b]当è¿è¡Œç²¾ç®€æˆ–æœåС噍坿‰§è¡Œæ–‡ä»¶æ—¶ï¼Œè¯¥å‡½æ•°è¿”回一个空å—符串。" #: doc/classes/VisualServer.xml msgid "Returns the id of a white texture. Creates one if none exists." -msgstr "返回白色纹ç†çš„id。如果ä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºä¸€ä¸ªã€‚" +msgstr "返回白色纹ç†çš„ id。如果ä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºä¸€ä¸ªã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -86804,7 +87125,7 @@ msgstr "" "于所有 [code]gi_probe_*[/code] VisualServer 函数。\n" "å®Œæˆ RID 处ç†åŽï¼Œå¯ä½¿ç”¨ VisualServer çš„ [method free_rid] 陿€æ–¹æ³•释放 " "RID。\n" -"è¦æ”¾ç½®åœ¨åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”回的 RID, 使用 [method instance_set_base] å°†æ¤ GI 探" +"è¦æ”¾ç½®åœ¨åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”回的 RID,使用 [method instance_set_base] å°†æ¤ GI 探" "é’ˆé™„åŠ åˆ°å®žä¾‹ã€‚" #: doc/classes/VisualServer.xml @@ -86812,57 +87133,57 @@ msgid "" "Returns the bias value for the GI probe. Bias is used to avoid self " "occlusion. Equivalent to [member GIProbeData.bias]." msgstr "" -"返回GI探针的å置值。å置是用æ¥é¿å…è‡ªæˆ‘é®æŒ¡çš„。相当于[member GIProbeData." +"返回该 GI 探针的å置值。å置是用æ¥é¿å…è‡ªæˆ‘é®æŒ¡çš„。相当于 [member GIProbeData." "bias]。" #: doc/classes/VisualServer.xml msgid "" "Returns the axis-aligned bounding box that covers the full extent of the GI " "probe." -msgstr "返回覆盖GI探针全部范围的轴对é½çš„边界框。" +msgstr "返回覆盖该 GI 探针全部范围的轴对é½çš„边界框。" #: doc/classes/VisualServer.xml msgid "Returns the cell size set by [method gi_probe_set_cell_size]." -msgstr "返回由[method gi_probe_set_cell_size]设置的å•元大å°ã€‚" +msgstr "返回由 [method gi_probe_set_cell_size] 设置的å•元大å°ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the data used by the GI probe." -msgstr "返回GI探针所使用的数æ®ã€‚" +msgstr "返回该 GI 探针所使用的数æ®ã€‚" #: doc/classes/VisualServer.xml msgid "" "Returns the dynamic range set for this GI probe. Equivalent to [member " "GIProbe.dynamic_range]." -msgstr "返回该GI探针的动æ€èŒƒå›´è®¾ç½®ã€‚相当于[member GIProbe.dynamic_range]。" +msgstr "返回该 GI 探针的动æ€èŒƒå›´è®¾ç½®ã€‚相当于 [member GIProbe.dynamic_range]。" #: doc/classes/VisualServer.xml msgid "" "Returns the energy multiplier for this GI probe. Equivalent to [member " "GIProbe.energy]." -msgstr "返回这个GI探针的能é‡ä¹˜æ•°ã€‚相当于[member GIProbe.energy]。" +msgstr "返回这个 GI 探针的能é‡ä¹˜æ•°ã€‚相当于 [member GIProbe.energy]。" #: doc/classes/VisualServer.xml msgid "" "Returns the normal bias for this GI probe. Equivalent to [member GIProbe." "normal_bias]." -msgstr "返回该GI探针的法线å置。相当于[member GIProbe.normal_bias]。" +msgstr "返回这个 GI 探针的法线å置。相当于 [member GIProbe.normal_bias]。" #: doc/classes/VisualServer.xml msgid "" "Returns the propagation value for this GI probe. Equivalent to [member " "GIProbe.propagation]." -msgstr "返回这个GIæŽ¢é’ˆçš„ä¼ æ’值。相当于[member GIProbe.propagation]。" +msgstr "返回这个 GI æŽ¢é’ˆçš„ä¼ æ’值。相当于 [member GIProbe.propagation]。" #: doc/classes/VisualServer.xml msgid "Returns the Transform set by [method gi_probe_set_to_cell_xform]." -msgstr "返回由[method gi_probe_set_to_cell_xform]è®¾ç½®çš„å˜æ¢ã€‚" +msgstr "返回由 [method gi_probe_set_to_cell_xform] è®¾ç½®çš„å˜æ¢ã€‚" #: doc/classes/VisualServer.xml msgid "" "Returns [code]true[/code] if the GI probe data associated with this GI probe " "is compressed. Equivalent to [member GIProbe.compress]." msgstr "" -"如果与æ¤GI探针相关的数æ®è¢«åŽ‹ç¼©ï¼Œè¿”å›ž [code]true[/code]。相当于[member " +"如果与该 GI 探针相关的数æ®è¢«åŽ‹ç¼©ï¼Œè¿”å›ž [code]true[/code]。相当于 [member " "GIProbe.compress]。" #: doc/classes/VisualServer.xml @@ -86870,23 +87191,23 @@ msgid "" "Returns [code]true[/code] if the GI probe is set to interior, meaning it " "does not account for sky light. Equivalent to [member GIProbe.interior]." msgstr "" -"如果 GI 探针设置为内部,则返回 [code]true[/code],这æ„味ç€å®ƒä¸è€ƒè™‘天空光。相" -"当于[member GIProbe.interior]。" +"如果该 GI 探针设置为内部,则返回 [code]true[/code],这æ„味ç€å®ƒä¸è€ƒè™‘天空光。" +"相当于 [member GIProbe.interior]。" #: doc/classes/VisualServer.xml msgid "" "Sets the bias value to avoid self-occlusion. Equivalent to [member GIProbe." "bias]." -msgstr "设置å置值以é¿å…è‡ªé®æŒ¡ã€‚相当于[member GIProbe.bias]。" +msgstr "设置å置值以é¿å…è‡ªé®æŒ¡ã€‚相当于 [member GIProbe.bias]。" #: doc/classes/VisualServer.xml msgid "" "Sets the axis-aligned bounding box that covers the extent of the GI probe." -msgstr "设置覆盖 GI 探针范围的轴对é½è¾¹ç•Œæ¡†ã€‚" +msgstr "设置覆盖该 GI 探针范围的轴对é½è¾¹ç•Œæ¡†ã€‚" #: doc/classes/VisualServer.xml msgid "Sets the size of individual cells within the GI probe." -msgstr "设置 GI 探针内å•个å•元的大å°ã€‚" +msgstr "设置该 GI 探针内å•个å•元的大å°ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -86894,8 +87215,8 @@ msgid "" "take up less space but may look worse. Equivalent to [member GIProbe." "compress]." msgstr "" -"设置GI探针数æ®çš„压缩设置。压缩åŽçš„æ•°æ®å°†å 用更少的空间,但å¯èƒ½çœ‹èµ·æ¥æ›´ç³Ÿç³•。" -"相当于[member GIProbe.compress]。" +"设置该 GI 探针数æ®çš„压缩设置。压缩åŽçš„æ•°æ®å°†å 用更少的空间,但å¯èƒ½çœ‹èµ·æ¥æ›´ç³Ÿ" +"糕。相当于 [member GIProbe.compress]。" #: doc/classes/VisualServer.xml msgid "" @@ -86903,8 +87224,8 @@ msgid "" "this is created and called internally within the [GIProbe] node. You should " "not try to set this yourself." msgstr "" -"设置用于照明计算的GI探针的数æ®ã€‚通常这是在[GIProbe]èŠ‚ç‚¹å†…éƒ¨åˆ›å»ºå’Œè°ƒç”¨çš„ã€‚ä½ ä¸" -"应该å°è¯•自己设置。" +"设置用于照明计算的 GI 探针的数æ®ã€‚通常这是在 [GIProbe] 节点内部创建和调用的。" +"ä½ ä¸åº”该å°è¯•自己设置。" #: doc/classes/VisualServer.xml msgid "" @@ -86912,8 +87233,8 @@ msgid "" "bright lights can be. A smaller range captures greater detail but limits how " "bright lights can be. Equivalent to [member GIProbe.dynamic_range]." msgstr "" -"设定GI探针的动æ€èŒƒå›´ã€‚动æ€èŒƒå›´è®¾å®šäº†ç¯å…‰çš„亮度é™åˆ¶ã€‚较å°çš„范围å¯ä»¥æ•æ‰åˆ°æ›´å¤š" -"的细节,但是é™åˆ¶äº†ç¯å…‰çš„亮度。相当于[member GIProbe.dynamic_range]。" +"设置该 GI 探针的动æ€èŒƒå›´ã€‚动æ€èŒƒå›´è®¾å®šäº†ç¯å…‰çš„亮度é™åˆ¶ã€‚较å°çš„范围å¯ä»¥æ•æ‰åˆ°" +"更多的细节,但是é™åˆ¶äº†ç¯å…‰çš„亮度。相当于 [member GIProbe.dynamic_range]。" #: doc/classes/VisualServer.xml msgid "" @@ -86921,7 +87242,7 @@ msgid "" "indirect light from the GI probe brighter. Equivalent to [member GIProbe." "energy]." msgstr "" -"设置该GI探针的能é‡ä¹˜æ•°ã€‚较高的能é‡ä½¿GI探针的间接光更亮。相当于[member " +"设置这个 GI 探针的能é‡ä¹˜æ•°ã€‚较高的能é‡ä½¿ GI 探针的间接光更亮。相当于 [member " "GIProbe.energy]。" #: doc/classes/VisualServer.xml @@ -86930,7 +87251,7 @@ msgid "" "not include the sky when calculating lighting. Equivalent to [member GIProbe." "interior]." msgstr "" -"设置该 GI 探针的内部值。设置为内部的 GI 探针在计算照明时ä¸åŒ…括天空。相当于 " +"设置这个 GI 探针的内部值。设置为内部的 GI 探针在计算照明时ä¸åŒ…括天空。相当于 " "[member GIProbe.interior]。" #: doc/classes/VisualServer.xml @@ -86939,18 +87260,18 @@ msgid "" "other form of bias and may help reduce self-occlusion. Equivalent to [member " "GIProbe.normal_bias]." msgstr "" -"设置该GI探针的法线å置。法线å置的行为类似于其他形å¼çš„åç½®ï¼Œå¯æœ‰åŠ©äºŽå‡å°‘自我" -"鮿Œ¡ã€‚相当于[member GIProbe.normal_bias]。" +"设置这个 GI 探针的法线å置。法线å置的行为类似于其他形å¼çš„åç½®ï¼Œå¯æœ‰åŠ©äºŽå‡å°‘" +"è‡ªæˆ‘é®æŒ¡ã€‚相当于 [member GIProbe.normal_bias]。" #: doc/classes/VisualServer.xml msgid "" "Sets the propagation of light within this GI probe. Equivalent to [member " "GIProbe.propagation]." -msgstr "设置光在这个GI探针ä¸çš„ä¼ æ’。相当于[member GIProbe.propagation]。" +msgstr "设置光在这个 GI 探针ä¸çš„ä¼ æ’。相当于 [member GIProbe.propagation]。" #: doc/classes/VisualServer.xml msgid "Sets the to cell [Transform] for this GI probe." -msgstr "为这个GI探针设置å•å…ƒ[Transform]。" +msgstr "为这个 GI 探针设置å•å…ƒ [Transform]。" #: doc/classes/VisualServer.xml msgid "" @@ -86978,18 +87299,18 @@ msgid "" "[code]skinning_fallback[/code] in case the hardware doesn't support the " "default GPU skinning process." msgstr "" -"如果æ“ä½œç³»ç»Ÿæ”¯æŒæŸé¡¹åŠŸèƒ½ï¼Œåˆ™è¿”å›ž [code]true[/code]。特性å¯èƒ½æ˜¯[code]s3tc[/" -"code], [code]etc[/code], [code]etc2[/code], [code]pvrtc[/code] å’Œ " +"如果æ“ä½œç³»ç»Ÿæ”¯æŒæŸé¡¹åŠŸèƒ½ï¼Œåˆ™è¿”å›ž [code]true[/code]。特性å¯èƒ½æ˜¯ [code]s3tc[/" +"code]ã€[code]etc[/code]ã€[code]etc2[/code]ã€[code]pvrtc[/code] å’Œ " "[code]skinning_fallback[/code]。\n" -"当使用GLES2æ¸²æŸ“æ—¶ï¼Œåœ¨ç¡¬ä»¶ä¸æ”¯æŒé»˜è®¤çš„GPU蒙皮过程的情况下,返回 [code]true[/" -"code]与[code]skinning_fallback[/code]。" +"当使用 GLES2 æ¸²æŸ“æ—¶ï¼Œåœ¨ç¡¬ä»¶ä¸æ”¯æŒé»˜è®¤çš„ GPU 蒙皮过程的情况下,返回 " +"[code]true[/code] 与 [code]skinning_fallback[/code]。" #: doc/classes/VisualServer.xml msgid "" "Sets up [ImmediateGeometry] internals to prepare for drawing. Equivalent to " "[method ImmediateGeometry.begin]." msgstr "" -"设置[ImmediateGeometry]的内部结构,为绘图åšå‡†å¤‡ã€‚相当于[method " +"设置 [ImmediateGeometry] 的内部结构,为绘图åšå‡†å¤‡ã€‚相当于 [method " "ImmediateGeometry.begin]。" #: doc/classes/VisualServer.xml @@ -87004,7 +87325,8 @@ msgstr "" msgid "" "Sets the color to be used with next vertex. Equivalent to [method " "ImmediateGeometry.set_color]." -msgstr "设置用于下一个顶点的颜色。相当于[method ImmediateGeometry.set_color]。" +msgstr "" +"设置用于下一个顶点的颜色。相当于 [method ImmediateGeometry.set_color]。" #: doc/classes/VisualServer.xml msgid "" @@ -87016,60 +87338,61 @@ msgid "" "To place in a scene, attach this immediate geometry to an instance using " "[method instance_set_base] using the returned RID." msgstr "" -"åˆ›å»ºç›´æŽ¥å‡ ä½•å›¾å½¢å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的RID进行访问。这个" -"RIDå¯åœ¨æ‰€æœ‰[code]immediate_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" -"一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放" -"RID。\n" -"è¦åœ¨åœºæ™¯ä¸æ”¾ç½®ï¼Œä½¿ç”¨è¿”回的RID用[method instance_set_base]å°†è¿™ä¸ªç›´æŽ¥å‡ ä½•ä½“é™„åŠ " -"到一个实例上。" +"åˆ›å»ºç›´æŽ¥å‡ ä½•å›¾å½¢å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的 RID 进行访问。" +"这个 RID å¯åœ¨æ‰€æœ‰ [code]immediate_*[/code] VisualServer 函数ä¸ä½¿ç”¨ã€‚\n" +"一旦完æˆäº†å¯¹ RID 的处ç†ï¼Œå¯ä½¿ç”¨ VisualServer çš„ [method free_rid] 陿€æ–¹æ³•释" +"放 RID。\n" +"è¦åœ¨åœºæ™¯ä¸æ”¾ç½®ï¼Œä½¿ç”¨è¿”回的 RID 用 [method instance_set_base] å°†è¿™ä¸ªç›´æŽ¥å‡ ä½•ä½“" +"é™„åŠ åˆ°ä¸€ä¸ªå®žä¾‹ä¸Šã€‚" #: doc/classes/VisualServer.xml msgid "" "Ends drawing the [ImmediateGeometry] and displays it. Equivalent to [method " "ImmediateGeometry.end]." msgstr "" -"结æŸç»˜åˆ¶[ImmediateGeometry]并显示它。相当于[method ImmediateGeometry.end]。" +"结æŸç»˜åˆ¶ [ImmediateGeometry] 并进行显示。相当于 [method ImmediateGeometry." +"end]。" #: doc/classes/VisualServer.xml msgid "Returns the material assigned to the [ImmediateGeometry]." -msgstr "返回分é…ç»™[ImmediateGeometry]çš„æè´¨ã€‚" +msgstr "返回分é…给该 [ImmediateGeometry] çš„æè´¨ã€‚" #: doc/classes/VisualServer.xml msgid "" "Sets the normal to be used with next vertex. Equivalent to [method " "ImmediateGeometry.set_normal]." msgstr "" -"设置用于下一个顶点的法线。相当于[method ImmediateGeometry.set_normal]。" +"设置用于下一个顶点的法线。相当于 [method ImmediateGeometry.set_normal]。" #: doc/classes/VisualServer.xml msgid "Sets the material to be used to draw the [ImmediateGeometry]." -msgstr "设置用于绘制[ImmediateGeometry]çš„æè´¨ã€‚" +msgstr "设置用于绘制该 [ImmediateGeometry] çš„æè´¨ã€‚" #: doc/classes/VisualServer.xml msgid "" "Sets the tangent to be used with next vertex. Equivalent to [method " "ImmediateGeometry.set_tangent]." msgstr "" -"设置用于下一个顶点的切线。相当于[method ImmediateGeometry.set_tangent]。" +"设置用于下一个顶点的切线。相当于 [method ImmediateGeometry.set_tangent]。" #: doc/classes/VisualServer.xml msgid "" "Sets the UV to be used with next vertex. Equivalent to [method " "ImmediateGeometry.set_uv]." -msgstr "设置用于下一个顶点的UV。相当于[method ImmediateGeometry.set_uv]。" +msgstr "设置用于下一个顶点的 UV。相当于 [method ImmediateGeometry.set_uv]。" #: doc/classes/VisualServer.xml msgid "" "Sets the UV2 to be used with next vertex. Equivalent to [method " "ImmediateGeometry.set_uv2]." -msgstr "设置用于下一个顶点的UV2。相当于[method ImmediateGeometry.set_uv2]。" +msgstr "设置用于下一个顶点的 UV2。相当于 [method ImmediateGeometry.set_uv2]。" #: doc/classes/VisualServer.xml msgid "" "Adds the next vertex using the information provided in advance. Equivalent " "to [method ImmediateGeometry.add_vertex]." msgstr "" -"使用预先æä¾›çš„ä¿¡æ¯æ·»åŠ ä¸‹ä¸€ä¸ªé¡¶ç‚¹ã€‚ç›¸å½“äºŽ[method ImmediateGeometry." +"使用预先æä¾›çš„ä¿¡æ¯æ·»åŠ ä¸‹ä¸€ä¸ªé¡¶ç‚¹ã€‚ç›¸å½“äºŽ [method ImmediateGeometry." "add_vertex]。" #: doc/classes/VisualServer.xml @@ -87078,8 +87401,8 @@ msgid "" "helper class that calls [method immediate_vertex] under the hood. Equivalent " "to [method ImmediateGeometry.add_vertex]." msgstr "" -"使用预先æä¾›çš„ä¿¡æ¯æ·»åŠ ä¸‹ä¸€ä¸ªé¡¶ç‚¹ã€‚è¿™æ˜¯ä¸€ä¸ªè¾…åŠ©ç±»ï¼Œå®ƒåœ¨åŽå°è°ƒç”¨[method " -"immediate_vertex]。相当于[method ImmediateGeometry.add_vertex]。" +"使用预先æä¾›çš„ä¿¡æ¯æ·»åŠ ä¸‹ä¸€ä¸ªé¡¶ç‚¹ã€‚è¿™æ˜¯ä¸€ä¸ªè¾…åŠ©ç±»ï¼Œå®ƒåœ¨åŽå°è°ƒç”¨ [method " +"immediate_vertex]。相当于 [method ImmediateGeometry.add_vertex]。" #: doc/classes/VisualServer.xml msgid "" @@ -87096,9 +87419,9 @@ msgid "" "instance for proper culling with [method instances_cull_aabb], [method " "instances_cull_convex], and [method instances_cull_ray]." msgstr "" -"将唯一的对象IDé™„åŠ åˆ°å®žä¾‹ä¸Šã€‚å¿…é¡»å°†å¯¹è±¡IDé™„åŠ åˆ°å®žä¾‹ä¸Šï¼Œä»¥ä¾¿é€šè¿‡[method " -"instances_cull_aabb]ã€[method instances_cull_convex]å’Œ[method " -"instances_cull_ray]进行æ£ç¡®çš„ç›é™¤ã€‚" +"将唯一的对象 ID é™„åŠ åˆ°å®žä¾‹ä¸Šã€‚å¿…é¡»å°†å¯¹è±¡ ID é™„åŠ åˆ°å®žä¾‹ä¸Šï¼Œä»¥ä¾¿é€šè¿‡ [method " +"instances_cull_aabb]ã€[method instances_cull_convex] å’Œ [method " +"instances_cull_ray] 进行æ£ç¡®çš„ç›é™¤ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -87117,7 +87440,7 @@ msgid "" "particles, meshes, and reflection probes need to be associated with an " "instance to be visible in the scenario using [method instance_set_base]." msgstr "" -"创建一个å¯è§†åŒ–å®žä¾‹å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个" +"创建一个å¯è§†åŒ–å®žä¾‹å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个" "RIDå¯åœ¨æ‰€æœ‰[code]instance_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放" "RID。\n" @@ -87132,8 +87455,9 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"创建一个å¯è§†åŒ–å®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ°VisualServerä¸ï¼Œå¹¶è®¾ç½®åŸºæœ¬å’Œæ•ˆæžœã€‚å¯ä»¥ç”¨è¿”回的" -"RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯åœ¨æ‰€æœ‰[code]instance_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" +"创建一个å¯è§†åŒ–å®žä¾‹ï¼Œå°†å…¶æ·»åŠ åˆ° VisualServer ä¸ï¼Œå¹¶è®¾ç½®åŸºæœ¬å’Œæ•ˆæžœã€‚å¯ä»¥ç”¨è¿”回" +"çš„RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯åœ¨æ‰€æœ‰[code]instance_*[/code]VisualServer函数ä¸ä½¿" +"用。\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -87153,7 +87477,7 @@ msgid "" "Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for " "more details." msgstr "" -"设置给定的[enum InstanceFlags]æ ‡å¿—ã€‚æ›´å¤šç»†èŠ‚è¯·å‚阅[enum InstanceFlags]。" +"设置给定的 [enum InstanceFlags] æ ‡å¿—ã€‚æ›´å¤šç»†èŠ‚è¯·å‚阅 [enum InstanceFlags]。" #: doc/classes/VisualServer.xml msgid "" @@ -87161,7 +87485,7 @@ msgid "" "materials for the mesh associated with this instance. Equivalent to [member " "GeometryInstance.material_overlay]." msgstr "" -"ä¸ºè¯¥å®žä¾‹çš„ç½‘æ ¼è®¾ç½®æè´¨ï¼Œå°†åœ¨æ‰€æœ‰è¡¨é¢çš„æ´»åЍæè´¨ä¸Šå±‚进行渲染。ç‰ä»·äºŽ [member " +"ä¸ºè¯¥å®žä¾‹çš„ç½‘æ ¼è®¾ç½®æè´¨ï¼Œå°†åœ¨æ‰€æœ‰è¡¨é¢çš„æ´»åЍæè´¨ä¸Šå±‚进行渲染。相当于 [member " "GeometryInstance.material_overlay]。" #: doc/classes/VisualServer.xml @@ -87170,7 +87494,7 @@ msgid "" "associated with this instance. Equivalent to [member GeometryInstance." "material_override]." msgstr "" -"设置一个æè´¨ï¼Œè¦†ç›–与æ¤å®žä¾‹å…³è”çš„ç½‘æ ¼ä¸Šçš„æ‰€æœ‰è¡¨é¢çš„æè´¨ã€‚相当于[member " +"设置一个æè´¨ï¼Œè¦†ç›–与æ¤å®žä¾‹å…³è”çš„ç½‘æ ¼ä¸Šçš„æ‰€æœ‰è¡¨é¢çš„æè´¨ã€‚相当于 [member " "GeometryInstance.material_override]。" #: doc/classes/VisualServer.xml @@ -87181,9 +87505,9 @@ msgid "" "reflection probe, lightmap capture, and the GI probe are all types that can " "be set as the base of an instance in order to be displayed in the scenario." msgstr "" -"设置实例的基类。基类å¯ä»¥æ˜¯VisualServerä¸åˆ›å»ºçš„任何å¯ä»¥æ˜¾ç¤ºçš„3D对象。例如,光" -"照类型ã€ç½‘æ ¼ã€å¤šç½‘æ ¼ã€åŸºæœ¬å‡ 何ã€ç²’å系统ã€å射探针ã€å…‰ç…§å›¾æ•æ‰å’ŒGI探针ç‰ç±»åž‹" -"都å¯ä»¥è¢«è®¾ç½®ä¸ºå®žä¾‹çš„åŸºç±»ï¼Œä»¥ä¾¿åœ¨åœºæ™¯ä¸æ˜¾ç¤ºã€‚" +"设置实例的基类。基类å¯ä»¥æ˜¯ VisualServer ä¸åˆ›å»ºçš„任何å¯ä»¥æ˜¾ç¤ºçš„3D对象。例如," +"光照类型ã€ç½‘æ ¼ã€å¤šç½‘æ ¼ã€åŸºæœ¬å‡ 何ã€ç²’å系统ã€å射探针ã€å…‰ç…§å›¾æ•æ‰å’ŒGI探针ç‰ç±»" +"型都å¯ä»¥è¢«è®¾ç½®ä¸ºå®žä¾‹çš„åŸºç±»ï¼Œä»¥ä¾¿åœ¨åœºæ™¯ä¸æ˜¾ç¤ºã€‚" #: doc/classes/VisualServer.xml msgid "Sets the weight for a given blend shape associated with this instance." @@ -87194,12 +87518,12 @@ msgid "" "Sets a custom AABB to use when culling objects from the view frustum. " "Equivalent to [method GeometryInstance.set_custom_aabb]." msgstr "" -"设置自定义的AABB,当从视图ä¸å‰”除对象时使用。相当于[method GeometryInstance." +"设置自定义的 AABB,当从视图ä¸å‰”除对象时使用。相当于 [method GeometryInstance." "set_custom_aabb]。" #: doc/classes/VisualServer.xml msgid "Function not implemented in Godot 3.x." -msgstr "在Godot 3.x䏿²¡æœ‰å®žçŽ°çš„åŠŸèƒ½ã€‚" +msgstr "在 Godot 3.x 䏿²¡æœ‰å®žçŽ°çš„åŠŸèƒ½ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -87207,14 +87531,14 @@ msgid "" "view frustum. This allows you to avoid culling objects that fall outside the " "view frustum. Equivalent to [member GeometryInstance.extra_cull_margin]." msgstr "" -"设置边è·ï¼Œåœ¨å‰”é™¤è§†åŸŸèŒƒå›´å†…çš„å¯¹è±¡æ—¶å¢žåŠ AABB的大å°ã€‚è¿™å¯ä»¥è®©ä½ é¿å…剔除è½åœ¨è§†åŸŸ" -"范围外的物体。相当于[member GeometryInstance.extra_cull_margin]。" +"设置边è·ï¼Œåœ¨å‰”é™¤è§†åŸŸèŒƒå›´å†…çš„å¯¹è±¡æ—¶å¢žåŠ AABB 的大å°ã€‚è¿™å¯ä»¥è®©ä½ é¿å…剔除è½åœ¨è§†" +"域范围外的物体。相当于 [member GeometryInstance.extra_cull_margin]。" #: doc/classes/VisualServer.xml msgid "" "Sets the render layers that this instance will be drawn to. Equivalent to " "[member VisualInstance.layers]." -msgstr "设置该实例将被绘制的渲染层。相当于[member VisualInstance.layers]。" +msgstr "设置该实例将被绘制的渲染层。相当于 [member VisualInstance.layers]。" #: doc/classes/VisualServer.xml msgid "" @@ -87226,13 +87550,14 @@ msgstr "è®¾ç½®å®žä¾‹æ‰€åœ¨çš„åœºæ™¯ã€‚åœºæ™¯æ˜¯å¯¹è±¡å°†åœ¨å…¶ä¸æ˜¾ç¤ºçš„ 3D ä¸ msgid "" "Sets the material of a specific surface. Equivalent to [method MeshInstance." "set_surface_material]." -msgstr "设置特定表é¢çš„æè´¨ã€‚相当于[method MeshInstance.set_surface_material]。" +msgstr "" +"设置特定表é¢çš„æè´¨ã€‚相当于 [method MeshInstance.set_surface_material]。" #: doc/classes/VisualServer.xml msgid "" "Sets the world space transform of the instance. Equivalent to [member " "Spatial.transform]." -msgstr "è®¾ç½®å®žä¾‹çš„ä¸–ç•Œç©ºé—´å˜æ¢ã€‚相当于[member Spatial.transform]。" +msgstr "è®¾ç½®å®žä¾‹çš„ä¸–ç•Œç©ºé—´å˜æ¢ã€‚相当于 [member Spatial.transform]。" #: doc/classes/VisualServer.xml msgid "Sets the lightmap to use with this instance." @@ -87255,10 +87580,10 @@ msgid "" "[b]Warning:[/b] This function is primarily intended for editor usage. For in-" "game use cases, prefer physics collision." msgstr "" -"返回一个与所æä¾›çš„AABB相交的物体ID数组。åªè€ƒè™‘å¯è§†åŒ–çš„3D节点,例如" -"[MeshInstance]或[DirectionalLight]。使用[method @GDScript.instance_from_id]æ¥" -"获å–实际节点。这必须æä¾›ä¸€ä¸ªåœºæ™¯çš„RID,该RIDåœ¨ä½ æƒ³æŸ¥è¯¢çš„[World]䏿˜¯å¯ç”¨çš„。这" -"将强制更新所有排队ç‰å¾…更新的资æºã€‚\n" +"返回一个与所æä¾›çš„ AABB 相交的物体 ID 数组。åªè€ƒè™‘å¯è§†åŒ–çš„ 3D 节点,例如 " +"[MeshInstance] 或 [DirectionalLight]。使用 [method @GDScript." +"instance_from_id] æ¥èŽ·å–实际节点。这必须æä¾›ä¸€ä¸ªåœºæ™¯çš„ RID,该 RID åœ¨ä½ æƒ³æŸ¥è¯¢" +"çš„ [World] 䏿˜¯å¯ç”¨çš„。这将强制更新所有排队ç‰å¾…更新的资æºã€‚\n" "[b]è¦å‘Šï¼š[/b]这个函数主è¦ç”¨äºŽç¼–辑器使用。对于游æˆä¸çš„使用情况,最好是物ç†ç¢°" "撞。" @@ -87356,14 +87681,14 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Sets the color of the light. Equivalent to [member Light.light_color]." -msgstr "设置ç¯å…‰çš„颜色。相当于[member Light.light_color]。" +msgstr "设置ç¯å…‰çš„颜色。相当于 [member Light.light_color]。" #: doc/classes/VisualServer.xml msgid "" "Sets the cull mask for this Light. Lights only affect objects in the " "selected layers. Equivalent to [member Light.light_cull_mask]." msgstr "" -"设置æ¤ç¯å…‰çš„剔除é®ç½©ã€‚ç¯å…‰ä»…å½±å“选定图层ä¸çš„对象。相当于[member Light." +"设置æ¤ç¯å…‰çš„剔除é®ç½©ã€‚ç¯å…‰ä»…å½±å“选定图层ä¸çš„对象。相当于 [member Light." "light_cull_mask]。" #: doc/classes/VisualServer.xml @@ -87371,7 +87696,7 @@ msgid "" "If [code]true[/code], light will subtract light instead of adding light. " "Equivalent to [member Light.light_negative]." msgstr "" -"如果[code]true[/code],光将å‡åŽ»å…‰è€Œä¸æ˜¯å¢žåŠ å…‰ã€‚ç›¸å½“äºŽ[member Light." +"如果为 [code]true[/code],光将å‡åŽ»å…‰è€Œä¸æ˜¯å¢žåŠ å…‰ã€‚ç›¸å½“äºŽ [member Light." "light_negative]。" #: doc/classes/VisualServer.xml @@ -87379,7 +87704,7 @@ msgid "" "Sets the specified light parameter. See [enum LightParam] for options. " "Equivalent to [method Light.set_param]." msgstr "" -"设置指定的ç¯å…‰å‚数。å‚阅[enum LightParam]的选项。相当于[method Light." +"设置指定的ç¯å…‰å‚数。å‚阅 [enum LightParam] 的选项。相当于 [method Light." "set_param]。" #: doc/classes/VisualServer.xml @@ -87390,8 +87715,8 @@ msgid "" "shadows with [method instance_geometry_set_cast_shadows_setting]. Equivalent " "to [member Light.shadow_reverse_cull_face]." msgstr "" -"如果[code]true[/code],åè½¬ç½‘æ ¼çš„èƒŒé¢å‰”é™¤ã€‚å½“ä½ æœ‰ä¸€ä¸ªå¹³é¢ç½‘æ ¼åŽé¢æœ‰ç¯å…‰æ—¶ï¼Œè¿™" -"å¯èƒ½å¾ˆæœ‰ç”¨ã€‚å¦‚æžœä½ éœ€è¦åœ¨ç½‘æ ¼çš„ä¸¤é¢éƒ½æŠ•下阴影,å¯ä»¥ç”¨[method " +"如果为 [code]true[/code],åè½¬ç½‘æ ¼çš„èƒŒé¢å‰”é™¤ã€‚å½“ä½ æœ‰ä¸€ä¸ªå¹³é¢ç½‘æ ¼åŽé¢æœ‰ç¯å…‰" +"时,这å¯èƒ½å¾ˆæœ‰ç”¨ã€‚å¦‚æžœä½ éœ€è¦åœ¨ç½‘æ ¼çš„ä¸¤é¢éƒ½æŠ•下阴影,å¯ä»¥ç”¨[method " "instance_geometry_set_cast_shadows_setting]å°†ç½‘æ ¼è®¾ç½®ä¸ºä½¿ç”¨åŒé¢é˜´å½±ã€‚相当于" "[member Light.shadow_reverse_cull_face]。" @@ -87400,13 +87725,14 @@ msgid "" "If [code]true[/code], light will cast shadows. Equivalent to [member Light." "shadow_enabled]." msgstr "" -"如果[code]true[/code],光线会投射阴影。相当于[member Light.shadow_enabled]。" +"如果为 [code]true[/code],光线会投射阴影。相当于 [member Light." +"shadow_enabled]。" #: doc/classes/VisualServer.xml msgid "" "Sets the color of the shadow cast by the light. Equivalent to [member Light." "shadow_color]." -msgstr "设置ç¯å…‰æŠ•射阴影的颜色。相当于[member Light.shadow_color]。" +msgstr "设置ç¯å…‰æŠ•射阴影的颜色。相当于 [member Light.shadow_color]。" #: doc/classes/VisualServer.xml msgid "" @@ -87432,8 +87758,8 @@ msgid "" "To place in a scene, attach this lightmap capture to an instance using " "[method instance_set_base] using the returned RID." msgstr "" -"创建一个光照贴图æ•èŽ·å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个" -"RIDå¯ç”¨äºŽæ‰€æœ‰[code]lightmap_capture_*[/code] VisualServer函数。\n" +"创建一个光照贴图æ•èŽ·å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚è¿™" +"个RIDå¯ç”¨äºŽæ‰€æœ‰[code]lightmap_capture_*[/code] VisualServer函数。\n" "一旦完æˆäº†RID处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。\n" "è¦åœ¨åœºæ™¯ä¸æ”¾ç½®ï¼Œä½¿ç”¨è¿”回的RID,用[method instance_set_base]将这个lightmap " "captureé™„åŠ åˆ°ä¸€ä¸ªå®žä¾‹ä¸Šã€‚" @@ -87475,7 +87801,7 @@ msgid "" "Sets the energy multiplier for this lightmap capture. Equivalent to [member " "BakedLightmapData.energy]." msgstr "" -"设置æ¤å…‰ç…§è´´å›¾æ•获的能é‡ä¹˜æ•°ã€‚相当于[member BakedLightmapData.energy]。" +"设置æ¤å…‰ç…§è´´å›¾æ•获的能é‡ä¹˜æ•°ã€‚相当于 [member BakedLightmapData.energy]。" #: doc/classes/VisualServer.xml msgid "" @@ -87492,14 +87818,14 @@ msgid "" "BakedLightmapData.octree]." msgstr "" "设置æ¤å…‰ç…§è´´å›¾æ•获è¦ä½¿ç”¨çš„八剿 ‘。该函数通常由 [BakedLightmap] 节点使用。相当" -"于[member BakedLightmapData.octree]。" +"于 [member BakedLightmapData.octree]。" #: doc/classes/VisualServer.xml msgid "" "Sets the subdivision level of this lightmap capture's octree. Equivalent to " "[member BakedLightmapData.cell_subdiv]." msgstr "" -"设置æ¤å…‰ç…§è´´å›¾æ•èŽ·å…«å‰æ ‘的细分级别。相当于[member BakedLightmapData." +"设置æ¤å…‰ç…§è´´å›¾æ•èŽ·å…«å‰æ ‘的细分级别。相当于 [member BakedLightmapData." "cell_subdiv]。" #: doc/classes/VisualServer.xml @@ -87507,7 +87833,7 @@ msgid "" "Sets the octree cell transform for this lightmap capture's octree. " "Equivalent to [member BakedLightmapData.cell_space_transform]." msgstr "" -"设置æ¤å…‰ç…§è´´å›¾æ•èŽ·çš„å…«å‰æ ‘çš„å…«å‰æ ‘å•å…ƒå˜æ¢ã€‚相当于[member BakedLightmapData." +"设置æ¤å…‰ç…§è´´å›¾æ•èŽ·çš„å…«å‰æ ‘çš„å…«å‰æ ‘å•å…ƒå˜æ¢ã€‚相当于 [member BakedLightmapData." "cell_space_transform]。" #: doc/classes/VisualServer.xml @@ -87716,22 +88042,20 @@ msgstr "" msgid "" "Calculates and returns the axis-aligned bounding box that encloses all " "instances within the multimesh." -msgstr "" -"计算并返回轴对é½çš„边界框(包围盒),该边界框(包围盒)将所有的实例都包å«åœ¨" -"multimeshä¸ã€‚" +msgstr "计算并返回轴对é½çš„包围盒,该包围盒将所有的实例都包å«åœ¨ multimesh ä¸ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the number of instances allocated for this multimesh." -msgstr "返回分é…给这个multimesh的实例的数é‡ã€‚" +msgstr "返回分é…给这个 multimesh 的实例的数é‡ã€‚" #: doc/classes/VisualServer.xml msgid "" "Returns the RID of the mesh that will be used in drawing this multimesh." -msgstr "返回用于绘制æ¤multimeshçš„RID。" +msgstr "è¿”å›žç”¨äºŽç»˜åˆ¶æ¤ multimesh çš„ RID。" #: doc/classes/VisualServer.xml msgid "Returns the number of visible instances for this multimesh." -msgstr "返回æ¤multimeshçš„å¯è§å®žä¾‹æ•°ã€‚" +msgstr "è¿”å›žæ¤ multimesh çš„å¯è§å®žä¾‹æ•°ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the color by which the specified instance will be modulated." @@ -87743,19 +88067,20 @@ msgstr "返回与指定实例相关的自定义数æ®ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the [Transform] of the specified instance." -msgstr "返回指定实例的[Transform]。" +msgstr "返回指定实例的 [Transform]。" #: doc/classes/VisualServer.xml msgid "" "Returns the [Transform2D] of the specified instance. For use when the " "multimesh is set to use 2D transforms." -msgstr "返回指定实例的 [Transform2D]。åªåœ¨multimesh设置为使用 2D å˜æ¢æ—¶ä½¿ç”¨ã€‚" +msgstr "" +"返回指定实例的 [Transform2D]。åªåœ¨ multimesh 设置为使用 2D å˜æ¢æ—¶ä½¿ç”¨ã€‚" #: doc/classes/VisualServer.xml msgid "" "Sets the color by which this instance will be modulated. Equivalent to " "[method MultiMesh.set_instance_color]." -msgstr "设置这个实例的调制颜色。ç‰åŒäºŽ[method MultiMesh.set_instance_color]。" +msgstr "设置这个实例的调制颜色。相当于 [method MultiMesh.set_instance_color]。" #: doc/classes/VisualServer.xml msgid "" @@ -87763,22 +88088,22 @@ msgid "" "but is interpreted as a [code]vec4[/code] in the shader. Equivalent to " "[method MultiMesh.set_instance_custom_data]." msgstr "" -"为这个实例设置自定义数æ®ã€‚自定义数æ®ä»¥[Color]的形å¼ä¼ 递,但在ç€è‰²å™¨ä¸ä¼šè¢«è§£é‡Š" -"为[code]vec4[/code]。ç‰åŒäºŽ[method MultiMesh.set_instance_custom_data]。" +"为这个实例设置自定义数æ®ã€‚自定义数æ®ä»¥ [Color] 的形å¼ä¼ 递,但在ç€è‰²å™¨ä¸ä¼šè¢«è§£" +"释为 [code]vec4[/code]。相当于 [method MultiMesh.set_instance_custom_data]。" #: doc/classes/VisualServer.xml msgid "" "Sets the [Transform] for this instance. Equivalent to [method MultiMesh." "set_instance_transform]." msgstr "" -"设置æ¤å®žä¾‹çš„ [Transform]。相当于[method MultiMesh.set_instance_transform]。" +"设置æ¤å®žä¾‹çš„ [Transform]。相当于 [method MultiMesh.set_instance_transform]。" #: doc/classes/VisualServer.xml msgid "" "Sets the [Transform2D] for this instance. For use when multimesh is used in " "2D. Equivalent to [method MultiMesh.set_instance_transform_2d]." msgstr "" -"为æ¤å®žä¾‹è®¾ç½® [Transform2D]。用于在 2D ä¸ä½¿ç”¨multimesh时。相当于[method " +"为æ¤å®žä¾‹è®¾ç½® [Transform2D]。用于在 2D ä¸ä½¿ç”¨ multimesh 时。相当于 [method " "MultiMesh.set_instance_transform_2d]。" #: doc/classes/VisualServer.xml @@ -87810,7 +88135,7 @@ msgstr "" msgid "" "Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." "mesh]." -msgstr "设置Multimesh所è¦ç»˜åˆ¶çš„ç½‘æ ¼ã€‚ç‰åŒäºŽ [member MultiMesh.mesh]。" +msgstr "设置 Multimesh 所è¦ç»˜åˆ¶çš„ç½‘æ ¼ã€‚ç›¸å½“äºŽ [member MultiMesh.mesh]。" #: doc/classes/VisualServer.xml msgid "" @@ -87818,8 +88143,8 @@ msgid "" "that have been allocated are drawn. Equivalent to [member MultiMesh." "visible_instance_count]." msgstr "" -"设置在给定时间内å¯è§çš„实例的数é‡ã€‚如果是-1,所有被分é…的实例都会被画出æ¥ã€‚ç‰" -"åŒäºŽ[member MultiMesh.visible_instance_count]。" +"设置在给定时间内å¯è§çš„实例的数é‡ã€‚如果是 -1,所有被分é…的实例都会被画出æ¥ã€‚相" +"当于 [member MultiMesh.visible_instance_count]。" #: doc/classes/VisualServer.xml msgid "" @@ -87859,7 +88184,8 @@ msgid "" "Calculates and returns the axis-aligned bounding box that contains all the " "particles. Equivalent to [method Particles.capture_aabb]." msgstr "" -"è®¡ç®—å¹¶è¿”å›žåŒ…å«æ‰€æœ‰ç²’å的轴对é½è¾¹ç•Œæ¡†ã€‚相当于[method Particles.capture_aabb]。" +"è®¡ç®—å¹¶è¿”å›žåŒ…å«æ‰€æœ‰ç²’å的轴对é½è¾¹ç•Œæ¡†ã€‚相当于 [method Particles." +"capture_aabb]。" #: doc/classes/VisualServer.xml msgid "Returns [code]true[/code] if particles are currently set to emitting." @@ -87886,14 +88212,14 @@ msgstr "" msgid "" "Reset the particles on the next update. Equivalent to [method Particles." "restart]." -msgstr "在下次更新时é‡ç½®ç²’å。相当于[method Particles.restart]。" +msgstr "在下次更新时é‡ç½®ç²’å。相当于 [method Particles.restart]。" #: doc/classes/VisualServer.xml msgid "" "Sets the number of particles to be drawn and allocates the memory for them. " "Equivalent to [member Particles.amount]." msgstr "" -"设置è¦ç»˜åˆ¶çš„ç²’å的数é‡ï¼Œå¹¶ä¸ºå…¶åˆ†é…内å˜ã€‚相当于[member Particles.amount]。" +"设置è¦ç»˜åˆ¶çš„ç²’å的数é‡ï¼Œå¹¶ä¸ºå…¶åˆ†é…内å˜ã€‚相当于 [member Particles.amount]。" #: doc/classes/VisualServer.xml msgid "" @@ -87938,8 +88264,8 @@ msgid "" "not reset the particles, but only stops their emission. Equivalent to " "[member Particles.emitting]." msgstr "" -"如果[code]true[/code],粒å会éšç€æ—¶é—´çš„æŽ¨ç§»è€Œå‘射出æ¥ã€‚设置为falseä¸ä¼šé‡ç½®ç²’" -"åï¼Œè€Œåªæ˜¯åœæ¢å…¶å‘射。相当于[member Particles.emitting]。" +"如果为 [code]true[/code],粒å会éšç€æ—¶é—´çš„æŽ¨ç§»è€Œå‘射出æ¥ã€‚设置为falseä¸ä¼šé‡ç½®" +"ç²’åï¼Œè€Œåªæ˜¯åœæ¢å…¶å‘射。相当于[member Particles.emitting]。" #: doc/classes/VisualServer.xml msgid "" @@ -87957,7 +88283,7 @@ msgid "" "If [code]true[/code], uses fractional delta which smooths the movement of " "the particles. Equivalent to [member Particles.fract_delta]." msgstr "" -"如果 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨åˆ†æ•°å¢žé‡æ¥å¹³æ»‘ç²’åçš„è¿åŠ¨ã€‚ç›¸å½“äºŽ [member " +"如果为 [code]true[/code]ï¼Œåˆ™ä½¿ç”¨åˆ†æ•°å¢žé‡æ¥å¹³æ»‘ç²’åçš„è¿åŠ¨ã€‚ç›¸å½“äºŽ [member " "Particles.fract_delta]。" #: doc/classes/VisualServer.xml @@ -87971,7 +88297,7 @@ msgid "" "If [code]true[/code], particles will emit once and then stop. Equivalent to " "[member Particles.one_shot]." msgstr "" -"如果 [code]true[/code],粒åå°†å‘射一次然åŽåœæ¢ã€‚相当于 [member Particles." +"如果为 [code]true[/code],粒åå°†å‘射一次然åŽåœæ¢ã€‚相当于 [member Particles." "one_shot]。" #: doc/classes/VisualServer.xml @@ -88012,8 +88338,8 @@ msgid "" "If [code]true[/code], particles use local coordinates. If [code]false[/code] " "they use global coordinates. Equivalent to [member Particles.local_coords]." msgstr "" -"如果 [code]true[/code],粒åä½¿ç”¨å±€éƒ¨åæ ‡ã€‚如果 [code]false[/code] 其使用全局" -"åæ ‡ã€‚相当于 [member Particles.local_coords]。" +"如果为 [code]true[/code],粒åä½¿ç”¨å±€éƒ¨åæ ‡ã€‚如果 [code]false[/code] 其使用全" +"å±€åæ ‡ã€‚相当于 [member Particles.local_coords]。" #: doc/classes/VisualServer.xml msgid "" @@ -88025,8 +88351,8 @@ msgid "" "To place in a scene, attach this reflection probe to an instance using " "[method instance_set_base] using the returned RID." msgstr "" -"创建一个åå°„æŽ¢é’ˆå¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RID" -"å¯ç”¨äºŽæ‰€æœ‰[code]reflection_probe_*[/code] VisualServer函数。\n" +"创建一个åå°„æŽ¢é’ˆå¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个" +"RIDå¯ç”¨äºŽæ‰€æœ‰[code]reflection_probe_*[/code] VisualServer函数。\n" "一旦完æˆäº†RID处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。\n" "è¦åœ¨åœºæ™¯ä¸æ”¾ç½®ï¼Œä½¿ç”¨è¿”回的RID,用[method instance_set_base]将这个åå°„æŽ¢é’ˆé™„åŠ " "到一个实例上。" @@ -88036,8 +88362,8 @@ msgid "" "If [code]true[/code], reflections will ignore sky contribution. Equivalent " "to [member ReflectionProbe.interior_enable]." msgstr "" -"如果 [code]true[/code],å射将忽略天空的贡献。相当于 [member ReflectionProbe." -"interior_enable]。" +"如果为 [code]true[/code],å射将忽略天空的贡献。相当于 [member " +"ReflectionProbe.interior_enable]。" #: doc/classes/VisualServer.xml msgid "" @@ -88045,8 +88371,8 @@ msgid "" "matching cull mask will be rendered by this probe. Equivalent to [member " "ReflectionProbe.cull_mask]." msgstr "" -"为这个å射探针设置渲染é®è”½ã€‚åªæœ‰å…·æœ‰åŒ¹é…çš„é®è”½ç½©çš„实例æ‰ä¼šè¢«è¿™ä¸ªæŽ¢é’ˆæ¸²æŸ“。ç‰" -"åŒäºŽ[member ReflectionProbe.cull_mask]。" +"为这个å射探针设置渲染é®è”½ã€‚åªæœ‰å…·æœ‰åŒ¹é…çš„é®è”½ç½©çš„实例æ‰ä¼šè¢«è¿™ä¸ªæŽ¢é’ˆæ¸²æŸ“。相" +"当于 [member ReflectionProbe.cull_mask]。" #: doc/classes/VisualServer.xml msgid "" @@ -88054,7 +88380,7 @@ msgid "" "more correct in certain situations. Equivalent to [member ReflectionProbe." "box_projection]." msgstr "" -"如果 [code]true[/code],则使用箱体投影。这å¯ä»¥ä½¿å射在æŸäº›æƒ…å†µä¸‹çœ‹èµ·æ¥æ›´æ£" +"如果为 [code]true[/code],则使用箱体投影。这å¯ä»¥ä½¿å射在æŸäº›æƒ…å†µä¸‹çœ‹èµ·æ¥æ›´æ£" "确。相当于 [member ReflectionProbe.box_projection]。" #: doc/classes/VisualServer.xml @@ -88063,22 +88389,22 @@ msgid "" "the reflection much slower to compute. Equivalent to [member ReflectionProbe." "enable_shadows]." msgstr "" -"如果 [code]true[/code],计算å射探针ä¸çš„阴影。这会使得å射的计算速度慢得多。" -"相当于 [member ReflectionProbe.enable_shadows]。" +"如果为 [code]true[/code],计算å射探针ä¸çš„阴影。这会使得å射的计算速度慢得" +"多。相当于 [member ReflectionProbe.enable_shadows]。" #: doc/classes/VisualServer.xml msgid "" "Sets the size of the area that the reflection probe will capture. Equivalent " "to [member ReflectionProbe.extents]." msgstr "" -"设置å射探针将æ•获的区域的大å°ã€‚ç‰æ•ˆäºŽ [member ReflectionProbe.extents]。" +"设置å射探针将æ•获的区域的大å°ã€‚相当于 [member ReflectionProbe.extents]。" #: doc/classes/VisualServer.xml msgid "" "Sets the intensity of the reflection probe. Intensity modulates the strength " "of the reflection. Equivalent to [member ReflectionProbe.intensity]." msgstr "" -"设置å射探针的强度。强度调节åå°„çš„å¼ºåº¦ã€‚ç‰æ•ˆäºŽ [member ReflectionProbe." +"设置å射探针的强度。强度调节å射的强度。相当于 [member ReflectionProbe." "intensity]。" #: doc/classes/VisualServer.xml @@ -88086,7 +88412,7 @@ msgid "" "Sets the ambient light color for this reflection probe when set to interior " "mode. Equivalent to [member ReflectionProbe.interior_ambient_color]." msgstr "" -"è®¾ç½®ä¸ºå†…éƒ¨æ¨¡å¼æ—¶ï¼Œä¸ºæ¤å射探针设置环境光颜色。相当于[member ReflectionProbe." +"è®¾ç½®ä¸ºå†…éƒ¨æ¨¡å¼æ—¶ï¼Œä¸ºæ¤å射探针设置环境光颜色。相当于 [member ReflectionProbe." "interior_ambient_color]。" #: doc/classes/VisualServer.xml @@ -88095,7 +88421,7 @@ msgid "" "contribution when set to interior mode. Equivalent to [member " "ReflectionProbe.interior_ambient_energy]." msgstr "" -"å½“è®¾ç½®ä¸ºå†…éƒ¨æ¨¡å¼æ—¶ï¼Œè®¾ç½®æ¤å射探针环境光贡献的能é‡ä¹˜æ•°ã€‚相当于[member " +"å½“è®¾ç½®ä¸ºå†…éƒ¨æ¨¡å¼æ—¶ï¼Œè®¾ç½®æ¤å射探针环境光贡献的能é‡ä¹˜æ•°ã€‚相当于 [member " "ReflectionProbe.interior_ambient_energy]。" #: doc/classes/VisualServer.xml @@ -88114,7 +88440,7 @@ msgid "" "Sets the max distance away from the probe an object can be before it is " "culled. Equivalent to [member ReflectionProbe.max_distance]." msgstr "" -"è®¾ç½®ç‰©ä½“åœ¨è¢«åˆ é™¤å‰ä¸ŽæŽ¢é’ˆçš„æœ€å¤§è·ç¦»ã€‚ç‰åŒäºŽ[member ReflectionProbe." +"è®¾ç½®ç‰©ä½“åœ¨è¢«åˆ é™¤å‰ä¸ŽæŽ¢é’ˆçš„æœ€å¤§è·ç¦»ã€‚相当于 [member ReflectionProbe." "max_distance]。" #: doc/classes/VisualServer.xml @@ -88122,7 +88448,7 @@ msgid "" "Sets the origin offset to be used when this reflection probe is in box " "project mode. Equivalent to [member ReflectionProbe.origin_offset]." msgstr "" -"设置当æ¤åå°„æŽ¢é’ˆå¤„äºŽæ¡†é¡¹ç›®æ¨¡å¼æ—¶è¦ä½¿ç”¨çš„æºå移。相当于[member " +"设置当æ¤åå°„æŽ¢é’ˆå¤„äºŽæ¡†é¡¹ç›®æ¨¡å¼æ—¶è¦ä½¿ç”¨çš„æºå移。相当于 [member " "ReflectionProbe.origin_offset]。" #: doc/classes/VisualServer.xml @@ -88130,8 +88456,8 @@ msgid "" "Sets how often the reflection probe updates. Can either be once or every " "frame. See [enum ReflectionProbeUpdateMode] for options." msgstr "" -"设置å射探针的更新频率。å¯ä»¥æ˜¯ä¸€æ¬¡ï¼Œä¹Ÿå¯ä»¥æ˜¯æ¯ä¸€å¸§ã€‚å‚阅[enum " -"ReflectionProbeUpdateMode]选项。" +"设置å射探针的更新频率。å¯ä»¥æ˜¯ä¸€æ¬¡ï¼Œä¹Ÿå¯ä»¥æ˜¯æ¯ä¸€å¸§ã€‚å‚阅 [enum " +"ReflectionProbeUpdateMode] 选项。" #: doc/classes/VisualServer.xml msgid "" @@ -88140,9 +88466,9 @@ msgid "" "The callback method must use only 1 argument which will be called with " "[code]userdata[/code]." msgstr "" -"在画完一帧åŽï¼Œåœ¨[code]where[/code]上安排一个回调给相应的命åçš„[code]method[/" -"code]。\n" -"回调方法必须åªä½¿ç”¨1ä¸ªå‚æ•°ï¼Œå®ƒå°†ä¸Ž[code]userdata[/code]一起被调用。" +"在画完一帧åŽï¼Œåœ¨ [code]where[/code] 上安排一个回调给相应的命åçš„ " +"[code]method[/code]。\n" +"回调方法必须åªä½¿ç”¨ 1 ä¸ªå‚æ•°ï¼Œå®ƒå°†ä¸Ž [code]userdata[/code] 一起被调用。" #: doc/classes/VisualServer.xml msgid "" @@ -88153,17 +88479,17 @@ msgid "" "VisualServer's [method free_rid] static method.\n" "The scenario is the 3D world that all the visual instances exist in." msgstr "" -"åˆ›å»ºä¸€ä¸ªåœºæ™¯å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的RID进行访问。这个RID" -"å¯åœ¨æ‰€æœ‰[code]scenario_*[/code]VisualServer函数ä¸ä½¿ç”¨ã€‚\n" -"一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放" -"RID。\n" -"场景是所有视觉实例所å˜åœ¨çš„三维世界。" +"åˆ›å»ºä¸€ä¸ªåœºæ™¯å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚它å¯ä»¥é€šè¿‡è¿”回的 RID 进行访问。这" +"个 RID å¯åœ¨æ‰€æœ‰ [code]scenario_*[/code] VisualServer 函数ä¸ä½¿ç”¨ã€‚\n" +"一旦完æˆäº†å¯¹ RID 的处ç†ï¼Œå¯ä½¿ç”¨ VisualServer çš„ [method free_rid] 陿€æ–¹æ³•释" +"放 RID。\n" +"场景是所有视觉实例所å˜åœ¨çš„ 3D 世界。" #: doc/classes/VisualServer.xml msgid "" "Sets the [enum ScenarioDebugMode] for this scenario. See [enum " "ScenarioDebugMode] for options." -msgstr "设置该场景的[enum ScenarioDebugMode]。" +msgstr "设置该场景的 [enum ScenarioDebugMode]。" #: doc/classes/VisualServer.xml msgid "Sets the environment that will be used with this scenario." @@ -88192,16 +88518,16 @@ msgid "" "with linear interpolation. If [code]use_filter[/code] is [code]false[/code], " "the image will be scaled with nearest-neighbor interpolation." msgstr "" -"设置一个å¯åЍ图åƒã€‚颜色定义了背景颜色。如果[code]scale[/code]是[code]true[/" -"code],图åƒå°†è¢«ç¼©æ”¾ä»¥é€‚应å±å¹•尺寸。如果[code]use_filter[/code]是[code]true[/" -"code],图åƒå°†ä»¥çº¿æ€§æ’值进行缩放。如果[code]use_filter[/code]是[code]false[/" -"code],图åƒå°†ä»¥è¿‘é‚»æ’值的方å¼ç¼©æ”¾ã€‚" +"设置一个å¯åЍ图åƒã€‚颜色定义了背景颜色。如果 [code]scale[/code] 是 [code]true[/" +"code],图åƒå°†è¢«ç¼©æ”¾ä»¥é€‚应å±å¹•尺寸。如果 [code]use_filter[/code] 是 " +"[code]true[/code],图åƒå°†ä»¥çº¿æ€§æ’值进行缩放。如果 [code]use_filter[/code] 是 " +"[code]false[/code],图åƒå°†ä»¥è¿‘é‚»æ’值的方å¼ç¼©æ”¾ã€‚" #: doc/classes/VisualServer.xml msgid "" "If [code]true[/code], the engine will generate wireframes for use with the " "wireframe debug mode." -msgstr "如果 [code]true[/code],引擎将生æˆç”¨äºŽçº¿æ¡†è°ƒè¯•模å¼çš„线框。" +msgstr "如果为 [code]true[/code],引擎将生æˆç”¨äºŽçº¿æ¡†è°ƒè¯•模å¼çš„线框。" #: doc/classes/VisualServer.xml msgid "" @@ -88233,8 +88559,8 @@ msgid "" "count the real time as it goes by, without narrowing or stretching it." msgstr "" "设置应用于ç€è‰²å™¨ [code]TIME[/code] 内置时间æµé€çš„æ¯”例。\n" -"默认值是[code]1.0[/code],表示[code]TIME[/code]会éšç€æ—¶é—´çš„æŽ¨ç§»è®¡ç®—实时时间," -"ä¸ä¼šç¼©å°æˆ–拉伸它。" +"默认值是 [code]1.0[/code],表示 [code]TIME[/code] 会éšç€æ—¶é—´çš„æŽ¨ç§»è®¡ç®—实时时" +"间,ä¸ä¼šç¼©å°æˆ–拉伸它。" #: doc/classes/VisualServer.xml msgid "Enables or disables occlusion culling." @@ -88317,8 +88643,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"åˆ›å»ºä¸€ä¸ªç©ºçš„å¤©ç©ºå¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RID" -"å¯ç”¨äºŽæ‰€æœ‰[code]sky_*[/code] VisualServer函数。\n" +"åˆ›å»ºä¸€ä¸ªç©ºçš„å¤©ç©ºå¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个" +"RIDå¯ç”¨äºŽæ‰€æœ‰[code]sky_*[/code] VisualServer函数。\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -88358,8 +88684,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"创建一个空纹ç†å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RIDå¯" -"用于所有[code]texture_*[/code] VisualServer函数ä¸ã€‚\n" +"创建一个空纹ç†å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RID" +"å¯ç”¨äºŽæ‰€æœ‰[code]texture_*[/code] VisualServer函数ä¸ã€‚\n" "一旦完æˆäº†å¯¹RID的处ç†ï¼Œå¯ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -88385,7 +88711,7 @@ msgstr "返回纹ç†çš„æ·±åº¦ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the flags of a texture." -msgstr "返回一个纹ç†çš„æ ‡å¿—flags。" +msgstr "返回纹ç†çš„æ ‡å¿—。" #: doc/classes/VisualServer.xml msgid "Returns the format of the texture's image." @@ -88405,7 +88731,7 @@ msgstr "返回纹ç†å›¾åƒçš„opengl id。" #: doc/classes/VisualServer.xml msgid "Returns the type of the texture, can be any of the [enum TextureType]." -msgstr "返回纹ç†çš„类型,å¯ä»¥æ˜¯[enum TextureType]ä¸çš„任何一ç§ã€‚" +msgstr "返回纹ç†çš„类型,å¯ä»¥æ˜¯ [enum TextureType] ä¸çš„任何一ç§ã€‚" #: doc/classes/VisualServer.xml msgid "Returns the texture's width." @@ -88428,7 +88754,7 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Sets the texture's flags. See [enum TextureFlags] for options." -msgstr "设置纹ç†çš„æ ‡å¿—flags。选项è§[enum TextureFlags]。" +msgstr "设置纹ç†çš„æ ‡å¿—。å¯é€‰é¡¹è§ [enum TextureFlags]。" #: doc/classes/VisualServer.xml msgid "Sets the texture's path." @@ -88543,8 +88869,8 @@ msgid "" "Once finished with your RID, you will want to free the RID using the " "VisualServer's [method free_rid] static method." msgstr "" -"åˆ›å»ºä¸€ä¸ªç©ºè§†çª—å¹¶å°†å…¶æ·»åŠ åˆ°VisualServerä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RIDå°†" -"用于所有[code]viewport_*[/code] çš„VisualServer函数。\n" +"åˆ›å»ºä¸€ä¸ªç©ºè§†çª—å¹¶å°†å…¶æ·»åŠ åˆ° VisualServer ä¸ã€‚å¯ä»¥ç”¨è¿”回的RIDæ¥è®¿é—®å®ƒã€‚这个RID" +"将用于所有[code]viewport_*[/code] çš„VisualServer函数。\n" "ä¸€æ—¦ä½ ç”¨å®Œäº†RIDï¼Œä½ è¦ä½¿ç”¨VisualServerçš„[method free_rid]陿€æ–¹æ³•释放RID。" #: doc/classes/VisualServer.xml @@ -88568,7 +88894,7 @@ msgstr "从画布分离视窗,å之亦然。" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], sets the viewport active, else sets it inactive." msgstr "" -"如果 [code]true[/code],则将视窗设置为活动状æ€ï¼Œå¦åˆ™å°†å…¶è®¾ç½®ä¸ºéžæ´»åŠ¨çŠ¶æ€ã€‚" +"如果为 [code]true[/code],则将视窗设置为活动状æ€ï¼Œå¦åˆ™å°†å…¶è®¾ç½®ä¸ºéžæ´»åŠ¨çŠ¶æ€ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -88577,8 +88903,8 @@ msgid "" "specifies the stacking order of the canvas among those in the same layer." msgstr "" "è®¾ç½®è§†çª—ç”»å¸ƒçš„å †å 顺åºã€‚\n" -"[code]layer[/code]是实际的画布层,而[code]sublayer[/code]则指定画布在åŒä¸€å±‚ä¸" -"çš„å †å 顺åºã€‚" +"[code]layer[/code] 是实际的画布层,而 [code]sublayer[/code] 则指定画布在åŒä¸€" +"层ä¸çš„å †å 顺åºã€‚" #: doc/classes/VisualServer.xml msgid "Sets the transformation of a viewport's canvas." @@ -88587,13 +88913,13 @@ msgstr "è®¾ç½®è§†çª—ç”»å¸ƒçš„å˜æ¢ã€‚" #: doc/classes/VisualServer.xml msgid "" "Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." -msgstr "设置视窗的清除模å¼ã€‚详è§[enum ViewportClearMode]。" +msgstr "设置视窗的清除模å¼ã€‚å¯é€‰é¡¹è§ [enum ViewportClearMode]。" #: doc/classes/VisualServer.xml msgid "" "Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " "options." -msgstr "设置视窗的调试绘图模å¼ã€‚详è§[enum ViewportDebugDraw]。" +msgstr "设置视窗的调试绘图模å¼ã€‚å¯é€‰é¡¹è§ [enum ViewportDebugDraw]。" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], a viewport's 3D rendering is disabled." @@ -88602,7 +88928,7 @@ msgstr "如果为 [code]true[/code],则视窗的 3D 渲染将ç¦ç”¨ã€‚" #: doc/classes/VisualServer.xml msgid "" "If [code]true[/code], rendering of a viewport's environment is disabled." -msgstr "如果 [code]true[/code],则ç¦ç”¨è§†çª—环境的渲染。" +msgstr "如果为 [code]true[/code],则ç¦ç”¨è§†çª—环境的渲染。" #: doc/classes/VisualServer.xml msgid "Sets the viewport's global transformation matrix." @@ -88610,11 +88936,11 @@ msgstr "è®¾ç½®è§†çª—çš„å…¨å±€å˜æ¢çŸ©é˜µã€‚" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], the viewport renders to hdr." -msgstr "如果 [code]true[/code],视窗将呈现为 hdr。" +msgstr "如果为 [code]true[/code],视窗将呈现为 hdr。" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], the viewport's canvas is not rendered." -msgstr "如果 [code]true[/code]ï¼Œåˆ™ä¸æ¸²æŸ“视窗的画布。" +msgstr "如果为 [code]true[/code]ï¼Œåˆ™ä¸æ¸²æŸ“视窗的画布。" #: doc/classes/VisualServer.xml msgid "Currently unimplemented in Godot 3.x." @@ -88622,7 +88948,7 @@ msgstr "ç›®å‰åœ¨ Godot 3.x 䏿œªå®žçŽ°ã€‚" #: doc/classes/VisualServer.xml msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." -msgstr "设置抗锯齿模å¼ã€‚详è§[enum ViewportMSAA]。" +msgstr "设置抗锯齿模å¼ã€‚å¯é€‰é¡¹è§ [enum ViewportMSAA]。" #: doc/classes/VisualServer.xml msgid "Sets the viewport's parent to another viewport." @@ -88643,8 +88969,8 @@ msgid "" "will be drawn, no automatic scaling is possible, even if your game scene is " "significantly larger than the window size." msgstr "" -"如果[code]true[/code],直接将视窗的内容渲染到å±å¹•上。这å…许一个低级别的优化," -"ä½ å¯ä»¥è·³è¿‡ç»˜åˆ¶è§†çª—åˆ°æ ¹è§†çª—ã€‚è™½ç„¶è¿™ç§ä¼˜åŒ–å¯ä»¥æ˜¾è‘—æé«˜é€Ÿåº¦ï¼ˆç‰¹åˆ«æ˜¯åœ¨æ—§è®¾å¤‡" +"如果为 [code]true[/code],直接将视窗的内容渲染到å±å¹•上。这å…许一个低级别的优" +"åŒ–ï¼Œä½ å¯ä»¥è·³è¿‡ç»˜åˆ¶è§†çª—åˆ°æ ¹è§†çª—ã€‚è™½ç„¶è¿™ç§ä¼˜åŒ–å¯ä»¥æ˜¾è‘—æé«˜é€Ÿåº¦ï¼ˆç‰¹åˆ«æ˜¯åœ¨æ—§è®¾å¤‡" "上),但它是以牺牲å¯ç”¨æ€§ä¸ºä»£ä»·çš„。当å¯ç”¨è¿™ä¸ªåŠŸèƒ½æ—¶ï¼Œä½ ä¸èƒ½ä»Žè§†çª—或" "[code]SCREEN_TEXTURE[/code]ä¸è¯»å–ã€‚ä½ ä¹Ÿä¼šå¤±åŽ»æŸäº›çª—å£è®¾ç½®çš„好处,比如å„ç§æ‹‰ä¼¸" "模å¼ã€‚å¦ä¸€ä¸ªéœ€è¦æ³¨æ„çš„åŽæžœæ˜¯ï¼Œåœ¨2Dä¸ï¼Œæ¸²æŸ“是以窗å£åæ ‡è¿›è¡Œçš„ï¼Œæ‰€ä»¥å¦‚æžœä½ æœ‰ä¸€" @@ -88658,7 +88984,7 @@ msgid "" "environment information, reflection atlas etc." msgstr "" "设置一个视窗的场景。\n" -"场景包å«[enum ScenarioDebugMode]的信æ¯ã€çŽ¯å¢ƒä¿¡æ¯ã€å射图集ç‰ã€‚" +"åœºæ™¯åŒ…å« [enum ScenarioDebugMode] 的信æ¯ã€çŽ¯å¢ƒä¿¡æ¯ã€å射图集ç‰ã€‚" #: doc/classes/VisualServer.xml msgid "Sets the shadow atlas quadrant's subdivision." @@ -88693,13 +89019,13 @@ msgstr "设置视窗的宽度和高度。" #: doc/classes/VisualServer.xml msgid "" "If [code]true[/code], the viewport renders its background as transparent." -msgstr "如果 [code]true[/code]ï¼Œè§†çª—å°†å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" +msgstr "如果为 [code]true[/code]ï¼Œè§†çª—å°†å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" #: doc/classes/VisualServer.xml msgid "" "Sets when the viewport should be updated. See [enum ViewportUpdateMode] " "constants for options." -msgstr "设置应更新视窗的时间。请å‚阅 [enum ViewportUpdateMode] 。" +msgstr "设置应更新视窗的时间。å¯é€‰é¡¹è¯·å‚阅 [enum ViewportUpdateMode] 。" #: doc/classes/VisualServer.xml msgid "" @@ -88712,7 +89038,7 @@ msgid "" "If [code]true[/code], the viewport uses augmented or virtual reality " "technologies. See [ARVRInterface]." msgstr "" -"如果 [code]true[/code],则视窗使用增强或虚拟现实技术。å‚阅 [ARVRInterface]。" +"如果为 [code]true[/code]ï¼Œåˆ™è§†çª—ä½¿ç”¨å¢žå¼ºæˆ–è™šæ‹ŸçŽ°å®žæŠ€æœ¯ã€‚è§ [ARVRInterface]。" #: doc/classes/VisualServer.xml msgid "" @@ -88739,14 +89065,14 @@ msgid "" "recovered by enabling contrast-adaptive sharpening (see [method " "viewport_set_sharpen_intensity])." msgstr "" -"å¯ç”¨è¯¥è§†çª—的快速近似抗锯齿。FXAAæ˜¯ä¸€ç§æµè¡Œçš„å±å¹•空间抗锯齿方法,它速度快,但" -"会使图åƒçœ‹èµ·æ¥å¾ˆæ¨¡ç³Šï¼Œç‰¹åˆ«æ˜¯åœ¨ä½Žåˆ†è¾¨çŽ‡ä¸‹ã€‚åœ¨å¤§çš„åˆ†è¾¨çŽ‡ä¸‹ï¼Œå¦‚1440på’Œ4K,它ä»ç„¶" -"å¯ä»¥å·¥ä½œå¾—比较好。一些æŸå¤±çš„é”度å¯ä»¥é€šè¿‡å¯ç”¨å¯¹æ¯”度适应性é”åŒ–æ¥æ¢å¤ï¼ˆè§" +"å¯ç”¨è¯¥è§†çª—的快速近似抗锯齿。FXAA æ˜¯ä¸€ç§æµè¡Œçš„å±å¹•空间抗锯齿方法,它速度快,但" +"会使图åƒçœ‹èµ·æ¥å¾ˆæ¨¡ç³Šï¼Œç‰¹åˆ«æ˜¯åœ¨ä½Žåˆ†è¾¨çŽ‡ä¸‹ã€‚åœ¨ 1440p å’Œ 4K ç‰é«˜åˆ†è¾¨çŽ‡ä¸‹ï¼Œå®ƒä»ç„¶" +"å¯ä»¥å·¥ä½œå¾—比较好。一些æŸå¤±çš„é”度å¯ä»¥é€šè¿‡å¯ç”¨å¯¹æ¯”度适应性é”åŒ–æ¥æ¢å¤ï¼ˆè§ " "[method viewport_set_sharpen_intensity])。" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], the viewport's rendering is flipped vertically." -msgstr "如果 [code]true[/code],则视窗的渲染垂直翻转。" +msgstr "如果为 [code]true[/code],则视窗的渲染垂直翻转。" #: doc/classes/VisualServer.xml msgid "" @@ -88754,8 +89080,8 @@ msgid "" "is still being processed. You can call [method force_draw] to draw a frame " "even with rendering disabled." msgstr "" -"如果[code]false[/code],则完全ç¦ç”¨æ¸²æŸ“,但引擎逻辑ä»åœ¨å¤„ç†ä¸ã€‚å³ä½¿ç¦ç”¨æ¸²æŸ“," -"您也å¯ä»¥è°ƒç”¨ [method force_draw] æ¥ç»˜åˆ¶å¸§ã€‚" +"如果为 [code]false[/code],则完全ç¦ç”¨æ¸²æŸ“,但引擎逻辑ä»åœ¨å¤„ç†ä¸ã€‚å³ä½¿ç¦ç”¨æ¸²" +"染,您也å¯ä»¥è°ƒç”¨ [method force_draw] æ¥ç»˜åˆ¶å¸§ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -88957,10 +89283,11 @@ msgid "" "ARRAY_COMPRESS_WEIGHTS], and [constant " "ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] quickly." msgstr "" -"ç”¨äºŽå¿«é€Ÿè®¾ç½®æ ‡å¿—[constant ARRAY_COMPRESS_NORMAL]ã€[constant " +"ç”¨äºŽå¿«é€Ÿè®¾ç½®æ ‡å¿— [constant ARRAY_COMPRESS_NORMAL]ã€[constant " "ARRAY_COMPRESS_TANGENT]ã€[constant ARRAY_COMPRESS_COLOR]ã€[constant " "ARRAY_COMPRESS_TEX_UV]ã€[constant ARRAY_COMPRESS_TEX_UV2]ã€[constant " -"ARRAY_COMPRESS_WEIGHTS] å’Œ[constant ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] 。" +"ARRAY_COMPRESS_WEIGHTS] å’Œ [constant " +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] 。" #: doc/classes/VisualServer.xml msgid "Primitive to draw consists of points." @@ -89246,7 +89573,7 @@ msgstr "在这一帧ä¸ï¼Œ2d绘制所调用的数é‡ã€‚" #: doc/classes/VisualServer.xml msgid "Represents the size of the [enum ViewportRenderInfo] enum." -msgstr "代表[enum ViewportRenderInfo]枚举的大å°ã€‚" +msgstr "代表 [enum ViewportRenderInfo] 枚举的大å°ã€‚" #: doc/classes/VisualServer.xml msgid "Debug draw is disabled. Default setting." @@ -89254,15 +89581,15 @@ msgstr "调试绘制被ç¦ç”¨ã€‚默认设置。" #: doc/classes/VisualServer.xml msgid "Debug draw sets objects to unshaded." -msgstr "è°ƒè¯•ç»˜åˆ¶å°†å¯¹è±¡è®¾ç½®ä¸ºæ— é˜´å½±ã€‚" +msgstr "调试绘制,ä¸ä½¿ç”¨ç€è‰²æµç¨‹ç»˜åˆ¶å¯¹è±¡ã€‚" #: doc/classes/VisualServer.xml msgid "Overwrites clear color to [code](0,0,0,0)[/code]." -msgstr "将清除颜色覆盖为[code](0,0,0,0)[/code]。" +msgstr "将清除颜色覆盖为 [code](0,0,0,0)[/code]。" #: doc/classes/VisualServer.xml msgid "Debug draw draws objects in wireframe." -msgstr "调试绘制 在线框ä¸ç»˜åˆ¶å¯¹è±¡ã€‚" +msgstr "调试绘制,将对象用线框形å¼ç»˜åˆ¶ã€‚" #: doc/classes/VisualServer.xml msgid "Do not use a debug mode." @@ -89286,7 +89613,8 @@ msgid "" "Draw all objects without shading. Equivalent to setting all objects shaders " "to [code]unshaded[/code]." msgstr "" -"绘制没有阴影的所有物体。相当于将所有物体的ç€è‰²å™¨è®¾ç½®ä¸º[code]unshaded[/code]。" +"ä¸ä½¿ç”¨ç€è‰²æµç¨‹ç»˜åˆ¶å¯¹è±¡ã€‚相当于将所有物体的ç€è‰²å™¨è®¾ç½®ä¸º [code]unshaded[/" +"code]。" #: doc/classes/VisualServer.xml msgid "The instance does not have a type." @@ -89326,7 +89654,7 @@ msgstr "该实例是一个光照贴图æ•获。" #: doc/classes/VisualServer.xml msgid "Represents the size of the [enum InstanceType] enum." -msgstr "代表[enum InstanceType]枚举的大å°ã€‚" +msgstr "代表 [enum InstanceType] 枚举的大å°ã€‚" #: doc/classes/VisualServer.xml msgid "" @@ -89344,7 +89672,7 @@ msgstr "å½“è®¾ç½®æ—¶ï¼Œæ‰‹åŠ¨è¯·æ±‚åœ¨ä¸‹ä¸€å¸§ç»˜åˆ¶å‡ ä½•å›¾å½¢ã€‚" #: doc/classes/VisualServer.xml msgid "Represents the size of the [enum InstanceFlags] enum." -msgstr "代表[enum InstanceFlags]枚举的大å°ã€‚" +msgstr "代表 [enum InstanceFlags] 枚举的大å°ã€‚" #: doc/classes/VisualServer.xml msgid "Disable shadows from this instance." @@ -89372,13 +89700,13 @@ msgstr "ä¹å®«æ ¼åœ¨éœ€è¦çš„地方被拉伸。" #: doc/classes/VisualServer.xml msgid "The nine patch gets filled with tiles where needed." -msgstr "ä¹å®«æ ¼åœ¨éœ€è¦çš„åœ°æ–¹å¡«å……ç“·ç –ã€‚" +msgstr "ä¹å®«æ ¼åœ¨éœ€è¦çš„地方填充图å—。" #: doc/classes/VisualServer.xml msgid "" "The nine patch gets filled with tiles where needed and stretches them a bit " "if needed." -msgstr "ä¹å®«æ ¼åœ¨éœ€è¦çš„åœ°æ–¹å¡«å……ç“·ç –ï¼Œå¹¶åœ¨éœ€è¦æ—¶å°†å®ƒä»¬æ‹‰ä¼¸ä¸€ç‚¹ã€‚" +msgstr "ä¹å®«æ ¼åœ¨éœ€è¦çš„地方填充图å—ï¼Œå¹¶åœ¨éœ€è¦æ—¶å°†å®ƒä»¬æ‹‰ä¼¸ä¸€ç‚¹ã€‚" #: doc/classes/VisualServer.xml msgid "Adds light color additive to the canvas." @@ -89402,23 +89730,23 @@ msgstr "ä¸è¦å¯¹ç”»å¸ƒä¸Šçš„光影应用滤镜。" #: doc/classes/VisualServer.xml msgid "Use PCF3 filtering to filter canvas light shadows." -msgstr "使用PCF3过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" +msgstr "使用 PCF3 过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" #: doc/classes/VisualServer.xml msgid "Use PCF5 filtering to filter canvas light shadows." -msgstr "使用PCF5过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" +msgstr "使用 PCF5 过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" #: doc/classes/VisualServer.xml msgid "Use PCF7 filtering to filter canvas light shadows." -msgstr "使用PCF7过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" +msgstr "使用 PCF7 过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" #: doc/classes/VisualServer.xml msgid "Use PCF9 filtering to filter canvas light shadows." -msgstr "使用PCF9过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" +msgstr "使用 PCF9 过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" #: doc/classes/VisualServer.xml msgid "Use PCF13 filtering to filter canvas light shadows." -msgstr "使用PCF13过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" +msgstr "使用 PCF13 过滤法æ¥è¿‡æ»¤ç”»å¸ƒçš„光影。" #: doc/classes/VisualServer.xml msgid "Culling of the canvas occluder is disabled." @@ -89481,12 +89809,12 @@ msgstr "帧ä¸2d绘制调用数é‡ã€‚" #: doc/classes/VisualServer.xml msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." -msgstr "硬件支æŒç€è‰²å™¨ã€‚这个枚举目å‰åœ¨Godot 3.x䏿²¡æœ‰ä½¿ç”¨ã€‚" +msgstr "硬件支æŒç€è‰²å™¨ã€‚这个枚举目å‰åœ¨ Godot 3.x 䏿²¡æœ‰ä½¿ç”¨ã€‚" #: doc/classes/VisualServer.xml msgid "" "Hardware supports multithreading. This enum is currently unused in Godot 3.x." -msgstr "硬件支æŒå¤šçº¿ç¨‹ã€‚这个枚举目å‰åœ¨Godot 3.x䏿²¡æœ‰ä½¿ç”¨ã€‚" +msgstr "硬件支æŒå¤šçº¿ç¨‹ã€‚这个枚举目å‰åœ¨ Godot 3.x 䏿²¡æœ‰ä½¿ç”¨ã€‚" #: doc/classes/VisualServer.xml msgid "Use [Transform2D] to store MultiMesh transform." @@ -89822,12 +90150,12 @@ msgid "" "Returns an [Array] containing default values for all of the input ports of " "the node in the form [code][index0, value0, index1, value1, ...][/code]." msgstr "" -"返回一个包å«èŠ‚ç‚¹æ‰€æœ‰è¾“å…¥ç«¯å£é»˜è®¤å€¼çš„[Array],形å¼ä¸º[code][index0, value0, " +"返回一个包å«èŠ‚ç‚¹æ‰€æœ‰è¾“å…¥ç«¯å£é»˜è®¤å€¼çš„ [Array],形å¼ä¸º [code][index0, value0, " "index1, value1, ...][/code]。" #: doc/classes/VisualShaderNode.xml msgid "Returns the default value of the input [code]port[/code]." -msgstr "返回输入[code]port[/code]的默认值。" +msgstr "返回输入 [code]port[/code] 的默认值。" #: doc/classes/VisualShaderNode.xml msgid "" @@ -89835,8 +90163,8 @@ msgid "" "[index0, value0, index1, value1, ...][/code]. For example: [code][0, " "Vector3(0, 0, 0), 1, Vector3(0, 0, 0)][/code]." msgstr "" -"使用[code][index0, value0, index1, value1, ...][/code]å½¢å¼çš„[Array]设置默认输" -"入端å£å€¼ã€‚例如: [code][0, Vector3(0, 0, 0), 1, Vector3(0, 0, 0)][/code]。" +"使用 [code][index0, value0, index1, value1, ...][/code] å½¢å¼çš„ [Array] 设置默" +"认输入端å£å€¼ã€‚例如: [code][0, Vector3(0, 0, 0), 1, Vector3(0, 0, 0)][/code]。" #: doc/classes/VisualShaderNode.xml msgid "Sets the default value for the selected input [code]port[/code]." @@ -89885,12 +90213,12 @@ msgid "" "Sampler type. Translated to reference of sampler uniform in shader code. Can " "only be used for input ports in non-uniform nodes." msgstr "" -"é‡‡æ ·å™¨ç±»åž‹ã€‚è½¬æ¢ä¸ºç€è‰²å™¨ä»£ç ä¸çš„é‡‡æ ·å™¨uniform引用。åªèƒ½ç”¨äºŽnon-uniform节点ä¸" -"的输入端å£ã€‚" +"é‡‡æ ·å™¨ç±»åž‹ã€‚è½¬æ¢ä¸ºç€è‰²å™¨ä»£ç ä¸çš„é‡‡æ ·å™¨ uniform 引用。åªèƒ½ç”¨äºŽéž uniform 节点" +"ä¸çš„输入端å£ã€‚" #: doc/classes/VisualShaderNode.xml msgid "Represents the size of the [enum PortType] enum." -msgstr "表示[enum PortType]枚举的大å°ã€‚" +msgstr "表示 [enum PortType] 枚举的大å°ã€‚" #: doc/classes/VisualShaderNodeBooleanConstant.xml msgid "A boolean constant to be used within the visual shader graph." @@ -89902,19 +90230,19 @@ msgid "" "Translated to [code]bool[/code] in the shader language." msgstr "" "åªæœ‰ä¸€ä¸ªè¾“出端å£ï¼Œæ²¡æœ‰è¾“入。\n" -"在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]bool[/code]。" +"在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]bool[/code]。" #: doc/classes/VisualShaderNodeBooleanConstant.xml msgid "A boolean constant which represents a state of this node." -msgstr "一个布尔常é‡ï¼Œè¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„çŠ¶æ€ã€‚" +msgstr "布尔常é‡ï¼Œè¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„çŠ¶æ€ã€‚" #: doc/classes/VisualShaderNodeBooleanUniform.xml msgid "A boolean uniform to be used within the visual shader graph." -msgstr "一个在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„布尔uniform。" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„布尔 uniform。" #: doc/classes/VisualShaderNodeBooleanUniform.xml msgid "Translated to [code]uniform bool[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]uniform bool[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]uniform bool[/code]。" #: doc/classes/VisualShaderNodeBooleanUniform.xml #: doc/classes/VisualShaderNodeColorUniform.xml @@ -89934,7 +90262,7 @@ msgstr "å¯ç”¨ [member default_value]。" #: doc/classes/VisualShaderNodeColorConstant.xml msgid "A [Color] constant to be used within the visual shader graph." -msgstr "一个[Color]常é‡ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" +msgstr "[Color] 常é‡ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeColorConstant.xml msgid "" @@ -89947,11 +90275,11 @@ msgstr "" #: doc/classes/VisualShaderNodeColorConstant.xml msgid "A [Color] constant which represents a state of this node." -msgstr "一个[Color]常é‡ï¼Œè¡¨ç¤ºè¿™ä¸ªèŠ‚ç‚¹çš„çŠ¶æ€ã€‚" +msgstr "[Color] 常é‡ï¼Œè¡¨ç¤ºè¿™ä¸ªèŠ‚ç‚¹çš„çŠ¶æ€ã€‚" #: doc/classes/VisualShaderNodeColorFunc.xml msgid "A [Color] function to be used within the visual shader graph." -msgstr "一个[Color]函数,在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" +msgstr "[Color] 函数,在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeColorFunc.xml msgid "" @@ -89962,7 +90290,7 @@ msgstr "接å—一个 [Color] 到输入端å£ï¼Œå¹¶æ ¹æ® [member function] å¯¹å… #: doc/classes/VisualShaderNodeColorFunc.xml msgid "" "A function to be applied to the input color. See [enum Function] for options." -msgstr "è¦åº”用于输入颜色的函数。å‚阅[enum Function]的选项。" +msgstr "è¦åº”用于输入颜色的函数。å‚阅 [enum Function] 的选项。" #: doc/classes/VisualShaderNodeColorFunc.xml msgid "" @@ -90006,7 +90334,7 @@ msgstr "" #: doc/classes/VisualShaderNodeColorOp.xml msgid "A [Color] operator to be used within the visual shader graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„[Color]è¿ç®—符。" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„ [Color] è¿ç®—符。" #: doc/classes/VisualShaderNodeColorOp.xml msgid "Applies [member operator] to two color inputs." @@ -90015,7 +90343,7 @@ msgstr "å°† [member operator] 应用于两个颜色输入。" #: doc/classes/VisualShaderNodeColorOp.xml msgid "" "An operator to be applied to the inputs. See [enum Operator] for options." -msgstr "è¦åº”用于输入的è¿ç®—符。å‚阅[enum Operator]的选项。" +msgstr "è¦åº”用于输入的è¿ç®—符。å‚阅 [enum Operator] 的选项。" #: doc/classes/VisualShaderNodeColorOp.xml msgid "" @@ -90036,7 +90364,7 @@ msgid "" "result = abs(a - b);\n" "[/codeblock]" msgstr "" -"用下é¢çš„å…¬å¼äº§ç”Ÿå·®å¼‚效果。\n" +"用以下公å¼äº§ç”Ÿå·®å¼‚效果。\n" "[codeblock]\n" "result = abs(a - b);\n" "[/codeblock]" @@ -90048,7 +90376,7 @@ msgid "" "result = min(a, b);\n" "[/codeblock]" msgstr "" -"用以下公å¼äº§ç”Ÿå˜æš—的效果。\n" +"用以下公å¼äº§ç”Ÿå˜æš—效果。\n" "[codeblock]\n" "result = min(a, b);\n" "[/codeblock]" @@ -90132,7 +90460,7 @@ msgid "" "}\n" "[/codeblock]" msgstr "" -"用以下公å¼äº§ç”ŸæŸ”和的光线效果。\n" +"用以下公å¼äº§ç”ŸæŸ”光效果。\n" "[codeblock]\n" "for (int i = 0; i < 3; i++) {\n" " float base = a[i];\n" @@ -90160,7 +90488,7 @@ msgid "" "}\n" "[/codeblock]" msgstr "" -"用下é¢çš„å…¬å¼äº§ç”Ÿä¸€ä¸ªç¡¬å…‰æ•ˆæžœã€‚\n" +"用以下公å¼äº§ç”Ÿç¡¬å…‰æ•ˆæžœã€‚\n" "[codeblock]\n" "for (int i = 0; i < 3; i++) {\n" " float base = a[i];\n" @@ -90175,11 +90503,11 @@ msgstr "" #: doc/classes/VisualShaderNodeColorUniform.xml msgid "A [Color] uniform to be used within the visual shader graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„一个[Color]uniform。" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„一个 [Color] uniform。" #: doc/classes/VisualShaderNodeColorUniform.xml msgid "Translated to [code]uniform vec4[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]uniform vec4[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]uniform vec4[/code]。" #: doc/classes/VisualShaderNodeCompare.xml msgid "A comparison function for common types within the visual shader graph." @@ -90223,23 +90551,23 @@ msgstr "布林类型。" #: doc/classes/VisualShaderNodeCompare.xml msgid "A transform ([code]mat4[/code]) type." -msgstr "å˜æ¢ç±»åž‹ï¼Œå³[code]mat4[/code]。" +msgstr "å˜æ¢ç±»åž‹ï¼Œå³ [code]mat4[/code]。" #: doc/classes/VisualShaderNodeCompare.xml msgid "Comparison for equality ([code]a == b[/code])." -msgstr "ç›¸ç‰æ¯”较,å³[code]a == b[/code]。" +msgstr "ç›¸ç‰æ¯”è¾ƒï¼Œå³ [code]a == b[/code]。" #: doc/classes/VisualShaderNodeCompare.xml msgid "Comparison for inequality ([code]a != b[/code])." -msgstr "ä¸ç‰æ¯”较,å³[code]a != b[/code]。" +msgstr "ä¸ç‰æ¯”è¾ƒï¼Œå³ [code]a != b[/code]。" #: doc/classes/VisualShaderNodeCompare.xml msgid "" "Comparison for greater than ([code]a > b[/code]). Cannot be used if [member " "type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." msgstr "" -"大于比较,å³[code]a > b[/code]。如果 [member type] 设置为 [constant " -"CTYPE_BOOLEAN]或 [constant CTYPE_TRANSFORM]则ä¸èƒ½ä½¿ç”¨ã€‚" +"å¤§äºŽæ¯”è¾ƒï¼Œå³ [code]a > b[/code]。如果 [member type] 设置为 [constant " +"CTYPE_BOOLEAN] 或 [constant CTYPE_TRANSFORM] 则ä¸èƒ½ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeCompare.xml msgid "" @@ -90247,24 +90575,24 @@ msgid "" "if [member type] set to [constant CTYPE_BOOLEAN] or [constant " "CTYPE_TRANSFORM]." msgstr "" -"大于或ç‰äºŽçš„æ¯”较,å³[code]a >= b[/code]。如果[member type]设置为 [constant " -"CTYPE_BOOLEAN] 或[constant CTYPE_TRANSFORM]则ä¸èƒ½ä½¿ç”¨ã€‚" +"大于或ç‰äºŽçš„æ¯”è¾ƒï¼Œå³ [code]a >= b[/code]。如果 [member type] 设置为 " +"[constant CTYPE_BOOLEAN] 或 [constant CTYPE_TRANSFORM] 则ä¸èƒ½ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeCompare.xml msgid "" "Comparison for less than ([code]a < b[/code]). Cannot be used if [member " "type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." msgstr "" -"å°äºŽæ¯”较,å³[code]a < b[/code]。如果 [member type] 设置为[constant " -"CTYPE_BOOLEAN]或 [constant CTYPE_TRANSFORM]则ä¸èƒ½ä½¿ç”¨ã€‚" +"å°äºŽæ¯”è¾ƒï¼Œå³ [code]a < b[/code]。如果 [member type] 设置为 [constant " +"CTYPE_BOOLEAN] 或 [constant CTYPE_TRANSFORM] 则ä¸èƒ½ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeCompare.xml msgid "" "Comparison for less than or equal ([code]a < b[/code]). Cannot be used if " "[member type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." msgstr "" -"å°äºŽæˆ–ç‰äºŽçš„æ¯”较,å³[code]a < b[/code]。如果[member type] 设置为[constant " -"CTYPE_BOOLEAN]或[constant CTYPE_TRANSFORM]则ä¸èƒ½ä½¿ç”¨ã€‚" +"å°äºŽæˆ–ç‰äºŽçš„æ¯”è¾ƒï¼Œå³ [code]a < b[/code]。如果 [member type] 设置为 [constant " +"CTYPE_BOOLEAN] 或 [constant CTYPE_TRANSFORM] 则ä¸èƒ½ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeCompare.xml msgid "" @@ -90280,7 +90608,7 @@ msgstr "如果å‘é‡ä¸çš„ä»»æ„åˆ†é‡æ»¡è¶³æ¯”较æ¡ä»¶ï¼Œåˆ™ç»“果为真。" #: doc/classes/VisualShaderNodeCubeMap.xml msgid "A [CubeMap] sampling node to be used within the visual shader graph." -msgstr "[CubeMap]é‡‡æ ·èŠ‚ç‚¹ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾å½¢ä¸ä½¿ç”¨ã€‚" +msgstr "[CubeMap] é‡‡æ ·èŠ‚ç‚¹ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾å½¢ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeCubeMap.xml msgid "" @@ -90295,8 +90623,8 @@ msgid "" "The [CubeMap] texture to sample when using [constant SOURCE_TEXTURE] as " "[member source]." msgstr "" -"当使用[constant SOURCE_TEXTURE]作为 [member source] 时,è¦é‡‡æ ·çš„[CubeMap]纹" -"ç†ã€‚" +"当使用 [constant SOURCE_TEXTURE] 作为 [member source] 时,è¦é‡‡æ ·çš„ [CubeMap] " +"纹ç†ã€‚" #: doc/classes/VisualShaderNodeCubeMap.xml msgid "" @@ -90341,7 +90669,8 @@ msgid "" "Adds [code]hint_albedo[/code] as hint to the uniform declaration for proper " "sRGB to linear conversion." msgstr "" -"å°†[code]hint_albedo[/code]作为æç¤ºæ·»åŠ åˆ°uniform声明ä¸ï¼Œä»¥ä¾¿å°†sRGB转æ¢ä¸ºçº¿æ€§ã€‚" +"å°† [code]hint_albedo[/code] 作为æç¤ºæ·»åŠ åˆ° uniform 声明ä¸ï¼Œä»¥ä¾¿å°† sRGB 转æ¢ä¸º" +"线性。" #: doc/classes/VisualShaderNodeCubeMap.xml #: doc/classes/VisualShaderNodeTexture.xml @@ -90350,8 +90679,8 @@ msgid "" "Adds [code]hint_normal[/code] as hint to the uniform declaration, which " "internally converts the texture for proper usage as normal map." msgstr "" -"å°†[code]hint_normal[/code]作为æç¤ºæ·»åŠ åˆ°uniform声明ä¸ï¼Œè¯¥å£°æ˜Žåœ¨å†…部将纹ç†è½¬æ¢" -"为法线贴图。" +"å°† [code]hint_normal[/code] 作为æç¤ºæ·»åŠ åˆ° uniform 声明ä¸ï¼Œè¯¥å£°æ˜Žåœ¨å†…部将纹ç†" +"转æ¢ä¸ºæ³•线贴图。" #: doc/classes/VisualShaderNodeCubeMapUniform.xml msgid "A [CubeMap] uniform node to be used within the visual shader graph." @@ -90595,7 +90924,7 @@ msgstr "计算å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä¸¤ä¸ªå‘é‡çš„点积。" #: doc/classes/VisualShaderNodeDotProduct.xml msgid "Translates to [code]dot(a, b)[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]dot(a, b)[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]dot(a, b)[/code]。" #: doc/classes/VisualShaderNodeExpression.xml msgid "" @@ -90612,10 +90941,10 @@ msgid "" "global constants. See [VisualShaderNodeGlobalExpression] for such global " "definitions." msgstr "" -"自定义Godotç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œæœ‰è‡ªå®šä¹‰æ•°é‡çš„输入和输出端å£ã€‚\n" -"所æä¾›çš„代ç 直接注入到图形匹é…ç€è‰²å™¨å‡½æ•°ä¸ï¼Œå³[code]vertex[/code], " -"[code]fragment[/code], or [code]light[/code],所以它ä¸èƒ½ç”¨äºŽå£°æ˜Žå‡½æ•°ã€å˜ä½“ã€" -"uniforms或全局常é‡ã€‚请å‚阅[VisualShaderNodeGlobalExpression]以了解æ¤ç±»å…¨å±€å®š" +"自定义 Godot ç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œæœ‰è‡ªå®šä¹‰æ•°é‡çš„输入和输出端å£ã€‚\n" +"所æä¾›çš„代ç 直接注入到图形匹é…ç€è‰²å™¨å‡½æ•°ä¸ï¼ˆ[code]vertex[/code]ã€" +"[code]fragment[/code] 或 [code]light[/code]),所以它ä¸èƒ½ç”¨äºŽå£°æ˜Žå‡½æ•°ã€å˜ä½“ã€" +"uniform 或全局常é‡ã€‚请å‚阅[VisualShaderNodeGlobalExpression]以了解æ¤ç±»å…¨å±€å®š" "义。" #: doc/classes/VisualShaderNodeExpression.xml @@ -90626,8 +90955,8 @@ msgid "" "declare functions, varyings, uniforms, or global constants." msgstr "" "Godot ç€è‰²å™¨è¯è¨€ä¸çš„表达å¼ï¼Œå®ƒå°†è¢«æ³¨å…¥åˆ°å›¾å½¢åŒ¹é…çš„ç€è‰²å™¨å‡½æ•°ï¼ˆ[code]vertex[/" -"code], [code]fragment[/code], or [code]light[/code]ï¼‰çš„å¼€å¤´ï¼Œå› æ¤ä¸èƒ½ç”¨äºŽå£°æ˜Ž" -"函数ã€varyingsã€uniforms或全局常é‡ã€‚" +"code]ã€[code]fragment[/code] 或 [code]light[/code]ï¼‰çš„å¼€å¤´ï¼Œå› æ¤ä¸èƒ½ç”¨äºŽå£°æ˜Ž" +"函数ã€varyingã€uniform 或全局常é‡ã€‚" #: doc/classes/VisualShaderNodeFaceForward.xml msgid "" @@ -90644,10 +90973,10 @@ msgid "" "is smaller than zero the return value is [code]N[/code]. Otherwise, [code]-" "N[/code] is returned." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸ç¿»è¯‘为[code]faceforward(N, I, Nref)[/code]。该函数有三个å‘é‡å‚" -"数。[code]N[/code],定å‘矢é‡ï¼Œ[code]I[/code],入射矢é‡ï¼Œä»¥åŠ[code]Nref[/" -"code],å‚考矢é‡ã€‚如果[code]I[/code]å’Œ[code]Nref[/code]的点积å°äºŽé›¶ï¼Œè¿”回值为" -"[code]N[/code]。å¦åˆ™ï¼Œå°†è¿”回 [code]-N[/code]。" +"在ç€è‰²å™¨è¯è¨€ä¸ç¿»è¯‘为 [code]faceforward(N, I, Nref)[/code]。该函数有三个å‘é‡å‚" +"数。[code]N[/code],定å‘å‘é‡ï¼Œ[code]I[/code],入射å‘é‡ï¼Œä»¥åŠ[code]Nref[/" +"code],å‚考矢é‡ã€‚如果 [code]I[/code] å’Œ [code]Nref[/code] 的点积å°äºŽé›¶ï¼Œè¿”回" +"值为 [code]N[/code]。å¦åˆ™ï¼Œå°†è¿”回 [code]-N[/code]。" #: doc/classes/VisualShaderNodeFresnel.xml msgid "A Fresnel effect to be used within the visual shader graph." @@ -90818,7 +91147,7 @@ msgid "" "type (check [code]Tutorials[/code] section for link)." msgstr "" "æä¾›å¯¹ç€è‰²å™¨å¯ç”¨çš„输入å˜é‡ï¼ˆå†…置)的访问。关于æ¯ç§ç€è‰²å™¨ç±»åž‹çš„å¯ç”¨å†…ç½®å˜é‡åˆ—" -"表,请å‚阅ç€è‰²å™¨å‚è€ƒï¼Œå³æŸ¥çœ‹[code]Tutorials[/code]教程部分的链接。" +"表,请å‚阅ç€è‰²å™¨å‚考(查看[code]教程[/code]部分的链接)。" #: doc/classes/VisualShaderNodeInput.xml msgid "" @@ -90934,7 +91263,7 @@ msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„ä¸¤ä¸ªæ ‡é‡ä¹‹é—´è¿›è¡Œçº¿æ€§æ’值。" #: doc/classes/VisualShaderNodeScalarInterp.xml msgid "Translates to [code]mix(a, b, weight)[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢ä¸º[code]mix(a, b, weight)[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢ä¸º [code]mix(a, b, weight)[/code]。" #: doc/classes/VisualShaderNodeScalarSmoothStep.xml msgid "Calculates a scalar SmoothStep function within the visual shader graph." @@ -90949,10 +91278,10 @@ msgid "" "code]. Otherwise the return value is interpolated between [code]0.0[/code] " "and [code]1.0[/code] using Hermite polynomials." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]smoothstep(edge0, edge1, x)[/code]。\n" -"如果[code]x[/code]å°äºŽ[code]edge0[/code],返回 [code]0.0[/code];如果" -"[code]x[/code]大于[code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在" -"[code]0.0[/code]å’Œ[code]1.0[/code]之间使用Hermite多项å¼è¿›è¡Œæ’值。" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]smoothstep(edge0, edge1, x)[/code]。\n" +"如果 [code]x[/code] å°äºŽ [code]edge0[/code],返回 [code]0.0[/code];如果 " +"[code]x[/code] 大于 [code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在 " +"[code]0.0[/code] å’Œ [code]1.0[/code] 之间使用 Hermite 多项å¼è¿›è¡Œæ’值。" #: doc/classes/VisualShaderNodeScalarSwitch.xml msgid "A boolean/scalar function for use within the visual shader graph." @@ -91087,23 +91416,23 @@ msgstr "将输入端å£ä¸æä¾›çš„纹ç†ç”¨äºŽæ¤å‡½æ•°ã€‚" #: doc/classes/VisualShaderNodeTextureUniform.xml msgid "Performs a uniform texture lookup within the visual shader graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸æ‰§è¡Œuniformçš„çº¹ç†æŸ¥æ‰¾ã€‚" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸æ‰§è¡Œ uniform çš„çº¹ç†æŸ¥æ‰¾ã€‚" #: doc/classes/VisualShaderNodeTextureUniform.xml msgid "" "Performs a lookup operation on the texture provided as a uniform for the " "shader." -msgstr "对作为uniformç€è‰²å™¨æä¾›çš„纹ç†è¿›è¡ŒæŸ¥æ‰¾æ“作。" +msgstr "对作为 uniform ç€è‰²å™¨æä¾›çš„纹ç†è¿›è¡ŒæŸ¥æ‰¾æ“作。" #: doc/classes/VisualShaderNodeTextureUniform.xml msgid "Sets the default color if no texture is assigned to the uniform." -msgstr "如果没有给uniform分é…纹ç†ï¼Œåˆ™è®¾ç½®é»˜è®¤é¢œè‰²ã€‚" +msgstr "如果没有给 uniform 分é…纹ç†ï¼Œåˆ™è®¾ç½®é»˜è®¤é¢œè‰²ã€‚" #: doc/classes/VisualShaderNodeTextureUniform.xml msgid "" "Adds [code]hint_aniso[/code] as hint to the uniform declaration to use for a " "flowmap." -msgstr "å°†[code]hint_aniso[/code]作为æç¤ºæ·»åŠ åˆ°uniform声明ä¸ï¼Œç”¨äºŽæµç¨‹å›¾ã€‚" +msgstr "å°† [code]hint_aniso[/code] 作为æç¤ºæ·»åŠ åˆ° uniform 声明ä¸ï¼Œç”¨äºŽæµå‘图。" #: doc/classes/VisualShaderNodeTextureUniform.xml msgid "Defaults to white color." @@ -91117,7 +91446,7 @@ msgstr "默认为黑色。" msgid "" "Performs a uniform texture lookup with triplanar within the visual shader " "graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ç”¨ä¸‰è§’é¢è¿›è¡Œuniformçº¹ç†æŸ¥æ‰¾ã€‚" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ç”¨ä¸‰è§’é¢è¿›è¡Œ uniform çº¹ç†æŸ¥æ‰¾ã€‚" #: doc/classes/VisualShaderNodeTextureUniformTriplanar.xml msgid "" @@ -91128,7 +91457,7 @@ msgstr "对作为uniformç€è‰²å™¨æä¾›çš„纹ç†è¿›è¡ŒæŸ¥æ‰¾æ“作,并支æŒä¸ #: doc/classes/VisualShaderNodeTransformCompose.xml msgid "" "Composes a [Transform] from four [Vector3]s within the visual shader graph." -msgstr "从å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„四个[Vector3]组æˆä¸€ä¸ª[Transform]。" +msgstr "从å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„四个 [Vector3] 组æˆä¸€ä¸ª [Transform]。" #: doc/classes/VisualShaderNodeTransformCompose.xml msgid "" @@ -91136,25 +91465,25 @@ msgid "" "Each vector is one row in the matrix and the last column is a [code]vec4(0, " "0, 0, 1)[/code]." msgstr "" -"使用四个类型为[code]vec3[/code]çš„å‘é‡åˆ›å»ºä¸€ä¸ª4x4å˜æ¢çŸ©é˜µã€‚æ¯ä¸ªå‘釿˜¯çŸ©é˜µä¸çš„" -"一行,最åŽä¸€åˆ—是一个[code]vec4(0, 0, 0, 1)[/code]。" +"使用四个类型为 [code]vec3[/code] çš„å‘é‡åˆ›å»ºä¸€ä¸ª 4x4 å˜æ¢çŸ©é˜µã€‚æ¯ä¸ªå‘釿˜¯çŸ©é˜µ" +"ä¸çš„一行,最åŽä¸€åˆ—是一个 [code]vec4(0, 0, 0, 1)[/code]。" #: doc/classes/VisualShaderNodeTransformConstant.xml msgid "A [Transform] constant for use within the visual shader graph." -msgstr "一个[Transform]常é‡ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" +msgstr "[Transform] 常é‡ï¼Œåœ¨å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeTransformConstant.xml msgid "A constant [Transform], which can be used as an input node." -msgstr "一个常é‡[Transform],å¯ä»¥ä½œä¸ºä¸€ä¸ªè¾“入节点使用。" +msgstr "å¸¸é‡ [Transform],å¯ä»¥ä½œä¸ºä¸€ä¸ªè¾“入节点使用。" #: doc/classes/VisualShaderNodeTransformConstant.xml msgid "A [Transform] constant which represents the state of this node." -msgstr "一个[Transform]常é‡ï¼Œè¡¨ç¤ºè¿™ä¸ªèŠ‚ç‚¹çš„çŠ¶æ€ã€‚" +msgstr "[Transform] 常é‡ï¼Œè¡¨ç¤ºè¿™ä¸ªèŠ‚ç‚¹çš„çŠ¶æ€ã€‚" #: doc/classes/VisualShaderNodeTransformDecompose.xml msgid "" "Decomposes a [Transform] into four [Vector3]s within the visual shader graph." -msgstr "将一个[Transform]分解为å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„四个[Vector3]。" +msgstr "将一个 [Transform] 分解为å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„四个 [Vector3]。" #: doc/classes/VisualShaderNodeTransformDecompose.xml msgid "" @@ -91200,47 +91529,47 @@ msgstr "è¦å¯¹å˜æ¢è¿›è¡Œçš„乘法类型。å‚阅[enum Operator]的选项。" #: doc/classes/VisualShaderNodeTransformMult.xml msgid "Multiplies transform [code]a[/code] by the transform [code]b[/code]." -msgstr "å°†å˜æ¢[code]a[/code]ä¹˜ä»¥å˜æ¢[code]b[/code]。" +msgstr "å°†å˜æ¢ [code]a[/code] ä¹˜ä»¥å˜æ¢ [code]b[/code]。" #: doc/classes/VisualShaderNodeTransformMult.xml msgid "Multiplies transform [code]b[/code] by the transform [code]a[/code]." -msgstr "å°†å˜æ¢[code]b[/code]ä¹˜ä»¥å˜æ¢[code]a[/code]。" +msgstr "å°†å˜æ¢ [code]b[/code] ä¹˜ä»¥å˜æ¢ [code]a[/code]。" #: doc/classes/VisualShaderNodeTransformMult.xml msgid "" "Performs a component-wise multiplication of transform [code]a[/code] by the " "transform [code]b[/code]." -msgstr "å¯¹å˜æ¢[code]a[/code]ä¸Žå˜æ¢[code]b[/code]è¿›è¡Œåˆ†é‡æ˜Žæ™ºçš„乘法。" +msgstr "å¯¹å˜æ¢ [code]a[/code] ä¸Žå˜æ¢ [code]b[/code] è¿›è¡Œåˆ†é‡æ˜Žæ™ºçš„乘法。" #: doc/classes/VisualShaderNodeTransformMult.xml msgid "" "Performs a component-wise multiplication of transform [code]b[/code] by the " "transform [code]a[/code]." -msgstr "å¯¹å˜æ¢[code]b[/code]ä¸Žå˜æ¢[code]a[/code]è¿›è¡Œåˆ†é‡æ˜Žæ™ºçš„乘法。" +msgstr "å¯¹å˜æ¢ [code]b[/code] ä¸Žå˜æ¢ [code]a[/code] è¿›è¡Œåˆ†é‡æ˜Žæ™ºçš„乘法。" #: doc/classes/VisualShaderNodeTransformUniform.xml msgid "A [Transform] uniform for use within the visual shader graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„[Transform]uniform。" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨çš„ [Transform] uniform。" #: doc/classes/VisualShaderNodeTransformUniform.xml msgid "Translated to [code]uniform mat4[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]uniform mat4[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]uniform mat4[/code]。" #: doc/classes/VisualShaderNodeTransformVecMult.xml msgid "" "Multiplies a [Transform] and a [Vector3] within the visual shader graph." -msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ï¼Œå°†ä¸€ä¸ª[Transform]和一个[Vector3]相乘。" +msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ï¼Œå°†ä¸€ä¸ª [Transform] 和一个 [Vector3] 相乘。" #: doc/classes/VisualShaderNodeTransformVecMult.xml msgid "" "A multiplication operation on a transform (4x4 matrix) and a vector, with " "support for different multiplication operators." -msgstr "å¯¹ä¸€ä¸ªå˜æ¢ï¼ˆ4x4矩阵)和一个å‘é‡è¿›è¡Œä¹˜æ³•è¿ç®—,支æŒä¸åŒçš„乘法è¿ç®—符。" +msgstr "å¯¹ä¸€ä¸ªå˜æ¢ï¼ˆ4x4 矩阵)和一个å‘é‡è¿›è¡Œä¹˜æ³•è¿ç®—,支æŒä¸åŒçš„乘法è¿ç®—符。" #: doc/classes/VisualShaderNodeTransformVecMult.xml msgid "" "The multiplication type to be performed. See [enum Operator] for options." -msgstr "è¦æ‰§è¡Œçš„乘法类型。å‚阅[enum Operator]的选项。" +msgstr "è¦æ‰§è¡Œçš„乘法类型。å‚阅 [enum Operator] 的选项。" #: doc/classes/VisualShaderNodeTransformVecMult.xml msgid "Multiplies transform [code]a[/code] by the vector [code]b[/code]." @@ -91301,23 +91630,23 @@ msgstr "该引用所指å‘çš„ uniform çš„å称。" #: doc/classes/VisualShaderNodeVec3Constant.xml msgid "A [Vector3] constant to be used within the visual shader graph." -msgstr "一个 [Vector3] 常é‡ï¼Œç”¨äºŽå¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ã€‚" +msgstr "[Vector3] 常é‡ï¼Œç”¨äºŽå¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ã€‚" #: doc/classes/VisualShaderNodeVec3Constant.xml msgid "A constant [Vector3], which can be used as an input node." -msgstr "ä¸€ä¸ªå¸¸é‡ [Vector3],它å¯ä»¥ä½œä¸ºè¾“入节点使用。" +msgstr "å¸¸é‡ [Vector3],它å¯ä»¥ä½œä¸ºè¾“入节点使用。" #: doc/classes/VisualShaderNodeVec3Constant.xml msgid "A [Vector3] constant which represents the state of this node." -msgstr "一个 [Vector3] 常é‡ï¼Œè¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„çŠ¶æ€ã€‚" +msgstr "[Vector3] 常é‡ï¼Œè¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„çŠ¶æ€ã€‚" #: doc/classes/VisualShaderNodeVec3Uniform.xml msgid "A [Vector3] uniform to be used within the visual shader graph." -msgstr "一个 [Vector3] çš„ uniform,在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" +msgstr "[Vector3] çš„ uniform,在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸ä½¿ç”¨ã€‚" #: doc/classes/VisualShaderNodeVec3Uniform.xml msgid "Translated to [code]uniform vec3[/code] in the shader language." -msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]uniform vec3[/code]。" +msgstr "在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]uniform vec3[/code]。" #: doc/classes/VisualShaderNodeVectorClamp.xml msgid "Clamps a vector value within the visual shader graph." @@ -91329,30 +91658,30 @@ msgid "" "values. The operation is performed on each component of the vector " "individually." msgstr "" -"将一个值é™åˆ¶åœ¨[code]min[/code]å’Œ[code]max[/code]之间。该æ“作是对å‘é‡çš„æ¯ä¸ªåˆ†" -"é‡å•独执行的。" +"将一个值é™åˆ¶åœ¨ [code]min[/code] å’Œ [code]max[/code] 之间。该æ“作是对å‘é‡çš„æ¯" +"个分é‡å•独执行的。" #: doc/classes/VisualShaderNodeVectorCompose.xml msgid "Composes a [Vector3] from three scalars within the visual shader graph." -msgstr "从å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„ä¸‰ä¸ªæ ‡é‡ç»„æˆä¸€ä¸ª[Vector3]。" +msgstr "从å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„ä¸‰ä¸ªæ ‡é‡ç»„æˆä¸€ä¸ª [Vector3]。" #: doc/classes/VisualShaderNodeVectorCompose.xml msgid "" "Creates a [code]vec3[/code] using three scalar values that can be provided " "from separate inputs." msgstr "" -"ä½¿ç”¨ä¸‰ä¸ªæ ‡é‡å€¼åˆ›å»ºä¸€ä¸ª[code]vec3[/code]ï¼Œè¿™äº›æ ‡é‡å€¼å¯ä»¥ç”±å•独的输入æä¾›ã€‚" +"ä½¿ç”¨ä¸‰ä¸ªæ ‡é‡å€¼åˆ›å»ºä¸€ä¸ª [code]vec3[/code]ï¼Œè¿™äº›æ ‡é‡å€¼å¯ä»¥ç”±å•独的输入æä¾›ã€‚" #: doc/classes/VisualShaderNodeVectorDecompose.xml msgid "" "Decomposes a [Vector3] into three scalars within the visual shader graph." -msgstr "将一个[Vector3]分解为å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„ä¸‰ä¸ªæ ‡é‡ã€‚" +msgstr "将一个 [Vector3] 分解为å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸çš„ä¸‰ä¸ªæ ‡é‡ã€‚" #: doc/classes/VisualShaderNodeVectorDecompose.xml msgid "" "Takes a [code]vec3[/code] and decomposes it into three scalar values that " "can be used as separate inputs." -msgstr "å–一个[code]vec3[/code]å¹¶å°†å…¶åˆ†è§£ä¸ºä¸‰ä¸ªæ ‡é‡å€¼ï¼Œå¯ä½œä¸ºå•独的输入。" +msgstr "å–一个 [code]vec3[/code] å¹¶å°†å…¶åˆ†è§£ä¸ºä¸‰ä¸ªæ ‡é‡å€¼ï¼Œå¯ä½œä¸ºå•独的输入。" #: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml msgid "Calculates a vector derivative within the visual shader graph." @@ -91360,7 +91689,7 @@ msgstr "在å¯è§†åŒ–ç€è‰²å™¨å›¾ä¸è®¡ç®—一个å‘é‡å¯¼æ•°ã€‚" #: doc/classes/VisualShaderNodeVectorDerivativeFunc.xml msgid "A derivative type. See [enum Function] for options." -msgstr "派生类型。选项å‚阅[enum Function]。" +msgstr "派生类型。选项å‚阅 [enum Function]。" #: doc/classes/VisualShaderNodeVectorDistance.xml msgid "" @@ -91374,8 +91703,8 @@ msgid "" "vector [code]p1[/code].\n" "Translated to [code]distance(p0, p1)[/code] in the shader language." msgstr "" -"计算从å‘é‡[code]p0[/code]表示的点到å‘é‡[code]p1[/code]çš„è·ç¦»ã€‚\n" -"在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ[code]distance(p0, p1)[/code]。" +"计算从å‘é‡ [code]p0[/code] 表示的点到å‘é‡ [code]p1[/code] çš„è·ç¦»ã€‚\n" +"在ç€è‰²å™¨è¯è¨€ä¸è¢«è½¬æ¢æˆ [code]distance(p0, p1)[/code]。" #: doc/classes/VisualShaderNodeVectorFunc.xml msgid "A vector function to be used within the visual shader graph." @@ -91387,7 +91716,7 @@ msgstr "å¯è§†åŒ–ç€è‰²å™¨èŠ‚ç‚¹ï¼Œèƒ½å¤Ÿä½¿ç”¨å‘釿‰§è¡Œä¸åŒçš„函数。" #: doc/classes/VisualShaderNodeVectorFunc.xml msgid "The function to be performed. See [enum Function] for options." -msgstr "è¦æ‰§è¡Œçš„函数。å‚阅[enum Function]的选项。" +msgstr "è¦æ‰§è¡Œçš„函数。å‚阅 [enum Function] 的选项。" #: doc/classes/VisualShaderNodeVectorFunc.xml msgid "" @@ -91549,8 +91878,8 @@ msgid "" "Translates to [code]mix(a, b, weight)[/code] in the shader language, where " "[code]weight[/code] is a [Vector3] with weights for each component." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]mix(a, b, weight)[/code],其ä¸[code]weight[/code]是" -"一个[Vector3],æ¯ä¸ªåˆ†é‡çš„æƒé‡ã€‚" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]mix(a, b, weight)[/code]ï¼Œå…¶ä¸ [code]weight[/" +"code] 是一个 [Vector3],æ¯ä¸ªåˆ†é‡çš„æƒé‡ã€‚" #: doc/classes/VisualShaderNodeVectorLen.xml msgid "Returns the length of a [Vector3] within the visual shader graph." @@ -91645,8 +91974,8 @@ msgid "" "[code]I[/code] is the incident vector, [code]N[/code] is the normal vector " "and [code]eta[/code] is the ratio of the indices of the refraction." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]refract(I, N, eta)[/code],其ä¸[code]I[/code]是入射" -"å‘é‡ï¼Œ[code]N[/code]是法线å‘é‡ï¼Œ[code]eta[/code]是折射的比率。" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]refract(I, N, eta)[/code]ï¼Œå…¶ä¸ [code]I[/code] 是" +"入射å‘é‡ï¼Œ[code]N[/code] 是法线å‘é‡ï¼Œ[code]eta[/code] 是折射的比率。" #: doc/classes/VisualShaderNodeVectorScalarMix.xml msgid "" @@ -91660,8 +91989,8 @@ msgid "" "[code]a[/code] and [code]b[/code] are vectors and [code]weight[/code] is a " "scalar." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]mix(a, b, weight)[/code],其ä¸[code]a[/code]å’Œ" -"[code]b[/code]是å‘é‡ï¼Œ[code]weight[/code]æ˜¯æ ‡é‡ã€‚" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]mix(a, b, weight)[/code]ï¼Œå…¶ä¸ [code]a[/code] å’Œ " +"[code]b[/code] 是å‘é‡ï¼Œ[code]weight[/code] æ˜¯æ ‡é‡ã€‚" #: doc/classes/VisualShaderNodeVectorScalarSmoothStep.xml msgid "" @@ -91678,11 +92007,11 @@ msgid "" "code]. Otherwise the return value is interpolated between [code]0.0[/code] " "and [code]1.0[/code] using Hermite polynomials." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]smoothstep(edge0, edge1, x)[/code],其ä¸[code]x[/" -"code]æ˜¯ä¸€ä¸ªæ ‡é‡ã€‚\n" -"如果[code]x[/code]å°äºŽ[code]edge0[/code],返回 [code]0.0[/code],如果" -"[code]x[/code]大于[code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在" -"[code]0.0[/code]å’Œ[code]1.0[/code]之间使用Hermite多项å¼è¿›è¡Œæ’值。" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]smoothstep(edge0, edge1, x)[/code]ï¼Œå…¶ä¸ [code]x[/" +"code] æ˜¯ä¸€ä¸ªæ ‡é‡ã€‚\n" +"如果 [code]x[/code] å°äºŽ [code]edge0[/code],返回 [code]0.0[/code],如果 " +"[code]x[/code] 大于 [code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在" +"[code]0.0[/code] å’Œ [code]1.0[/code] 之间使用 Hermite 多项å¼è¿›è¡Œæ’值。" #: doc/classes/VisualShaderNodeVectorScalarStep.xml msgid "Calculates a vector Step function within the visual shader graph." @@ -91694,8 +92023,8 @@ msgid "" "Returns [code]0.0[/code] if [code]x[/code] is smaller than [code]edge[/code] " "and [code]1.0[/code] otherwise." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]step(edge, x)[/code]。\n" -"如果[code]x[/code]å°äºŽ[code]edge[/code],返回 [code]0.0[/code],å¦åˆ™è¿”回 " +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]step(edge, x)[/code]。\n" +"如果 [code]x[/code] å°äºŽ [code]edge[/code],返回 [code]0.0[/code],å¦åˆ™è¿”回 " "[code]1.0[/code]。" #: doc/classes/VisualShaderNodeVectorSmoothStep.xml @@ -91711,11 +92040,11 @@ msgid "" "code]. Otherwise the return value is interpolated between [code]0.0[/code] " "and [code]1.0[/code] using Hermite polynomials." msgstr "" -"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ[code]smoothstep(edge0, edge1, x)[/code],其ä¸[code]x[/" -"code]是一个å‘é‡ã€‚\n" -"如果[code]x[/code]å°äºŽ[code]edge0[/code],返回 [code]0.0[/code],如果" -"[code]x[/code]大于[code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在" -"[code]0.0[/code]å’Œ[code]1.0[/code]之间使用Hermite多项å¼è¿›è¡Œæ’值。" +"在ç€è‰²å™¨è¯è¨€ä¸è½¬æ¢æˆ [code]smoothstep(edge0, edge1, x)[/code]ï¼Œå…¶ä¸ [code]x[/" +"code] 是一个å‘é‡ã€‚\n" +"如果 [code]x[/code] å°äºŽ [code]edge0[/code],返回 [code]0.0[/code],如果 " +"[code]x[/code] 大于 [code]edge1[/code],返回 [code]1.0[/code]。å¦åˆ™è¿”回值在 " +"[code]0.0[/code] å’Œ [code]1.0[/code] 之间使用 Hermite 多项å¼è¿›è¡Œæ’值。" #: doc/classes/VScrollBar.xml msgid "Vertical scroll bar." @@ -91763,8 +92092,8 @@ msgid "" "The style for the separator line. Works best with [StyleBoxLine] (remember " "to enable [member StyleBoxLine.vertical])." msgstr "" -"åˆ†éš”çº¿çš„æ ·å¼ã€‚与[StyleBoxLine]一起使用效果最好,记得è¦å¯ç”¨[member " -"StyleBoxLine.vertical]。" +"åˆ†éš”çº¿çš„æ ·å¼ã€‚与 [StyleBoxLine] 一起使用效果最好(记得è¦å¯ç”¨ [member " +"StyleBoxLine.vertical])。" #: doc/classes/VSlider.xml msgid "Vertical slider." @@ -91777,7 +92106,7 @@ msgid "" "[b]Note:[/b] The [signal Range.changed] and [signal Range.value_changed] " "signals are part of the [Range] class which this class inherits from." msgstr "" -"垂直滑动æ¡ã€‚请å‚阅 [Slider]。这个控件是从底部(最å°ï¼‰æ»‘到顶部(最大)的。\n" +"垂直滑动æ¡ã€‚è§ [Slider]。这个控件是从底部(最å°ï¼‰æ»‘到顶部(最大)的。\n" "[b]注æ„:[/b][signal Range.changed] å’Œ [signal Range.value_changed] ä¿¡å·æ˜¯ " "[Range] 类的一部分,该类继承自它。" @@ -91798,7 +92127,7 @@ msgstr "垂直拆分容器。" #: doc/classes/VSplitContainer.xml msgid "" "Vertical split container. See [SplitContainer]. This goes from top to bottom." -msgstr "垂直拆分容器。å‚阅[SplitContainer]。这是从上到下的。" +msgstr "åž‚ç›´æ‹†åˆ†å®¹å™¨ã€‚è§ [SplitContainer]。这是从上到下的。" #: doc/classes/WeakRef.xml msgid "" @@ -91846,8 +92175,8 @@ msgid "" "after the connection is established (will return [code]65535[/code] until " "then)." msgstr "" -"返回创建时分é…给该通é“çš„ID,或在å商时自动分é…。\n" -"å¦‚æžœè¯¥é€šé“æ²¡æœ‰è¿›è¡Œå¸¦å¤–å商,那么该IDå°†åªåœ¨è¿žæŽ¥å»ºç«‹åŽå¯ç”¨ï¼Œåœ¨æ¤ä¹‹å‰å°†è¿”回 " +"返回创建时分é…给该通é“çš„ ID,或在å商时自动分é…。\n" +"å¦‚æžœè¯¥é€šé“æ²¡æœ‰è¿›è¡Œå¸¦å¤–å商,那么该 ID å°†åªåœ¨è¿žæŽ¥å»ºç«‹åŽå¯ç”¨ï¼Œåœ¨æ¤ä¹‹å‰å°†è¿”回 " "[code]65535[/code]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -91860,8 +92189,8 @@ msgid "" "during creation.\n" "Will be [code]65535[/code] if not specified." msgstr "" -"返回创建时分é…给这个通é“çš„[code]maxPacketLifeTime[/code]值。\n" -"如果没有指定,将是[code]65535[/code]。" +"返回创建时分é…给这个通é“çš„ [code]maxPacketLifeTime[/code] 值。\n" +"如果没有指定,将是 [code]65535[/code]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "" @@ -91869,8 +92198,8 @@ msgid "" "during creation.\n" "Will be [code]65535[/code] if not specified." msgstr "" -"返回创建时分é…给这个通é“çš„[code]maxRetransmits[/code]值。\n" -"如果没有指定,将是[code]65535[/code]。" +"返回创建时分é…给这个通é“çš„ [code]maxRetransmits[/code] 值。\n" +"如果没有指定,将是 [code]65535[/code]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "" @@ -91880,7 +92209,7 @@ msgstr "返回创建时分é…给这个通é“çš„åå议。如果没有指定, #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "Returns the current state of this channel, see [enum ChannelState]." -msgstr "返回该通é“的当å‰çжæ€ï¼Œå‚阅[enum ChannelState]。" +msgstr "返回该通é“的当å‰çжæ€ï¼Œè§ [enum ChannelState]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "" @@ -91903,7 +92232,7 @@ msgid "" "Returns [code]true[/code] if the last received packet was transferred as " "text. See [member write_mode]." msgstr "" -"å¦‚æžœæœ€åŽæ”¶åˆ°çš„æ•°æ®åŒ…是以文本形å¼ä¼ 输,则返回 [code]true[/code]。å‚阅[member " +"å¦‚æžœæœ€åŽæ”¶åˆ°çš„æ•°æ®åŒ…是以文本形å¼ä¼ 输,则返回 [code]true[/code]ã€‚è§ [member " "write_mode]。" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -91916,16 +92245,16 @@ msgid "" "Tells the channel to send data over this channel as text. An external peer " "(non-Godot) would receive this as a string." msgstr "" -"告诉通é“以文本形å¼åœ¨è¿™ä¸ªé€šé“上å‘逿•°æ®ã€‚外部对ç‰ä½“(éžGodot)会以å—符串的形å¼" -"接收。" +"告诉通é“以文本形å¼åœ¨è¿™ä¸ªé€šé“上å‘逿•°æ®ã€‚外部对ç‰ä½“ï¼ˆéž Godot)会以å—符串的形" +"å¼æŽ¥æ”¶ã€‚" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "" "Tells the channel to send data over this channel as binary. An external peer " "(non-Godot) would receive this as array buffer or blob." msgstr "" -"告诉通é“以二进制形å¼åœ¨æ¤é€šé“上å‘逿•°æ®ã€‚外部对ç‰ä½“(éžGodot)将以数组缓冲区或" -"blobçš„å½¢å¼æŽ¥æ”¶ã€‚" +"告诉通é“以二进制形å¼åœ¨æ¤é€šé“上å‘逿•°æ®ã€‚外部对ç‰ä½“ï¼ˆéž Godot)将以数组缓冲区" +"或 blob çš„å½¢å¼æŽ¥æ”¶ã€‚" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "The channel was created, but it's still trying to connect." @@ -91950,8 +92279,8 @@ msgid "" "A simple interface to create a peer-to-peer mesh network composed of " "[WebRTCPeerConnection] that is compatible with the [MultiplayerAPI]." msgstr "" -"简å•的接å£ï¼Œç”¨äºŽåˆ›å»ºç”±[WebRTCPeerConnection]组æˆçš„点对点网状网络,与" -"[MultiplayerAPI]兼容。" +"简å•的接å£ï¼Œç”¨äºŽåˆ›å»ºç”± [WebRTCPeerConnection] 组æˆçš„点对点网状网络,与 " +"[MultiplayerAPI] 兼容。" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml msgid "" @@ -91990,12 +92319,12 @@ msgid "" "the [code]maxPacketLifetime[/code] option when creating unreliable and " "ordered channels (see [method WebRTCPeerConnection.create_data_channel])." msgstr "" -"以给定的[code]peer_id[/code]æ·»åŠ ä¸€ä¸ªæ–°çš„å¯¹ç‰ä½“到网状结构。该" -"[WebRTCPeerConnection]必须处于[constant WebRTCPeerConnection.STATE_NEW]状" +"以给定的 [code]peer_id[/code] æ·»åŠ ä¸€ä¸ªæ–°çš„å¯¹ç‰ä½“到网状结构。该 " +"[WebRTCPeerConnection] 必须处于 [constant WebRTCPeerConnection.STATE_NEW] 状" "æ€ã€‚\n" "将为å¯é çš„ã€ä¸å¯é 的和有åºçš„ä¼ è¾“åˆ›å»ºä¸‰ä¸ªé€šé“。在创建ä¸å¯é 和有åºé€šé“时," -"[code]unreliable_lifetime[/code]çš„å€¼å°†è¢«ä¼ é€’ç»™[code]maxPacketLifetime[/code]" -"选项,å‚阅[method WebRTCPeerConnection.create_data_channel]。" +"[code]unreliable_lifetime[/code] çš„å€¼å°†è¢«ä¼ é€’ç»™ [code]maxPacketLifetime[/" +"code]é€‰é¡¹ï¼ˆè§ [method WebRTCPeerConnection.create_data_channel])。" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml msgid "Close all the add peer connections and channels, freeing all resources." @@ -92009,25 +92338,25 @@ msgid "" "[WebRTCDataChannel], and [code]connected[/code] a boolean representing if " "the peer connection is currently connected (all three channels are open)." msgstr "" -"返回一个具有给定[code]peer_id[/code]的对ç‰ä½“çš„å—典表示,有三个键。" -"[code]connection[/code]包å«åˆ°è¿™ä¸ªå¯¹ç‰ä½“çš„[WebRTCPeerConnection]," -"[code]channels[/code]三个[WebRTCDataChannel]的数组,以åŠ[code]connected[/" -"code]一个布尔值,表示对ç‰ä½“连接是å¦å½“å‰å·²è¿žæŽ¥ï¼Œæ³¨ï¼Œæ‰€æœ‰ä¸‰ä¸ªé€šé“都打开。" +"返回一个具有给定 [code]peer_id[/code] 的对ç‰ä½“çš„å—典表示,有三个键。" +"[code]connection[/code] 包å«åˆ°è¿™ä¸ªå¯¹ç‰ä½“çš„ [WebRTCPeerConnection]," +"[code]channels[/code] 三个 [WebRTCDataChannel] çš„æ•°ç»„ï¼Œä»¥åŠ [code]connected[/" +"code] 一个布尔值,表示对ç‰ä½“连接是å¦å½“å‰å·²è¿žæŽ¥ï¼ˆæ‰€æœ‰ä¸‰ä¸ªé€šé“都打开)。" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml msgid "" "Returns a dictionary which keys are the peer ids and values the peer " "representation as in [method get_peer]." msgstr "" -"返回一个å—典,其键是对ç‰ä½“çš„id,其值是对ç‰ä½“的表示,如[method get_peer]。" +"返回一个å—典,其键是对ç‰ä½“çš„ id,其值是对ç‰ä½“的表示,如 [method get_peer]。" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml msgid "" "Returns [code]true[/code] if the given [code]peer_id[/code] is in the peers " "map (it might not be connected though)." msgstr "" -"如果给定的[code]peer_id[/code]在对ç‰ä½“æ˜ å°„ä¸ï¼Œåˆ™è¿”回 [code]true[/code],尽管" -"它å¯èƒ½æ²¡æœ‰è¿žæŽ¥ã€‚" +"如果给定的 [code]peer_id[/code] 在对ç‰ä½“æ˜ å°„ä¸ï¼Œåˆ™è¿”回 [code]true[/code],尽" +"管它å¯èƒ½æ²¡æœ‰è¿žæŽ¥ã€‚" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml msgid "" @@ -92048,18 +92377,18 @@ msgid "" "server_disconnected] will be emitted and state will become [constant " "NetworkedMultiplayerPeer.CONNECTION_CONNECTED]." msgstr "" -"用给定的[code]peer_id[/code](必须在1å’Œ2147483647之间)åˆå§‹åŒ–多人游æˆå¯¹ç‰" -"体。\n" -"如果[code]server_compatibilty[/code]是[code]false[/code](默认),多人对ç‰ä½“" -"将立å³å¤„于[constant NetworkedMultiplayerPeer.CONNECTION_CONNECTED]状æ€ï¼Œ" -"[signal NetworkedMultiplayerPeer.connection_succeeded]å°†ä¸ä¼šè¢«å‘射出æ¥ã€‚\n" -"如果[code]server_compatibilty[/code]为 [code]true[/code],对ç‰ä½“将抑制所有" -"[signal NetworkedMultiplayerPeer.peer_connected]ä¿¡å·ï¼Œç›´åˆ°ä¸€ä¸ªid为[constant " -"NetworkedMultiplayerPeer.TARGET_PEER_SERVER]的对ç‰ä½“连接,然åŽå‘出[signal " -"NetworkedMultiplayerPeer.connection_succeeded]。之åŽå°†å¯¹æ¯ä¸ªå·²ç»è¿žæŽ¥çš„对ç‰ä½“" -"å’Œå¯èƒ½è¿žæŽ¥çš„任何新对ç‰ä½“å‘出[signal NetworkedMultiplayerPeer.peer_connected]" -"的信å·ã€‚如果æœåС噍坹ç‰ä½“在æ¤ä¹‹åŽæ–开连接,信å·[signal " -"NetworkedMultiplayerPeer.server_disconnected]将被å‘出,状æ€å°†å˜æˆ[constant " +"用给定的 [code]peer_id[/code](必须在 1 å’Œ 2147483647 之间)åˆå§‹åŒ–多人游æˆå¯¹" +"ç‰ä½“。\n" +"如果[code]server_compatibilty[/code] 是 [code]false[/code](默认),多人对ç‰" +"体将立å³å¤„于 [constant NetworkedMultiplayerPeer.CONNECTION_CONNECTED] 状æ€ï¼Œ" +"[signal NetworkedMultiplayerPeer.connection_succeeded] å°†ä¸ä¼šè¢«å‘射出æ¥ã€‚\n" +"如果[code]server_compatibilty[/code] 为 [code]true[/code],对ç‰ä½“将抑制所有 " +"[signal NetworkedMultiplayerPeer.peer_connected] ä¿¡å·ï¼Œç›´åˆ°ä¸€ä¸ª id 为 " +"[constant NetworkedMultiplayerPeer.TARGET_PEER_SERVER] 的对ç‰ä½“连接,然åŽå‘" +"出 [signal NetworkedMultiplayerPeer.connection_succeeded]。之åŽå°†å¯¹æ¯ä¸ªå·²ç»è¿ž" +"接的对ç‰ä½“å’Œå¯èƒ½è¿žæŽ¥çš„任何新对ç‰ä½“å‘出 [signal NetworkedMultiplayerPeer." +"peer_connected] 的信å·ã€‚如果æœåС噍坹ç‰ä½“在æ¤ä¹‹åŽæ–å¼€è¿žæŽ¥ï¼Œä¿¡å· [signal " +"NetworkedMultiplayerPeer.server_disconnected] 将被å‘出,状æ€å°†å˜æˆ [constant " "NetworkedMultiplayerPeer.CONNECTION_CONNECTED]。" #: modules/webrtc/doc_classes/WebRTCMultiplayer.xml @@ -92069,13 +92398,13 @@ msgid "" "emitted for it, then [signal NetworkedMultiplayerPeer.peer_disconnected] " "will be emitted." msgstr "" -"ä»Žç½‘æ ¼ä¸ç§»é™¤ç»™å®šçš„[code]peer_id[/code]的对ç‰ä½“。如果对ç‰ä½“是连接的,并为其å‘" -"出[signal NetworkedMultiplayerPeer.peer_connected],那么[signal " -"NetworkedMultiplayerPeer.peer_disconnected]将被å‘出。" +"ä»Žç½‘æ ¼ä¸ç§»é™¤ç»™å®šçš„ [code]peer_id[/code] 的对ç‰ä½“。如果对ç‰ä½“是连接的,并为其" +"å‘出 [signal NetworkedMultiplayerPeer.peer_connected],那么 [signal " +"NetworkedMultiplayerPeer.peer_disconnected] 将被å‘出。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "Interface to a WebRTC peer connection." -msgstr "与WebRTC对ç‰ä½“连接的接å£ã€‚" +msgstr "与 WebRTC 对ç‰ä½“连接的接å£ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -92093,14 +92422,14 @@ msgid "" "After these steps, the connection should become connected. Keep on reading " "or look into the tutorial for more information." msgstr "" -"本地计算机和远程对ç‰ä½“之间的WebRTC连接。æä¾›ä¸€ä¸ªæŽ¥å£æ¥è¿žæŽ¥ã€ç»´æŠ¤å’Œç›‘控连" +"本地计算机和远程对ç‰ä½“之间的 WebRTC 连接。æä¾›ä¸€ä¸ªæŽ¥å£æ¥è¿žæŽ¥ã€ç»´æŠ¤å’Œç›‘控连" "接。\n" -"从当å‰å¼€å§‹ï¼Œåœ¨ä¸¤ä¸ªå¯¹ç‰ä½“之间建立WebRTCè¿žæŽ¥ï¼Œè¿™ä¸æ˜¯ä¸€é¡¹ç®€å•的任务,但它å¯ä»¥åˆ†" -"解为3ä¸ªä¸»è¦æ¥éª¤ã€‚\n" +"从当å‰å¼€å§‹ï¼Œåœ¨ä¸¤ä¸ªå¯¹ç‰ä½“之间建立 WebRTC è¿žæŽ¥ï¼Œè¿™ä¸æ˜¯ä¸€é¡¹ç®€å•的任务,但它å¯ä»¥" +"分解为 3 ä¸ªä¸»è¦æ¥éª¤ã€‚\n" "- 想è¦å¯åŠ¨è¿žæŽ¥çš„å¯¹ç‰ä½“([code]A[/code]从现在开始)创建一个æäº¤ï¼Œå¹¶å°†å…¶å‘é€ç»™" "å¦ä¸€ä¸ªå¯¹ç‰ä½“([code]B[/code]从现在开始)。\n" -"- [code]B[/code]收到è¦çº¦ï¼Œç”Ÿæˆå’Œå›žç”,并将其å‘é€ç»™[code]A[/code])。\n" -"- [code]A[/code]å’Œ[code]B[/code]ç„¶åŽç”Ÿæˆå¹¶ç›¸äº’交æ¢ICE候选。\n" +"- [code]B[/code] 收到è¦çº¦ï¼Œç”Ÿæˆå’Œå›žç”,并将其å‘é€ç»™ [code]A[/code])。\n" +"- [code]A[/code] å’Œ [code]B[/code] ç„¶åŽç”Ÿæˆå¹¶ç›¸äº’äº¤æ¢ ICE 候选。\n" "在这些æ¥éª¤ä¹‹åŽï¼Œè¿žæŽ¥åº”该æˆåŠŸå»ºç«‹ã€‚ç»§ç»é˜…读或查看教程以了解更多信æ¯ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -92118,7 +92447,7 @@ msgid "" "call [method initialize]." msgstr "" "å…³é—对ç‰ä½“连接和与之相关的所有数æ®é€šé“。\n" -"[b]注æ„:[/b]ä½ ä¸èƒ½ä¸ºä¸€ä¸ªæ–°çš„连接é‡å¤ä½¿ç”¨è¿™ä¸ªå¯¹è±¡ï¼Œé™¤éžä½ 调用[method " +"[b]注æ„:[/b]ä½ ä¸èƒ½ä¸ºä¸€ä¸ªæ–°çš„连接é‡å¤ä½¿ç”¨è¿™ä¸ªå¯¹è±¡ï¼Œé™¤éžä½ 调用 [method " "initialize]。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -92197,14 +92526,14 @@ msgid "" "session_description_created] will be called when the session is ready to be " "sent." msgstr "" -"创建一个新的SDPæäº¤ï¼Œä»¥å¼€å§‹ä¸Žè¿œç¨‹å¯¹ç‰ä½“çš„WebRTCè¿žæŽ¥ã€‚åœ¨è°ƒç”¨æ¤æ–¹æ³•之å‰ï¼Œè‡³å°‘è¦" -"创建一个[WebRTCDataChannel]。\n" -"如果这个函数返回[constant OK],当会è¯å‡†å¤‡å¥½è¢«å‘逿—¶ï¼Œ[signal " -"session_description_created]将被调用。" +"创建一个新的 SDP æäº¤ï¼Œä»¥å¼€å§‹ä¸Žè¿œç¨‹å¯¹ç‰ä½“çš„ WebRTC è¿žæŽ¥ã€‚åœ¨è°ƒç”¨æ¤æ–¹æ³•之å‰ï¼Œè‡³" +"å°‘è¦åˆ›å»ºä¸€ä¸ª [WebRTCDataChannel]。\n" +"如果这个函数返回 [constant OK],当会è¯å‡†å¤‡å¥½è¢«å‘逿—¶ï¼Œ[signal " +"session_description_created] 将被调用。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "Returns the connection state. See [enum ConnectionState]." -msgstr "返回连接状æ€ã€‚å‚阅[enum ConnectionState]。" +msgstr "返回连接状æ€ã€‚è§ [enum ConnectionState]。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -92256,8 +92585,8 @@ msgid "" "Call this method frequently (e.g. in [method Node._process] or [method Node." "_physics_process]) to properly receive signals." msgstr "" -"ç»å¸¸è°ƒç”¨è¿™ä¸ªæ–¹æ³•以æ£ç¡®æŽ¥æ”¶ä¿¡å·ï¼Œä¾‹å¦‚在[method Node._process]或[method Node." -"_physics_process]ä¸ã€‚" +"ç»å¸¸è°ƒç”¨è¿™ä¸ªæ–¹æ³•以æ£ç¡®æŽ¥æ”¶ä¿¡å·ï¼Œä¾‹å¦‚在 [method Node._process] 或 [method " +"Node._physics_process] ä¸ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -92267,10 +92596,10 @@ msgid "" "ice_candidate_created] (unless an [enum Error] different from [constant OK] " "is returned)." msgstr "" -"设置本地对ç‰ä½“çš„SDPæè¿°ã€‚这应是在å“应[signal session_description_created]æ—¶è°ƒ" -"用的。\n" -"调用æ¤å‡½æ•°åŽï¼Œå¯¹ç‰ä½“将开始å‘出[signal ice_candidate_created],除éžè¿”回与" -"[constant OK]ä¸åŒçš„[enum Error]。" +"设置本地对ç‰ä½“çš„ SDP æè¿°ã€‚这应是在å“应 [signal session_description_created] " +"时调用的。\n" +"调用æ¤å‡½æ•°åŽï¼Œå¯¹ç‰ä½“将开始å‘出 [signal ice_candidate_created],除éžè¿”回与 " +"[constant OK] ä¸åŒçš„ [enum Error]。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -92281,11 +92610,11 @@ msgid "" "If [code]type[/code] is [code]answer[/code] the peer will start emitting " "[signal ice_candidate_created]." msgstr "" -"设置远程对ç‰ä½“çš„SDPæè¿°ã€‚应用远程对ç‰ä½“产生的值æ¥è°ƒç”¨ï¼Œå¹¶é€šè¿‡ä¿¡å·æœåŠ¡å™¨æŽ¥" +"设置远程对ç‰ä½“çš„ SDP æè¿°ã€‚应用远程对ç‰ä½“产生的值æ¥è°ƒç”¨ï¼Œå¹¶é€šè¿‡ä¿¡å·æœåŠ¡å™¨æŽ¥" "收。\n" -"如果[code]type[/code]是[code]offer[/code],对ç‰ä½“å°†å‘出[signal " -"session_description_created]å¹¶ç»™å‡ºé€‚å½“çš„ç”æ¡ˆã€‚\n" -"如果[code]type[/code]是[code]answer[/code],对ç‰ä½“将开始å‘出[signal " +"如果 [code]type[/code] 是 [code]offer[/code],对ç‰ä½“å°†å‘出 [signal " +"session_description_created] å¹¶ç»™å‡ºé€‚å½“çš„ç”æ¡ˆã€‚\n" +"如果 [code]type[/code] 是 [code]answer[/code],对ç‰ä½“将开始å‘出 [signal " "ice_candidate_created]。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -92306,7 +92635,8 @@ msgid "" "Emitted when a new ICE candidate has been created. The three parameters are " "meant to be passed to the remote peer over the signaling server." msgstr "" -"当新的ICE候选者被创建时触å‘ã€‚è¿™ä¸‰ä¸ªå‚æ•°æ˜¯ä¸ºäº†é€šè¿‡ä¿¡å·æœåŠ¡å™¨ä¼ é€’ç»™è¿œç¨‹å¯¹ç‰ä½“。" +"当新的 ICE 候选者被创建时触å‘ã€‚è¿™ä¸‰ä¸ªå‚æ•°æ˜¯ä¸ºäº†é€šè¿‡ä¿¡å·æœåŠ¡å™¨ä¼ é€’ç»™è¿œç¨‹å¯¹ç‰" +"体。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -92315,8 +92645,8 @@ msgid "" "meant to be passed to [method set_local_description] on this object, and " "sent to the remote peer over the signaling server." msgstr "" -"在æˆåŠŸè°ƒç”¨[method create_offer]或[method set_remote_description]åŽè§¦å‘,当它" -"äº§ç”Ÿä¸€ä¸ªåº”ç”æ—¶ã€‚è¿™äº›å‚æ•°æ˜¯ä¸ºäº†ä¼ 递给这个对象上的[method " +"在æˆåŠŸè°ƒç”¨ [method create_offer] 或 [method set_remote_description] åŽè§¦å‘," +"å½“å®ƒäº§ç”Ÿä¸€ä¸ªåº”ç”æ—¶ã€‚è¿™äº›å‚æ•°æ˜¯ä¸ºäº†ä¼ 递给这个对象上的 [method " "set_local_description]ï¼Œå¹¶é€šè¿‡ä¿¡å·æœåС噍å‘é€ç»™è¿œç¨‹å¯¹ç‰ä½“。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml @@ -92329,28 +92659,28 @@ msgstr "连接是新的,数æ®é€šé“å’Œæäº¤å¯ä»¥åœ¨è¿™ç§çжæ€ä¸‹åˆ›å»ºã€‚ msgid "" "The peer is connecting, ICE is in progress, none of the transports has " "failed." -msgstr "对ç‰ä½“æ£åœ¨è¿žæŽ¥ï¼ŒICEæ£åœ¨è¿›è¡Œä¸ï¼Œæ²¡æœ‰ä»»ä½•ä¼ è¾“å¤±è´¥ã€‚" +msgstr "对ç‰ä½“æ£åœ¨è¿žæŽ¥ï¼ŒICE æ£åœ¨è¿›è¡Œä¸ï¼Œæ²¡æœ‰ä»»ä½•ä¼ è¾“å¤±è´¥ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "The peer is connected, all ICE transports are connected." -msgstr "对ç‰ä½“已连接,所有的ICEä¼ è¾“éƒ½å·²è¿žæŽ¥ã€‚" +msgstr "对ç‰ä½“已连接,所有的 ICE ä¼ è¾“éƒ½å·²è¿žæŽ¥ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "At least one ICE transport is disconnected." -msgstr "至少有一个ICEä¼ è¾“è¢«æ–开连接。" +msgstr "至少有一个 ICE ä¼ è¾“è¢«æ–开连接。" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "One or more of the ICE transports failed." -msgstr "一个或更多的ICEä¼ è¾“å¤±è´¥ã€‚" +msgstr "一个或更多的 ICE ä¼ è¾“å¤±è´¥ã€‚" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" "The peer connection is closed (after calling [method close] for example)." -msgstr "对ç‰è¿žæŽ¥å·²å…³é—,例如在调用[method close]åŽã€‚" +msgstr "对ç‰è¿žæŽ¥å·²å…³é—,例如在调用 [method close] åŽã€‚" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "A WebSocket client implementation." -msgstr "WebSocket客户端的实现。" +msgstr "WebSocket 客户端的实现。" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "" @@ -92364,12 +92694,13 @@ msgid "" "You will receive appropriate signals when connecting, disconnecting, or when " "new data is available." msgstr "" -"该类实现了一个与任何符åˆRFC 6455çš„WebSocketæœåŠ¡å™¨å…¼å®¹çš„WebSocket客户端。\n" -"这个客户端å¯ä»¥é€‰æ‹©æ€§åœ°ä½œä¸º[MultiplayerAPI]的网络对ç‰ä½“使用。\n" -"在å¯åŠ¨å®¢æˆ·ç«¯åŽï¼ˆ[method connect_to_url]ï¼‰ï¼Œä½ éœ€è¦[method " -"NetworkedMultiplayerPeer.poll]它以固定的时间间隔,例如在[method Node." -"_process]内。\n" -"å½“è¿žæŽ¥ã€æ–å¼€è¿žæŽ¥æˆ–æœ‰æ–°æ•°æ®æ—¶ï¼Œä½ 将收到适当的信å·ã€‚" +"该类实现了一个 WebSocket å®¢æˆ·ç«¯ï¼Œä¸Žä»»ä½•ç¬¦åˆ RFC 6455 çš„ WebSocket æœåС噍兼" +"容。\n" +"这个客户端å¯ä»¥é€‰æ‹©æ€§åœ°ä½œä¸º [MultiplayerAPI] 的网络对ç‰ä½“使用。\n" +"在å¯åŠ¨å®¢æˆ·ç«¯åŽï¼ˆ[method connect_to_url]ï¼‰ï¼Œä½ éœ€è¦ä»¥å›ºå®šçš„æ—¶é—´é—´éš”调用 " +"[method NetworkedMultiplayerPeer.poll](例如在 [method Node._process] " +"内)。\n" +"å½“è¿žæŽ¥ã€æ–å¼€è¿žæŽ¥æˆ–æœ‰æ–°æ•°æ®æ—¶ï¼Œä½ 将收到相应的信å·ã€‚" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "" @@ -92395,38 +92726,38 @@ msgid "" "[b]Note:[/b] Specifying [code]custom_headers[/code] is not supported in " "HTML5 exports due to browsers restrictions." msgstr "" -"连接到给定的URL,请求给定的[code]protocols[/code]之一作为åå议。如果列表为" -"空,默认为空,将ä¸è¯·æ±‚åå议。\n" -"如果[code]true[/code]作为[code]gd_mp_api[/code]è¢«ä¼ é€’ï¼Œå®¢æˆ·ç«¯å°†è¡¨çŽ°å¾—åƒ" -"[MultiplayerAPI]的网络对ç‰ä½“,与éžGodotæœåŠ¡å™¨çš„è¿žæŽ¥å°†ä¸å·¥ä½œï¼Œå¹¶ä¸”[signal " +"连接到给定的 URL,请求给定的 [code]protocols[/code] 之一作为åå议。如果列表" +"为空,默认为空,将ä¸è¯·æ±‚åå议。\n" +"如果 [code]true[/code] 作为 [code]gd_mp_api[/code] è¢«ä¼ é€’ï¼Œå®¢æˆ·ç«¯å°†è¡¨çŽ°å¾—åƒ " +"[MultiplayerAPI] 的网络对ç‰ä½“ï¼Œä¸Žéž Godot æœåŠ¡å™¨çš„è¿žæŽ¥å°†ä¸å·¥ä½œï¼Œå¹¶ä¸”[signal " "data_received]å°†ä¸è¢«è§¦å‘。\n" -"如果[code]false[/code]è¢«ä¼ é€’ï¼Œé»˜è®¤ä¼ é€’ï¼Œä½ å¿…é¡»è°ƒç”¨[PacketPeer]函数," -"[code]put_packet[/code], [code]get_packet[/code]ç‰ï¼Œå¯¹é€šè¿‡[code]get_peer(1)[/" -"code]返回的[WebSocketPeer]ï¼Œè€Œä¸æ˜¯ç›´æŽ¥å¯¹è¯¥å¯¹è±¡ï¼Œä¾‹å¦‚,[code]get_peer(1)." +"如果 [code]false[/code] è¢«ä¼ é€’ï¼Œé»˜è®¤ä¼ é€’ï¼Œä½ å¿…é¡»è°ƒç”¨ [PacketPeer]函数," +"[code]put_packet[/code], [code]get_packet[/code] ç‰ï¼Œå¯¹é€šè¿‡[code]get_peer(1)" +"[/code] 返回的 [WebSocketPeer]ï¼Œè€Œä¸æ˜¯ç›´æŽ¥å¯¹è¯¥å¯¹è±¡ï¼Œä¾‹å¦‚ [code]get_peer(1)." "put_packet(data)[/code]。\n" -"ä½ å¯ä»¥é€‰æ‹©ä¼ 递一个[code]custom_headers[/code]çš„åˆ—è¡¨ï¼Œä»¥æ·»åŠ åˆ°æ¡æ‰‹çš„HTTP请求" -"ä¸ã€‚\n" -"[b]注æ„:[/b]为了é¿å…HTML5ä¸çš„æ··åˆå†…容è¦å‘Šæˆ–错误,须使用以[code]wss://[/code]" -"(安全)开头的[code]url[/code]ï¼Œè€Œä¸æ˜¯[code]ws://[/code]ã€‚è¿™æ ·åšæ—¶ï¼Œç¡®ä¿ä½¿ç”¨" -"与æœåŠ¡å™¨çš„SSLè¯ä¹¦ä¸å®šä¹‰çš„å®Œå…¨åˆæ ¼çš„域å。ä¸è¦ç›´æŽ¥é€šè¿‡IP地å€è¿›è¡Œ[code]wss://[/" -"code]è¿žæŽ¥ï¼Œå› ä¸ºå®ƒä¸ä¼šä¸ŽSSLè¯ä¹¦ç›¸åŒ¹é…。\n" -"[b]注æ„:[/b]由于æµè§ˆå™¨çš„é™åˆ¶ï¼ŒæŒ‡å®š[code]custom_headers[/code]在HTML5导出ä¸ä¸" -"被支æŒã€‚" +"ä½ å¯ä»¥é€‰æ‹©ä¼ 递一个 [code]custom_headers[/code] çš„åˆ—è¡¨ï¼Œä»¥æ·»åŠ åˆ°æ¡æ‰‹çš„ HTTP 请" +"求ä¸ã€‚\n" +"[b]注æ„:[/b]为了é¿å… HTML5 ä¸çš„æ··åˆå†…容è¦å‘Šæˆ–错误,须使用以 [code]wss://[/" +"code](安全)开头的 [code]url[/code]ï¼Œè€Œä¸æ˜¯ [code]ws://[/code]ã€‚è¿™æ ·åšæ—¶ï¼Œç¡®" +"ä¿ä½¿ç”¨ä¸ŽæœåŠ¡å™¨çš„ SSL è¯ä¹¦ä¸å®šä¹‰çš„å®Œå…¨åˆæ ¼çš„域å。ä¸è¦ç›´æŽ¥é€šè¿‡ IP 地å€è¿›è¡Œ " +"[code]wss://[/code] è¿žæŽ¥ï¼Œå› ä¸ºå®ƒä¸ä¼šä¸Ž SSL è¯ä¹¦ç›¸åŒ¹é…。\n" +"[b]注æ„:[/b]由于æµè§ˆå™¨çš„é™åˆ¶ï¼ŒæŒ‡å®š [code]custom_headers[/code] 在 HTML5 导出" +"ä¸ä¸è¢«æ”¯æŒã€‚" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "" "Disconnects this client from the connected host. See [method WebSocketPeer." "close] for more information." msgstr "" -"æ–å¼€æ¤å®¢æˆ·ç«¯ä¸Žæ‰€è¿žæŽ¥ä¸»æœºçš„连接。更多信æ¯å‚阅[method WebSocketPeer.close]。" +"æ–å¼€æ¤å®¢æˆ·ç«¯ä¸Žæ‰€è¿žæŽ¥ä¸»æœºçš„连接。详情请å‚阅 [method WebSocketPeer.close]。" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "Return the IP address of the currently connected host." -msgstr "返回当å‰è¿žæŽ¥çš„主机的IP地å€ã€‚" +msgstr "返回当å‰è¿žæŽ¥çš„主机的 IP 地å€ã€‚" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "Return the IP port of the currently connected host." -msgstr "返回当å‰è¿žæŽ¥çš„主机的IP端å£ã€‚" +msgstr "返回当å‰è¿žæŽ¥çš„主机的 IP 端å£ã€‚" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "" @@ -92436,9 +92767,9 @@ msgid "" "[b]Note:[/b] Specifying a custom [code]trusted_ssl_certificate[/code] is not " "supported in HTML5 exports due to browsers restrictions." msgstr "" -"如果指定,该[X509Certificate]将是连接到SSL主机时唯一接å—çš„è¯ä¹¦ã€‚任何由æœåС噍" -"æä¾›çš„å…¶ä»–è¯ä¹¦å°†è¢«è§†ä¸ºæ— 效。\n" -"[b]注æ„:[/b]由于æµè§ˆå™¨çš„é™åˆ¶ï¼Œåœ¨HTML5导出ä¸ä¸æ”¯æŒæŒ‡å®šä¸€ä¸ªè‡ªå®šä¹‰çš„" +"如果指定,该 [X509Certificate] 将是连接到 SSL 主机时唯一接å—çš„è¯ä¹¦ã€‚任何由æœ" +"务器æä¾›çš„å…¶ä»–è¯ä¹¦å°†è¢«è§†ä¸ºæ— 效。\n" +"[b]注æ„:[/b]由于æµè§ˆå™¨çš„é™åˆ¶ï¼Œåœ¨ HTML5 导出ä¸ä¸æ”¯æŒæŒ‡å®šä¸€ä¸ªè‡ªå®šä¹‰çš„ " "[code]trusted_ssl_certificate[/code]。" #: modules/websocket/doc_classes/WebSocketClient.xml @@ -92447,7 +92778,7 @@ msgid "" "[b]Note:[/b] You must specify the certificates to be used in the Project " "Settings for it to work when exported." msgstr "" -"如果 [code]true[/code],则å¯ç”¨ SSL è¯ä¹¦éªŒè¯ã€‚\n" +"如果为 [code]true[/code],则å¯ç”¨ SSL è¯ä¹¦éªŒè¯ã€‚\n" "[b]注æ„:[/b]ä½ å¿…é¡»åœ¨é¡¹ç›®è®¾ç½®ä¸æŒ‡å®šè¦ä½¿ç”¨çš„è¯ä¹¦ï¼Œä»¥ä¾¿åœ¨å¯¼å‡ºæ—¶å‘挥作用。" #: modules/websocket/doc_classes/WebSocketClient.xml @@ -92455,7 +92786,7 @@ msgid "" "Emitted when the connection to the server is closed. [code]was_clean_close[/" "code] will be [code]true[/code] if the connection was shutdown cleanly." msgstr "" -"当与æœåŠ¡å™¨çš„è¿žæŽ¥è¢«å…³é—æ—¶è§¦å‘。[code]was_clean_close[/code] 将是[code]true[/" +"当与æœåŠ¡å™¨çš„è¿žæŽ¥è¢«å…³é—æ—¶è§¦å‘。[code]was_clean_close[/code] 将是 [code]true[/" "code] 如果连接完全关é—。" #: modules/websocket/doc_classes/WebSocketClient.xml @@ -92467,8 +92798,8 @@ msgid "" "Emitted when a connection with the server is established, [code]protocol[/" "code] will contain the sub-protocol agreed with the server." msgstr "" -"当与æœåŠ¡å™¨å»ºç«‹è¿žæŽ¥æ—¶è§¦å‘,[code]protocol[/code]å议将包å«ä¸ŽæœåŠ¡å™¨è¾¾æˆä¸€è‡´çš„å" -"å议。" +"当与æœåŠ¡å™¨å»ºç«‹è¿žæŽ¥æ—¶è§¦å‘,[code]protocol[/code] 将包å«ä¸ŽæœåŠ¡å™¨è¾¾æˆä¸€è‡´çš„åå" +"议。" #: modules/websocket/doc_classes/WebSocketClient.xml msgid "" @@ -92485,9 +92816,9 @@ msgid "" "until you get a [signal connection_closed] signal to achieve the clean " "close. See [method WebSocketPeer.close] for more details." msgstr "" -"当æœåŠ¡å™¨è¯·æ±‚å®Œå…¨å…³é—æ—¶è§¦å‘ã€‚ä½ åº”è¯¥ç»§ç»è¿›è¡Œè½®è¯¢ï¼Œç›´åˆ°èŽ·å¾—[signal " -"connection_closed]ä¿¡å·ï¼Œä»¥å®žçŽ°å½»åº•çš„å…³é—。更多细节å‚阅[method WebSocketPeer." -"close]。" +"当æœåŠ¡å™¨è¯·æ±‚å®Œå…¨å…³é—æ—¶è§¦å‘ã€‚ä½ åº”è¯¥ç»§ç»è¿›è¡Œè½®è¯¢ï¼Œç›´åˆ°èŽ·å¾— [signal " +"connection_closed] ä¿¡å·ï¼Œä»¥å®žçŽ°å½»åº•çš„å…³é—。更多细节å‚阅 [method " +"WebSocketPeer.close]。" #: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml msgid "Base class for WebSocket server and client." @@ -92518,13 +92849,13 @@ msgid "" "[b]Note:[/b] HTML5 exports only use the input buffer since the output one is " "managed by browsers." msgstr "" -"é…置该WebSocket对ç‰ä½“的缓冲区大å°ã€‚默认值å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®ä¸çš„[code]network/" -"limits[/code]下指定。对于æœåŠ¡å™¨ï¼Œæ•°å€¼æ˜¯æŒ‡æ¯ä¸ªè¿žæŽ¥çš„对ç‰ä½“。\n" +"é…置该 WebSocket 对ç‰ä½“的缓冲区大å°ã€‚默认值å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®ä¸çš„ [code]network/" +"limits[/code] 下指定。对于æœåŠ¡å™¨ï¼Œæ•°å€¼æ˜¯æŒ‡æ¯ä¸ªè¿žæŽ¥çš„对ç‰ä½“。\n" "å‰ä¸¤ä¸ªå‚数定义了输入缓冲区的大å°å’ŒæŽ’队数æ®åŒ…çš„é™åˆ¶ï¼ŒåŽä¸¤ä¸ªå‚数定义了输出缓冲" "区。\n" -"缓冲区的大å°ä»¥KiB为å•ä½ï¼Œæ‰€ä»¥[code]4=2^12=4096å—节[/code]ã€‚æ‰€æœ‰çš„å‚æ•°éƒ½å°†è¢«å››" -"èˆäº”入到最接近的2的幂。\n" -"[b]注æ„:[/b]HTML5输出åªä½¿ç”¨è¾“å…¥ç¼“å†²åŒºï¼Œå› ä¸ºè¾“å‡ºç¼“å†²åŒºæ˜¯ç”±æµè§ˆå™¨ç®¡ç†çš„。" +"缓冲区的大å°ä»¥ KiB 为å•ä½ï¼Œæ‰€ä»¥ [code]4=2^12=4096å—节[/code]ã€‚æ‰€æœ‰çš„å‚æ•°éƒ½å°†" +"被四èˆäº”入到最接近的 2 的幂。\n" +"[b]注æ„:[/b]HTML5 输出åªä½¿ç”¨è¾“å…¥ç¼“å†²åŒºï¼Œå› ä¸ºè¾“å‡ºç¼“å†²åŒºæ˜¯ç”±æµè§ˆå™¨ç®¡ç†çš„。" #: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml msgid "" @@ -92562,13 +92893,13 @@ msgid "" "[b]Note:[/b] The HTML5 export might not support all status codes. Please " "refer to browser-specific documentation for more details." msgstr "" -"关闿¤WebSocket连接。[code]code[/code]是关é—的状æ€ä»£ç ,有效状æ€ä»£ç 的列表å‚" -"阅RFC 6455第7.4节。[code]reason[/code] 是关é—连接的åªè¯»åŽŸå› ï¼ˆå¯ä»¥æ˜¯ä»»ä½•å°äºŽ" -"123å—节的UTF-8å—符串)。\n" -"[b]注æ„:[/b]为了实现彻底的关é—ï¼Œä½ éœ€è¦ç»§ç»è½®è¯¢ï¼Œç›´åˆ°æ”¶åˆ°[signal " -"WebSocketClient.connection_closed]或[signal WebSocketServer." +"关闿¤ WebSocket 连接。[code]code[/code] 是关é—的状æ€ä»£ç ,有效状æ€ä»£ç 的列表" +"å‚阅 RFC 6455 第 7.4 节。[code]reason[/code] 是关é—连接的åªè¯»åŽŸå› ï¼ˆå¯ä»¥æ˜¯ä»»ä½•" +"å°äºŽ 123 å—节的 UTF-8 å—符串)。\n" +"[b]注æ„:[/b]为了实现彻底的关é—ï¼Œä½ éœ€è¦ç»§ç»è½®è¯¢ï¼Œç›´åˆ°æ”¶åˆ° [signal " +"WebSocketClient.connection_closed] 或 [signal WebSocketServer." "client_disconnected]。\n" -"[b]注æ„:[/b]HTML5导出å¯èƒ½ä¸æ”¯æŒæ‰€æœ‰çжæ€ä»£ç 。请å‚考特定æµè§ˆå™¨çš„æ–‡æ¡£ä»¥äº†è§£æ›´" +"[b]注æ„:[/b]HTML5 导出å¯èƒ½ä¸æ”¯æŒæ‰€æœ‰çжæ€ä»£ç 。请å‚考特定æµè§ˆå™¨çš„æ–‡æ¡£ä»¥äº†è§£æ›´" "多细节。" #: modules/websocket/doc_classes/WebSocketPeer.xml @@ -92593,12 +92924,12 @@ msgid "" "[/b] HTML5 exports use WebSocket.bufferedAmount, while other platforms use " "an internal buffer." msgstr "" -"返回输出的websocket缓冲区ä¸çš„当剿•°æ®é‡ã€‚[b]注æ„:[/b]HTML5导出使用WebSocket." -"bufferedAmount,而其他平å°ä½¿ç”¨å†…部缓冲区。" +"返回输出的 websocket 缓冲区ä¸çš„当剿•°æ®é‡ã€‚[b]注æ„:[/b]HTML5 导出使用 " +"WebSocket.bufferedAmount,而其他平å°ä½¿ç”¨å†…部缓冲区。" #: modules/websocket/doc_classes/WebSocketPeer.xml msgid "Gets the current selected write mode. See [enum WriteMode]." -msgstr "获å–当å‰é€‰æ‹©çš„写入模å¼ã€‚å‚阅[enum WriteMode]。" +msgstr "获å–当å‰é€‰æ‹©çš„写入模å¼ã€‚è§ [enum WriteMode]。" #: modules/websocket/doc_classes/WebSocketPeer.xml msgid "Returns [code]true[/code] if this peer is currently connected." @@ -92623,24 +92954,24 @@ msgid "" "Returns [code]true[/code] if the last received packet was sent as a text " "payload. See [enum WriteMode]." msgstr "" -"å¦‚æžœæœ€åŽæ”¶åˆ°çš„æ•°æ®åŒ…是作为文本有效载è·å‘é€çš„,返回 [code]true[/code]。å‚阅" +"å¦‚æžœæœ€åŽæ”¶åˆ°çš„æ•°æ®åŒ…是作为文本有效载è·å‘é€çš„,返回 [code]true[/code]ã€‚è§ " "[enum WriteMode]。" #: modules/websocket/doc_classes/WebSocketPeer.xml msgid "" "Specifies that WebSockets messages should be transferred as text payload " "(only valid UTF-8 is allowed)." -msgstr "指定WebSockets消æ¯åº”作为文本有效载è·ä¼ 输(åªå…许有效的UTF-8)。" +msgstr "指定 WebSockets 消æ¯åº”作为文本有效载è·ä¼ 输(åªå…许有效的 UTF-8)。" #: modules/websocket/doc_classes/WebSocketPeer.xml msgid "" "Specifies that WebSockets messages should be transferred as binary payload " "(any byte combination is allowed)." -msgstr "指定WebSockets消æ¯åº”以二进制有效载è·çš„å½¢å¼ä¼ 输(å…许任何å—节组åˆï¼‰ã€‚" +msgstr "指定 WebSockets 消æ¯åº”以二进制有效载è·çš„å½¢å¼ä¼ 输(å…许任何å—节组åˆï¼‰ã€‚" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "A WebSocket server implementation." -msgstr "WebSocketæœåŠ¡å™¨çš„å®žçŽ°ã€‚" +msgstr "WebSocket æœåŠ¡å™¨çš„å®žçŽ°ã€‚" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -92663,7 +92994,7 @@ msgid "" "Disconnects the peer identified by [code]id[/code] from the server. See " "[method WebSocketPeer.close] for more information." msgstr "" -"æ–开由[code]id[/code]æ ‡è¯†çš„å¯¹ç‰ä½“与æœåŠ¡å™¨çš„è¿žæŽ¥ã€‚æ›´å¤šä¿¡æ¯å‚阅[method " +"æ–开由 [code]id[/code] æ ‡è¯†çš„å¯¹ç‰ä½“与æœåŠ¡å™¨çš„è¿žæŽ¥ã€‚è¯¦æƒ…è¯·å‚阅 [method " "WebSocketPeer.close]。" #: modules/websocket/doc_classes/WebSocketServer.xml @@ -92691,15 +93022,16 @@ msgid "" "[code]get_peer(id).get_available_packet_count[/code])." msgstr "" "在给定的端å£ä¸Šå¼€å§‹ç›‘å¬ã€‚\n" -"ä½ å¯ä»¥é€šè¿‡ \"åè®®\" 数组指定所需的åå议。如果列表为空(默认情况下),将ä¸è¯·" +"ä½ å¯ä»¥é€šè¿‡â€œprotocolsâ€æ•°ç»„指定所需的åå议。如果列表为空(默认情况下),将ä¸è¯·" "求任何åå议。\n" -"如果[code]true[/code]作为[code]gd_mp_api[/code]ä¼ é€’ï¼ŒæœåŠ¡å™¨å°†è¡¨çŽ°å¾—åƒ" -"[MultiplayerAPI]的网络对ç‰ä½“,æ¥è‡ªéžGodot客户端的连接将ä¸å·¥ä½œï¼Œå¹¶ä¸”[signal " -"data_received]å°†ä¸è¢«è§¦å‘。\n" -"如果[code]false[/code]è¢«ä¼ é€’ï¼ˆé»˜è®¤ï¼‰ï¼Œä½ å¿…é¡»è°ƒç”¨[PacketPeer]函数" -"([code]put_packet[/code], [code]get_packet[/code], etc.),在通过" -"[code]get_peer(id)[/code]返回的[WebSocketPeer]上,与具有给定[code]id[/code]çš„" -"对ç‰ä½“进行通信,例如,[code]get_peer(id).get_available_packet_count[/code]。" +"å¦‚æžœä¼ é€’çš„ [code]gd_mp_api[/code] 为 [code]true[/code],æœåŠ¡å™¨å°†è¡¨çŽ°å¾—åƒ " +"[MultiplayerAPI] 的网络对ç‰ä½“,æ¥è‡ªéž Godot 客户端的连接将ä¸å·¥ä½œï¼Œå¹¶ä¸” " +"[signal data_received] å°†ä¸è¢«è§¦å‘。\n" +"å¦‚æžœä¼ é€’çš„æ˜¯ [code]false[/code]ï¼ˆé»˜è®¤ï¼‰ï¼Œä½ å¿…é¡»è°ƒç”¨ [PacketPeer] 函数" +"([code]put_packet[/code]ã€[code]get_packet[/code] ç‰ï¼‰ï¼Œåœ¨é€šè¿‡ " +"[code]get_peer(id)[/code] 返回的 [WebSocketPeer] 上,与具有给定 [code]id[/" +"code] 的对ç‰ä½“进行通信(例如 [code]get_peer(id).get_available_packet_count[/" +"code])。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -92716,8 +93048,9 @@ msgid "" "specified IP address. Setting [code]bind_ip[/code] to [code]127.0.0.1[/code] " "will cause the server to listen only to the local host." msgstr "" -"当ä¸è®¾ç½®ä¸º[code]*[/code]时,将é™åˆ¶è¿›å…¥çš„连接到指定的IP地å€ã€‚å°†[code]bind_ip[/" -"code]设置为[code]127.0.0.1[/code]将导致æœåС噍åªç›‘嬿œ¬åœ°ä¸»æœºã€‚" +"当ä¸è®¾ç½®ä¸º [code]*[/code] 时,将é™åˆ¶è¿›å…¥çš„连接到指定的 IP 地å€ã€‚å°† " +"[code]bind_ip[/code] 设置为 [code]127.0.0.1[/code] 将导致æœåС噍åªç›‘嬿œ¬åœ°ä¸»" +"机。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -92743,8 +93076,8 @@ msgid "" "cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" "[/code] protocol)." msgstr "" -"当设置为有效的[CryptoKey]时,与[member ssl_certificate]一起,将导致æœåŠ¡å™¨éœ€è¦" -"SSLè€Œä¸æ˜¯æ™®é€šçš„TCP,å³[code]wss://[/code]å议。" +"当设置为有效的 [CryptoKey] 时,与 [member ssl_certificate] 一起,将导致æœåС噍" +"éœ€è¦ SSL è€Œä¸æ˜¯æ™®é€šçš„ TCPï¼Œå³ [code]wss://[/code] å议。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -92752,8 +93085,8 @@ msgid "" "cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" "[/code] protocol)." msgstr "" -"当设置为有效的[X509Certificate]时,连åŒ[member private_key],将导致æœåŠ¡å™¨éœ€è¦" -"SSLè€Œä¸æ˜¯æ™®é€šçš„TCP,å³[code]wss://[/code]å议。" +"当设置为有效的 [X509Certificate] æ—¶ï¼Œè¿žåŒ [member private_key],将导致æœåС噍" +"éœ€è¦ SSL è€Œä¸æ˜¯æ™®é€šçš„ TCPï¼Œå³ [code]wss://[/code] å议。" #: modules/websocket/doc_classes/WebSocketServer.xml msgid "" @@ -92947,7 +93280,7 @@ msgstr "" " webxr_interface.xr_standard_mapping = true\n" "\n" " # WebXR使用了大é‡çš„异æ¥å›žè°ƒï¼Œ\n" -" # 所以我们è¦è¿žæŽ¥å„ç§ä¿¡å·æ¥æŽ¥æ”¶å®ƒä»¬ã€‚ \n" +" # 所以我们è¦è¿žæŽ¥å„ç§ä¿¡å·æ¥æŽ¥æ”¶å®ƒä»¬ã€‚ \n" " webxr_interface.connect(\"session_supported\", self, " "\"_webxr_session_supported\")\n" " webxr_interface.connect(\"session_started\", self, " @@ -92959,7 +93292,7 @@ msgstr "" "\n" " # 这将立å³è¿”回——自身的_webxr_session_supported()方法\n" " # (我们在上é¢è¿žæŽ¥äº†'session_supported' ä¿¡å·)将在ç¨åŽè¢«è°ƒç”¨\n" -" # 让我们知é“它是å¦è¢«æ”¯æŒã€‚ \n" +" # 让我们知é“它是å¦è¢«æ”¯æŒã€‚ \n" " webxr_interface.is_session_supported(\"immersive-vr\")\n" "\n" "func _webxr_session_supported(session_mode, supported):\n" @@ -92972,7 +93305,7 @@ msgstr "" " return\n" "\n" " # 获得沉浸å¼çš„VRä½“éªŒï¼Œè€Œä¸æ˜¯AR('immersive-ar')\n" -" # 或一个简å•çš„3DoF查看器('viewer')。 \n" +" # 或一个简å•çš„3DoF查看器('viewer')。 \n" " webxr_interface.session_mode = 'immersive-vr'\n" " # 'bounded-floor'是房间大å°ï¼Œ'local-floor'æ˜¯ç«™ç€æˆ–åç€çš„\n" " # ä½“éªŒï¼ˆå¦‚æžœä½ æœ‰3DoFè€³æœºï¼Œå®ƒä¼šè®©ä½ ç¦»åœ°é¢1.6米)。\n" @@ -93002,7 +93335,7 @@ msgstr "" " get_viewport().arvr = true\n" " # 这将是您从上é¢è¯·æ±‚çš„ç±»åž‹ä¸æœ€ç»ˆå¾—到的引用空间类型。\n" " # å¦‚æžœä½ æƒ³è®©æ¸¸æˆåœ¨'bounded-floor'å’Œ 'local-floor' 䏿œ‰ä¸€ç‚¹ä¸åŒï¼Œ\n" -" # 这是很有用的。 \n" +" # 这是很有用的。 \n" " print (\"Reference space type: \" + webxr_interface." "reference_space_type)\n" "\n" @@ -93057,10 +93390,10 @@ msgid "" "- [signal squeezestart]" msgstr "" "获å–给定 [code]controller_id[/code] çš„ [ARVRPositionalTracker]。\n" -"在 WebXR 的上下文ä¸ï¼Œ \"controller\"控制器å¯ä»¥æ˜¯é«˜çº§ VR 控制器,如 Oculus " -"Touch 或 Index 控制器,甚至å¯ä»¥æ˜¯å±å¹•上的点击ã€è¯éŸ³å‘½ä»¤æˆ–设备本身的按钮按下。" -"当使用éžä¼ 统控制器时,将 [ARVRPositionalTracker] çš„ä½ç½®å’Œæ–¹å‘解释为指å‘用户希" -"望与之交互的对象的射线。\n" +"在 WebXR 的上下文ä¸ï¼Œâ€œcontrollerâ€æŽ§åˆ¶å™¨å¯ä»¥æ˜¯é«˜çº§ VR 控制器,如 Oculus Touch " +"或 Index 控制器,甚至å¯ä»¥æ˜¯å±å¹•上的点击ã€è¯éŸ³å‘½ä»¤æˆ–设备本身的按钮按下。当使用" +"éžä¼ 统控制器时,将 [ARVRPositionalTracker] çš„ä½ç½®å’Œæ–¹å‘解释为指å‘用户希望与之" +"交互的对象的射线。\n" "ä½¿ç”¨æ¤æ–¹æ³•èŽ·å–æœ‰å…³è§¦å‘以下信å·ä¹‹ä¸€çš„æŽ§åˆ¶å™¨çš„ä¿¡æ¯ï¼š\n" "- [signal selectstart]\n" "- [signal select]\n" @@ -93091,11 +93424,11 @@ msgid "" "This method returns nothing, instead it emits the [signal session_supported] " "signal with the result." msgstr "" -"检查给定的[code]session_mode[/code]是å¦è¢«ç”¨æˆ·çš„æµè§ˆå™¨æ”¯æŒã€‚\n" -"å¯èƒ½çš„值æ¥è‡ª[url=https://developer.mozilla.org/en-US/docs/Web/API/" -"XRSessionMode]WebXRçš„XRSessionMode[/url],包括:[code]\"immersive-vr\"[/" -"code], [code]\"immersive-ar\"[/code], å’Œ[code]\"inline\"[/code]。\n" -"æ¤æ–¹æ³•ä¸è¿”回任何东西,而是将结果å‘é€ç»™[signal session_supported]ä¿¡å·ã€‚" +"检查给定的 [code]session_mode[/code] 是å¦è¢«ç”¨æˆ·çš„æµè§ˆå™¨æ”¯æŒã€‚\n" +"å¯èƒ½çš„值æ¥è‡ª [url=https://developer.mozilla.org/en-US/docs/Web/API/" +"XRSessionMode]WebXR çš„ XRSessionMode[/url],包括:[code]\"immersive-vr\"[/" +"code]ã€[code]\"immersive-ar\"[/code] å’Œ [code]\"inline\"[/code]。\n" +"æ¤æ–¹æ³•ä¸è¿”回任何东西,而是将结果å‘é€ç»™ [signal session_supported] ä¿¡å·ã€‚" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93144,12 +93477,13 @@ msgid "" "use a particular reference space type, it must be listed in either [member " "required_features] or [member optional_features]." msgstr "" -"引用空间类型,æ¥è‡ª[member requested_reference_space_types]属性ä¸è®¾ç½®çš„请求类" -"型列表,最终由[method ARVRInterface.initialize]在设置WebXRä¼šè¯æ—¶ä½¿ç”¨ã€‚\n" -"å¯èƒ½çš„值æ¥è‡ª[url=https://developer.mozilla.org/en-US/docs/Web/API/" -"XRReferenceSpaceType]WebXRçš„XRReferenceSpaceType[/url]ã€‚å¦‚æžœä½ æƒ³ä½¿ç”¨ä¸€ä¸ªç‰¹å®š" -"的引用空间类型,它必须被列入[member required_features]或[member " -"optional_features]ä¸ã€‚" +"引用空间类型,æ¥è‡ª [member requested_reference_space_types] 属性ä¸è®¾ç½®çš„请求" +"类型列表,最终由 [method ARVRInterface.initialize] 在设置 WebXR ä¼šè¯æ—¶ä½¿" +"用。\n" +"å¯èƒ½çš„值æ¥è‡ª [url=https://developer.mozilla.org/en-US/docs/Web/API/" +"XRReferenceSpaceType]WebXR çš„ XRReferenceSpaceType[/url]ã€‚å¦‚æžœä½ æƒ³ä½¿ç”¨ä¸€ä¸ªç‰¹" +"定的引用空间类型,它必须被列入 [member required_features] 或 [member " +"optional_features] ä¸ã€‚" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93167,7 +93501,7 @@ msgid "" msgstr "" "[method ARVRInterface.initialize] 设置 WebXR ä¼šè¯æ—¶ä½¿ç”¨çš„引用空间类型的逗å·åˆ†" "隔列表。\n" -"按顺åºè¯·æ±‚引用空间类型,将使用用户设备或æµè§ˆå™¨æ”¯æŒçš„第一个。 [member " +"按顺åºè¯·æ±‚引用空间类型,将使用用户设备或æµè§ˆå™¨æ”¯æŒçš„第一个。[member " "reference_space_type] å±žæ€§åŒ…å«æœ€ç»ˆä½¿ç”¨çš„引用空间类型。\n" "这对已ç»åˆå§‹åŒ–çš„æŽ¥å£æ²¡æœ‰ä»»ä½•å½±å“。\n" "å¯èƒ½çš„值æ¥è‡ª [url=https://developer.mozilla.org/en-US/docs/Web/API/" @@ -93206,11 +93540,11 @@ msgid "" "API/XRSessionMode]WebXR's XRSessionMode[/url], including: [code]\"immersive-" "vr\"[/code], [code]\"immersive-ar\"[/code], and [code]\"inline\"[/code]." msgstr "" -"设置WebXRä¼šè¯æ—¶ï¼Œ[method ARVRInterface.initialize]æ‰€ä½¿ç”¨çš„ä¼šè¯æ¨¡å¼ã€‚\n" +"设置 WebXR ä¼šè¯æ—¶ï¼Œ[method ARVRInterface.initialize] æ‰€ä½¿ç”¨çš„ä¼šè¯æ¨¡å¼ã€‚\n" "在已ç»åˆå§‹åŒ–çš„æƒ…å†µä¸‹ï¼Œè¿™å¯¹æŽ¥å£æ²¡æœ‰ä»»ä½•å½±å“。\n" -"å¯èƒ½çš„值æ¥è‡ª[url=https://developer.mozilla.org/en-US/docs/Web/API/" -"XRSessionMode]WebXRçš„XRSessionMode[/url],包括:[code]\"immersive-vr\"[/" -"code], [code]\"immersive-ar\"[/code], å’Œ[code]\"inline\"[/code]。" +"å¯èƒ½çš„值æ¥è‡ª [url=https://developer.mozilla.org/en-US/docs/Web/API/" +"XRSessionMode]WebXR çš„ XRSessionMode[/url],包括:[code]\"immersive-vr\"[/" +"code]ã€[code]\"immersive-ar\"[/code] å’Œ [code]\"inline\"[/code]。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93223,7 +93557,7 @@ msgstr "" "指示用户是å¦å¯ä»¥çœ‹åˆ° WebXR 会è¯çš„图åƒã€‚\n" "å¯èƒ½çš„值æ¥è‡ª [url=https://developer.mozilla.org/en-US/docs/Web/API/" "XRVisibilityState]WebXR çš„ XRVisibilityState[/url],包括 [code]\"hidden\"[/" -"code], [code]\"visible\"[/code], å’Œ [code]\"visible-blurred\"[/code]。" +"code]ã€[code]\"visible\"[/code] å’Œ [code]\"visible-blurred\"[/code]。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93296,9 +93630,9 @@ msgid "" "[code]message[/code] may optionally contain an error message from WebXR, or " "an empty string if no message is available." msgstr "" -"如果会è¯å¯åŠ¨å¤±è´¥ï¼Œç”±[method ARVRInterface.initialize]触å‘。\n" -"[code]message[/code]å¯ä»¥é€‰æ‹©åŒ…å«ä¸€ä¸ªæ¥è‡ªWebXR的错误信æ¯ï¼Œå¦‚果没有信æ¯ï¼Œåˆ™ä¸ºç©º" -"å—符串。" +"如果会è¯å¯åŠ¨å¤±è´¥ï¼Œç”± [method ARVRInterface.initialize] 触å‘。\n" +"[code]message[/code] å¯ä»¥é€‰æ‹©åŒ…å«ä¸€ä¸ªæ¥è‡ª WebXR 的错误信æ¯ï¼Œå¦‚果没有信æ¯ï¼Œåˆ™" +"为空å—符串。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93307,17 +93641,17 @@ msgid "" "At this point, it's safe to do [code]get_viewport().arvr = true[/code] to " "instruct Godot to start rendering to the AR/VR device." msgstr "" -"å¦‚æžœä¼šè¯æˆåŠŸå¯åŠ¨ï¼Œç”±[method ARVRInterface.initialize]触å‘。\n" -"æ¤æ—¶ï¼Œåº”该执行[code]get_viewport().arvr = true[/code]æ¥æŒ‡ç¤ºGodot开始å‘AR/VR设" -"备进行渲染是安全的。" +"å¦‚æžœä¼šè¯æˆåŠŸå¯åŠ¨ï¼Œç”± [method ARVRInterface.initialize] 触å‘。\n" +"æ¤æ—¶ï¼Œåº”该执行 [code]get_viewport().arvr = true[/code] æ¥æŒ‡ç¤º Godot å¼€å§‹å‘ " +"AR/VR 设备进行渲染是安全的。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" "Emitted by [method is_session_supported] to indicate if the given " "[code]session_mode[/code] is supported or not." msgstr "" -"ç”±[method is_session_supported]触å‘ï¼Œè¡¨ç¤ºæ˜¯å¦æ”¯æŒæŒ‡å®šçš„[code]session_mode[/" -"code]。" +"ç”± [method is_session_supported] 触å‘ï¼Œè¡¨ç¤ºæ˜¯å¦æ”¯æŒæŒ‡å®šçš„ " +"[code]session_mode[/code]。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "" @@ -93351,7 +93685,7 @@ msgstr "" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "Emitted when [member visibility_state] has changed." -msgstr "当[member visibility_state]已更改时触å‘。" +msgstr "当 [member visibility_state] 已更改时触å‘。" #: modules/webxr/doc_classes/WebXRInterface.xml msgid "We don't know the target ray mode." @@ -93381,8 +93715,8 @@ msgid "" "default toplevel [Control] that draws a window decoration and allows motion " "and resizing." msgstr "" -"Windowdialog是所有基于窗å£çš„å¯¹è¯æ¡†çš„基类。它是一个默认的顶层[Control]控件,å¯" -"以绘制一个窗å£è£…饰,并å…许移动和调整大å°ã€‚" +"Windowdialog 是所有基于窗å£çš„å¯¹è¯æ¡†çš„基类。它是一个默认的顶层 [Control] 控" +"件,å¯ä»¥ç»˜åˆ¶ä¸€ä¸ªçª—å£è£…饰,并å…许移动和调整大å°ã€‚" #: doc/classes/WindowDialog.xml msgid "" @@ -93397,7 +93731,7 @@ msgstr "" #: doc/classes/WindowDialog.xml msgid "If [code]true[/code], the user can resize the window." -msgstr "如果[code]true[/code],用户å¯ä»¥è°ƒæ•´çª—å£å¤§å°ã€‚" +msgstr "如果为 [code]true[/code],用户å¯ä»¥è°ƒæ•´çª—å£å¤§å°ã€‚" #: doc/classes/WindowDialog.xml msgid "The text displayed in the window's title bar." @@ -93415,7 +93749,7 @@ msgstr "关闿Œ‰é’®çš„æ°´å¹³å移。" msgid "" "The thickness of the border that can be dragged when scaling the window (if " "[member resizable] is enabled)." -msgstr "ç¼©æ”¾çª—å£æ—¶å¯ä»¥æ‹–动的边框的粗细,如果å¯ç”¨äº†[member resizable]。" +msgstr "ç¼©æ”¾çª—å£æ—¶å¯ä»¥æ‹–动的边框的粗细,如果å¯ç”¨äº† [member resizable]。" #: doc/classes/WindowDialog.xml msgid "The vertical offset of the title text." @@ -93464,16 +93798,13 @@ msgstr "ç›´æŽ¥è®¿é—®ä¸–ç•Œç‰©ç† 3D 空间状æ€ã€‚用于查询当å‰å’Œæ½œåœ¨çš #: doc/classes/World.xml msgid "The World's [Environment]." -msgstr "Worldçš„[Environment]环境。" +msgstr "World çš„ [Environment] 环境。" #: doc/classes/World.xml -#, fuzzy msgid "" "The World's fallback environment will be used if [member environment] fails " "or is missing." -msgstr "" -"如果 World çš„ [Environment] 失败或丢失,将使用 World çš„ " -"fallback_environment。" +msgstr "该 World 的回退环境会在 [member environment] 失败或丢失时使用。" #: doc/classes/World.xml msgid "" @@ -93526,7 +93857,7 @@ msgid "" "The [RID] of this world's physics space resource. Used by the " "[Physics2DServer] for 2D physics, treating it as both a space and an area." msgstr "" -"这个世界物ç†ç©ºé—´èµ„æºçš„[RID]。 [Physics2DServer] 用于 2D 物ç†ï¼Œå°†å…¶è§†ä¸ºç©ºé—´å’Œ" +"这个世界物ç†ç©ºé—´èµ„æºçš„ [RID]。[Physics2DServer] 用于 2D 物ç†ï¼Œå°†å…¶è§†ä¸ºç©ºé—´å’Œ" "区域。" #: doc/classes/WorldEnvironment.xml @@ -93654,8 +93985,8 @@ msgid "" "current node type is neither [constant NODE_ELEMENT] nor [constant " "NODE_ELEMENT_END]." msgstr "" -"获å–当å‰å…ƒç´ 节点的å称。如果当å‰èŠ‚ç‚¹ç±»åž‹æ—¢ä¸æ˜¯[constant NODE_ELEMENT]ä¹Ÿä¸æ˜¯" -"[constant NODE_ELEMENT_END],将引å‘一个错误。" +"获å–当å‰å…ƒç´ 节点的å称。如果当å‰èŠ‚ç‚¹ç±»åž‹æ—¢ä¸æ˜¯ [constant NODE_ELEMENT] 也ä¸" +"是 [constant NODE_ELEMENT_END],将引å‘一个错误。" #: doc/classes/XMLParser.xml msgid "" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index ba40f5ee74..84b16d22a6 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -482,7 +482,7 @@ msgid "" "- 1.0: Linear\n" "- Greater than 1.0 (exclusive): Ease in\n" "[/codeblock]\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." @@ -1203,7 +1203,7 @@ msgid "" "[method smoothstep] returns the smoothest possible curve with no sudden " "changes in the derivative. If you need to perform more advanced transitions, " "use [Tween] or [AnimationPlayer].\n" -"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" @@ -28417,7 +28417,7 @@ msgid "" " # Note: Don't make simultaneous requests using a single HTTPRequest " "node.\n" " # The snippet below is provided for reference only.\n" -" var body = {\"name\": \"Godette\"}\n" +" var body = to_json({\"name\": \"Godette\"})\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" " if error != OK:\n" @@ -31042,7 +31042,18 @@ msgid "" "[code]\\n[/code]) in the string won't produce a newline. Text wrapping is " "enabled in [constant ICON_MODE_TOP] mode, but column's width is adjusted to " "fully fit its content by default. You need to set [member " -"fixed_column_width] greater than zero to wrap the text." +"fixed_column_width] greater than zero to wrap the text.\n" +"[b]Incremental search:[/b] Like [PopupMenu] and [Tree], [ItemList] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/ItemList.xml @@ -34794,12 +34805,18 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the [Material] for a surface of the [Mesh] resource." +msgid "" +"Returns the override [Material] for a surface of the [Mesh] resource.\n" +"[b]Note:[/b] This function only returns [i]override[/i] materials associated " +"with this [MeshInstance]. Consider using [method get_active_material] or " +"[method Mesh.surface_get_material] to get materials associated with the " +"[Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml -msgid "Returns the number of surface materials." -msgstr "" +#, fuzzy +msgid "Returns the number of surface override materials." +msgstr "å›žå‚³åƒæ•¸çš„æ£å¼¦å€¼ã€‚" #: doc/classes/MeshInstance.xml msgid "" @@ -34835,7 +34852,10 @@ msgid "" msgstr "" #: doc/classes/MeshInstance.xml -msgid "Sets the [Material] for a surface of the [Mesh] resource." +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance] rather than " +"with the [Mesh] resource." msgstr "" #: doc/classes/MeshInstance.xml @@ -35634,6 +35654,9 @@ msgstr "" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Provides navigation and pathfinding within a collection of " "[NavigationMesh]es. By default, these will be automatically collected from " "child [NavigationMeshInstance] nodes. In addition to basic pathfinding, this " @@ -35680,6 +35703,9 @@ msgstr "å›žå‚³åƒæ•¸çš„æ£å¼¦å€¼ã€‚" #: doc/classes/Navigation.xml msgid "" +"[i]Deprecated.[/i] [Navigation] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"NavigationServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the " "agent properties associated with each [NavigationMesh] (radius, height, " @@ -35723,6 +35749,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Navigation2D provides navigation and pathfinding within a 2D area, specified " "as a collection of [NavigationPolygon] resources. By default, these are " "automatically collected from child [NavigationPolygonInstance] nodes." @@ -35742,6 +35771,9 @@ msgstr "" #: doc/classes/Navigation2D.xml msgid "" +"[i]Deprecated.[/i] [Navigation2D] node and [method get_simple_path] are " +"deprecated and will be removed in a future version. Use [method " +"Navigation2DServer.map_get_path] instead.\n" "Returns the path between two given points. Points are in local coordinate " "space. If [code]optimize[/code] is [code]true[/code] (the default), the path " "is smoothed by merging path segments where possible." @@ -35877,11 +35909,47 @@ msgid "Destroys the given RID." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns all created navigation map [RID]s on the NavigationServer. This " +"returns both 2D and 3D created navigation maps as there is technically no " +"distinction between them." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" +"This function immediately forces synchronization of the specified navigation " +"[code]map[/code] [RID]. By default navigation maps are only synchronized at " +"the end of each physics frame. This function can be used to immediately " +"(re)calculate all the navigation meshes and region connections of the " +"navigation map. This makes it possible to query a navigation path for a " +"changed map immediately and in the same frame (multiple times if needed).\n" +"Due to technical restrictions the current NavigationServer command queue " +"will be flushed. This means all already queued update commands for this " +"physics frame will be executed, even those intended for other maps, regions " +"and agents not part of the specified map. The expensive computation of the " +"navigation meshes and region connections of a map will only be done for the " +"specified map. Other maps will receive the normal synchronization at the end " +"of the physics frame. Should the specified map receive changes after the " +"forced update it will update again as well when the other maps receive their " +"update.\n" +"Avoidance processing and dispatch of the [code]safe_velocity[/code] signals " +"is untouched by this function and continues to happen for all maps and " +"agents at the end of the physics frame.\n" +"[b]Note:[/b] With great power comes great responsibility. This function " +"should only be used by users that really know what they are doing and have a " +"good reason for it. Forcing an immediate update of a navigation map requires " +"locking the NavigationServer and flushing the entire NavigationServer " +"command queue. Not only can this severely impact the performance of a game " +"but it can also introduce bugs if used inappropriately without much " +"foresight." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" @@ -35997,6 +36065,23 @@ msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." msgstr "計算兩個å‘é‡çš„外ç©ã€‚" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml +msgid "" +"Returns [code]true[/code] if the provided [code]point[/code] in world space " +"is currently owned by the provided navigation [code]region[/code]. Owned in " +"this context means that one of the region's navigation mesh polygon faces " +"has a possible position at the closest distance to this point compared to " +"all other navigation meshes from other navigation regions that are also " +"registered on the navigation map of the provided region.\n" +"If multiple navigation meshes have positions at equal distance the " +"navigation region whose polygons are processed first wins the ownership. " +"Polygons are processed in the same order that navigation regions were " +"registered on the NavigationServer.\n" +"[b]Note:[/b] If navigation meshes from different navigation regions overlap " +"(which should be avoided in general) the result might not be what is " +"expected." +msgstr "" + +#: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "計算兩個å‘é‡çš„外ç©ã€‚" @@ -36210,20 +36295,40 @@ msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" +"The distance threshold before a path point is considered to be reached. This " +"will allow an agent to not have to hit a path point on the path exactly, but " +"in the area. If this value is set to high the NavigationAgent will skip " +"points on the path which can lead to leaving the navigation mesh. If this " +"value is set to low the NavigationAgent will be stuck in a repath loop cause " +"it will constantly overshoot or undershoot the distance to the next point on " +"each physics frame update." +msgstr "" + +#: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml +msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -msgid "The radius of the agent." +msgid "" +"The radius of the avoidance agent. This is the \"body\" of the avoidance " +"agent and not the avoidance maneuver starting radius (which is controlled by " +"[member neighbor_dist]).\n" +"Does not affect normal pathfinding. To change an actor's pathfinding radius " +"bake [NavigationMesh] resources with a different [member NavigationMesh." +"agent_radius] property and use different navigation maps for each actor size." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" -"The distance threshold before a target is considered to be reached. This " -"will allow an agent to not have to hit a point on the path exactly, but in " -"the area." +"The distance threshold before the final target point is considered to be " +"reached. This will allow an agent to not have to hit the point of the final " +"target exactly, but only the area. If this value is set to low the " +"NavigationAgent will be stuck in a repath loop cause it will constantly " +"overshoot or undershoot the distance to the final target point on each " +"physics frame update." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36440,6 +36545,16 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml +msgid "" +"If the baking [AABB] has a volume the navigation mesh baking will be " +"restricted to its enclosing area." +msgstr "" + +#: doc/classes/NavigationMesh.xml +msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." +msgstr "" + +#: doc/classes/NavigationMesh.xml msgid "If [code]true[/code], marks spans that are ledges as non-walkable." msgstr "" @@ -36610,7 +36725,15 @@ msgid "" "geometry for walkable terrain suitable to [NavigationMesh] agent properties " "by creating a voxel world around the meshes bounding area.\n" "The finalized navigation mesh is then returned and stored inside the " -"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] nodes." +"[NavigationMesh] for use as a resource inside [NavigationMeshInstance] " +"nodes.\n" +"[b]Note:[/b] Using meshes to not only define walkable surfaces but also " +"obstruct navigation baking does not always work. The navigation baking has " +"no concept of what is a geometry \"inside\" when dealing with mesh source " +"geometry and this is intentional. Depending on current baking parameters, as " +"soon as the obstructing mesh is large enough to fit a navigation mesh area " +"inside, the baking will generate navigation mesh areas that are inside the " +"obstructing source geometry mesh." msgstr "" #: doc/classes/NavigationMeshGenerator.xml @@ -38492,13 +38615,19 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when a child node enters the scene tree, either because it entered " -"on its own or because this node entered with it." +"on its own or because this node entered with it.\n" +"This signal is emitted [i]after[/i] the child node's own [constant " +"NOTIFICATION_ENTER_TREE] and [signal tree_entered]." msgstr "" #: doc/classes/Node.xml msgid "" -"Emitted when a child node exits the scene tree, either because it exited on " -"its own or because this node exited." +"Emitted when a child node is about to exit the scene tree, either because it " +"is being removed or freed directly, or because this node is exiting the " +"tree.\n" +"When this signal is received, the child [code]node[/code] is still in the " +"tree and valid. This signal is emitted [i]after[/i] the child node's own " +"[signal tree_exiting] and [constant NOTIFICATION_EXIT_TREE]." msgstr "" #: doc/classes/Node.xml @@ -38510,7 +38639,10 @@ msgid "Emitted when the node is renamed." msgstr "" #: doc/classes/Node.xml -msgid "Emitted when the node enters the tree." +msgid "" +"Emitted when the node enters the tree.\n" +"This signal is emitted [i]after[/i] the related [constant " +"NOTIFICATION_ENTER_TREE] notification." msgstr "" #: doc/classes/Node.xml @@ -38520,15 +38652,21 @@ msgstr "" #: doc/classes/Node.xml msgid "" "Emitted when the node is still active but about to exit the tree. This is " -"the right place for de-initialization (or a \"destructor\", if you will)." +"the right place for de-initialization (or a \"destructor\", if you will).\n" +"This signal is emitted [i]before[/i] the related [constant " +"NOTIFICATION_EXIT_TREE] notification." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node enters a [SceneTree]." +msgid "" +"Notification received when the node enters a [SceneTree].\n" +"This notification is emitted [i]before[/i] the related [signal tree_entered]." msgstr "" #: doc/classes/Node.xml -msgid "Notification received when the node is about to exit a [SceneTree]." +msgid "" +"Notification received when the node is about to exit a [SceneTree].\n" +"This notification is emitted [i]after[/i] the related [signal tree_exiting]." msgstr "" #: doc/classes/Node.xml @@ -40240,6 +40378,10 @@ msgid "" " if argument.find(\"=\") > -1:\n" " var key_value = argument.split(\"=\")\n" " arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Options without an argument will be present in the dictionary,\n" +" # with the value set to an empty string.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" @@ -45761,7 +45903,18 @@ msgstr "" #: doc/classes/PopupMenu.xml msgid "" "[PopupMenu] is a [Control] that displays a list of options. They are popular " -"in toolbars or context menus." +"in toolbars or context menus.\n" +"[b]Incremental search:[/b] Like [ItemList] and [Tree], [PopupMenu] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/PopupMenu.xml @@ -49337,20 +49490,28 @@ msgid "" "cause.\n" "The default value is a conservative one, so you are advised to tweak it " "according to the hardware you are targeting.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"The default is a very conservative override for [code]rendering/gles3/" -"shaders/max_concurrent_compiles[/code].\n" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" "Depending on the specific devices you are targeting, you may want to raise " "it.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is [b]not[/b] [code]Synchronous[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"The default is a very conservative override for [member rendering/gles3/" +"shaders/max_simultaneous_compiles].\n" +"Depending on the specific browsers you are targeting, you may want to raise " +"it.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49358,19 +49519,28 @@ msgid "" "The maximum size, in megabytes, that the ubershader cache can grow up to. On " "startup, the least recently used entries will be deleted until the total " "size is within bounds.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/ubershader_cache_size_mb[/" -"code], so a smaller maximum size can be configured for mobile platforms, " -"where storage space is more limited.\n" -"[b]Note:[/b] This setting is only meaningful if [code]rendering/gles3/" -"shaders/shader_compilation_mode[/code] is set to [code]Asynchronous + Cache[/" -"code]." +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for mobile platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" +"An override for [member rendering/gles3/shaders/shader_cache_size_mb], so a " +"smaller maximum size can be configured for web platforms, where storage " +"space is more limited.\n" +"[b]Note:[/b] Currently, shader caching is generally unavailable on web " +"platforms.\n" +"[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" +"shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" #: doc/classes/ProjectSettings.xml @@ -49402,14 +49572,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" -"An override for [code]rendering/gles3/shaders/shader_compilation_mode[/" -"code], so asynchronous compilation can be disabled for mobile.\n" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on mobile platforms.\n" "You may want to do that since mobile GPUs generally won't support " "ubershaders due to their complexity." msgstr "" #: doc/classes/ProjectSettings.xml msgid "" +"An override for [member rendering/gles3/shaders/shader_compilation_mode], so " +"asynchronous compilation can be disabled on web platforms.\n" +"You may want to do that since certain browsers (especially on mobile " +"platforms) generally won't support ubershaders due to their complexity." +msgstr "" + +#: doc/classes/ProjectSettings.xml +msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" @@ -54100,24 +54278,23 @@ msgid "" "manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be " "used for tweening values, but you can do manual interpolation with [method " "interpolate_value].\n" -"A [SceneTreeTween] animation is composed of a sequence of [Tweener]s, which " -"by default are executed one after another. You can create a sequence by " -"appending [Tweener]s to the [SceneTreeTween]. Animating something with a " -"[Tweener] is called tweening. Example tweening sequence looks like this:\n" +"A tween animation is created by adding [Tweener]s to the [SceneTreeTween] " +"object, using [method tween_property], [method tween_interval], [method " +"tween_callback] or [method tween_method]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1)\n" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"This sequence will make the [code]$Sprite[/code] node turn red, then shrink " -"and finally the [method Node.queue_free] is called to remove the sprite. See " -"methods [method tween_property], [method tween_interval], [method " -"tween_callback] and [method tween_method] for more usage information.\n" +"This sequence will make the [code]$Sprite[/code] node turn red, then shrink, " +"before finally calling [method Node.queue_free] to free the sprite. " +"[Tweener]s are executed one after another by default. This behavior can be " +"changed using [method parallel] and [method set_parallel].\n" "When a [Tweener] is created with one of the [code]tween_*[/code] methods, a " "chained method call can be used to tweak the properties of this [Tweener]. " -"For example, if you want to set different transition type in the above " -"example, you can do:\n" +"For example, if you want to set a different transition type in the above " +"example, you can use [method set_trans]:\n" "[codeblock]\n" "var tween = get_tree().create_tween()\n" "tween.tween_property($Sprite, \"modulate\", Color.red, 1).set_trans(Tween." @@ -54126,8 +54303,9 @@ msgid "" "TRANS_BOUNCE)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Most of the [SceneTreeTween] methods can be chained this way too. In this " -"example the [SceneTreeTween] is bound and have set a default transition:\n" +"Most of the [SceneTreeTween] methods can be chained this way too. In the " +"following example the [SceneTreeTween] is bound to the running script's node " +"and a default transition is set for its [Tweener]s:\n" "[codeblock]\n" "var tween = get_tree().create_tween().bind_node(self).set_trans(Tween." "TRANS_ELASTIC)\n" @@ -54135,16 +54313,16 @@ msgid "" "tween.tween_property($Sprite, \"scale\", Vector2(), 1)\n" "tween.tween_callback($Sprite, \"queue_free\")\n" "[/codeblock]\n" -"Another interesting use for [SceneTreeTween]s is animating arbitrary set of " +"Another interesting use for [SceneTreeTween]s is animating arbitrary sets of " "objects:\n" "[codeblock]\n" "var tween = create_tween()\n" "for sprite in get_children():\n" -" tween.tween_property(sprite, \"position\", Vector2(), 1)\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "In the example above, all children of a node are moved one after another to " "position (0, 0).\n" -"Some [Tweener]s use transitions and eases. The first accepts an [enum Tween." +"Some [Tweener]s use transitions and eases. The first accepts a [enum Tween." "TransitionType] constant, and refers to the way the timing of the animation " "is handled (see [url=https://easings.net/]easings.net[/url] for some " "examples). The second accepts an [enum Tween.EaseType] constant, and " @@ -54156,7 +54334,7 @@ msgid "" "tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url]\n" "[b]Note:[/b] All [SceneTreeTween]s will automatically start by default. To " "prevent a [SceneTreeTween] from autostarting, you can call [method stop] " -"immediately after it was created." +"immediately after it is created." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54186,21 +54364,24 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" -"Processes the [SceneTreeTween] by given [code]delta[/code] value, in " -"seconds. Mostly useful when the [SceneTreeTween] is paused, for controlling " -"it manually. Can also be used to end the [SceneTreeTween] animation " -"immediately, by using [code]delta[/code] longer than the whole duration.\n" +"Processes the [SceneTreeTween] by the given [code]delta[/code] value, in " +"seconds. This is mostly useful for manual control when the [SceneTreeTween] " +"is paused. It can also be used to end the [SceneTreeTween] animation " +"immediately, by setting [code]delta[/code] longer than the whole duration of " +"the [SceneTreeTween] animation.\n" "Returns [code]true[/code] if the [SceneTreeTween] still has [Tweener]s that " "haven't finished.\n" -"[b]Note:[/b] The [SceneTreeTween] will become invalid after finished, but " -"you can call [method stop] after the step, to keep it and reset." +"[b]Note:[/b] The [SceneTreeTween] will become invalid in the next processing " +"frame after its animation finishes. Calling [method stop] after performing " +"[method custom_step] instead keeps and resets the [SceneTreeTween]." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Returns the total time in seconds the [SceneTreeTween] has been animating (i." -"e. time since it started, not counting pauses etc.). The time is affected by " -"[method set_speed_scale] and [method stop] will reset it to [code]0[/code].\n" +"e. the time since it started, not counting pauses etc.). The time is " +"affected by [method set_speed_scale], and [method stop] will reset it to " +"[code]0[/code].\n" "[b]Note:[/b] As it results from accumulating frame deltas, the time returned " "after the [SceneTreeTween] has finished animating will be slightly greater " "than the actual [SceneTreeTween] duration." @@ -54236,11 +54417,10 @@ msgstr "" msgid "" "Returns whether the [SceneTreeTween] is valid. A valid [SceneTreeTween] is a " "[SceneTreeTween] contained by the scene tree (i.e. the array from [method " -"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). " -"[SceneTreeTween] might become invalid when it has finished tweening or was " -"killed, also when created with [code]Tween.new()[/code]. Invalid " -"[SceneTreeTween] can't have [Tweener]s appended, because it can't animate " -"them. You can however still use [method interpolate_value]." +"SceneTree.get_processed_tweens] will contain this [SceneTreeTween]). A " +"[SceneTreeTween] might become invalid when it has finished tweening, is " +"killed, or when created with [code]SceneTreeTween.new()[/code]. Invalid " +"[SceneTreeTween]s can't have [Tweener]s appended." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54280,16 +54460,15 @@ msgstr "" msgid "" "Sets the number of times the tweening sequence will be repeated, i.e. " "[code]set_loops(2)[/code] will run the animation twice.\n" -"Calling this method without arguments will make the [SceneTreeTween] run " -"infinitely, until it is either killed by [method kill] or by freeing bound " -"node, or all the animated objects have been freed (which makes further " +"Calling this method without arguments will make the [Tween] run infinitely, " +"until either it is killed with [method kill], the [Tween]'s bound node is " +"freed, or all the animated objects have been freed (which makes further " "animation impossible).\n" "[b]Warning:[/b] Make sure to always add some duration/delay when using " -"infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] " -"with no delay or [PropertyTweener] with invalid node) are equivalent to " -"infinite [code]while[/code] loops and will freeze your game. If a " -"[SceneTreeTween]'s lifetime depends on some node, always use [method " -"bind_node]." +"infinite loops. To prevent the game freezing, 0-duration looped animations " +"(e.g. a single [CallbackTweener] with no delay) are stopped after a small " +"number of loops, which may produce unexpected results. If a [Tween]'s " +"lifetime depends on some node, always use [method bind_node]." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -54351,10 +54530,10 @@ msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " -"delays in the tween animation, as an alternative for using the delay in " -"other [Tweener]s or when there's no animation (in which case the " -"[SceneTreeTween] acts as a timer). [code]time[/code] is the length of the " -"interval, in seconds.\n" +"delays in the tween animation, as an alternative to using the delay in other " +"[Tweener]s, or when there's no animation (in which case the [SceneTreeTween] " +"acts as a timer). [code]time[/code] is the length of the interval, in " +"seconds.\n" "Example: creating an interval in code execution.\n" "[codeblock]\n" "# ... some code\n" @@ -54408,8 +54587,8 @@ msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " "[code]final_val[/code] in a span of time equal to [code]duration[/code], in " -"seconds. The initial value by default is a value at the time the tweening of " -"the [PropertyTweener] start. For example:\n" +"seconds. The initial value by default is the property's value at the time " +"the tweening of the [PropertyTweener] starts. For example:\n" "[codeblock]\n" "var tween = create_tween()\n" "tween.tween_property($Sprite, \"position\", Vector2(100, 200), 1)\n" @@ -54440,16 +54619,15 @@ msgid "" "Emitted when the [SceneTreeTween] has finished all tweening. Never emitted " "when the [SceneTreeTween] is set to infinite looping (see [method " "set_loops]).\n" -"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) after this signal " -"is emitted, but it doesn't happen immediately, but on the next processing " -"frame. Calling [method stop] inside the signal callback will preserve the " -"[SceneTreeTween]." +"[b]Note:[/b] The [SceneTreeTween] is removed (invalidated) in the next " +"processing frame after this signal is emitted. Calling [method stop] inside " +"the signal callback will prevent the [SceneTreeTween] from being removed." msgstr "" #: doc/classes/SceneTreeTween.xml msgid "" "Emitted when a full loop is complete (see [method set_loops]), providing the " -"loop index. This signal is not emitted after final loop, use [signal " +"loop index. This signal is not emitted after the final loop, use [signal " "finished] instead for this case." msgstr "" @@ -54457,7 +54635,7 @@ msgstr "" msgid "" "Emitted when one step of the [SceneTreeTween] is complete, providing the " "step index. One step is either a single [Tweener] or a group of [Tweener]s " -"running parallelly." +"running in parallel." msgstr "" #: doc/classes/SceneTreeTween.xml @@ -58429,11 +58607,11 @@ msgstr "" msgid "" "Returns [code]true[/code] if this string contains a valid integer.\n" "[codeblock]\n" -"print(\"7\".is_valid_int()) # Prints \"True\"\n" -"print(\"14.6\".is_valid_int()) # Prints \"False\"\n" -"print(\"L\".is_valid_int()) # Prints \"False\"\n" -"print(\"+3\".is_valid_int()) # Prints \"True\"\n" -"print(\"-12\".is_valid_int()) # Prints \"True\"\n" +"print(\"7\".is_valid_integer()) # Prints \"True\"\n" +"print(\"14.6\".is_valid_integer()) # Prints \"False\"\n" +"print(\"L\".is_valid_integer()) # Prints \"False\"\n" +"print(\"+3\".is_valid_integer()) # Prints \"True\"\n" +"print(\"-12\".is_valid_integer()) # Prints \"True\"\n" "[/codeblock]" msgstr "" @@ -63318,7 +63496,18 @@ msgid "" "To iterate over all the [TreeItem] objects in a [Tree] object, use [method " "TreeItem.get_next] and [method TreeItem.get_children] after getting the root " "through [method get_root]. You can use [method Object.free] on a [TreeItem] " -"to remove it from the [Tree]." +"to remove it from the [Tree].\n" +"[b]Incremental search:[/b] Like [ItemList] and [PopupMenu], [Tree] supports " +"searching within the list while the control is focused. Press a key that " +"matches the first letter of an item's name to select the first item starting " +"with the given letter. After that point, there are two ways to perform " +"incremental search: 1) Press the same key again before the timeout duration " +"to select the next item starting with the same letter. 2) Press letter keys " +"that match the rest of the word before the timeout duration to match to " +"select the item in question directly. Both of these actions will be reset to " +"the beginning of the list if the timeout duration has passed since the last " +"keystroke was registered. You can adjust the timeout duration by changing " +"[member ProjectSettings.gui/timers/incremental_search_max_interval_msec]." msgstr "" #: doc/classes/Tree.xml diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 99aa0e2442..9b491be128 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -1400,7 +1400,7 @@ Error RenderingDeviceVulkan::_insert_staging_block() { return OK; } -Error RenderingDeviceVulkan::_staging_buffer_allocate(uint32_t p_amount, uint32_t p_required_align, uint32_t &r_alloc_offset, uint32_t &r_alloc_size, bool p_can_segment, bool p_on_draw_command_buffer) { +Error RenderingDeviceVulkan::_staging_buffer_allocate(uint32_t p_amount, uint32_t p_required_align, uint32_t &r_alloc_offset, uint32_t &r_alloc_size, bool p_can_segment) { //determine a block to use r_alloc_size = p_amount; @@ -1542,7 +1542,7 @@ Error RenderingDeviceVulkan::_buffer_update(Buffer *p_buffer, size_t p_offset, c uint32_t block_write_offset; uint32_t block_write_amount; - Error err = _staging_buffer_allocate(MIN(to_submit, staging_buffer_block_size), p_required_align, block_write_offset, block_write_amount, p_use_draw_command_buffer); + Error err = _staging_buffer_allocate(MIN(to_submit, staging_buffer_block_size), p_required_align, block_write_offset, block_write_amount); if (err) { return err; } @@ -2376,6 +2376,22 @@ Error RenderingDeviceVulkan::texture_update(RID p_texture, uint32_t p_layer, con return _texture_update(p_texture, p_layer, p_data, p_post_barrier, false); } +static _ALWAYS_INLINE_ void _copy_region(uint8_t const *__restrict p_src, uint8_t *__restrict p_dst, uint32_t p_src_x, uint32_t p_src_y, uint32_t p_src_w, uint32_t p_src_h, uint32_t p_src_full_w, uint32_t p_unit_size) { + uint32_t src_offset = (p_src_y * p_src_full_w + p_src_x) * p_unit_size; + uint32_t dst_offset = 0; + for (uint32_t y = p_src_h; y > 0; y--) { + uint8_t const *__restrict src = p_src + src_offset; + uint8_t *__restrict dst = p_dst + dst_offset; + for (uint32_t x = p_src_w * p_unit_size; x > 0; x--) { + *dst = *src; + src++; + dst++; + } + src_offset += p_src_full_w * p_unit_size; + dst_offset += p_src_w * p_unit_size; + } +} + Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, uint32_t p_post_barrier, bool p_use_setup_queue) { _THREAD_SAFE_METHOD_ @@ -2461,8 +2477,8 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co const uint8_t *read_ptr = read_ptr_mipmap + image_size * z / depth; - for (uint32_t x = 0; x < width; x += region_size) { - for (uint32_t y = 0; y < height; y += region_size) { + for (uint32_t y = 0; y < height; y += region_size) { + for (uint32_t x = 0; x < width; x += region_size) { uint32_t region_w = MIN(region_size, width - x); uint32_t region_h = MIN(region_size, height - y); @@ -2474,7 +2490,7 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co to_allocate >>= get_compressed_image_format_pixel_rshift(texture->format); uint32_t alloc_offset, alloc_size; - Error err = _staging_buffer_allocate(to_allocate, required_align, alloc_offset, alloc_size, false, !p_use_setup_queue); + Error err = _staging_buffer_allocate(to_allocate, required_align, alloc_offset, alloc_size, false); ERR_FAIL_COND_V(err, ERR_CANT_CREATE); uint8_t *write_ptr; @@ -2505,31 +2521,11 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co //uint32_t hb = height / block_h; uint32_t region_wb = region_w / block_w; uint32_t region_hb = region_h / block_h; - for (uint32_t xr = 0; xr < region_wb; xr++) { - for (uint32_t yr = 0; yr < region_hb; yr++) { - uint32_t src_offset = ((yr + yb) * wb + xr + xb) * block_size; - uint32_t dst_offset = (yr * region_wb + xr) * block_size; - //copy block - for (uint32_t i = 0; i < block_size; i++) { - write_ptr[dst_offset + i] = read_ptr[src_offset + i]; - } - } - } - + _copy_region(read_ptr, write_ptr, xb, yb, region_wb, region_hb, wb, block_size); } else { //regular image (pixels) //must copy a pixel region - - for (uint32_t xr = 0; xr < region_w; xr++) { - for (uint32_t yr = 0; yr < region_h; yr++) { - uint32_t src_offset = ((yr + y) * width + xr + x) * pixel_size; - uint32_t dst_offset = (yr * region_w + xr) * pixel_size; - //copy block - for (uint32_t i = 0; i < pixel_size; i++) { - write_ptr[dst_offset + i] = read_ptr[src_offset + i]; - } - } - } + _copy_region(read_ptr, write_ptr, x, y, region_w, region_h, width, pixel_size); } { //unmap @@ -2572,11 +2568,11 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co uint32_t access_flags = 0; if (p_post_barrier & BARRIER_MASK_COMPUTE) { barrier_flags |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; - access_flags |= VK_ACCESS_SHADER_READ_BIT; + access_flags |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; } if (p_post_barrier & BARRIER_MASK_RASTER) { barrier_flags |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - access_flags |= VK_ACCESS_SHADER_READ_BIT; + access_flags |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; } if (p_post_barrier & BARRIER_MASK_TRANSFER) { barrier_flags |= VK_PIPELINE_STAGE_TRANSFER_BIT; @@ -2990,7 +2986,7 @@ Error RenderingDeviceVulkan::texture_copy(RID p_from_texture, RID p_to_texture, image_memory_barrier.subresourceRange.baseArrayLayer = p_src_layer; image_memory_barrier.subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(command_buffer, VK_ACCESS_TRANSFER_WRITE_BIT, barrier_flags, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, barrier_flags, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); } { //make dst readable @@ -3016,6 +3012,13 @@ Error RenderingDeviceVulkan::texture_copy(RID p_from_texture, RID p_to_texture, } } + if (dst_tex->used_in_frame != frames_drawn) { + dst_tex->used_in_raster = false; + dst_tex->used_in_compute = false; + dst_tex->used_in_frame = frames_drawn; + } + dst_tex->used_in_transfer = true; + return OK; } @@ -4348,7 +4351,7 @@ String RenderingDeviceVulkan::_shader_uniform_debug(RID p_shader, int p_set) { if (!ret.is_empty()) { ret += "\n"; } - ret += "Set: " + itos(i) + " Binding: " + itos(ui.binding) + " Type: " + shader_uniform_names[ui.type] + " Length: " + itos(ui.length); + ret += "Set: " + itos(i) + " Binding: " + itos(ui.binding) + " Type: " + shader_uniform_names[ui.type] + " Writable: " + (ui.writable ? "Y" : "N") + " Length: " + itos(ui.length); } } return ret; @@ -4548,8 +4551,9 @@ bool RenderingDeviceVulkan::_uniform_add_binding(Vector<Vector<VkDescriptorSetLa //version 1: initial //version 2: Added shader name +//version 3: Added writable -#define SHADER_BINARY_VERSION 2 +#define SHADER_BINARY_VERSION 3 String RenderingDeviceVulkan::shader_get_binary_cache_key() const { return "Vulkan-SV" + itos(SHADER_BINARY_VERSION); @@ -4560,6 +4564,7 @@ struct RenderingDeviceVulkanShaderBinaryDataBinding { uint32_t binding; uint32_t stages; uint32_t length; //size of arrays (in total elements), or ubos (in bytes * total elements) + uint32_t writable; }; struct RenderingDeviceVulkanShaderBinarySpecializationConstant { @@ -4649,6 +4654,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve bool need_array_dimensions = false; bool need_block_size = false; + bool may_be_writable = false; switch (binding.descriptor_type) { case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER: { @@ -4666,6 +4672,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE: { info.type = UNIFORM_TYPE_IMAGE; need_array_dimensions = true; + may_be_writable = true; } break; case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: { info.type = UNIFORM_TYPE_TEXTURE_BUFFER; @@ -4674,6 +4681,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { info.type = UNIFORM_TYPE_IMAGE_BUFFER; need_array_dimensions = true; + may_be_writable = true; } break; case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER: { info.type = UNIFORM_TYPE_UNIFORM_BUFFER; @@ -4682,6 +4690,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER: { info.type = UNIFORM_TYPE_STORAGE_BUFFER; need_block_size = true; + may_be_writable = true; } break; case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { ERR_PRINT("Dynamic uniform buffer not supported."); @@ -4720,6 +4729,12 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve info.length = 0; } + if (may_be_writable) { + info.writable = !(bool)(binding.type_description->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE); + } else { + info.writable = false; + } + info.binding = binding.binding; uint32_t set = binding.set; @@ -4745,6 +4760,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve //just append stage mask and return uniform_info.write[set].write[k].stages |= 1 << stage; exists = true; + break; } } @@ -5087,6 +5103,7 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ for (uint32_t j = 0; j < set_count; j++) { UniformInfo info; info.type = UniformType(set_ptr[j].type); + info.writable = set_ptr[j].writable; info.length = set_ptr[j].length; info.binding = set_ptr[j].binding; info.stages = set_ptr[j].stages; @@ -5410,7 +5427,6 @@ RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Ve ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); Buffer buffer; - buffer.usage = p_usage; uint32_t flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; if (p_usage & STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT) { flags |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; @@ -7175,6 +7191,9 @@ RenderingDevice::DrawListID RenderingDeviceVulkan::draw_list_begin(RID p_framebu Error RenderingDeviceVulkan::draw_list_begin_split(RID p_framebuffer, uint32_t p_splits, DrawListID *r_split_ids, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region, const Vector<RID> &p_storage_textures) { _THREAD_SAFE_METHOD_ + ERR_FAIL_COND_V_MSG(draw_list != nullptr, ERR_BUSY, "Only one draw list can be active at the same time."); + ERR_FAIL_COND_V_MSG(compute_list != nullptr && !compute_list->state.allow_draw_overlap, ERR_BUSY, "Only one draw/compute list can be active at the same time."); + ERR_FAIL_COND_V(p_splits < 1, ERR_INVALID_DECLARATION); Framebuffer *framebuffer = framebuffer_owner.get_or_null(p_framebuffer); @@ -7899,10 +7918,6 @@ void RenderingDeviceVulkan::draw_list_end(uint32_t p_post_barrier) { // * Some buffer is copied // * Another render pass happens (since we may be done) -#ifdef FORCE_FULL_BARRIER - _full_barrier(true); -#else - VkMemoryBarrier mem_barrier; mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; mem_barrier.pNext = nullptr; @@ -7913,6 +7928,8 @@ void RenderingDeviceVulkan::draw_list_end(uint32_t p_post_barrier) { vkCmdPipelineBarrier(frames[frame].draw_command_buffer, src_stage, barrier_flags, 0, 1, &mem_barrier, 0, nullptr, image_barrier_count, image_barriers); } +#ifdef FORCE_FULL_BARRIER + _full_barrier(true); #endif } @@ -8267,7 +8284,7 @@ void RenderingDeviceVulkan::compute_list_dispatch_indirect(ComputeListID p_list, Buffer *buffer = storage_buffer_owner.get_or_null(p_buffer); ERR_FAIL_COND(!buffer); - ERR_FAIL_COND_MSG(!(buffer->usage & STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT), "Buffer provided was not created to do indirect dispatch."); + ERR_FAIL_COND_MSG(!(buffer->usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT), "Buffer provided was not created to do indirect dispatch."); ERR_FAIL_COND_MSG(p_offset + 12 > buffer->size, "Offset provided (+12) is past the end of buffer."); @@ -8383,9 +8400,6 @@ void RenderingDeviceVulkan::compute_list_end(uint32_t p_post_barrier) { } } -#ifdef FORCE_FULL_BARRIER - _full_barrier(true); -#else VkMemoryBarrier mem_barrier; mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; mem_barrier.pNext = nullptr; @@ -8396,6 +8410,8 @@ void RenderingDeviceVulkan::compute_list_end(uint32_t p_post_barrier) { vkCmdPipelineBarrier(compute_list->command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, barrier_flags, 0, 1, &mem_barrier, 0, nullptr, image_barrier_count, image_barriers); } +#ifdef FORCE_FULL_BARRIER + _full_barrier(true); #endif memdelete(compute_list); @@ -8723,7 +8739,7 @@ void RenderingDeviceVulkan::_begin_frame() { } if (frames[frame].timestamp_count) { - vkGetQueryPoolResults(device, frames[frame].timestamp_pool, 0, frames[frame].timestamp_count, sizeof(uint64_t) * max_timestamp_query_elements, frames[frame].timestamp_result_values, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT); + vkGetQueryPoolResults(device, frames[frame].timestamp_pool, 0, frames[frame].timestamp_count, sizeof(uint64_t) * max_timestamp_query_elements, frames[frame].timestamp_result_values.ptr(), sizeof(uint64_t), VK_QUERY_RESULT_64_BIT); vkCmdResetQueryPool(frames[frame].setup_command_buffer, frames[frame].timestamp_pool, 0, frames[frame].timestamp_count); SWAP(frames[frame].timestamp_names, frames[frame].timestamp_result_names); SWAP(frames[frame].timestamp_cpu_values, frames[frame].timestamp_cpu_result_values); @@ -9014,7 +9030,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de vmaCreateAllocator(&allocatorInfo, &allocator); } - frames = memnew_arr(Frame, frame_count); + frames.resize(frame_count); frame = 0; //create setup and frame buffers for (int i = 0; i < frame_count; i++) { @@ -9060,12 +9076,12 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de vkCreateQueryPool(device, &query_pool_create_info, nullptr, &frames[i].timestamp_pool); - frames[i].timestamp_names = memnew_arr(String, max_timestamp_query_elements); - frames[i].timestamp_cpu_values = memnew_arr(uint64_t, max_timestamp_query_elements); + frames[i].timestamp_names.resize(max_timestamp_query_elements); + frames[i].timestamp_cpu_values.resize(max_timestamp_query_elements); frames[i].timestamp_count = 0; - frames[i].timestamp_result_names = memnew_arr(String, max_timestamp_query_elements); - frames[i].timestamp_cpu_result_values = memnew_arr(uint64_t, max_timestamp_query_elements); - frames[i].timestamp_result_values = memnew_arr(uint64_t, max_timestamp_query_elements); + frames[i].timestamp_result_names.resize(max_timestamp_query_elements); + frames[i].timestamp_cpu_result_values.resize(max_timestamp_query_elements); + frames[i].timestamp_result_values.resize(max_timestamp_query_elements); frames[i].timestamp_result_count = 0; } } @@ -9466,18 +9482,13 @@ void RenderingDeviceVulkan::finalize() { _free_pending_resources(f); vkDestroyCommandPool(device, frames[i].command_pool, nullptr); vkDestroyQueryPool(device, frames[i].timestamp_pool, nullptr); - memdelete_arr(frames[i].timestamp_names); - memdelete_arr(frames[i].timestamp_cpu_values); - memdelete_arr(frames[i].timestamp_result_names); - memdelete_arr(frames[i].timestamp_result_values); - memdelete_arr(frames[i].timestamp_cpu_result_values); } for (int i = 0; i < split_draw_list_allocators.size(); i++) { vkDestroyCommandPool(device, split_draw_list_allocators[i].command_pool, nullptr); } - memdelete_arr(frames); + frames.clear(); for (int i = 0; i < staging_buffer_blocks.size(); i++) { vmaDestroyBuffer(allocator, staging_buffer_blocks[i].buffer, staging_buffer_blocks[i].allocation); diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 3b21ee67a1..ec9e864370 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -206,7 +206,7 @@ class RenderingDeviceVulkan : public RenderingDevice { uint64_t staging_buffer_max_size = 0; bool staging_buffer_used = false; - Error _staging_buffer_allocate(uint32_t p_amount, uint32_t p_required_align, uint32_t &r_alloc_offset, uint32_t &r_alloc_size, bool p_can_segment = true, bool p_on_draw_command_buffer = false); + Error _staging_buffer_allocate(uint32_t p_amount, uint32_t p_required_align, uint32_t &r_alloc_offset, uint32_t &r_alloc_size, bool p_can_segment = true); Error _insert_staging_block(); struct Buffer { @@ -544,12 +544,13 @@ class RenderingDeviceVulkan : public RenderingDevice { struct UniformInfo { UniformType type = UniformType::UNIFORM_TYPE_MAX; + bool writable = false; int binding = 0; uint32_t stages = 0; int length = 0; //size of arrays (in total elements), or ubos (in bytes * total elements) bool operator!=(const UniformInfo &p_info) const { - return (binding != p_info.binding || type != p_info.type || stages != p_info.stages || length != p_info.length); + return (binding != p_info.binding || type != p_info.type || writable != p_info.writable || stages != p_info.stages || length != p_info.length); } bool operator<(const UniformInfo &p_info) const { @@ -559,6 +560,9 @@ class RenderingDeviceVulkan : public RenderingDevice { if (type != p_info.type) { return type < p_info.type; } + if (writable != p_info.writable) { + return writable < p_info.writable; + } if (stages != p_info.stages) { return stages < p_info.stages; } @@ -633,7 +637,6 @@ class RenderingDeviceVulkan : public RenderingDevice { }; bool is_compute = false; - int max_output = 0; Vector<Set> sets; Vector<uint32_t> set_formats; Vector<VkPipelineShaderStageCreateInfo> pipeline_stages; @@ -866,11 +869,9 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t pipeline_dynamic_state = 0; VertexFormatID pipeline_vertex_format = INVALID_ID; RID pipeline_shader; - uint32_t invalid_set_from = 0; bool pipeline_uses_restart_indices = false; uint32_t pipeline_primitive_divisor = 0; uint32_t pipeline_primitive_minimum = 0; - Vector<uint32_t> pipeline_set_formats; uint32_t pipeline_push_constant_size = 0; bool pipeline_push_constant_supplied = false; } validation; @@ -944,7 +945,6 @@ class RenderingDeviceVulkan : public RenderingDevice { bool pipeline_active = false; RID pipeline_shader; uint32_t invalid_set_from = 0; - Vector<uint32_t> pipeline_set_formats; uint32_t pipeline_push_constant_size = 0; bool pipeline_push_constant_supplied = false; } validation; @@ -994,19 +994,19 @@ class RenderingDeviceVulkan : public RenderingDevice { VkQueryPool timestamp_pool; - String *timestamp_names = nullptr; - uint64_t *timestamp_cpu_values = nullptr; + TightLocalVector<String> timestamp_names; + TightLocalVector<uint64_t> timestamp_cpu_values; uint32_t timestamp_count = 0; - String *timestamp_result_names = nullptr; - uint64_t *timestamp_cpu_result_values = nullptr; - uint64_t *timestamp_result_values = nullptr; + TightLocalVector<String> timestamp_result_names; + TightLocalVector<uint64_t> timestamp_cpu_result_values; + TightLocalVector<uint64_t> timestamp_result_values; uint32_t timestamp_result_count = 0; uint64_t index = 0; }; uint32_t max_timestamp_query_elements = 0; - Frame *frames = nullptr; //frames available, for main device they are cycled (usually 3), for local devices only 1 + TightLocalVector<Frame> frames; //frames available, for main device they are cycled (usually 3), for local devices only 1 int frame = 0; //current frame int frame_count = 0; //total amount of frames uint64_t frames_drawn = 0; diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 7944057041..0301f5b7fa 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -1860,16 +1860,16 @@ Error VulkanContext::initialize() { return OK; } -void VulkanContext::set_setup_buffer(const VkCommandBuffer &pCommandBuffer) { - command_buffer_queue.write[0] = pCommandBuffer; +void VulkanContext::set_setup_buffer(VkCommandBuffer p_command_buffer) { + command_buffer_queue.write[0] = p_command_buffer; } -void VulkanContext::append_command_buffer(const VkCommandBuffer &pCommandBuffer) { +void VulkanContext::append_command_buffer(VkCommandBuffer p_command_buffer) { if (command_buffer_queue.size() <= command_buffer_count) { command_buffer_queue.resize(command_buffer_count + 1); } - command_buffer_queue.write[command_buffer_count] = pCommandBuffer; + command_buffer_queue.write[command_buffer_count] = p_command_buffer; command_buffer_count++; } @@ -1879,7 +1879,10 @@ void VulkanContext::flush(bool p_flush_setup, bool p_flush_pending) { //flush the pending setup buffer - if (p_flush_setup && command_buffer_queue[0]) { + bool setup_flushable = p_flush_setup && command_buffer_queue[0]; + bool pending_flushable = p_flush_pending && command_buffer_count > 1; + + if (setup_flushable) { //use a fence to wait for everything done VkSubmitInfo submit_info; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; @@ -1889,33 +1892,33 @@ void VulkanContext::flush(bool p_flush_setup, bool p_flush_pending) { submit_info.pWaitSemaphores = nullptr; submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = command_buffer_queue.ptr(); - submit_info.signalSemaphoreCount = 0; - submit_info.pSignalSemaphores = nullptr; + submit_info.signalSemaphoreCount = pending_flushable ? 1 : 0; + submit_info.pSignalSemaphores = pending_flushable ? &draw_complete_semaphores[frame_index] : nullptr; VkResult err = vkQueueSubmit(graphics_queue, 1, &submit_info, VK_NULL_HANDLE); command_buffer_queue.write[0] = nullptr; ERR_FAIL_COND(err); - vkDeviceWaitIdle(device); } - if (p_flush_pending && command_buffer_count > 1) { + if (pending_flushable) { //use a fence to wait for everything done VkSubmitInfo submit_info; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.pNext = nullptr; - submit_info.pWaitDstStageMask = nullptr; - submit_info.waitSemaphoreCount = 0; - submit_info.pWaitSemaphores = nullptr; + VkPipelineStageFlags wait_stage_mask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + submit_info.pWaitDstStageMask = setup_flushable ? &wait_stage_mask : nullptr; + submit_info.waitSemaphoreCount = setup_flushable ? 1 : 0; + submit_info.pWaitSemaphores = setup_flushable ? &draw_complete_semaphores[frame_index] : nullptr; submit_info.commandBufferCount = command_buffer_count - 1; submit_info.pCommandBuffers = command_buffer_queue.ptr() + 1; submit_info.signalSemaphoreCount = 0; submit_info.pSignalSemaphores = nullptr; VkResult err = vkQueueSubmit(graphics_queue, 1, &submit_info, VK_NULL_HANDLE); - ERR_FAIL_COND(err); - vkDeviceWaitIdle(device); - command_buffer_count = 1; + ERR_FAIL_COND(err); } + + vkDeviceWaitIdle(device); } Error VulkanContext::prepare_buffers() { diff --git a/drivers/vulkan/vulkan_context.h b/drivers/vulkan/vulkan_context.h index 236e3bf35f..e96facfacb 100644 --- a/drivers/vulkan/vulkan_context.h +++ b/drivers/vulkan/vulkan_context.h @@ -117,8 +117,8 @@ private: // Present queue. bool queues_initialized = false; - uint32_t graphics_queue_family_index = 0; - uint32_t present_queue_family_index = 0; + uint32_t graphics_queue_family_index = UINT32_MAX; + uint32_t present_queue_family_index = UINT32_MAX; bool separate_present_queue = false; VkQueue graphics_queue = VK_NULL_HANDLE; VkQueue present_queue = VK_NULL_HANDLE; @@ -289,8 +289,8 @@ public: VkFormat get_screen_format() const; VkPhysicalDeviceLimits get_device_limits() const; - void set_setup_buffer(const VkCommandBuffer &pCommandBuffer); - void append_command_buffer(const VkCommandBuffer &pCommandBuffer); + void set_setup_buffer(VkCommandBuffer p_command_buffer); + void append_command_buffer(VkCommandBuffer p_command_buffer); void resize_notify(); void flush(bool p_flush_setup = false, bool p_flush_pending = false); Error prepare_buffers(); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index c209c67dcb..408d6af022 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -428,6 +428,9 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da case RemoteDebugger::MESSAGE_TYPE_LOG: { msg_type = EditorLog::MSG_TYPE_STD; } break; + case RemoteDebugger::MESSAGE_TYPE_LOG_RICH: { + msg_type = EditorLog::MSG_TYPE_STD_RICH; + } break; case RemoteDebugger::MESSAGE_TYPE_ERROR: { msg_type = EditorLog::MSG_TYPE_ERROR; } break; diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index b4325f09c5..36360954d9 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -63,6 +63,8 @@ void EditorHelp::_update_theme() { doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); doc_title_font = get_theme_font(SNAME("doc_title"), SNAME("EditorFonts")); doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); + + doc_title_font_size = get_theme_font_size(SNAME("doc_title_size"), SNAME("EditorFonts")); } void EditorHelp::_search(bool p_search_previous) { @@ -362,8 +364,9 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) { void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods, bool &r_method_descrpitons) { Ref<Font> doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // title font size + class_desc->pop(); // title font + class_desc->pop(); // title color class_desc->add_newline(); class_desc->push_font(doc_code_font); @@ -431,8 +434,9 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, Ref<Font> doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); Ref<Font> doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); String link_color_text = title_color.to_html(false); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // title font size + class_desc->pop(); // title font + class_desc->pop(); // title color class_desc->add_newline(); class_desc->add_newline(); @@ -535,15 +539,17 @@ void EditorHelp::_update_doc() { // Class name section_line.push_back(Pair<String, int>(TTR("Top"), 0)); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->push_color(title_color); class_desc->add_text(TTR("Class:") + " "); class_desc->add_image(icon, icon->get_width(), icon->get_height()); class_desc->add_text(" "); class_desc->push_color(headline_color); _add_text(edited_class); - class_desc->pop(); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // color + class_desc->pop(); // color + class_desc->pop(); // font size + class_desc->pop(); // font class_desc->add_newline(); // Inheritance tree @@ -624,9 +630,11 @@ void EditorHelp::_update_doc() { description_line = class_desc->get_paragraph_count() - 2; class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Description")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->add_newline(); @@ -646,9 +654,11 @@ void EditorHelp::_update_doc() { if (cd.tutorials.size()) { class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Online Tutorials")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->push_indent(1); class_desc->push_font(doc_code_font); @@ -694,9 +704,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Properties"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Properties")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->push_font(doc_code_font); @@ -858,6 +870,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Constructors"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Constructors")); _update_method_list(cd.constructors, constructor_descriptions); } @@ -869,6 +882,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Methods"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Methods")); _update_method_list(methods, method_descriptions); } @@ -881,6 +895,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Operators"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Operators")); _update_method_list(cd.operators, operator_descriptions); } @@ -890,9 +905,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Theme Properties"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Theme Properties")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->add_newline(); @@ -916,13 +933,15 @@ void EditorHelp::_update_doc() { class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); if (data_type_names.has(theme_data_type)) { class_desc->add_text(data_type_names[theme_data_type]); } else { class_desc->add_text(""); } - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->add_newline(); @@ -984,9 +1003,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Signals"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Signals")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->add_newline(); @@ -1070,9 +1091,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Enumerations"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Enumerations")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->push_indent(1); class_desc->add_newline(); @@ -1174,9 +1197,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Constants"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Constants")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->push_indent(1); class_desc->add_newline(); @@ -1235,9 +1260,11 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Property Descriptions"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Property Descriptions")); - class_desc->pop(); - class_desc->pop(); + class_desc->pop(); // font size + class_desc->pop(); // font + class_desc->pop(); // color class_desc->add_newline(); class_desc->add_newline(); @@ -1401,6 +1428,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Constructor Descriptions"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Constructor Descriptions")); _update_method_descriptions(cd, cd.constructors, "constructor"); } @@ -1410,6 +1438,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Method Descriptions"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Method Descriptions")); _update_method_descriptions(cd, methods, "method"); } @@ -1419,6 +1448,7 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Operator Descriptions"), class_desc->get_paragraph_count() - 2)); class_desc->push_color(title_color); class_desc->push_font(doc_title_font); + class_desc->push_font_size(doc_title_font_size); class_desc->add_text(TTR("Operator Descriptions")); _update_method_descriptions(cd, cd.operators, "operator"); } diff --git a/editor/editor_help.h b/editor/editor_help.h index 766a09f485..7f91a8102d 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -140,6 +140,8 @@ class EditorHelp : public VBoxContainer { Ref<Font> doc_title_font; Ref<Font> doc_code_font; + int doc_title_font_size; + int scroll_to = -1; void _update_theme(); diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index dbe44aee1b..f26f47dbc7 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -181,7 +181,7 @@ void EditorLog::clear() { } void EditorLog::_process_message(const String &p_msg, MessageType p_type) { - if (messages.size() > 0 && messages[messages.size() - 1].text == p_msg) { + if (messages.size() > 0 && messages[messages.size() - 1].text == p_msg && messages[messages.size() - 1].type == p_type) { // If previous message is the same as the new one, increase previous count rather than adding another // instance to the messages list. LogMessage &previous = messages.write[messages.size() - 1]; @@ -258,6 +258,8 @@ void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) { switch (p_message.type) { case MSG_TYPE_STD: { } break; + case MSG_TYPE_STD_RICH: { + } break; case MSG_TYPE_ERROR: { log->push_color(get_theme_color(SNAME("error_color"), SNAME("Editor"))); Ref<Texture2D> icon = get_theme_icon(SNAME("Error"), SNAME("EditorIcons")); @@ -285,11 +287,15 @@ void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) { log->pop(); } - log->add_text(p_message.text); + if (p_message.type == MSG_TYPE_STD_RICH) { + log->append_text(p_message.text); + } else { + log->add_text(p_message.text); + } // Need to use pop() to exit out of the RichTextLabels current "push" stack. - // We only "push" in the above switch when message type != STD, so only pop when that is the case. - if (p_message.type != MSG_TYPE_STD) { + // We only "push" in the above switch when message type != STD and RICH, so only pop when that is the case. + if (p_message.type != MSG_TYPE_STD && p_message.type != MSG_TYPE_STD_RICH) { log->pop(); } @@ -342,6 +348,7 @@ EditorLog::EditorLog() { // Log - Rich Text Label. log = memnew(RichTextLabel); + log->set_use_bbcode(true); log->set_scroll_follow(true); log->set_selection_enabled(true); log->set_focus_mode(FOCUS_CLICK); @@ -418,6 +425,7 @@ EditorLog::EditorLog() { std_filter->initialize_button(TTR("Toggle visibility of standard output messages."), callable_mp(this, &EditorLog::_set_filter_active)); vb_right->add_child(std_filter->toggle_button); type_filter_map.insert(MSG_TYPE_STD, std_filter); + type_filter_map.insert(MSG_TYPE_STD_RICH, std_filter); LogFilter *error_filter = memnew(LogFilter(MSG_TYPE_ERROR)); error_filter->initialize_button(TTR("Toggle visibility of errors."), callable_mp(this, &EditorLog::_set_filter_active)); @@ -451,6 +459,10 @@ void EditorLog::deinit() { EditorLog::~EditorLog() { for (const KeyValue<MessageType, LogFilter *> &E : type_filter_map) { - memdelete(E.value); + // MSG_TYPE_STD_RICH is connected to the std_filter button, so we do this + // to avoid it from being deleted twice, causing a crash on closing. + if (E.key != MSG_TYPE_STD_RICH) { + memdelete(E.value); + } } } diff --git a/editor/editor_log.h b/editor/editor_log.h index de0368501c..653fba9524 100644 --- a/editor/editor_log.h +++ b/editor/editor_log.h @@ -48,6 +48,7 @@ public: enum MessageType { MSG_TYPE_STD, MSG_TYPE_ERROR, + MSG_TYPE_STD_RICH, MSG_TYPE_WARNING, MSG_TYPE_EDITOR, }; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index b4b82b1edf..e3caaf93c6 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -460,7 +460,7 @@ void EditorNode::shortcut_input(const Ref<InputEvent> &p_event) { _editor_select(EDITOR_SCRIPT); } else if (ED_IS_SHORTCUT("editor/editor_help", p_event)) { emit_signal(SNAME("request_help_search"), ""); - } else if (ED_IS_SHORTCUT("editor/editor_assetlib", p_event) && StreamPeerSSL::is_available()) { + } else if (ED_IS_SHORTCUT("editor/editor_assetlib", p_event) && AssetLibraryEditorPlugin::is_available()) { _editor_select(EDITOR_ASSETLIB); } else if (ED_IS_SHORTCUT("editor/editor_next", p_event)) { _editor_select_next(); @@ -5752,12 +5752,12 @@ void EditorNode::_feature_profile_changed() { main_editor_buttons[EDITOR_3D]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D)); main_editor_buttons[EDITOR_SCRIPT]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT)); - if (StreamPeerSSL::is_available()) { + if (AssetLibraryEditorPlugin::is_available()) { main_editor_buttons[EDITOR_ASSETLIB]->set_visible(!profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB)); } if ((profile->is_feature_disabled(EditorFeatureProfile::FEATURE_3D) && singleton->main_editor_buttons[EDITOR_3D]->is_pressed()) || (profile->is_feature_disabled(EditorFeatureProfile::FEATURE_SCRIPT) && singleton->main_editor_buttons[EDITOR_SCRIPT]->is_pressed()) || - (StreamPeerSSL::is_available() && profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB) && singleton->main_editor_buttons[EDITOR_ASSETLIB]->is_pressed())) { + (AssetLibraryEditorPlugin::is_available() && profile->is_feature_disabled(EditorFeatureProfile::FEATURE_ASSET_LIB) && singleton->main_editor_buttons[EDITOR_ASSETLIB]->is_pressed())) { _editor_select(EDITOR_2D); } } else { @@ -5769,7 +5769,7 @@ void EditorNode::_feature_profile_changed() { FileSystemDock::get_singleton()->set_visible(true); main_editor_buttons[EDITOR_3D]->set_visible(true); main_editor_buttons[EDITOR_SCRIPT]->set_visible(true); - if (StreamPeerSSL::is_available()) { + if (AssetLibraryEditorPlugin::is_available()) { main_editor_buttons[EDITOR_ASSETLIB]->set_visible(true); } } @@ -5829,9 +5829,15 @@ static Node *_resource_get_edited_scene() { return EditorNode::get_singleton()->get_edited_scene(); } -void EditorNode::_print_handler(void *p_this, const String &p_string, bool p_error) { +void EditorNode::_print_handler(void *p_this, const String &p_string, bool p_error, bool p_rich) { EditorNode *en = static_cast<EditorNode *>(p_this); - en->log->add_message(p_string, p_error ? EditorLog::MSG_TYPE_ERROR : EditorLog::MSG_TYPE_STD); + if (p_error) { + en->log->add_message(p_string, EditorLog::MSG_TYPE_ERROR); + } else if (p_rich) { + en->log->add_message(p_string, EditorLog::MSG_TYPE_STD_RICH); + } else { + en->log->add_message(p_string, EditorLog::MSG_TYPE_STD); + } } static void _execute_thread(void *p_ud) { @@ -7067,13 +7073,11 @@ EditorNode::EditorNode() { // Asset Library can't work on Web editor for now as most assets are sourced // directly from GitHub which does not set CORS. -#ifndef JAVASCRIPT_ENABLED - if (StreamPeerSSL::is_available()) { + if (AssetLibraryEditorPlugin::is_available()) { add_editor_plugin(memnew(AssetLibraryEditorPlugin)); } else { WARN_PRINT("Asset Library not available, as it requires SSL to work."); } -#endif // Add interface before adding plugins. diff --git a/editor/editor_node.h b/editor/editor_node.h index 89f80baeb9..c327a73ce9 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -505,7 +505,7 @@ private: static void _load_error_notify(void *p_ud, const String &p_text); static void _file_access_close_error_notify(const String &p_str); - static void _print_handler(void *p_this, const String &p_string, bool p_error); + static void _print_handler(void *p_this, const String &p_string, bool p_error, bool p_rich); static void _resource_saved(Ref<Resource> p_resource, const String &p_path); static void _resource_loaded(Ref<Resource> p_resource, const String &p_path); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index e5105fdedc..70622e85ff 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1304,7 +1304,7 @@ void EditorPropertyObjectID::update_property() { ObjectID id = get_edited_object()->get(get_edited_property()); if (id.is_valid()) { - edit->set_text(type + " ID: " + itos(id)); + edit->set_text(type + " ID: " + uitos(id)); edit->set_disabled(false); edit->set_icon(EditorNode::get_singleton()->get_class_icon(type)); } else { @@ -1328,6 +1328,54 @@ EditorPropertyObjectID::EditorPropertyObjectID() { edit->connect("pressed", callable_mp(this, &EditorPropertyObjectID::_edit_pressed)); } +///////////////////// SIGNAL ///////////////////////// + +void EditorPropertySignal::_edit_pressed() { + Signal signal = get_edited_object()->get(get_edited_property()); + emit_signal(SNAME("object_id_selected"), get_edited_property(), signal.get_object_id()); +} + +void EditorPropertySignal::update_property() { + String type = base_type; + + Signal signal = get_edited_object()->get(get_edited_property()); + + edit->set_text("Signal: " + signal.get_name()); + edit->set_disabled(false); + edit->set_icon(get_theme_icon(SNAME("Signals"), SNAME("EditorIcons"))); +} + +void EditorPropertySignal::_bind_methods() { +} + +EditorPropertySignal::EditorPropertySignal() { + edit = memnew(Button); + add_child(edit); + add_focusable(edit); + edit->connect("pressed", callable_mp(this, &EditorPropertySignal::_edit_pressed)); +} + +///////////////////// CALLABLE ///////////////////////// + +void EditorPropertyCallable::update_property() { + String type = base_type; + + Callable callable = get_edited_object()->get(get_edited_property()); + + edit->set_text("Callable"); + edit->set_disabled(true); + edit->set_icon(get_theme_icon(SNAME("Callable"), SNAME("EditorIcons"))); +} + +void EditorPropertyCallable::_bind_methods() { +} + +EditorPropertyCallable::EditorPropertyCallable() { + edit = memnew(Button); + add_child(edit); + add_focusable(edit); +} + ///////////////////// FLOAT ///////////////////////// void EditorPropertyFloat::_set_read_only(bool p_read_only) { @@ -3035,13 +3083,17 @@ String EditorPropertyNodePath::_get_meta_pointer_property() const { Variant EditorPropertyNodePath::_get_cache_value(const StringName &p_prop, bool &r_valid) const { if (p_prop == get_edited_property()) { r_valid = true; - return const_cast<EditorPropertyNodePath *>(this)->get_edited_object()->get(_get_meta_pointer_property(), &r_valid); + return const_cast<EditorPropertyNodePath *>(this)->get_edited_object()->get(pointer_mode ? StringName(_get_meta_pointer_property()) : get_edited_property(), &r_valid); } return Variant(); } StringName EditorPropertyNodePath::_get_revert_property() const { - return _get_meta_pointer_property(); + if (pointer_mode) { + return _get_meta_pointer_property(); + } else { + return get_edited_property(); + } } void EditorPropertyNodePath::_node_selected(const NodePath &p_path) { @@ -3218,8 +3270,8 @@ EditorPropertyNodePath::EditorPropertyNodePath() { void EditorPropertyRID::update_property() { RID rid = get_edited_object()->get(get_edited_property()); if (rid.is_valid()) { - int id = rid.get_id(); - label->set_text("RID: " + itos(id)); + uint64_t id = rid.get_id(); + label->set_text("RID: " + uitos(id)); } else { label->set_text(TTR("Invalid RID")); } @@ -3998,6 +4050,14 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } } break; + case Variant::CALLABLE: { + EditorPropertyCallable *editor = memnew(EditorPropertyCallable); + return editor; + } break; + case Variant::SIGNAL: { + EditorPropertySignal *editor = memnew(EditorPropertySignal); + return editor; + } break; case Variant::DICTIONARY: { if (p_hint == PROPERTY_HINT_LOCALIZABLE_STRING) { EditorPropertyLocalizableString *editor = memnew(EditorPropertyLocalizableString); diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 7cd6ea4f6b..7bec2d0013 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -389,6 +389,33 @@ public: EditorPropertyObjectID(); }; +class EditorPropertySignal : public EditorProperty { + GDCLASS(EditorPropertySignal, EditorProperty); + Button *edit = nullptr; + String base_type; + void _edit_pressed(); + +protected: + static void _bind_methods(); + +public: + virtual void update_property() override; + EditorPropertySignal(); +}; + +class EditorPropertyCallable : public EditorProperty { + GDCLASS(EditorPropertyCallable, EditorProperty); + Button *edit = nullptr; + String base_type; + +protected: + static void _bind_methods(); + +public: + virtual void update_property() override; + EditorPropertyCallable(); +}; + class EditorPropertyFloat : public EditorProperty { GDCLASS(EditorPropertyFloat, EditorProperty); EditorSpinSlider *spin = nullptr; diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index 04a3bf2915..ba49c6dc5f 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -59,11 +59,16 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie) { args.push_back(itos(OS::get_singleton()->get_process_id())); bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false); + bool debug_paths = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_paths", false); bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); if (debug_collisions) { args.push_back("--debug-collisions"); } + if (debug_paths) { + args.push_back("--debug-paths"); + } + if (debug_navigation) { args.push_back("--debug-navigation"); } diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 249b3a6d6a..e9435faae1 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -32,6 +32,7 @@ #include "core/input/input.h" #include "core/io/json.h" +#include "core/io/stream_peer_ssl.h" #include "core/os/keyboard.h" #include "core/version.h" #include "editor/editor_file_dialog.h" @@ -1588,6 +1589,16 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { /////// +bool AssetLibraryEditorPlugin::is_available() { +#ifdef JAVASCRIPT_ENABLED + // Asset Library can't work on Web editor for now as most assets are sourced + // directly from GitHub which does not set CORS. + return false; +#else + return StreamPeerSSL::is_available(); +#endif +} + void AssetLibraryEditorPlugin::make_visible(bool p_visible) { if (p_visible) { addon_library->show(); diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h index e09700b646..2b43719cdd 100644 --- a/editor/plugins/asset_library_editor_plugin.h +++ b/editor/plugins/asset_library_editor_plugin.h @@ -322,6 +322,8 @@ class AssetLibraryEditorPlugin : public EditorPlugin { EditorAssetLibrary *addon_library = nullptr; public: + static bool is_available(); + virtual String get_name() const override { return "AssetLib"; } bool has_main_screen() const override { return true; } virtual void edit(Object *p_object) override {} diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 8ea50c4529..5c90d70982 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -72,6 +72,9 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(MenuButton *p_debug_menu) { p->add_check_shortcut(ED_SHORTCUT("editor/visible_collision_shapes", TTR("Visible Collision Shapes")), RUN_DEBUG_COLLISONS); p->set_item_tooltip(-1, TTR("When this option is enabled, collision shapes and raycast nodes (for 2D and 3D) will be visible in the running project.")); + p->add_check_shortcut(ED_SHORTCUT("editor/visible_paths", TTR("Visible Paths")), RUN_DEBUG_PATHS); + p->set_item_tooltip(-1, + TTR("When this option is enabled, curve resources used by path nodes will be visible in the running project.")); p->add_check_shortcut(ED_SHORTCUT("editor/visible_navigation", TTR("Visible Navigation")), RUN_DEBUG_NAVIGATION); p->set_item_tooltip(-1, TTR("When this option is enabled, navigation meshes and polygons will be visible in the running project.")); @@ -153,6 +156,12 @@ void DebuggerEditorPlugin::_menu_option(int p_option) { EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_collisons", !ischecked); } break; + case RUN_DEBUG_PATHS: { + bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_PATHS)); + debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_PATHS), !ischecked); + EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_debug_paths", !ischecked); + + } break; case RUN_DEBUG_NAVIGATION: { bool ischecked = debug_menu->get_popup()->is_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION)); debug_menu->get_popup()->set_item_checked(debug_menu->get_popup()->get_item_index(RUN_DEBUG_NAVIGATION), !ischecked); @@ -182,6 +191,7 @@ void DebuggerEditorPlugin::_update_debug_options() { bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false); bool check_file_server = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false); bool check_debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisons", false); + bool check_debug_paths = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_paths", false); bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", true); bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", true); @@ -196,6 +206,9 @@ void DebuggerEditorPlugin::_update_debug_options() { if (check_debug_collisions) { _menu_option(RUN_DEBUG_COLLISONS); } + if (check_debug_paths) { + _menu_option(RUN_DEBUG_PATHS); + } if (check_debug_navigation) { _menu_option(RUN_DEBUG_NAVIGATION); } diff --git a/editor/plugins/debugger_editor_plugin.h b/editor/plugins/debugger_editor_plugin.h index 10e1a27933..fb963385cd 100644 --- a/editor/plugins/debugger_editor_plugin.h +++ b/editor/plugins/debugger_editor_plugin.h @@ -49,6 +49,7 @@ private: RUN_FILE_SERVER, RUN_LIVE_DEBUG, RUN_DEBUG_COLLISONS, + RUN_DEBUG_PATHS, RUN_DEBUG_NAVIGATION, RUN_DEPLOY_REMOTE_DEBUG, RUN_RELOAD_SCRIPTS, diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 15f03fd46d..98e80c5513 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -59,7 +59,7 @@ void TexturePreview::_notification(int p_what) { } void TexturePreview::_update_metadata_label_text() { - Ref<Texture2D> texture = texture_display->get_texture(); + const Ref<Texture2D> texture = texture_display->get_texture(); String format; if (Object::cast_to<ImageTexture>(*texture)) { @@ -70,7 +70,49 @@ void TexturePreview::_update_metadata_label_text() { format = texture->get_class(); } - metadata_label->set_text(vformat(String::utf8("%s×%s %s"), itos(texture->get_width()), itos(texture->get_height()), format)); + const Ref<Image> image = texture->get_image(); + if (image.is_valid()) { + const int mipmaps = image->get_mipmap_count(); + // Avoid signed integer overflow that could occur with huge texture sizes by casting everything to uint64_t. + uint64_t memory = uint64_t(image->get_width()) * uint64_t(image->get_height()) * uint64_t(Image::get_format_pixel_size(image->get_format())); + // Handle VRAM-compressed formats that are stored with 4 bpp. + memory >>= Image::get_format_pixel_rshift(image->get_format()); + + float mipmaps_multiplier = 1.0; + float mipmap_increase = 0.25; + for (int i = 0; i < mipmaps; i++) { + // Each mip adds 25% memory usage of the previous one. + // With a complete mipmap chain, memory usage increases by ~33%. + mipmaps_multiplier += mipmap_increase; + mipmap_increase *= 0.25; + } + memory *= mipmaps_multiplier; + + if (mipmaps >= 1) { + metadata_label->set_text( + vformat(String::utf8("%d×%d %s\n") + TTR("%s Mipmaps") + "\n" + TTR("Memory: %s"), + texture->get_width(), + texture->get_height(), + format, + mipmaps, + String::humanize_size(memory))); + } else { + // "No Mipmaps" is easier to distinguish than "0 Mipmaps", + // especially since 0, 6, and 8 look quite close with the default code font. + metadata_label->set_text( + vformat(String::utf8("%d×%d %s\n") + TTR("No Mipmaps") + "\n" + TTR("Memory: %s"), + texture->get_width(), + texture->get_height(), + format, + String::humanize_size(memory))); + } + } else { + metadata_label->set_text( + vformat(String::utf8("%d×%d %s"), + texture->get_width(), + texture->get_height(), + format)); + } } TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) { @@ -97,11 +139,9 @@ TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) { metadata_label->add_theme_color_override("font_color", Color::named("white")); metadata_label->add_theme_color_override("font_color_shadow", Color::named("black")); - metadata_label->add_theme_font_size_override("font_size", 16 * EDSCALE); + metadata_label->add_theme_font_size_override("font_size", 14 * EDSCALE); metadata_label->add_theme_color_override("font_outline_color", Color::named("black")); - metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE); - - metadata_label->add_theme_constant_override("shadow_outline_size", 1); + metadata_label->add_theme_constant_override("outline_size", 8 * EDSCALE); metadata_label->set_h_size_flags(Control::SIZE_SHRINK_END); metadata_label->set_v_size_flags(Control::SIZE_SHRINK_END); diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index dfe40f9d4f..9ed3b72587 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -110,6 +110,7 @@ static const char *enum_renames[][2] = { { "FORMAT_PVRTC2A", "FORMAT_PVRTC1_2A" }, // Image { "FORMAT_PVRTC4", "FORMAT_PVRTC1_4" }, // Image { "FORMAT_PVRTC4A", "FORMAT_PVRTC1_4A" }, // Image + { "FUNC_FRAC", "FUNC_FRACT" }, // VisualShaderNodeVectorFunc { "INSTANCE_LIGHTMAP_CAPTURE", "INSTANCE_LIGHTMAP" }, // RenderingServer { "JOINT_6DOF", "JOINT_TYPE_6DOF" }, // PhysicsServer3D { "JOINT_CONE_TWIST", "JOINT_TYPE_CONE_TWIST" }, // PhysicsServer3D @@ -124,12 +125,14 @@ static const char *enum_renames[][2] = { { "MATH_RANDOM", "MATH_RANDI_RANGE" }, // VisualScriptBuiltinFunc { "MATH_STEPIFY", "MATH_STEP_DECIMALS" }, // VisualScriptBuiltinFunc { "MODE_CHARACTER", "MODE_DYNAMIC_LOCKED" }, // RigidBody2D, RigidBody3D + { "MODE_KINEMATIC", "FREEZE_MODE_KINEMATIC" }, // RigidDynamicBody { "MODE_OPEN_ANY", "FILE_MODE_OPEN_ANY" }, // FileDialog { "MODE_OPEN_DIR", "FILE_MODE_OPEN_DIR" }, // FileDialog { "MODE_OPEN_FILE", "FILE_MODE_OPEN_FILE" }, // FileDialog { "MODE_OPEN_FILES", "FILE_MODE_OPEN_FILES" }, // FileDialog { "MODE_RIGID", "MODE_DYNAMIC" }, // RigidBody2D, RigidBody3D { "MODE_SAVE_FILE", "FILE_MODE_SAVE_FILE" }, // FileDialog + { "MODE_STATIC", "FREEZE_MODE_STATIC" }, // RigidDynamicBody { "NOTIFICATION_APP_PAUSED", "NOTIFICATION_APPLICATION_PAUSED" }, // MainLoop { "NOTIFICATION_APP_RESUMED", "NOTIFICATION_APPLICATION_RESUMED" }, // MainLoop { "NOTIFICATION_PATH_CHANGED", "NOTIFICATION_PATH_RENAMED" }, //Node @@ -208,7 +211,6 @@ static const char *gdscript_function_renames[][2] = { // { "set_v_offset", "set_drag_vertical_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D // {"get_points","get_points_id"},// Astar, broke Line2D, Convexpolygonshape // {"get_v_scroll","get_v_scroll_bar"},//ItemList, broke TextView - { "RenderingServer", "get_tab_alignment" }, // Tab { "_about_to_show", "_about_to_popup" }, // ColorPickerButton { "_get_configuration_warning", "_get_configuration_warnings" }, // Node { "_set_current", "set_current" }, // Camera2D @@ -217,17 +219,20 @@ static const char *gdscript_function_renames[][2] = { { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit { "add_animation", "add_animation_library" }, // AnimationPlayer { "add_cancel", "add_cancel_button" }, // AcceptDialog - { "add_central_force", "add_constant_central_force" }, //RigidDynamicBody2D + { "add_central_force", "apply_central_force" }, //RigidDynamicBody2D { "add_child_below_node", "add_sibling" }, // Node { "add_color_override", "add_theme_color_override" }, // Control { "add_constant_override", "add_theme_constant_override" }, // Control { "add_font_override", "add_theme_font_override" }, // Control - { "add_force", "add_constant_force" }, //RigidDynamicBody2D + { "add_force", "apply_force" }, //RigidDynamicBody2D { "add_icon_override", "add_theme_icon_override" }, // Control { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin { "add_stylebox_override", "add_theme_stylebox_override" }, // Control - { "add_torque", "add_constant_torque" }, //RigidDynamicBody2D + { "add_torque", "apply_torque" }, //RigidDynamicBody2D + { "apply_changes", "_apply_changes" }, // EditorPlugin { "bind_child_node_to_bone", "set_bone_children" }, // Skeleton3D + { "body_add_force", "body_apply_force" }, // PhysicsServer2D + { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D { "bumpmap_to_normalmap", "bump_map_to_normal_map" }, // Image { "can_be_hidden", "_can_be_hidden" }, // EditorNode3DGizmoPlugin { "can_drop_data_fw", "_can_drop_data_fw" }, // ScriptEditor @@ -239,6 +244,7 @@ static const char *gdscript_function_renames[][2] = { { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo { "convex_hull_2d", "convex_hull" }, // Geometry2D + { "create_gizmo", "_create_gizmo" }, // EditorNode3DGizmoPlugin { "cursor_get_blink_speed", "get_caret_blink_speed" }, // TextEdit { "cursor_get_column", "get_caret_column" }, // TextEdit { "cursor_get_line", "get_caret_line" }, // TextEdit @@ -251,8 +257,10 @@ static const char *gdscript_function_renames[][2] = { { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit { "deselect_items", "deselect_all" }, // FileDialog + { "disable_plugin", "_disable_plugin" }, // EditorPlugin { "drop_data_fw", "_drop_data_fw" }, // ScriptEditor { "exclude_polygons_2d", "exclude_polygons" }, // Geometry2D + { "find_node", "find_child" }, // Node { "find_scancode_from_string", "find_keycode_from_string" }, // OS { "forward_canvas_draw_over_viewport", "_forward_canvas_draw_over_viewport" }, // EditorPlugin { "forward_canvas_force_draw_over_viewport", "_forward_canvas_force_draw_over_viewport" }, // EditorPlugin @@ -287,7 +295,9 @@ static const char *gdscript_function_renames[][2] = { { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D { "get_cursor_position", "get_caret_column" }, // LineEdit { "get_d", "get_distance" }, // LineShape2D + { "get_drag_data", "_get_drag_data" }, // Control { "get_drag_data_fw", "_get_drag_data_fw" }, // ScriptEditor + { "get_editor_description", "_get_editor_description" }, // Node { "get_editor_viewport", "get_viewport" }, // EditorPlugin { "get_enabled_focus_mode", "get_focus_mode" }, // BaseButton { "get_endian_swap", "is_big_endian" }, // File @@ -327,6 +337,7 @@ static const char *gdscript_function_renames[][2] = { { "get_parameter_default_value", "_get_parameter_default_value" }, // AnimationNode { "get_parameter_list", "_get_parameter_list" }, // AnimationNode { "get_parent_spatial", "get_parent_node_3d" }, // Node3D + { "get_pause_mode", "get_process_mode" }, // Node { "get_physical_scancode", "get_physical_keycode" }, // InputEventKey { "get_physical_scancode_with_modifiers", "get_physical_keycode_with_modifiers" }, // InputEventKey { "get_plugin_icon", "_get_plugin_icon" }, // EditorPlugin @@ -392,8 +403,10 @@ static const char *gdscript_function_renames[][2] = { { "is_a_parent_of", "is_ancestor_of" }, // Node { "is_commiting_action", "is_committing_action" }, // UndoRedo { "is_doubleclick", "is_double_click" }, // InputEventMouseButton + { "is_draw_red", "is_draw_warning" }, // EditorProperty { "is_h_drag_enabled", "is_drag_horizontal_enabled" }, // Camera2D { "is_handle_highlighted", "_is_handle_highlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin + { "is_inverting_faces", "get_flip_faces" }, // CSGPrimitive3D { "is_network_master", "is_multiplayer_authority" }, // Node { "is_network_server", "is_server" }, // Multiplayer API { "is_normalmap", "is_normal_map" }, // NoiseTexture @@ -415,6 +428,7 @@ static const char *gdscript_function_renames[][2] = { { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D { "load_from_globals", "load_from_project_settings" }, // InputMap { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D + { "make_visible", "_make_visible" }, // EditorPlugin { "merge_polygons_2d", "merge_polygons" }, // Geometry2D { "mesh_surface_get_format", "mesh_surface_get_format_attribute_stride" }, // RenderingServer { "mesh_surface_update_region", "mesh_surface_update_attribute_region" }, // RenderingServer @@ -438,6 +452,7 @@ static const char *gdscript_function_renames[][2] = { { "remove_color_override", "remove_theme_color_override" }, // Control { "remove_constant_override", "remove_theme_constant_override" }, // Control { "remove_font_override", "remove_theme_font_override" }, // Control + { "remove_icon_override", "remove_theme_icon_override" }, // Control { "remove_scene_import_plugin", "remove_scene_format_importer_plugin" }, //EditorPlugin { "remove_stylebox_override", "remove_theme_stylebox_override" }, // Control { "rename_animation", "rename_animation_library" }, // AnimationPlayer @@ -465,6 +480,7 @@ static const char *gdscript_function_renames[][2] = { { "set_cursor_position", "set_caret_column" }, // LineEdit { "set_d", "set_distance" }, // WorldMarginShape2D { "set_doubleclick", "set_double_click" }, // InputEventMouseButton + { "set_draw_red", "set_draw_warning" }, // EditorProperty { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton { "set_endian_swap", "set_big_endian" }, // File { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit @@ -477,6 +493,7 @@ static const char *gdscript_function_renames[][2] = { { "set_icon_align", "set_icon_alignment" }, // Button { "set_interior_ambient", "set_ambient_color" }, // ReflectionProbe { "set_interior_ambient_energy", "set_ambient_color_energy" }, // ReflectionProbe + { "set_invert_faces", "set_flip_faces" }, // CSGPrimitive3D { "set_is_initialized", "_is_initialized" }, // XRInterface { "set_is_primary", "set_primary" }, // XRInterface { "set_iterations_per_second", "set_physics_ticks_per_second" }, // Engine @@ -487,6 +504,7 @@ static const char *gdscript_function_renames[][2] = { { "set_mid_height", "set_height" }, // CapsuleMesh { "set_network_master", "set_multiplayer_authority" }, // Node { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API + { "set_pause_mode", "set_process_mode" }, // Node { "set_physical_scancode", "set_physical_keycode" }, // InputEventKey { "set_refuse_new_network_connections", "set_refuse_new_connections" }, // Multiplayer API { "set_region", "set_region_enabled" }, // Sprite2D, Sprite broke AtlasTexture @@ -1220,7 +1238,6 @@ static const char *class_renames[][2] = { // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB // { "NativeScript","NativeExtension"}, ?? - { "AStar", "AStar3D" }, { "ARVRAnchor", "XRAnchor3D" }, { "ARVRCamera", "XRCamera3D" }, { "ARVRController", "XRController3D" }, @@ -1229,6 +1246,7 @@ static const char *class_renames[][2] = { { "ARVROrigin", "XROrigin3D" }, { "ARVRPositionalTracker", "XRPositionalTracker" }, { "ARVRServer", "XRServer" }, + { "AStar", "AStar3D" }, { "AnimatedSprite", "AnimatedSprite2D" }, { "AnimationTreePlayer", "AnimationTree" }, { "Area", "Area3D" }, // Be careful, this will be used everywhere @@ -1344,6 +1362,7 @@ static const char *class_renames[][2] = { { "ResourceInteractiveLoader", "ResourceLoader" }, { "RigidBody", "RigidDynamicBody3D" }, { "RigidBody2D", "RigidDynamicBody2D" }, + { "SceneTreeTween", "Tween" }, { "Shape", "Shape3D" }, // Be careful, this will be used everywhere { "ShortCut", "Shortcut" }, { "Skeleton", "Skeleton3D" }, @@ -2045,6 +2064,7 @@ bool ProjectConverter3To4::test_conversion() { valid = valid & test_conversion_single_additional("set_cell_item(a, b)", "set_cell_item(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); valid = valid & test_conversion_single_additional("get_cell_item_orientation(a, b,c)", "get_cell_item_orientation(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); valid = valid & test_conversion_single_additional("get_cell_item(a, b,c)", "get_cell_item(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional("map_to_world(a, b,c)", "map_to_world(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); valid = valid & test_conversion_single_additional("PackedStringArray(req_godot).join('.')", "'.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); valid = valid & test_conversion_single_additional("=PackedStringArray(req_godot).join('.')", "='.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); @@ -2054,6 +2074,9 @@ bool ProjectConverter3To4::test_conversion() { valid = valid & test_conversion_single_additional("\t aa", "\taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); valid = valid & test_conversion_single_additional(" \taa", " \taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional("apply_force(position, impulse)", "apply_force(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional("apply_impulse(position, impulse)", "apply_impulse(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional("AAA Color.white AF", "AAA Color.WHITE AF", &ProjectConverter3To4::rename_enums, "custom rename"); // Custom rule conversion @@ -2993,14 +3016,39 @@ void ProjectConverter3To4::rename_gdscript_functions(String &file_content) { } } } - - // TODO - add_surface_from_arrays - additional 4 argument - // ENetMultiplayerPeer.create_client - additional argument - // ENetMultiplayerPeer.create_server - additional argument - // Translation.get_message (and similar) - // TreeItem.move_after() - new argument - // TreeItem.move_before() - new argument - // UndoRedo.commit_action() - additional argument + // apply_impulse(A, B) -> apply_impulse(B, A) + if (line.find("apply_impulse(") != -1) { + int start = line.find("apply_impulse("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_impulse(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); + } + } + } + // apply_force(A, B) -> apply_force(B, A) + if (line.find("apply_force(") != -1) { + int start = line.find("apply_force("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_force(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); + } + } + } + // map_to_world(a, b, c) -> map_to_world(Vector3i(a, b, c)) + if (line.find("map_to_world(") != -1) { + int start = line.find("map_to_world("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "map_to_world(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + } + } + } } // Collect vector to string @@ -3398,13 +3446,39 @@ Vector<String> ProjectConverter3To4::check_for_rename_gdscript_functions(Vector< } } - // TODO - add_surface_from_arrays - additional 4 argument - // ENetMultiplayerPeer.create_client - additional argument - // ENetMultiplayerPeer.create_server - additional argument - // Translation.get_message (and similar) - // TreeItem.move_after() - new argument - // TreeItem.move_before() - new argument - // UndoRedo.commit_action() - additional argument + // apply_impulse(A, B) -> apply_impulse(B, A) + if (line.find("apply_impulse(") != -1) { + int start = line.find("apply_impulse("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_impulse(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); + } + } + } + // apply_force(A, B) -> apply_force(B, A) + if (line.find("apply_force(") != -1) { + int start = line.find("apply_force("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_force(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); + } + } + } + // map_to_world(a, b, c) -> map_to_world(Vector3i(a, b, c)) + if (line.find("map_to_world(") != -1) { + int start = line.find("get_cell_item_orientation("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "map_to_world(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + } + } + } if (old_line != line) { found_things.append(simple_line_formatter(current_line, old_line, line)); diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 2e7b6f7476..ef91128146 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -2792,10 +2792,7 @@ ProjectManager::ProjectManager() { center_box->add_child(settings_hb); } - // Asset Library can't work on Web editor for now as most assets are sourced - // directly from GitHub which does not set CORS. -#ifndef JAVASCRIPT_ENABLED - if (StreamPeerSSL::is_available()) { + if (AssetLibraryEditorPlugin::is_available()) { asset_library = memnew(EditorAssetLibrary(true)); asset_library->set_name(TTR("Asset Library Projects")); tabs->add_child(asset_library); @@ -2803,7 +2800,6 @@ ProjectManager::ProjectManager() { } else { WARN_PRINT("Asset Library not available, as it requires SSL to work."); } -#endif { // Dialogs diff --git a/editor/translations/af.po b/editor/translations/af.po index ae83779422..00c05287a1 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -8009,11 +8009,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -8033,11 +8042,6 @@ msgid "Animation name already exists!" msgstr "AutoLaai '%s' bestaan reeds!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8185,10 +8189,6 @@ msgid "Pin AnimationPlayer" msgstr "Animasie Zoem." #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21346,6 +21346,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Wysig Seleksie Kurwe" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Installeer" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22513,6 +22525,13 @@ msgstr "" msgid "Transform Normals" msgstr "Skep Intekening" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -26640,6 +26659,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Verwyder Seleksie" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index a3fcece225..f449036b53 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -69,7 +69,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" "Last-Translator: Awab Najim <dev.djvan@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -307,9 +307,8 @@ msgid "Refuse New Network Connections" msgstr "Ø±ÙØ¶ اتصالات الشبكة الجديدة" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Network Peer" -msgstr "مل٠تعري٠الشبكة Network Profiler" +msgstr "نظير الشبكة" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp msgid "Root Node" @@ -686,9 +685,8 @@ msgid "Main Run Args" msgstr "معاملات المشهد الرئيس" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "المسار للمشهد:" +msgstr "تسمية المشهد" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -699,9 +697,8 @@ msgid "Script Templates Search Path" msgstr "مسار Ø§Ù„Ø¨ØØ« ÙÙŠ قوالب النص البرمجي" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "التØÙ…يل التلقائي عند بدء التشغيل" +msgstr "التØÙ…يل التلقائي للتØÙƒÙ… ÙÙŠ الإصدار عند بدء التشغيل" #: core/project_settings.cpp #, fuzzy @@ -859,8 +856,9 @@ msgid "Formats" msgstr "البنية (اللاØÙ‚Ø©)" #: core/project_settings.cpp +#, fuzzy msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" @@ -875,12 +873,14 @@ msgid "Window Log Size" msgstr "ØØ¬Ù… Ù†Ø§ÙØ°Ø© سجل" #: core/project_settings.cpp +#, fuzzy msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp +#, fuzzy msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" @@ -892,7 +892,7 @@ msgstr "ÙˆØØ¯Ø§Øª" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "بروتوكول التØÙƒÙ… بالإرسال (TCP)" #: core/register_core_types.cpp msgid "Connect Timeout Seconds" @@ -900,15 +900,15 @@ msgstr "Ù†ÙØ° وقت الإتصال" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "ØØ²Ù…Ø© تيار الأقران" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى للمخزن المؤقت (قوة 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp msgid "Certificates" @@ -981,17 +981,17 @@ msgstr "إكسي بايت (EiB)" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "المخازن المؤقته" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "ØØ¬Ù… المخزن المؤقت Ù„Ù„ÙˆØØ© المضلعات (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "ØØ¬Ù… Ùهرس المخزن المؤقت Ù„Ù„ÙˆØØ© المضلعات (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1003,7 +1003,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1020,7 +1020,7 @@ msgstr "إستخدام كبس البكسل" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "ØØ¬Ù… المخزن المؤقت الÙوري (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1031,15 +1031,15 @@ msgstr "طبخ (إعداد) خرائط الضوء" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "استخدم طريقة Bicubic Sampling" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى للعناصر القابلة للعرض" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Ø§Ù„ØØ¬Ù… الأقصى للأضواء القابلة للعرض" #: drivers/gles3/rasterizer_scene_gles3.cpp #, fuzzy @@ -1048,11 +1048,11 @@ msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى للأضواء لكل كائن" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "التشتت ØªØØª السطØ" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1074,19 +1074,19 @@ msgstr "تزويد السطØ" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "عينات الوزن" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "تتبع مخروط Ùوكسل (Voxel)" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "جودة عالية" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى Ù„ØØ¬Ù… المخزن المؤقت لشكل المزج (كيلو بايت)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1197,7 +1197,7 @@ msgstr "الكمية:" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "المعاملات (Args)" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1221,7 +1221,7 @@ msgstr "ØØ¯Ø¯ المعامل" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "المجرى (Stream)" #: editor/animation_track_editor.cpp #, fuzzy @@ -1657,7 +1657,7 @@ msgstr "دوال" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "منØÙ†Ù‰ بيزر (Bezier)" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2243,7 +2243,7 @@ msgstr "Ø¥ÙØªØ" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "مالكو: %s (المجموع: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2803,7 +2803,7 @@ msgstr "إختر" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "تصدير المشروع لمنصة:" #: editor/editor_export.cpp #, fuzzy @@ -2933,11 +2933,11 @@ msgstr "تنسيق ثنائي" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 بت" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "تضمين PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2946,19 +2946,19 @@ msgstr "منطقة النقش TextureRegion" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy @@ -3009,7 +3009,7 @@ msgstr "لا يمكن Ù„Ù…ÙØµØ¯Ø±Ø§Øª 32-bit التي تتضمن PCK أن تك٠#: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "تØÙˆÙŠÙ„ الموارد النصية إلى صيغة ثنائية عند التصدير" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3331,7 +3331,7 @@ msgstr "أظهر Ø§Ù„Ù…Ù„ÙØ§Øª المخÙية" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -msgstr "" +msgstr "تعطيل ØªØØ°ÙŠØ± الإستبدال" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3432,7 +3432,7 @@ msgstr "إعادة إستيراد الأصول" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "إعادة استيراد Ø§Ù„Ù…Ù„ÙØ§Øª المستوردة المÙقودة" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3544,7 +3544,7 @@ msgstr "مساعدة" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "ترتيب الدوال أبجديا" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4323,6 +4323,8 @@ msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" +"غير قادر على الكتابة إلى المل٠'% s' ØŒ المل٠قيد الاستخدام ØŒ مؤمن أو ينقصه " +"الأذونات." #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp @@ -4342,11 +4344,11 @@ msgstr "إظهار الشبكة دوماً" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "تغيير Ø§Ù„ØØ¬Ù… ÙÙŠ ØØ§Ù„Ø© وجود العديد من علامات التبويب" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأدنى للعرض" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" @@ -4359,15 +4361,15 @@ msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "" +msgstr "دائما Ø§ÙØªØ Ù†Ø§ÙØ°Ø© الإخراج أثناء التشغيل" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" -msgstr "" +msgstr "دائما أغلق Ù†Ø§ÙØ°Ø© الإخراج عند إيقا٠التشغيل" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "ØÙظ عند Ùقدان التركيز" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4405,7 +4407,7 @@ msgstr "عقدة التنقل الزمني" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "إظهار الصورة المصغرة عند التمرير" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4418,7 +4420,7 @@ msgstr "مسار المشروع:" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "خطوة الfloat Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4427,15 +4429,15 @@ msgstr "زر معطّل" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "إكش٠المشاهد الأجنبية تلقائيا" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "ØªØØ±ÙŠØ± Vector2 الأÙقي" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "ØªØØ±ÙŠØ± أنواع المتجهات الأÙقية" #: editor/editor_node.cpp #, fuzzy @@ -4449,7 +4451,7 @@ msgstr "Ø§ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØªØµÙØ" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "" +msgstr "وضع منتقي الألوان Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -5079,6 +5081,12 @@ msgid "" "functions called by that function.\n" "Use this to find individual functions to optimize." msgstr "" +"شامل: يشمل الوقت من الدوال الأخرى التي تستدعيها هذه الدالة.\n" +"استخدم هذا Ù„ØªØØ¯ÙŠØ¯ الاختناقات (bottlenecks).\n" +"\n" +"ذاتي: Ø§ØØ³Ø¨ Ùقط الوقت المستغرق ÙÙŠ الدالة Ù†ÙØ³Ù‡Ø§ ØŒ وليس ÙÙŠ الدوال الأخرى التي " +"تستدعيها تلك الدالة.\n" +"استخدم هذا للعثور على دوال Ù…ØØ¯Ø¯Ø© Ù„ØªØØ³ÙŠÙ†Ù‡Ø§." #: editor/editor_profiler.cpp msgid "Frame #:" @@ -5095,7 +5103,7 @@ msgstr "Ù…ÙÙ†Ù‚Ø Ø§Ù„Ø£Ø®Ø·Ø§Ø¡" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" -msgstr "" +msgstr "ØØ¬Ù… تاريخ إطار المØÙ„Ù„" #: editor/editor_profiler.cpp #, fuzzy @@ -5309,23 +5317,23 @@ msgstr "إظهار الكل" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "مقياس العرض المخصص" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "" +msgstr "ØØ¬Ù… الخط الرئيسي" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "ØØ¬Ù… خط الشÙÙØ±Ø©" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "الخط Antialiased" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "ØªÙ„Ù…ÙŠØ Ø§Ù„Ø®Ø· (Hinting)" #: editor/editor_settings.cpp #, fuzzy @@ -5334,7 +5342,7 @@ msgstr "المشهد الرئيس" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "" +msgstr "الخط الرئيسي غامق" #: editor/editor_settings.cpp #, fuzzy @@ -5343,15 +5351,15 @@ msgstr "Ø¥Ø¶Ø§ÙØ© نقطة العقدة" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" -msgstr "" +msgstr "Ø§Ø®ÙØª Ø§Ù„Ù…ØØ±Ø± عند انبثاق Ù†Ø§ÙØ°Ø© الØÙˆØ§Ø±" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "وضع السكون Ø§Ù„Ù…Ù†Ø®ÙØ¶ للمعالج (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "وضع السكون Ø§Ù„Ù…Ù†Ø®ÙØ¶ للمعالج غير المركّز (µsec)" #: editor/editor_settings.cpp #, fuzzy @@ -5360,11 +5368,11 @@ msgstr "وضع خالي من الإلهاء" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "ÙØªØ لقطات الشاشة تلقائيًا" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى لعناصر قاموس المصÙÙˆÙØ© ÙÙŠ كل ØµÙØØ©" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5378,7 +5386,7 @@ msgstr "إعداد Ù…ÙØ³Ø¨Ù‚" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "لون الأيقونة والخط" #: editor/editor_settings.cpp #, fuzzy @@ -5392,11 +5400,11 @@ msgstr "اختر لوناً" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "التباين" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "عتامة خط العلاقة" #: editor/editor_settings.cpp #, fuzzy @@ -5410,7 +5418,7 @@ msgstr "البكسلات المØÙŠØ·ÙŠØ© (Ø§Ù„ØØ¯ÙˆØ¯ÙŠØ©)" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "استخدم رؤوس ÙˆØØ¯Ø§Øª الرسم البياني" #: editor/editor_settings.cpp #, fuzzy @@ -5454,7 +5462,7 @@ msgstr "نسخ الموارد" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "ØÙظ آمن على النسخ Ø§Ù„Ø§ØØªÙŠØ§Ø·ÙŠ Ø«Ù… إعادة التسمية" #: editor/editor_settings.cpp #, fuzzy @@ -5468,7 +5476,7 @@ msgstr "الصورة المصغرة..." #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "Ø§Ù„Ù†ÙˆØ§ÙØ° المثبتة (Docked)" #: editor/editor_settings.cpp #, fuzzy @@ -5477,7 +5485,7 @@ msgstr "تعديل شجرة المشهد" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "بدء Ù†Ø§ÙØ°Ø© ØÙˆØ§Ø± الإنشاء موسعة بالكامل" #: editor/editor_settings.cpp #, fuzzy @@ -5491,7 +5499,7 @@ msgstr "Ù…ØØ±Ø± المجموعات" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" -msgstr "" +msgstr "Ø§Ù„ÙØ§ØµÙ„ الزمني Ù„Ù„ØªØØ¯ÙŠØ« التلقائي" #: editor/editor_settings.cpp #, fuzzy @@ -5506,7 +5514,7 @@ msgstr "مظهر Ø§Ù„Ù…ØØ±Ø±/برنامج-جودوه" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Line Spacing" -msgstr "" +msgstr "تباعد الأسطر" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp @@ -5521,15 +5529,15 @@ msgstr "Ù…ÙØ¹Ù„ّم التركيب Syntax" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "قم بتمييز جميع التكرارات" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "" +msgstr "تمييز السطر Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "تمييز سطور الأنواع الآمنة" #: editor/editor_settings.cpp #, fuzzy @@ -5564,11 +5572,11 @@ msgstr "تنقل" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "" +msgstr "التمرير السلس" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "سرعة التمرير العمودي" #: editor/editor_settings.cpp #, fuzzy @@ -5577,15 +5585,15 @@ msgstr "إظهار المركز" #: editor/editor_settings.cpp msgid "Minimap Width" -msgstr "" +msgstr "عرض الخريطة المصغرة" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "تنقل ÙÙŠ سجل أزرار الماوس الإضاÙية" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "المظهر" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5599,7 +5607,7 @@ msgstr "رقم الخط:" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "إظهار مزراب الإشارة المرجعية" #: editor/editor_settings.cpp #, fuzzy @@ -5608,27 +5616,27 @@ msgstr "تخطي نقاط التكسّر" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "إظهار معلومات المزراب" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "طي الكود" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Ø§Ù„ØªÙØ§Ù الكلمات" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "إظهار إرشادات طول السطر" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "عمود ناعم لتوجيه طول السطر" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "عمود غامق لتوجيه طول السطر" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5637,7 +5645,7 @@ msgstr "Ù…ØØ±Ø± النص البرمجي" #: editor/editor_settings.cpp msgid "Show Members Overview" -msgstr "" +msgstr "عرض نظرة عامة على الأعضاء" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5651,19 +5659,19 @@ msgstr "تشذيب Ø§Ù„ÙØ±Ø§ØºØ§Øª البيضاء الزائدة" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "" +msgstr "Ø§Ù„ÙØ§ØµÙ„ الزمني للØÙظ التلقائي بالثواني" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "" +msgstr "استعادة البرامج النصية عند التØÙ…يل" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" -msgstr "" +msgstr "إعادة تØÙ…يل البرامج النصية تلقائيا وتØÙ„يلها عند الØÙظ" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "إعادة تØÙ…يل البرامج النصية تلقائيا عند تغييرها من الخارج" #: editor/editor_settings.cpp #, fuzzy @@ -5672,27 +5680,27 @@ msgstr "اجبار ارتداد(Ø§ØØªÙŠØ§Ø·) التظليل" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "ÙØ±Ø² الخطوط العريضة للأعضاء أبجدياً" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" -msgstr "" +msgstr "المؤشر" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "التمرير إلى ما بعد نهاية الملÙ" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "وميض علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "سرعة وميض علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp #, fuzzy @@ -5708,23 +5716,23 @@ msgstr "نسخ Ø§Ù„Ù…ÙØØ¯Ø¯" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "تأخير التØÙ„يل الخامل" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "اكمال القوس التلقائي" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "تأخير الإكمال التلقائي للكود" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "ضع ØªÙ„Ù…ÙŠØ Ø£Ø¯Ø§Ø© Callhint أسÙÙ„ السطر Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "Ø¥Ø²Ø§ØØ© ØªÙ„Ù…ÙŠØ Ø£Ø¯Ø§Ø© Callhint" #: editor/editor_settings.cpp #, fuzzy @@ -5748,15 +5756,15 @@ msgstr "أظهر المساعدات" #: editor/editor_settings.cpp msgid "Help Font Size" -msgstr "" +msgstr "ØØ¬Ù… خط المساعدة" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "" +msgstr "ØØ¬Ù… خط مصدر المساعدة" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "" +msgstr "ØØ¬Ù… خط عنوان المساعدة" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -5774,11 +5782,11 @@ msgstr "عرض" #: editor/editor_settings.cpp msgid "Primary Grid Color" -msgstr "" +msgstr "لون الشبكة الأساسي" #: editor/editor_settings.cpp msgid "Secondary Grid Color" -msgstr "" +msgstr "لون الشبكة الثانوي" #: editor/editor_settings.cpp #, fuzzy @@ -5815,7 +5823,7 @@ msgstr "نقطة" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "شكل" #: editor/editor_settings.cpp #, fuzzy @@ -5829,15 +5837,15 @@ msgstr "خطوة الشبكة:" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأقصى لمستوى تقسيم الشبكة" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "Ø§Ù„ØØ¯ الأدنى لمستوى تقسيم الشبكة" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "التØÙŠØ² على مستوى تقسيم الشبكة" #: editor/editor_settings.cpp #, fuzzy @@ -5871,7 +5879,7 @@ msgstr "Ø§ÙØªØ±Ø§Ø¶ÙŠ" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "عدد خطوط المعالجة Ù„ØÙظ خرائط الإضاءة" #: editor/editor_settings.cpp #, fuzzy @@ -5895,11 +5903,11 @@ msgstr "تصغير" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "Ù…ØØ§ÙƒØ§Ø© Ù„ÙˆØØ© Ù…ÙØ§ØªÙŠØ الأرقام" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "Ù…ØØ§ÙƒØ§Ø© الماوس ذو الثلاثة أزرار" #: editor/editor_settings.cpp #, fuzzy @@ -5918,7 +5926,7 @@ msgstr "Ù…ÙØ¹Ø¯Ù‘Ù„" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "Ø§Ù„ØªÙØ§Ù Ø§Ù„ØØ±ÙƒØ© بالماوس" #: editor/editor_settings.cpp #, fuzzy @@ -5927,11 +5935,11 @@ msgstr "وضع التنقل" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "ØØ³Ø§Ø³ÙŠØ© التدوير" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "القصور الذاتي المداري" #: editor/editor_settings.cpp #, fuzzy @@ -5995,7 +6003,7 @@ msgstr "Ø§Ù„Ù…ØØ§Ø°Ø§Ø© الذكية" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "عرض العظام" #: editor/editor_settings.cpp #, fuzzy @@ -6014,11 +6022,11 @@ msgstr "عدل على Ø§Ù„ØØ³Ø§Ø¨ Ø§Ù„ØØ§Ù„ÙŠ:" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "لون IK العظام" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "لون ØØ¯ÙˆØ¯ العظام" #: editor/editor_settings.cpp #, fuzzy @@ -6027,19 +6035,19 @@ msgstr "ØØ¬Ù… الخطوط:" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "لون ØØ¯ÙˆØ¯ إطار العرض" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "تقييد عرض Ø§Ù„Ù…ØØ±Ø±" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "Ø§Ù„ØªØØ±ÙŠÙƒ البسيط" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "التمرير Ù„Ù„ØªØØ±ÙŠÙƒ" #: editor/editor_settings.cpp #, fuzzy @@ -6053,7 +6061,7 @@ msgstr "Ù…ÙØØ±Ø± UV الخاص Ø¨Ø§Ù„Ù…ÙØ¶Ù„عات ثنائية Ø§Ù„Ø¨ÙØ¹Ø¯" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "قطر نقطة الإنتزاع" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6067,7 +6075,7 @@ msgstr "إعادة تسمية الرسم Ø§Ù„Ù…ØªØØ±Ùƒ" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "إنشاء مسارات Bezier Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ©" #: editor/editor_settings.cpp #, fuzzy @@ -6076,11 +6084,11 @@ msgstr "إنشاء مسار(ات) إعادة التعيين (RESET)" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" -msgstr "" +msgstr "لون Onion Layers ÙÙŠ الماضي" #: editor/editor_settings.cpp msgid "Onion Layers Future Color" -msgstr "" +msgstr "لون Onion Layers ÙÙŠ المستقبل" #: editor/editor_settings.cpp #, fuzzy @@ -6089,11 +6097,11 @@ msgstr "Ù…ØØ±Ø± المجموعات" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "عتامة الخريطة المصغرة" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "موضع Ø§Ù„Ù†Ø§ÙØ°Ø©" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp @@ -6109,7 +6117,7 @@ msgstr "ØØ¯Ø¯ موقع خروج الإنØÙ†Ø§Ø¡" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "شاشة" #: editor/editor_settings.cpp #, fuzzy @@ -6144,17 +6152,17 @@ msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "وكيل (Proxy) HTTP" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "المضيÙ" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "Ù…Ù†ÙØ°" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6169,15 +6177,15 @@ msgstr "إعادة تسمية مجلد:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "لون الرمز" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "لون الكلمة Ø§Ù„Ù…ÙØªØ§ØÙŠØ©" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "لون الكلمة Ø§Ù„Ù…ÙØªØ§ØÙŠØ© لتدÙÙ‚ التØÙƒÙ…" #: editor/editor_settings.cpp #, fuzzy @@ -6186,15 +6194,15 @@ msgstr "النوع الأساسي" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "لون نوع Ø§Ù„Ù…ØØ±Ùƒ" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "لون نوع المستخدم" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "لون التعليق" #: editor/editor_settings.cpp #, fuzzy @@ -6220,15 +6228,15 @@ msgstr "إستيراد Ø§Ù„Ù…ØØ¯Ø¯" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "لون الإكمال الموجود" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "لون تمرير الإكمال" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "لون خط الإكمال" #: editor/editor_settings.cpp #, fuzzy @@ -6247,7 +6255,7 @@ msgstr "رقم الخط:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "لون علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6266,7 +6274,7 @@ msgstr "Ø§Ù„Ù…ØØ¯Ø¯ Ùقط" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "لون عدم تطابق الأقواس" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6275,7 +6283,7 @@ msgstr "المشهد Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "لون إرشاد طول السطر" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6284,7 +6292,7 @@ msgstr "Ù…ÙØ¹Ù„ّم التركيب Syntax" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "لون الرقم" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6313,11 +6321,11 @@ msgstr "نقاط التكسّر" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "لون سطر التنÙيذ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "لون الكود القابل للطي" #: editor/editor_settings.cpp #, fuzzy @@ -6632,7 +6640,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "خادم Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6998,11 +7006,11 @@ msgstr "إدارة المجموعات" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "كولادا (Collada)" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "استخدم Ambient" #: editor/import/resource_importer_bitmask.cpp #, fuzzy @@ -7012,7 +7020,7 @@ msgstr "أنشئ مجلد" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "عتبة" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7025,7 +7033,7 @@ msgstr "مكونات" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "Ù…ØØ¯Ø¯" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7034,7 +7042,7 @@ msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون." #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "لا BPTC إذا RGB" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7048,7 +7056,7 @@ msgstr "أعلام" #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "كرر" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp @@ -7066,12 +7074,12 @@ msgstr "الإشارات" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "تباين الخواص" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB (قياسي)" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7192,7 +7200,7 @@ msgstr "تخزين الملÙ:" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "استخدم الأسماء القديمة" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #, fuzzy @@ -7225,8 +7233,9 @@ msgid "Lightmap Texel Size" msgstr "طبخ/تجهيز-خريطة-الاضاءة" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp +#, fuzzy msgid "Skins" -msgstr "" +msgstr "سكينس (Skins)" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7240,7 +7249,7 @@ msgstr "Ø¥ÙØªØ ملÙ" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "خزن ÙÙŠ مجلد ÙØ±Ø¹ÙŠ" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7351,16 +7360,20 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: تم الكش٠عن نقش مستخدم كخريطة نورمال (NormalMap) ÙÙŠ 3D. تمكين ضغط نقش " +"الأØÙ…ر والأخضر لتقليل استخدام الذاكرة (يتم تجاهل القناة الزرقاء)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: تم الكش٠عن نقش مستخدم ÙÙŠ 3D. تمكين Ø§Ù„Ù…Ø±Ø´Ø ÙˆØ§Ù„ØªÙƒØ±Ø§Ø± وتوليد خريطة-الرسمة-" +"بدقات-متعددة (mipmap) وضغط نقش VRAM." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2DØŒ والكش٠عن 3D" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7369,7 +7382,7 @@ msgstr "البكسيلات الأساسية (Solid Pixels)" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "جودة ضائعة (Lossy)" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7378,14 +7391,14 @@ msgstr "ØªØØ¯ÙŠØ¯ الوضع" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "خريطة عادية" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7394,7 +7407,7 @@ msgstr "المعالجة-اللاØÙ‚Ø© Post-Process" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "Ø¥ØµÙ„Ø§Ø ØØ¯ÙˆØ¯ Ø£Ù„ÙØ§" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7403,7 +7416,7 @@ msgstr "تعديل Ù…ÙØªØ¹Ø¯Ø¯ السطوØ" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr As Srgb" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7421,7 +7434,7 @@ msgstr "Ø§Ù„ØØ¯ الأقصى Ù„Ù„ØØ¬Ù…" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "كش٠3D" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7433,6 +7446,8 @@ msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"ØªØØ°ÙŠØ±ØŒ لم يتم تمكين ضغط VRAM مناسب للكمبيوتر الشخصي ÙÙŠ إعدادات المشروع. لن " +"يتم عرض هذا النقش بشكل صØÙŠØ على جهاز الكمبيوتر." #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7451,7 +7466,7 @@ msgstr "ØªØØ¯ÙŠØ¯ منطقة البلاط" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "تقليم ØØ¯ÙˆØ¯ Ø£Ù„ÙØ§ من المنطقة" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy @@ -7460,12 +7475,12 @@ msgstr "أنشر بإجبار" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 بت" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Ø§ØØ§Ø¯ÙŠÙ‡" #: editor/import/resource_importer_wav.cpp #, fuzzy @@ -7479,7 +7494,7 @@ msgstr "عقدة الخلط" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "تقليم" #: editor/import/resource_importer_wav.cpp #, fuzzy @@ -7596,7 +7611,7 @@ msgstr "Ù…ØÙ„ÙŠ" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "الترجمة غير Ù…ØªÙˆÙØ±Ø© للغة Ø§Ù„ØØ§Ù„ية." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8045,11 +8060,20 @@ msgid "New Anim" msgstr "رسم Ù…ØªØØ±Ùƒ جديدة" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "إنشاء رسوم Ù…ØªØØ±ÙƒØ© جديدة" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "تغيير إسم الرسم Ø§Ù„Ù…ØªØØ±Ùƒ:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "إعادة تسمية الرسم Ø§Ù„Ù…ØªØØ±Ùƒ" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Ù…Ø³Ø Ø§Ù„Ø±Ø³Ù… Ø§Ù„Ù…ØªØØ±ÙƒØŸ" @@ -8067,11 +8091,6 @@ msgid "Animation name already exists!" msgstr "إسم الرسم Ø§Ù„Ù…ØªØØ±Ùƒ موجود Ø¨Ø§Ù„ÙØ¹Ù„!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "إعادة تسمية الرسم Ø§Ù„Ù…ØªØØ±Ùƒ" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "تكرار الرسم Ø§Ù„Ù…ØªØØ±Ùƒ" @@ -8215,10 +8234,6 @@ msgid "Pin AnimationPlayer" msgstr "تثبيت Ù…ÙØ´ØºÙ‘Ù„ الرسوميات Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "إنشاء رسوم Ù…ØªØØ±ÙƒØ© جديدة" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "إسم الرسم Ø§Ù„Ù…ØªØØ±Ùƒ:" @@ -8473,7 +8488,7 @@ msgstr "الÙلترة..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "استخدم خطوط المعالجة" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8706,7 +8721,7 @@ msgstr "أختبار" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "ÙØ´Ù„ Ø§Ù„ØØµÙˆÙ„ على إعدادات الأرشيÙ." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -21631,6 +21646,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "تعديل الإتصال:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22929,6 +22956,13 @@ msgstr "" msgid "Transform Normals" msgstr "أجهض التØÙˆÙ„." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27264,6 +27298,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "توليد AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/az.po b/editor/translations/az.po index 6e8dfbf1f3..f8d5d96a7e 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -7731,11 +7731,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7753,11 +7762,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7900,10 +7904,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20521,6 +20521,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ÆlaqÉ™ni redaktÉ™ edin:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "QuraÅŸdır" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21650,6 +21662,13 @@ msgstr "" msgid "Transform Normals" msgstr "3D Transformasya izi" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25610,6 +25629,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "%s növünü dÉ™yiÅŸdirin" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 9370a48a79..aa0fac6038 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -7889,11 +7889,20 @@ msgid "New Anim" msgstr "Ðова анимациÑ" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Създаване на нова анимациÑ" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ПромÑна на името на анимациÑта:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Преименуване на анимациÑта" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Изтриване на анимациÑта?" @@ -7911,11 +7920,6 @@ msgid "Animation name already exists!" msgstr "Вече ÑъщеÑтвува Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ Ñ‚Ð¾Ð²Ð° име!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Преименуване на анимациÑта" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Дублиране на анимациÑта" @@ -8060,10 +8064,6 @@ msgid "Pin AnimationPlayer" msgstr "Закачане на AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Създаване на нова анимациÑ" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Име на анимациÑта:" @@ -21072,6 +21072,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Редактиране на Връзката:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Изберете главна Ñцена" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22294,6 +22306,13 @@ msgstr "" msgid "Transform Normals" msgstr "КонÑтанта за транÑформациÑ." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26510,6 +26529,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "ОтмеÑтване:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 265a7fb58a..b3c338168c 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -12,13 +12,14 @@ # Sagen Soren <sagensoren03@gmail.com>, 2020. # Hasibul Hasan <d1hasib@yahoo.com>, 2020. # saitama <atik.wowspace@gmail.com>, 2022. +# Joysankar Majumdar <joymajumdar15828@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-12 13:19+0000\n" -"Last-Translator: saitama <atik.wowspace@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: Joysankar Majumdar <joymajumdar15828@gmail.com>\n" "Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/" "godot/bn/>\n" "Language: bn\n" @@ -26,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -234,9 +235,8 @@ msgid "Remote FS" msgstr "অপসারণ করà§à¦¨" #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Size" -msgstr "পাতা: " +msgstr "পাতা" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -8404,11 +8404,20 @@ msgid "New Anim" msgstr "নতà§à¦¨ অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "নতà§à¦¨ অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ তৈরি করà§à¦¨" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম পরিবরà§à¦¤à¦¨ করà§à¦¨:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Delete অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨?" @@ -8428,11 +8437,6 @@ msgid "Animation name already exists!" msgstr "à¦à§à¦²: অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করà§à¦¨" @@ -8584,10 +8588,6 @@ msgid "Pin AnimationPlayer" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨ করà§à¦¨" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "নতà§à¦¨ অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ তৈরি করà§à¦¨" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম:" @@ -22526,6 +22526,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "সংযোগসমূহ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23779,6 +23791,13 @@ msgstr "" msgid "Transform Normals" msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦° নিষà§à¦«à¦²à¦¾ করা হয়েছে।" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -28087,6 +28106,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABB উৎপনà§à¦¨ করà§à¦¨" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "অফসেট/à¦à¦¾à¦°à¦¸à¦¾à¦®à§à¦¯:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/br.po b/editor/translations/br.po index 3d1ca48f3f..c5d979fe2f 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -7611,11 +7611,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7633,11 +7642,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7780,10 +7784,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20303,6 +20303,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Tro Fiñvskeudenn" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21421,6 +21432,13 @@ msgstr "" msgid "Transform Normals" msgstr "Roudenn Treuzfurmadur 3D" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25314,6 +25332,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 380a247ac7..1e1ec84901 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -22,7 +22,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"PO-Revision-Date: 2022-06-26 16:15+0000\n" "Last-Translator: Roger VC <rogervilarasau@gmail.com>\n" "Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/" "godot/ca/>\n" @@ -2813,7 +2813,7 @@ msgstr "Completat amb èxit." #: editor/editor_export.cpp msgid "Failed." -msgstr "Fallit:" +msgstr "Ha fallat:" #: editor/editor_export.cpp msgid "Storing File:" @@ -8100,11 +8100,20 @@ msgid "New Anim" msgstr "Nova Animació" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Crea una Nova Animació" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Modifica el Nom de l'Animació:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Reanomena l'Animació" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Eliminar l'Animació?" @@ -8122,11 +8131,6 @@ msgid "Animation name already exists!" msgstr "El nom d'animació ja existeix!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Reanomena l'Animació" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplica l'Animació" @@ -8271,10 +8275,6 @@ msgid "Pin AnimationPlayer" msgstr "Fixar AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Crea una Nova Animació" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nom de l'Animació:" @@ -21992,6 +21992,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Editar Connexió:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Trieu la distà ncia:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23278,6 +23290,13 @@ msgstr "" msgid "Transform Normals" msgstr "S'ha interromput la Transformació ." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27625,6 +27644,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generant AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "òfset:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 9c3aea1d27..ade3299077 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -8136,11 +8136,20 @@ msgid "New Anim" msgstr "Nová animace" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "VytvoÅ™it novou animaci" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ZmÄ›nit název animace:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "PÅ™ejmenovat animaci" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Smazat animaci?" @@ -8158,11 +8167,6 @@ msgid "Animation name already exists!" msgstr "Jméno animace už existuje!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "PÅ™ejmenovat animaci" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplikovat animaci" @@ -8306,10 +8310,6 @@ msgid "Pin AnimationPlayer" msgstr "PÅ™ipnout AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "VytvoÅ™it novou animaci" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Jméno animace:" @@ -21727,6 +21727,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Upravit spojenÃ:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Vybrat vzdálenost:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23003,6 +23015,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformace zruÅ¡ena." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27355,6 +27374,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generovánà AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Offset(Posun):" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/da.po b/editor/translations/da.po index a90d207941..168f98fbf1 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -8233,11 +8233,20 @@ msgid "New Anim" msgstr "Ny Animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Opret Ny Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Ændre Animation Navn:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Omdøb animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Slet Animation?" @@ -8257,11 +8266,6 @@ msgid "Animation name already exists!" msgstr "FEJL: Animationsnavn eksisterer allerede!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Omdøb animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Lav en kopi af animation" @@ -8409,10 +8413,6 @@ msgid "Pin AnimationPlayer" msgstr "Fastgør AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Opret Ny Animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animations Navn:" @@ -21866,6 +21866,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Redigér Forbindelse:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Vælg en Main Scene" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23078,6 +23090,13 @@ msgstr "" msgid "Transform Normals" msgstr "Opret Poly" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27298,6 +27317,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Fjern Template" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/de.po b/editor/translations/de.po index 795dbd5328..61cfb48184 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -87,7 +87,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-03 02:51+0000\n" +"PO-Revision-Date: 2022-06-26 16:16+0000\n" "Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" @@ -96,7 +96,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -387,9 +387,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Nicht genügend Bytes zur Dekodierung oder ungültiges Format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Ungültige Eingabe %i (nicht übergeben) im Ausdruck" +msgstr "Ungültige Eingabe %d (nicht übergeben) im Ausdruck" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -434,14 +433,12 @@ msgid "Max Size (KB)" msgstr "Maximalgröße (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Bewegungsmodus" +msgstr "Mausmodus" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Eingang löschen" +msgstr "Kumulierte Eingabe verwenden" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -718,14 +715,12 @@ msgid "Script Templates Search Path" msgstr "Suchpfad für Skriptvorlagen" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Autoladen beim Start" +msgstr "Automatisches Laden der Versionskontrolle beim Start" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Versionsverwaltung" +msgstr "Name des Plugins zur Versionskontrolle" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -1358,19 +1353,16 @@ msgid "Remove this track." msgstr "Diese Spur entfernen." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Zeit (s): " +msgstr "Zeit (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Position" +msgstr "Position:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Rotation" +msgstr "Rotation:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1387,44 +1379,36 @@ msgid "Type:" msgstr "Typ:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Ungültige Exportvorlage:" +msgstr "(Ungültig, erwarteter Typ: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "Glätten Ein-Aus" +msgstr "Glätten:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Eingehender Handle" +msgstr "Eingehender Handle:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Ausgehender Handle" +msgstr "Ausgehender Handle:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Stream" +msgstr "Stream:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Neu starten (s):" +msgstr "Start (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "Einblenden (s):" +msgstr "Ende (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animationen:" +msgstr "Animations-Clip:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1639,9 +1623,8 @@ msgid "Add Method Track Key" msgstr "Methodenaufrufsspurschlüssel hinzufügen" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Methode nicht im Objekt gefunden: " +msgstr "Methode nicht in Objekt gefunden:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2254,7 +2237,7 @@ msgstr "Öffnen" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Besitzer von: %s (Insgesamt: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2615,9 +2598,8 @@ msgid "There is no '%s' file." msgstr "Datei ‚%s‘ existiert nicht." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Layout" +msgstr "Layout:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2820,22 +2802,19 @@ msgstr "Wählen" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Projektexport für Plattform:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Dateipfade vervollständigen" +msgstr "Fertiggestellt mit Fehlern." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Paket wurde erfolgreich installiert!" +msgstr "Erfolgreich fertiggestellt." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Fehlgeschlagen:" +msgstr "Fehlgeschlagen." #: editor/editor_export.cpp msgid "Storing File:" @@ -2850,29 +2829,24 @@ msgid "Packing" msgstr "Packe" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Speichern unter" +msgstr "PCK speichern" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Ordner konnte nicht erstellt werden." +msgstr "Datei „%s“ konnte nicht erstellt werden." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Projektdateien konnten nicht exportiert werden" +msgstr "Projektdateien konnten nicht exportiert werden." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Datei kann nicht zum Schreiben geöffnet werden:" +msgstr "Datei im Pfad „%s“kann nicht zum Lesen geöffnet werden." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Speichern unter" +msgstr "ZIP speichern" #: editor/editor_export.cpp msgid "" @@ -2993,30 +2967,25 @@ msgid "Custom release template not found." msgstr "Selbst konfigurierte Release-Exportvorlage nicht gefunden." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Vorlagen verwalten" +msgstr "Vorlage vorbereiten" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Der angegebene Export-Pfad existiert nicht:" +msgstr "Der angegebene Export-Pfad existiert nicht." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Vorlagendatei nicht gefunden:" +msgstr "Vorlagendatei nicht gefunden: „%s“." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Ungültige Exportvorlage:" +msgstr "Fehler beim Kopieren der Exportvorlage." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Versatz" +msgstr "PCK-Einbettung" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -5206,9 +5175,8 @@ msgid "Size:" msgstr "Größe:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "Seite: " +msgstr "Seite:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5304,9 +5272,8 @@ msgstr "" "Im Exportmenü kann eine Vorlage als ausführbar erstellt oder markiert werden." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Projekt" +msgstr "Projektdurchlauf" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -7210,9 +7177,8 @@ msgid "Generating Lightmaps" msgstr "Generiere Lightmaps" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "Generierung für Mesh: " +msgstr "Generierung für Mesh:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7245,12 +7211,17 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Verwendung der Textur als Normalen-Map in 3D festgestellt. Rot-Grün-" +"Texturkompression wurde aktiviert um Speicherverbrauch zu reduzieren (der " +"blaue Kanal wird verworfen)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Verwendung der Textur in 3D festgestellt. Filter, Wiederholung, Mipmap-" +"Erzeugung und VRAM-Texturkompression wurden aktiviert." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" @@ -7931,11 +7902,20 @@ msgid "New Anim" msgstr "Neue Animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Neue Animation erstellen" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Animationsname ändern:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Animation umbenennen" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Animation löschen?" @@ -7953,11 +7933,6 @@ msgid "Animation name already exists!" msgstr "Animationsname existiert bereits!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Animation umbenennen" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Animation duplizieren" @@ -8100,10 +8075,6 @@ msgid "Pin AnimationPlayer" msgstr "Animationsspieler anheften" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Neue Animation erstellen" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animationsname:" @@ -8219,9 +8190,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "End-Animation festlegen. Hilfreich bei Sub-Transitionen." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "Übergang: " +msgstr "Übergang:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -9989,9 +9959,8 @@ msgid "Volume" msgstr "Volumen" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Emissionsquelle: " +msgstr "Emissionsquelle:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -11087,15 +11056,13 @@ msgstr "Verschiebung" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "Skalierung: " +msgstr "Skalierung:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" -msgstr "Verschiebe: " +msgstr "Verschiebung:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -11609,9 +11576,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Zu Mesh2D umwandeln" +msgstr "Zu MeshInstance2D umwandeln" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11642,19 +11608,16 @@ msgid "Sprite" msgstr "Bild" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "Vereinfachung: " +msgstr "Vereinfachung:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "Schrumpfen (Pixel): " +msgstr "Schrumpfen (Pixel):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "Wachsen (Pixel): " +msgstr "Wachsen (Pixel):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -14250,9 +14213,8 @@ msgid "Export templates for this platform are missing:" msgstr "Export-Templates für diese Systeme fehlen:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "Projektgründer" +msgstr "Projektexport" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -15811,9 +15773,8 @@ msgid "Attach Node Script" msgstr "Node-Skript hinzufügen" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "Fern " +msgstr "Fern %s:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -16788,9 +16749,8 @@ msgid "Disabled GDNative Singleton" msgstr "GDNative Singleton wurde deaktiviert" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "Bibliotheken: " +msgstr "Bibliotheken:" #: modules/gdnative/nativescript/nativescript.cpp msgid "Class Name" @@ -17211,17 +17171,15 @@ msgid "Mask" msgstr "Maske" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navigation" +msgstr "Navigation backen" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "Navigationsgefühl" +msgstr "Navigationsschichten" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17626,9 +17584,8 @@ msgstr "" "sein! Bitte entsprechendes Node anpassen." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "Node gab ungültige Sequenzausgabe zurück: " +msgstr "Node gab ungültige Sequenzausgabe zurück:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" @@ -17637,9 +17594,8 @@ msgstr "" "melden Sie den Bug!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Stack-Overflow mit Stack-Tiefe: " +msgstr "Stack-Overflow mit Stack-Tiefe:" #: modules/visual_script/visual_script.cpp msgid "Visual Script" @@ -18008,18 +17964,16 @@ msgid "for (elem) in (input):" msgstr "for (Element) in (Eingabe):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "Eingabetyp nicht wiederholbar: " +msgstr "Eingabetyp nicht iterierbar:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "Iterator wurde ungültig" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "Iterator wurde ungültig: " +msgstr "Iterator wurde ungültig:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18170,14 +18124,12 @@ msgid "Operator" msgstr "Operator" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ": Ungültiger Parameter vom Typ: " +msgstr "Ungültiges Argument vom Typ:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": Ungültige Parameter: " +msgstr "Ungültige Argumente:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18188,14 +18140,12 @@ msgid "Var Name" msgstr "Variablenname" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet nicht im Skript gefunden: " +msgstr "VariableGet nicht im Skript gefunden:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet nicht im Skript gefunden: " +msgstr "VariableSet nicht im Skript gefunden:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -18816,19 +18766,16 @@ msgstr "" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Codesignierendes DMG" +msgstr "Code-Signieren" #: platform/android/export/export_plugin.cpp -#, fuzzy 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‘ konnte nicht gefunden werden.\n" -"Ist das Programm im Android SDK build-tools-Verzeichnis vorhanden?\n" -"Das resultierende %s ist nicht signiert." +"‚apksigner‘ konnte nicht gefunden werden. Ist die Anwendung im Android-SDK " +"build-tools-Verzeichnis vorhanden? Das resultierende %s ist nicht signiert." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -18843,9 +18790,8 @@ msgid "Could not find keystore, unable to export." msgstr "Keystore konnte nicht gefunden werden, Export fehlgeschlagen." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Unterprozess konnte nicht gestartet werden!" +msgstr "Apksigner-Anwendung konnte nicht gestartet werden." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -18879,9 +18825,8 @@ msgstr "" "Ungültiger Dateiname. Android APKs benötigen .apk als Dateinamenendung." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Nicht unterstütztes Exportformat!\n" +msgstr "Nicht unterstütztes Exportformat!" #: platform/android/export/export_plugin.cpp msgid "" @@ -18893,28 +18838,24 @@ msgstr "" "Menü benötigt." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Android-Build-Versionsinkompatibilität:\n" -" Installierte Vorlage: %s\n" -" Godot-Version: %s\n" -"Bitte Android-Build-Vorlage im ‚Projekt‘-Menü neu installieren." +"Android-Build-Versionsinkompatibilität: Installierte Vorlage: %s, Godot-" +"Version: %s. Bitte Android-Build-Vorlage über das ‚Projekt‘-Menü neu " +"installieren." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Kann res://android/build/res/*.xml Dateien nicht mit Projektnamen " -"überschreiben" +"res://android/build/res/*.xml-Dateien können nicht mit Projektnamen " +"überschrieben werden." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Konnte Projektdateien nicht als Gradle-Projekt exportieren\n" +msgstr "Projektdateien konnten nicht als Gradle-Projekt exportiert werden." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -18925,15 +18866,13 @@ msgid "Building Android Project (gradle)" msgstr "Baue Android-Projekt (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" "Bauen des Android-Projekts fehlgeschlagen, Fehlerdetails befinden ich in der " -"Textausgabe.\n" -"Alternativ befindet sich die Android-Build-Dokumentation auf docs." -"godotengine.org." +"Textausgabe. Alternativ befindet sich die Android-Build-Dokumentation auf " +"docs.godotengine.org." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -18948,31 +18887,25 @@ msgstr "" "im Gradle Projektverzeichnis erscheinen." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Paket nicht gefunden: %s" +msgstr "Paket nicht gefunden: „%s“." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Erzeuge APK…" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Konnte keine APK-Vorlage zum Exportieren finden:\n" -"%s" +msgstr "Keine APK-Vorlage zum Exportieren gefunden: „%s“." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Fehlende Bibliotheken in Exportvorlage für die ausgewählten Architekturen: " -"%s.\n" -"Es muss entweder eine Exportvorlage mit den allen benötigten Bibliotheken " +"%s. Es muss entweder eine Exportvorlage mit allen benötigten Bibliotheken " "gebaut werden oder die angegebenen Architekturen müssen abgewählt werden." #: platform/android/export/export_plugin.cpp @@ -18980,9 +18913,8 @@ msgid "Adding files..." msgstr "Füge Dateien hinzu…" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Projektdateien konnten nicht exportiert werden" +msgstr "Projektdateien konnten nicht exportiert werden." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19207,14 +19139,12 @@ msgstr "Eigene Hintergrundfarbe" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Vorlagen verwalten" +msgstr "Vorlagen vorbereiten" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Selbst konfigurierte Release-Exportvorlage nicht gefunden." +msgstr "Exportvorlage wurde nicht gefunden." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19238,33 +19168,28 @@ msgid "Run exported HTML in the system's default browser." msgstr "Führe exportiertes HTML im Standard-Browser des Betriebssystems aus." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Konnte Vorlage nicht zum Export öffnen:" +msgstr "Vorlage zum Export konnte nicht geöffnet werden: „%s“." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Ungültige Exportvorlage:" +msgstr "Ungültige Exportvorlage: „%s“." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Konnte Datei nicht schreiben:" +msgstr "Datei konnte nicht geschrieben werden: „%s“." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Symbolbildbegrenzung" +msgstr "Symbolbilderzeugung" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Konnte Datei nicht lesen:" +msgstr "Datei konnte nicht gelesen werden: „%s“." #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp msgid "Variant" @@ -19335,19 +19260,16 @@ msgid "Icon 512 X 512" msgstr "Symbol 512 X 512" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Konnte HTML-Shell nicht lesen:" +msgstr "HTML-Shell konnte nicht gelesen werden „%s“." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Konnte HTTP-Server-Verzeichnis nicht erstellen:" +msgstr "HTTP-Server-Verzeichnis konnte nicht erstellt werden: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Fehler beim Starten des HTTP-Servers:" +msgstr "Fehler beim Starten des HTTP-Servers: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19611,32 +19533,28 @@ msgid "Apple Team ID" msgstr "Apple-Team-ID" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Projektdateien konnten nicht exportiert werden" +msgstr "Symbolbilddatei „%s“ konnte nicht geöffnet werden." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Unterprozess konnte nicht gestartet werden!" +msgstr "Xcrun-Anwendung konnte nicht gestartet werden." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Beglaubigung" +msgstr "Beglaubigung fehlgeschlagen." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" -msgstr "" +msgstr "Beglaubigungsanfrage-UUID: „%s“" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "The notarization process generally takes less than an hour. When the process " "is completed, you'll receive an email." msgstr "" -"Hinweis: Der Beglaubigungsprozess dauert gewöhnlich weniger als eine Stunde. " -"Nach Ablauf wird eine Bestätigungsmail versandt." +"Der Beglaubigungsprozess dauert gewöhnlich weniger als eine Stunde. Nach " +"Ablauf wird eine Bestätigungsmail versandt." #: platform/osx/export/export.cpp msgid "" @@ -19655,81 +19573,75 @@ msgstr "" "Anwendung geheftet werden (optional):" #: platform/osx/export/export.cpp -#, fuzzy msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" msgstr "" -"Zeitstempel sind nicht mit Ad-hoc-Signaturen kompatibel, und werden " +"Zeitstempel sind nicht mit Ad-hoc-Signaturen kompatibel, und wurden " "deaktiviert!" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "Hardened Runtime is not compatible with ad-hoc signature, and was disabled!" msgstr "" "Die abgehärtete Laufzeitumgebung ist nicht mit Ad-hoc-Signaturen kompatibel, " -"und wird deaktiviert!" +"und wurde deaktiviert!" #: platform/osx/export/export.cpp msgid "Built-in CodeSign failed with error \"%s\"." -msgstr "" +msgstr "Eingebettetes CodeSign fehlgeschlagen mit Fehler „%s“." #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." -msgstr "" +msgstr "Eingebettetes CodeSign benötigt Regex-Modul." #: platform/osx/export/export.cpp msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"Codesign-Anwendung konnte nicht gestartet werden. Wurden die Xcode-" +"Kommandozeilen-Hilfsprogramme installiert?" #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." msgstr "Keine Identität gefunden." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Fehler beim Speichern von Datei: %s" +msgstr "Datei %s konnte nicht signiert werden." #: platform/osx/export/export.cpp -#, fuzzy msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" -"Relative symbolische Links werden von diesem Betriebssystem nicht " -"unterstützt, das exportierte Projekt könnte fehlerhaft sein!" +"Relative symbolische Links werden nicht unterstützt, exportiertes „%s“ " +"könnte fehlerhaft sein!" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Richtung" +msgstr "DMG-Erzeugung" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Unterprozess konnte nicht gestartet werden!" +msgstr "Hdiutil-Anwendung konnte nicht gestartet werden." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "„hdiutil create“ ist fehlgeschlagen - Datei existiert bereits." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "„hdiutil create“ ist fehlgeschlagen." #: platform/osx/export/export.cpp msgid "Creating app bundle" msgstr "Erzeuge App-Bundle" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Es konnte keine Vorlagen-App zum Exportieren gefunden werden:" +msgstr "Es konnte keine Vorlagen-App zum Exportieren gefunden werden: „%s“." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Ungültige Exportvorlage:" +msgstr "Ungültiges Exportformat." #: platform/osx/export/export.cpp msgid "" @@ -19740,12 +19652,11 @@ msgstr "" "unterstützt, das exportierte Projekt könnte fehlerhaft sein!" #: platform/osx/export/export.cpp -#, fuzzy msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." msgstr "" -"Benötigte Vorlagen-Binary ‚%s‘ nicht gefunden. Es könnte im Vorlagen-Archiv " +"Benötigte Vorlagen-Binary „%s“ nicht gefunden. Es könnte im Vorlagen-Archiv " "fehlen." #: platform/osx/export/export.cpp @@ -19789,14 +19700,12 @@ msgid "Sending archive for notarization" msgstr "Sende Archiv zur Beglaubigung" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Projektion" +msgstr "ZIP-Erstellung" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Konnte Projektdateien nicht als Gradle-Projekt exportieren\n" +msgstr "Datei im Pfad „%s“ konnte nicht zum Lesen geöffnet werden." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20126,9 +20035,8 @@ msgid "Debug Algorithm" msgstr "Debug-Algorithmus" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Temporäre Datei kann nicht entfernt werden:" +msgstr "Temporäre Datei „%s“ konnte nicht umbenannt werden." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20171,76 +20079,68 @@ msgid "Trademarks" msgstr "Handelsmarken" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Pushnachrichten" +msgstr "Ressourcen-Modifikationen" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find rcedit executable at \"%s\"." -msgstr "Keystore konnte nicht gefunden werden, Export fehlgeschlagen." +msgstr "Anwendung rcedit konnte nicht gefunden werden in „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find wine executable at \"%s\"." -msgstr "Keystore konnte nicht gefunden werden, Export fehlgeschlagen." +msgstr "Anwendung wine konnte nicht gefunden werden in „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start rcedit executable, configure rcedit path in the Editor " "Settings (Export > Windows > Rcedit)." msgstr "" -"Das Rcedit-Werkzeug muss in den Editoreinstellungen (Export > Windows > " -"Rcedit) festgelegt werden um Icon- oder Anwendungsinformation festlegen zu " -"können." +"Anwendung rcedit konnte nicht gestartet werden. Bitte rcedit-Pfad in " +"Editoreinstellungen festlegen (Export > Windows > Rcedit)." #: platform/windows/export/export.cpp msgid "" "rcedit failed to modify executable:\n" "%s" msgstr "" +"Modifikation der Anwendung durch rcedit fehlgeschlagen:\n" +"%s" #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find signtool executable at \"%s\"." -msgstr "Keystore konnte nicht gefunden werden, Export fehlgeschlagen." +msgstr "Anwendung signtool konnte nicht gefunden werden in: „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find osslsigncode executable at \"%s\"." -msgstr "Keystore konnte nicht gefunden werden, Export fehlgeschlagen." +msgstr "Anwendung osslsigncode konnte nicht gefunden werden in: „%s“." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Identitäts-Typ" +msgstr "Ungültiger Identitäts-Typ." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid timestamp server." -msgstr "Ungültiger Name." +msgstr "Ungültiger Zeitstempelserver." #: platform/windows/export/export.cpp -#, fuzzy msgid "" "Could not start signtool executable, configure signtool path in the Editor " "Settings (Export > Windows > Signtool)." msgstr "" -"Das Rcedit-Werkzeug muss in den Editoreinstellungen (Export > Windows > " -"Rcedit) festgelegt werden um Icon- oder Anwendungsinformation festlegen zu " -"können." +"Anwendung signtool konnte nicht gestartet werden. Bitte signtool-Pfad in " +"Editoreinstellungen festlegen (Export > Windows > Signtool)." #: platform/windows/export/export.cpp msgid "" "Signtool failed to sign executable:\n" "%s" msgstr "" +"Signieren der Anwendung durch Signtool ist fehlgeschlagen:\n" +"%s" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Temporäre Datei kann nicht entfernt werden:" +msgstr "Fehler beim entfernen temporärer Datei „%s“." #: platform/windows/export/export.cpp msgid "" @@ -20265,20 +20165,19 @@ msgstr "Ungültige Produktversion:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Windows-Anwendungen können nicht größer als 4 GiB sein." #: platform/windows/export/export.cpp platform/x11/export/export.cpp -#, fuzzy msgid "Failed to open executable file \"%s\"." -msgstr "Ungültige ausführbare Datei." +msgstr "Fehler beim Öffnen von ausführbarer Datei „%s“." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." -msgstr "" +msgstr "Header von ausführbarer Datei beschädigt." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "„pck“-Sektor von ausführbarer Datei nicht gefunden." #: platform/windows/export/export.cpp msgid "Windows" @@ -20299,6 +20198,8 @@ msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." msgstr "" +"32-bit-Anwendungen können keine eingebetteten Daten größer als 4 GiB " +"beinhalten." #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp @@ -21141,6 +21042,18 @@ msgstr "Zellen Größe" msgid "Edge Connection Margin" msgstr "Kantenverbindungsbegrenzung" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Gewünschte Zieldistanz" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "Gewünschte Zieldistanz" @@ -21200,14 +21113,12 @@ msgid "Navpoly" msgstr "Navpolygon" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Enter Cost" -msgstr "Mitte unten" +msgstr "Eintrittskosten" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Travel Cost" -msgstr "Reisen" +msgstr "Reisekosten" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp @@ -22300,6 +22211,13 @@ msgstr "Software-Skinning" msgid "Transform Normals" msgstr "Normalen transformieren" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "Hoch-Vektor" @@ -24756,14 +24674,12 @@ msgid "3D Physics" msgstr "3D-Physik" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "Navigation" +msgstr "2D-Navigation" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "Navigation" +msgstr "3D-Navigation" #: scene/register_scene_types.cpp msgid "Use hiDPI" @@ -26049,14 +25965,12 @@ msgid "Visible Instance Count" msgstr "Sichtbare Instanzen Anzahl" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "Skalierung: " +msgstr "Abtastung" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Partition Type" -msgstr "Probeneinteilunstyp" +msgstr "Einteilungstyp" #: scene/resources/navigation_mesh.cpp msgid "Parsed Geometry Type" @@ -26071,14 +25985,12 @@ msgid "Source Group Name" msgstr "Quellen-Gruppenname" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Cells" -msgstr "Zelle" +msgstr "Zellen" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Agent" +msgstr "Agenten" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -26089,18 +26001,16 @@ msgid "Max Slope" msgstr "Maximale Neigung" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Regions" -msgstr "Bereich" +msgstr "Bereiche" #: scene/resources/navigation_mesh.cpp msgid "Merge Size" msgstr "Größe der Zusammenführung" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Edges" -msgstr "Kante" +msgstr "Kanten" #: scene/resources/navigation_mesh.cpp msgid "Max Error" @@ -26111,7 +26021,6 @@ msgid "Verts Per Poly" msgstr "Vert per Poly" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Details" msgstr "Details" @@ -26132,9 +26041,18 @@ msgid "Ledge Spans" msgstr "Vorsprünge" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Walkable Low Height Spans" -msgstr "Ablaufbare Abstände niedriger Höhe aussortiern" +msgstr "Ablaufbare Abstände niedriger Höhe" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Erzeuge AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Grundversatz" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -26493,9 +26411,8 @@ msgid "Scenario" msgstr "Szenario" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Navigation Map" -msgstr "Navigation" +msgstr "Navigationskarte" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" @@ -26514,24 +26431,20 @@ msgid "Default Angular Damp" msgstr "Standard Winkeldämpfung" #: scene/resources/world.cpp -#, fuzzy msgid "Default Map Up" -msgstr "Standard Gleitkommaschritte" +msgstr "Standard Kartenhoch" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Size" -msgstr "Zellen Größe" +msgstr "Standardzellgröße" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Cell Height" -msgstr "Zellenhöhe" +msgstr "Standardzellhöhe" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "Kantenverbindungsbegrenzung" +msgstr "Standard Kantenverbinungsabstand" #: scene/resources/world_2d.cpp msgid "Canvas" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 169d40ebd7..2682db8c4b 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -7522,11 +7522,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7544,11 +7553,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7691,10 +7695,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20114,6 +20114,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21204,6 +21215,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -24926,6 +24944,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index a3f5e815e1..21f118d442 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -8154,11 +8154,20 @@ msgid "New Anim" msgstr "ÎÎα κίνηση" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "ΔημιουÏγία νÎας κίνησης" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Αλλαγή ονόματος κίνησης:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Μετονομασία κίνησης" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "ΔιαγÏαφή κίνησης;" @@ -8176,11 +8185,6 @@ msgid "Animation name already exists!" msgstr "Ήδη υπαÏκτό όνομα κίνησης!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Μετονομασία κίνησης" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "ΑναπαÏαγωγή κίνησης" @@ -8324,10 +8328,6 @@ msgid "Pin AnimationPlayer" msgstr "ΚαÏφίτσωμα AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "ΔημιουÏγία νÎας κίνησης" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Όνομα κίνησης:" @@ -21905,6 +21905,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ΕπεξεÏγασία ΣÏνδεσης:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Επιλογή απόστασης:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23195,6 +23207,13 @@ msgstr "" msgid "Transform Normals" msgstr "Ο μετασχηματισμός ματαιώθηκε." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27551,6 +27570,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "ΔημιουÏία AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Μετατόπιση:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 14388e1c66..bf2aa9d387 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -7568,11 +7568,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7590,11 +7599,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7737,10 +7741,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20216,6 +20216,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21328,6 +21339,13 @@ msgstr "" msgid "Transform Normals" msgstr "3-ð‘› ð‘‘ð‘®ð‘¨ð‘¯ð‘•ð‘“ð‘¹ð‘¥ ð‘‘ð‘®ð‘¨ð‘’" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25192,6 +25210,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 46e8f898ce..27aeb13ce0 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -8126,11 +8126,21 @@ msgid "New Anim" msgstr "Nova animacio" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Krei novan animacion" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ÅœanÄi nomon de animacio:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "Rename Animation" +msgstr "Renomi animaĵon" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Forigi animacion?" @@ -8148,12 +8158,6 @@ msgid "Animation name already exists!" msgstr "Nomo de animacio jam ekzistas!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy -msgid "Rename Animation" -msgstr "Renomi animaĵon" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplikati animacion" @@ -8296,10 +8300,6 @@ msgid "Pin AnimationPlayer" msgstr "Fiksi AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Krei novan animacion" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nomo de animacio:" @@ -21504,6 +21504,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Redakti Konekton:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Elektu ĉefan scenon" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22708,6 +22720,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformo" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26965,6 +26984,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Krada deÅovo:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index d419b78e4b..41b1e32779 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -79,13 +79,15 @@ # losfroger <emilioranita@gmail.com>, 2022. # Ventura Pérez GarcÃa <vetu@protonmail.com>, 2022. # David MartÃnez <goddrinksjava@gmail.com>, 2022. +# Nagamine-j <jimmy.kochi@unmsm.edu.pe>, 2022. +# Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -387,9 +389,8 @@ msgstr "" "inválido." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Entrada inválida %i (no aprobada) en la expresión" +msgstr "Entrada inválida %d (no aprobada) en la expresión" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -433,14 +434,12 @@ msgid "Max Size (KB)" msgstr "Tamaño Máximo (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Modo de Movimiento" +msgstr "Modo de Mouse" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Eliminar entrada" +msgstr "Usar entrada acumulada" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -487,7 +486,7 @@ msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "Echo" +msgstr "Eco" #: core/os/input_event.cpp scene/gui/base_button.cpp msgid "Button Mask" @@ -511,7 +510,7 @@ msgstr "Dobleclick" #: core/os/input_event.cpp msgid "Tilt" -msgstr "Tilt" +msgstr "Inclinar" #: core/os/input_event.cpp msgid "Pressure" @@ -590,11 +589,11 @@ msgstr "Valor del Controlador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp msgid "Application" -msgstr "Aplicación" +msgstr "Aplicação" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "Configurar" +msgstr "Configuração" #: core/project_settings.cpp msgid "Project Settings Override" @@ -2749,7 +2748,7 @@ msgstr "Nombre del Nodo:" #: editor/editor_autoload_settings.cpp msgid "Global Variable" -msgstr "Variable" +msgstr "Variable global" #: editor/editor_data.cpp msgid "Paste Params" @@ -2810,16 +2809,15 @@ msgstr "Elegir" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Exportar proyecto para la plataforma:" #: editor/editor_export.cpp msgid "Completed with errors." msgstr "Completado con errores." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Completado con éxito." +msgstr "Completado exitosamente." #: editor/editor_export.cpp msgid "Failed." @@ -2839,14 +2837,12 @@ msgid "Packing" msgstr "Empaquetando" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Guardar Como" +msgstr "Guardar como PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "No se pudo crear la carpeta." +msgstr "No se pudo crear el archivo \"%s\"." #: editor/editor_export.cpp msgid "Failed to export project files." @@ -2857,9 +2853,8 @@ msgid "Can't open file to read from path \"%s\"." msgstr "No se puede abrir el archivo a leer de la ruta \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Guardar Como" +msgstr "Guardar como ZIP" #: editor/editor_export.cpp msgid "" @@ -7968,11 +7963,20 @@ msgid "New Anim" msgstr "Nueva Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Crear Animación Nueva" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Cambiar nombre de animación:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renombrar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "¿Eliminar Animación?" @@ -7990,11 +7994,6 @@ msgid "Animation name already exists!" msgstr "¡El nombre de animación ya existe!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renombrar Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicar Animación" @@ -8140,10 +8139,6 @@ msgid "Pin AnimationPlayer" msgstr "Fijar AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Crear Animación Nueva" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nombre de Animación:" @@ -21517,6 +21512,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Margen de Conexión de Bordes" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Distancia de la Ruta U" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22787,6 +22794,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformar Normales" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27073,6 +27087,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generando AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Desplazamiento Base" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index c79bf0828f..aa0a7c6258 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -25,8 +25,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-16 18:57+0000\n" -"Last-Translator: emnrx <emanuelermancia@gmail.com>\n" +"PO-Revision-Date: 2022-06-21 15:56+0000\n" +"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -34,7 +34,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -50,7 +50,7 @@ msgstr "Escena Actual" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Código de Salida" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" @@ -116,7 +116,7 @@ msgstr "Minimizada" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Redimensionable" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -143,9 +143,8 @@ msgid "Endian Swap" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Editor" +msgstr "Sugerencia del Editor" #: core/bind/core_bind.cpp msgid "Print Error Messages" @@ -156,27 +155,24 @@ msgid "Iterations Per Second" msgstr "Iteraciones Por Segundo" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "Objetivo" +msgstr "Objetivo de FPS" #: core/bind/core_bind.cpp msgid "Time Scale" msgstr "Escala de Tiempo" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "Frames de FÃsica %" +msgstr "Corrección de Fluctuaciones(Jitter) de FÃsica" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "Error" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "Error al Guardar" +msgstr "String de Error" #: core/bind/core_bind.cpp msgid "Error Line" @@ -207,7 +203,7 @@ msgstr "Cola de comando" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Tamaño de la Cola de Multithreading (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -218,23 +214,20 @@ msgstr "Función" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Data" -msgstr "Con Data" +msgstr "Datos" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Network" -msgstr "Profiler de Red" +msgstr "Red" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Remoto " +msgstr "FS Remoto" #: core/io/file_access_network.cpp msgid "Page Size" @@ -246,7 +239,7 @@ msgstr "" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Modo Bloqueante Activado" #: core/io/http_client.cpp msgid "Connection" @@ -449,7 +442,6 @@ msgid "Button Mask" msgstr "Máscara de Botón" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" msgstr "Posición Global" @@ -8128,11 +8120,20 @@ msgid "New Anim" msgstr "Nueva Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Crear Nueva Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Cambiar Nombre de Animación:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renombrar Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Eliminar Animación?" @@ -8150,11 +8151,6 @@ msgid "Animation name already exists!" msgstr "El nombre de animación ya existe!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renombrar Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicar Animación" @@ -8300,10 +8296,6 @@ msgid "Pin AnimationPlayer" msgstr "Fijar AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Crear Nueva Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nombre de Animación:" @@ -21761,6 +21753,18 @@ msgstr "Tamaño de Celda" msgid "Edge Connection Margin" msgstr "Editar Conexión:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Elegir Instancia:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23022,6 +23026,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformación Abortada." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27379,6 +27390,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generando AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Offset:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/et.po b/editor/translations/et.po index ca2105aa20..f90543b559 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -7854,11 +7854,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Kustuta animatsioon?" @@ -7876,11 +7885,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8023,10 +8027,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20942,6 +20942,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Ühenda" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Paigalda" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22113,6 +22125,13 @@ msgstr "" msgid "Transform Normals" msgstr "3D muundus rada" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26252,6 +26271,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Muuda tüüpi" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index cfbf2945ff..9ffd16f336 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -7749,11 +7749,20 @@ msgid "New Anim" msgstr "Animazio berria" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Aldatu animazioaren izena:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Aldatu izena animazioari" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Ezabatu animazioa?" @@ -7771,11 +7780,6 @@ msgid "Animation name already exists!" msgstr "Animazio izena existitzen da jada!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Aldatu izena animazioari" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Bikoiztu animazioa" @@ -7918,10 +7922,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20720,6 +20720,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Edukiak:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Instalatu" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21877,6 +21889,13 @@ msgstr "" msgid "Transform Normals" msgstr "3D Transformazioaren pista" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25932,6 +25951,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Kide mota" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 43d79c6ede..0b7bd8cdb1 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -25,13 +25,14 @@ # Alireza Khodabande <alirezakhodabande74@gmail.com>, 2021. # Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. # Giga hertz <gigahertzyt@gmail.com>, 2022. +# Aryan Azadeh <aryan@azadeh.email>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-03 13:13+0000\n" -"Last-Translator: Giga hertz <gigahertzyt@gmail.com>\n" +"PO-Revision-Date: 2022-06-20 06:44+0000\n" +"Last-Translator: Aryan Azadeh <aryan@azadeh.email>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -39,7 +40,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -694,7 +695,7 @@ msgstr "Ø·Ø±Ø Ù¾ÛŒØ´ ÙØ±Ø¶ اتوبوس را بارگیری کنید." #: editor/editor_settings.cpp editor/script_create_dialog.cpp #: scene/2d/camera_2d.cpp scene/3d/light.cpp scene/main/node.cpp msgid "Editor" -msgstr "ویرایشگر" +msgstr "ÙˆÛŒØ±Ø§ÛŒÙØ´Ú¯ÙŽØ±" #: core/project_settings.cpp msgid "Main Run Args" @@ -4733,7 +4734,7 @@ msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "جامعه" +msgstr "اَنجÙÙ…ÙŽÙ†" #: editor/editor_node.cpp #, fuzzy @@ -8034,11 +8035,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "تغییر نام انیمیشن" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "انیمیشن ØØ°Ù شود؟" @@ -8058,11 +8068,6 @@ msgid "Animation name already exists!" msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "تغییر نام انیمیشن" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8211,10 +8216,6 @@ msgid "Pin AnimationPlayer" msgstr "تغییر نام انیمیشن" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -10732,7 +10733,7 @@ msgstr "زبانه قبلی" #: editor/plugins/script_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp msgid "File" -msgstr "" +msgstr "پَروَندÙÙ‡" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -11360,7 +11361,7 @@ msgstr "خصوصیات" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -15207,7 +15208,7 @@ msgstr "تنظیمات پروژه (پروژه.گودات)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "عمومی" +msgstr "Ù‡ÙŽÙ…Ùگان" #: editor/project_settings_editor.cpp msgid "Override For..." @@ -21704,6 +21705,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ویرایش اتصال:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "نصب کردن" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22918,6 +22931,13 @@ msgstr "" msgid "Transform Normals" msgstr "انتخاب شده را تغییر مقیاس بده" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -27128,6 +27148,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "ØØ°Ù قالب" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 7c69731934..24d8fd66ab 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -8143,11 +8143,20 @@ msgid "New Anim" msgstr "Uusi animaatio" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Luo uusi animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Vaihda animaation nimi:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Nimeä animaatio uudelleen" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Poista animaatio?" @@ -8165,11 +8174,6 @@ msgid "Animation name already exists!" msgstr "Samanniminen animaatio on jo olemassa!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Nimeä animaatio uudelleen" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Monista animaatio" @@ -8313,10 +8317,6 @@ msgid "Pin AnimationPlayer" msgstr "Kiinnitä AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Luo uusi animaatio" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animaation nimi:" @@ -21757,6 +21757,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Muokkaa yhteyttä:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Poimintaetäisyys:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23051,6 +23063,13 @@ msgstr "" msgid "Transform Normals" msgstr "Muunnos keskeytetty." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27441,6 +27460,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Luodaan AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Siirtymä:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 19cb3febb0..822a23a9b9 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -7616,11 +7616,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7638,11 +7647,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7785,10 +7789,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20375,6 +20375,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Ikabit" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21496,6 +21507,13 @@ msgstr "" msgid "Transform Normals" msgstr "3D Transform Track" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25361,6 +25379,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 6b077ba5e4..5711d32f52 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -97,13 +97,15 @@ # Zachary Dionne <zachary.dionne.01@gmail.com>, 2022. # Fares Setbel <fares.setbels@gmail.com>, 2022. # Nathan Hamy <hamynathan92@gmail.com>, 2022. +# HOUA <ninjacowzx@gmail.com>, 2022. +# DinosaurHorseSword <ewenlandry@mailfence.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-05-31 22:33+0000\n" -"Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: DinosaurHorseSword <ewenlandry@mailfence.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -111,7 +113,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -142,9 +144,8 @@ msgid "Delta Smoothing" msgstr "Lissage de Delta" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "Mode d'utilisation du processeur bas en ressources" +msgstr "Mode d'Utilisation Faible du Processeur" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -281,9 +282,8 @@ msgid "Command Queue" msgstr "File d’Attente de Commandes" #: core/command_queue_mt.cpp -#, fuzzy msgid "Multithreading Queue Size (KB)" -msgstr "Taille de la file du Multi-tache (KB)" +msgstr "Taille de la fille d'attente Multi-Tache (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -319,7 +319,7 @@ msgstr "" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Mode De Blocage Activé" #: core/io/http_client.cpp msgid "Connection" @@ -379,11 +379,11 @@ msgstr "" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "Tableau de données" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Blocage de la poignée de main" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -444,21 +444,19 @@ msgstr "État" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "File d'Attente de Message" #: core/message_queue.cpp msgid "Max Size (KB)" msgstr "Taille Maximale (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Mode déplacement" +msgstr "Mode De Déplacement Souris" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Supprimer l'entrée" +msgstr "Utiliser l'entrée accumulée" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -479,7 +477,7 @@ msgstr "Contrôle" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Méta" #: core/os/input_event.cpp msgid "Command" @@ -492,14 +490,12 @@ msgid "Pressed" msgstr "Pressé" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" msgstr "Scancode" #: core/os/input_event.cpp -#, fuzzy msgid "Physical Scancode" -msgstr "Touche physique" +msgstr "Code de Scan Physique" #: core/os/input_event.cpp msgid "Unicode" @@ -507,12 +503,11 @@ msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Écho" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" -msgstr "Bouton" +msgstr "Masque Bouton" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp msgid "Global Position" @@ -531,7 +526,6 @@ msgid "Doubleclick" msgstr "Double clique" #: core/os/input_event.cpp -#, fuzzy msgid "Tilt" msgstr "Inclinaison" @@ -572,7 +566,7 @@ msgstr "Action" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "Force" #: core/os/input_event.cpp msgid "Delta" @@ -606,7 +600,7 @@ msgstr "Numéro du contrôleur" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "Valeur du controller" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp @@ -619,9 +613,8 @@ msgid "Config" msgstr "Config" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "Paramètres du projet..." +msgstr "Remplacement Des Paramètres du Projet" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -663,9 +656,8 @@ msgid "Disable stderr" msgstr "Désactiver stderr" #: core/project_settings.cpp -#, fuzzy msgid "Use Hidden Project Data Directory" -msgstr "Utiliser un Répertoire de Données du Projet Caché" +msgstr "Utiliser un Répertoire Caché Pour Les Données du Projet" #: core/project_settings.cpp msgid "Use Custom User Dir" @@ -678,15 +670,14 @@ msgstr "Nom du Répertoire Utilisateur Personnalisé" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Tout afficher" +msgstr "Affichage" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Largeur" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -694,23 +685,20 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "Lumière" +msgstr "Hauteur" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Toujours Au Dessus" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "Étendu à Gauche" +msgstr "Tester la Largeur" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "En période de test" +msgstr "Tester la Hauteur" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -734,9 +722,8 @@ msgid "Main Run Args" msgstr "Arguments de la scène principale :" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Chemin de la scène :" +msgstr "Noms de scènes" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -747,14 +734,12 @@ msgid "Script Templates Search Path" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Système de contrôle de version" +msgstr "Chargement automatique de la version de contrôle au démarrage" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Contrôle de version" +msgstr "Nom de l'extension de version de contrôle" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -776,38 +761,33 @@ msgid "UI Cancel" msgstr "Annuler" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Focaliser le chemin" +msgstr "Focus suivant" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Focaliser le chemin" +msgstr "Focus précédent" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "En haut à gauche" +msgstr "Gauche" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "En haut à droite" +msgstr "Droite" #: core/project_settings.cpp msgid "UI Up" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Descendre" +msgstr "Bas" #: core/project_settings.cpp #, fuzzy msgid "UI Page Up" -msgstr "Page :" +msgstr "Page Haut" #: core/project_settings.cpp msgid "UI Page Down" @@ -818,9 +798,8 @@ msgid "UI Home" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "À la fin" +msgstr "Fin" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -846,7 +825,7 @@ msgstr "3D" #: core/project_settings.cpp #, fuzzy msgid "Smooth Trimesh Collision" -msgstr "Créer une collision Trimesh" +msgstr "Collision Lisse Trimesh" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -903,9 +882,8 @@ msgid "Profiler" msgstr "Profileur" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Faire fonction" +msgstr "Nombre maximum de fonctions" #: core/project_settings.cpp scene/3d/vehicle_body.cpp msgid "Compression" @@ -949,12 +927,11 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "TCP" +msgstr "PCT (Protocole de Contrôle de Transmissions)" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Connexions à la méthode :" +msgstr "Délai d'expiration de la connexion en secondes" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -1126,9 +1103,8 @@ msgid "Scale" msgstr "Mode mise à l'échelle" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Follow Surface" -msgstr "Remplir la surface" +msgstr "Suivre la surface" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -8146,11 +8122,20 @@ msgid "New Anim" msgstr "Nouvelle animation" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Créer une nouvelle animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Modifier le nom de l'animation :" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renommer l'animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Supprimer l'animation ?" @@ -8168,11 +8153,6 @@ msgid "Animation name already exists!" msgstr "Ce nom d'animation existe déjà !" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renommer l'animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Dupliquer l'animation" @@ -8317,10 +8297,6 @@ msgid "Pin AnimationPlayer" msgstr "Épingler AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Créer une nouvelle animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nom de l'animation :" @@ -9896,7 +9872,7 @@ msgstr "Créer le contour" #: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/texture.cpp msgid "Mesh" -msgstr "Maillages" +msgstr "Mesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -21762,6 +21738,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Modifier la connexion :" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Choisissez distance :" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23056,6 +23044,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformation annulée." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27168,7 +27163,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Rim" -msgstr "" +msgstr "Bordure" #: scene/resources/material.cpp #, fuzzy @@ -27400,6 +27395,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Générer AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Décalage :" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 884214d851..04e014ed77 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -7598,11 +7598,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7620,11 +7629,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7767,10 +7771,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20331,6 +20331,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Ãbhar:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21452,6 +21463,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25350,6 +25368,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 398746ea6a..27b15829fa 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -8091,11 +8091,20 @@ msgid "New Anim" msgstr "Nova Animación" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renomear Animación" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Eliminar Animación?" @@ -8113,11 +8122,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renomear Animación" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicar Animación" @@ -8261,10 +8265,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nome da Animación:" @@ -21515,6 +21515,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Editar Conexión:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Elexir unha Escena Principal" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22752,6 +22764,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformación" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27026,6 +27045,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Offset:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index 78c74fd01b..22cf33ba52 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -8059,11 +8059,20 @@ msgid "New Anim" msgstr "×”× ×¤×©×” חדשה" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "יצירת ×”× ×¤×©×” חדשה" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "×©×™× ×•×™ ×©× ×”× ×¤×©×”:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "×©×™× ×•×™ ×©× ×”× ×¤×©×”" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "מחיקת ×× ×™×ž×¦×™×”?" @@ -8081,11 +8090,6 @@ msgid "Animation name already exists!" msgstr "×©× ×”×”× ×¤×©×” כבר ×§×™×™×!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "×©×™× ×•×™ ×©× ×”× ×¤×©×”" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "שכפול ×”× ×¤×©×”" @@ -8229,10 +8233,6 @@ msgid "Pin AnimationPlayer" msgstr "הצמדת AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "יצירת ×”× ×¤×©×” חדשה" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "×©× ×”× ×¤×©×”:" @@ -21676,6 +21676,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "עריכת חיבור:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "בחירת מרחק:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22927,6 +22939,13 @@ msgstr "" msgid "Transform Normals" msgstr "התמרה" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27220,6 +27239,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "היסט רשת:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 2486887cac..a14fd36f4a 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -7982,11 +7982,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -8004,11 +8013,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8151,10 +8155,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21238,6 +21238,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "कनेकà¥à¤¶à¤¨ संपादित करें:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "à¤à¤• मà¥à¤–à¥à¤¯ दृशà¥à¤¯ चà¥à¤¨à¥‡à¤‚" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22410,6 +22422,13 @@ msgstr "" msgid "Transform Normals" msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26567,6 +26586,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "मिटाना" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index c9a87722f5..9a3dabefb3 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -7754,11 +7754,20 @@ msgid "New Anim" msgstr "Nova Animacija" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Kreiraj Novu Animaciju" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Promijeni Ime Animacije:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Preimenuj animaciju" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Obrisati Animaciju?" @@ -7776,11 +7785,6 @@ msgid "Animation name already exists!" msgstr "Animacija sa ovim imenom već postoji!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Preimenuj animaciju" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Dupliciraj Animaciju" @@ -7923,10 +7927,6 @@ msgid "Pin AnimationPlayer" msgstr "Pinuj AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Kreiraj Novu Animaciju" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Ime Animacije:" @@ -20719,6 +20719,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Uredi vezu:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Instaliraj" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21869,6 +21881,13 @@ msgstr "" msgid "Transform Normals" msgstr "NaÄin Ravnala" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25931,6 +25950,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Promijeni vrstu baze:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 5ee85051da..62f30698a3 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -8130,11 +8130,20 @@ msgid "New Anim" msgstr "Új Animáció" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Új Animáció Létrehozása" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Animáció Nevének Megváltoztatása:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Animáció Ãtnevezése" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Animáció Törlése?" @@ -8152,11 +8161,6 @@ msgid "Animation name already exists!" msgstr "Az animáció név már létezik!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Animáció Ãtnevezése" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Animáció MegkettÅ‘zése" @@ -8301,10 +8305,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Új Animáció Létrehozása" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animáció Neve:" @@ -21467,6 +21467,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Kapcsolat szerkesztése:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Válasszon egy FÅ‘ Jelenetet" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22682,6 +22694,13 @@ msgstr "" msgid "Transform Normals" msgstr "ÃtalakÃtás MegszakÃtva." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26941,6 +26960,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABB Generálása" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Rács Eltolás:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index 4788d2a7c2..4d71521032 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -8036,11 +8036,20 @@ msgid "New Anim" msgstr "Animasi Baru" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Buat Animasi Baru" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Ubah Nama Animasi:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Ubah Nama Animasi" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Hapus Animasi?" @@ -8058,11 +8067,6 @@ msgid "Animation name already exists!" msgstr "Nama animasi sudah ada!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Ubah Nama Animasi" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Gandakan Animasi" @@ -8206,10 +8210,6 @@ msgid "Pin AnimationPlayer" msgstr "Sematkan AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Buat Animasi Baru" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nama Animasi:" @@ -21618,6 +21618,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Sunting Koneksi:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Target Jarak yang Diinginkan" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "Target Jarak yang Diinginkan" @@ -22849,6 +22861,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformasi Dibatalkan." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "Vektor Atas" @@ -27214,6 +27233,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Membuat AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Pengimbangan:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index ea3301ce7f..105220c71e 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -7707,11 +7707,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7729,11 +7738,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7877,10 +7881,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20617,6 +20617,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Breyta Tengingu: " +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21755,6 +21766,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25715,6 +25733,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Fjarlægja val" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index c529c06241..074bb4259d 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -73,7 +73,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"PO-Revision-Date: 2022-06-26 16:16+0000\n" "Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" @@ -7930,11 +7930,20 @@ msgid "New Anim" msgstr "Nuova Animazione" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Crea Nuova Animazione" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Cambia Nome Animazione:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Rinomina Animazione" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Eliminare Animazione?" @@ -7952,11 +7961,6 @@ msgid "Animation name already exists!" msgstr "Nome animazione già esistente!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Rinomina Animazione" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplica Animazione" @@ -8100,10 +8104,6 @@ msgid "Pin AnimationPlayer" msgstr "Fissa AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Crea Nuova Animazione" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nome Animazione:" @@ -18905,10 +18905,8 @@ 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 "" -"Non è stato possibile trovare \"apksigner\".\n" -"Verificare che il comando sia disponibile nella directory degli strumenti di " -"compilazione Android SDK.\n" -"Il %s risultato non è firmato." +"'apksigner' non è stato trovato. Verificare che il comando sia disponibile " +"nella directory build-tools di Android SDK. Il risultato %s non è firmato." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19008,9 +19006,8 @@ msgid "" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" "Compilazione del progetto Android fallita, controlla l'output per vedere gli " -"errori.\n" -"In alternativa, visita docs.godotengine.org per la documentazione della " -"build Android." +"errori. In alternativa, visita docs.godotengine.org per la documentazione " +"della build Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19045,10 +19042,9 @@ msgid "" "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Mancano librerie nel template di esportazione per le architetture " -"selezionate: %s.\n" -"Si prega di costruire un template con tutte le librerie richieste, o " -"deselezionare le architetture mancanti nel preset di esportazione." +"Librerie mancanti nel modello di esportazione per le architetture " +"selezionate: %s. Creare un modello con tutte le librerie richieste o " +"deselezionare le architetture mancanti nella preimpostazione di esportazione." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -21363,6 +21359,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Modifica una connessione:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Scegli la Distanza:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22649,6 +22657,13 @@ msgstr "" msgid "Transform Normals" msgstr "Trasforma Normals" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27008,6 +27023,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generando AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Scostamento:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 1ae3c9cf8c..a699aeb597 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -7983,11 +7983,20 @@ msgid "New Anim" msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "アニメーションを新è¦ä½œæˆ" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "アニメーションåを変更:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "アニメーションã®åå‰ã‚’変更" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "アニメーションを削除ã—ã¾ã™ã‹ï¼Ÿ" @@ -8005,11 +8014,6 @@ msgid "Animation name already exists!" msgstr "アニメーションåã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "アニメーションã®åå‰ã‚’変更" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "アニメーションを複製" @@ -8153,10 +8157,6 @@ msgid "Pin AnimationPlayer" msgstr "アニメーションプレーヤーを固定" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "アニメーションを新è¦ä½œæˆ" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "アニメーションå:" @@ -21432,6 +21432,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "接続を編集:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "è·é›¢ã‚’å–å¾—:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22718,6 +22730,13 @@ msgstr "ソフトウェアスã‚ニング" msgid "Transform Normals" msgstr "トランスフォームã¯ä¸æ¢ã•れã¾ã—ãŸã€‚" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27095,6 +27114,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABBを生æˆä¸" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "オフセット:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 34914a67b6..caf07e1063 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -7909,11 +7909,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7931,11 +7940,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8079,10 +8083,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21110,6 +21110,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მრუდის ცვლილებáƒ" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "დáƒáƒ§áƒ”ნებáƒ" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22273,6 +22285,13 @@ msgstr "" msgid "Transform Normals" msgstr "შექმნáƒ" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -26366,6 +26385,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ ებáƒ" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/km.po b/editor/translations/km.po index 700f4f483c..b58578c50d 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -7545,11 +7545,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7567,11 +7576,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7714,10 +7718,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20176,6 +20176,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21270,6 +21281,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25032,6 +25050,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index b4a91e0076..fb4bf92e30 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -34,13 +34,15 @@ # Taehun Yun <yooontehoon@naver.com>, 2022. # vrSono <global.sonogong@gmail.com>, 2022. # Seonghyeon Cho <seonghyeoncho96@gmail.com>, 2022. +# Haoyu Qiu <timothyqiu32@gmail.com>, 2022. +# 김태우 <ogosengi3@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-12 13:19+0000\n" -"Last-Translator: Seonghyeon Cho <seonghyeoncho96@gmail.com>\n" +"PO-Revision-Date: 2022-06-26 16:16+0000\n" +"Last-Translator: 김태우 <ogosengi3@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -48,7 +50,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -4200,7 +4202,7 @@ msgstr "ë ˆì´ì•„웃 ì‚ì œ" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "ë””í´íЏ" +msgstr "기본값" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -7887,11 +7889,20 @@ msgid "New Anim" msgstr "새 ì• ë‹ˆë©”ì´ì…˜" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "새 ì• ë‹ˆë©”ì´ì…˜ 만들기" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ 바꾸기:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ 바꾸기" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "ì• ë‹ˆë©”ì´ì…˜ì„ ì‚ì œí• ê¹Œìš”?" @@ -7909,11 +7920,6 @@ msgid "Animation name already exists!" msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ì´ ì´ë¯¸ 있습니다!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ 바꾸기" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "ì• ë‹ˆë©”ì´ì…˜ ë³µì œ" @@ -8057,10 +8063,6 @@ msgid "Pin AnimationPlayer" msgstr "AnimationPlayer ê³ ì •" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "새 ì• ë‹ˆë©”ì´ì…˜ 만들기" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„:" @@ -15562,8 +15564,8 @@ msgid "" "Node is in %s group(s).\n" "Click to show groups dock." msgstr "" -"노드가 그룹 ì•ˆì— ìžˆìŠµë‹ˆë‹¤.\n" -"í´ë¦í•˜ë©´ 그룹 ë…ì„ ë³´ì—¬ì¤˜ìš”." +"노드가 %s 그룹 ì•ˆì— ìžˆìŠµë‹ˆë‹¤.\n" +"í´ë¦í•˜ì—¬ 그룹 ë…ì„ ë´…ë‹ˆë‹¤." #: editor/scene_tree_editor.cpp msgid "Open Script:" @@ -21407,6 +21409,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ì—°ê²° 변경:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "거리 ì„ íƒ:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22684,6 +22698,13 @@ msgstr "" msgid "Transform Normals" msgstr "변형 중단ë¨." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27050,6 +27071,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABB 만드는 중" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "오프셋:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 5f0e9b24ad..350bcb0352 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -7894,11 +7894,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7916,11 +7925,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8066,10 +8070,6 @@ msgid "Pin AnimationPlayer" msgstr "Animacija" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21134,6 +21134,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Prijungti" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Diegti" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22303,6 +22315,13 @@ msgstr "" msgid "Transform Normals" msgstr "Keisti Poligono SkalÄ™" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -26410,6 +26429,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Panaikinti pasirinkimÄ…" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 7397c083fa..c80bd29122 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -7930,11 +7930,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7952,11 +7961,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8099,10 +8103,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20958,6 +20958,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "IzmainÄ«t Savienojumu:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "IzvÄ“lÄ“ties galveno ainu" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22135,6 +22147,13 @@ msgstr "" msgid "Transform Normals" msgstr "TransformÄ“t vienmÄ“rÄ«go." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26302,6 +26321,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Noņemt tekstÅ«ru" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index e37eadfeaf..5c3bfc87ff 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -3,21 +3,21 @@ # Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # -# Kristijan Fremen Velkovski <me@krisfremen.com>, 2021. +# Kristijan Fremen Velkovski <me@krisfremen.com>, 2021, 2022. # Denis <densisman@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2021-11-18 13:37+0000\n" -"Last-Translator: Denis <densisman@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: Kristijan Fremen Velkovski <me@krisfremen.com>\n" "Language-Team: Macedonian <https://hosted.weblate.org/projects/godot-engine/" "godot/mk/>\n" "Language: mk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" -"X-Generator: Weblate 4.9.1-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -25,28 +25,27 @@ msgstr "" #: core/bind/core_bind.cpp msgid "Clipboard" -msgstr "" +msgstr "Табла Ñо иÑечоци" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "СвојÑтва на анимацијата." +msgstr "Тековен Екран" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Излезен код" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "" +msgstr "Вертикална Синхронизација е вклучена" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "Вертикална Синхронизација преку композитор" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Делта Измазнување" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -58,49 +57,49 @@ msgstr "" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "Чувај го екранот уклучен" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "" +msgstr "Минимална Големина на Прозорецот" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "" +msgstr "МакÑимална Големина на Прозорецот" #: core/bind/core_bind.cpp msgid "Screen Orientation" -msgstr "" +msgstr "Ориентација на Екран" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp msgid "Window" -msgstr "" +msgstr "Прозорец" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "" +msgstr "Без граници" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "Уклучена е ТранÑпарентоÑта По ПикÑел" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" -msgstr "" +msgstr "Цел екран" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "МакÑимизирано" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "" +msgstr "Минимизирано" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Променлива големина" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -108,7 +107,7 @@ msgstr "" #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Position" -msgstr "" +msgstr "Позиција" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -120,32 +119,31 @@ msgstr "" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "" +msgstr "Големина" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "ЕндијанÑка размена" #: core/bind/core_bind.cpp -#, fuzzy msgid "Editor Hint" -msgstr "Уреди" +msgstr "Совет за уредник" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Печати грешни пораки" #: core/bind/core_bind.cpp msgid "Iterations Per Second" -msgstr "" +msgstr "Итерации во Ñекунда" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "" +msgstr "Цел на FPS" #: core/bind/core_bind.cpp msgid "Time Scale" -msgstr "" +msgstr "ВременÑка Ñкала" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -153,23 +151,23 @@ msgstr "" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "Грешка" #: core/bind/core_bind.cpp msgid "Error String" -msgstr "" +msgstr "ТекÑÑ‚ на Грешка" #: core/bind/core_bind.cpp msgid "Error Line" -msgstr "" +msgstr "Линија за грешка" #: core/bind/core_bind.cpp msgid "Result" -msgstr "" +msgstr "Резултат" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Меморија" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -180,11 +178,11 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Граници" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "" +msgstr "Ред за наредби" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -7577,11 +7575,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7599,11 +7606,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7746,10 +7748,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20230,6 +20228,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21328,6 +21337,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25098,6 +25114,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 74ea6168e4..7b247d8f78 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -7593,11 +7593,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7615,11 +7624,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7762,10 +7766,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20271,6 +20271,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "ചലനം à´šàµà´±àµà´±àµ½" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21380,6 +21391,13 @@ msgstr "" msgid "Transform Normals" msgstr "à´¤àµà´°à´¿à´®à´¾à´¨ പരിവർതàµà´¤à´¨à´‚ നോകàµà´•àµà´•" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25214,6 +25232,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 005f8a3177..d7aa4bd1aa 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -7584,11 +7584,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "नवीन अâ€à¥…निमेशन तयार करा" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7606,11 +7615,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7753,10 +7757,6 @@ msgid "Pin AnimationPlayer" msgstr "अâ€à¥…निमेशनपà¥à¤²à¥‡à¤…र पिन करा" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "नवीन अâ€à¥…निमेशन तयार करा" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "अâ€à¥…निमेशन नाव:" @@ -20284,6 +20284,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "अâ€à¥…निमेशन टà¥à¤°à¥€" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21398,6 +21409,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25239,6 +25257,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 3ef25ef863..b297eb52a3 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -7971,11 +7971,20 @@ msgid "New Anim" msgstr "Anim Baru" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Cipta Animasi Baru" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Tukar Nama Animasi:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Namakan Semula Animasi" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Padam Animasi?" @@ -7993,11 +8002,6 @@ msgid "Animation name already exists!" msgstr "Nama animasi sudah wujud!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Namakan Semula Animasi" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Gandakan Animasi" @@ -8140,10 +8144,6 @@ msgid "Pin AnimationPlayer" msgstr "Pin AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Cipta Animasi Baru" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nama Animasi:" @@ -21167,6 +21167,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Edit Sambungan:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Pilih Adegan Utama" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22362,6 +22374,13 @@ msgstr "" msgid "Transform Normals" msgstr "Trek Transformasi 3D" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26577,6 +26596,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Grid Offset:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index e5b0dcc26f..a545e4fc83 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -8259,11 +8259,20 @@ msgid "New Anim" msgstr "Ny Anim" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Lag Ny Animasjon" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Endre Animasjonsnavn:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Endre navn pÃ¥ Animasjon" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Fjern Animasjon?" @@ -8281,11 +8290,6 @@ msgid "Animation name already exists!" msgstr "Animasjonsnavnet finnes allerede!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Endre navn pÃ¥ Animasjon" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Dupliser Animasjon" @@ -8435,10 +8439,6 @@ msgid "Pin AnimationPlayer" msgstr "Lim inn Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Lag Ny Animasjon" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animasjonsnavn:" @@ -22015,6 +22015,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Tilkoblingsfeil" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Velg en HovedScene" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23243,6 +23255,13 @@ msgstr "" msgid "Transform Normals" msgstr "Lag Poly" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27516,6 +27535,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Avstand:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 6d43002a17..32d57b08b9 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -8207,11 +8207,20 @@ msgid "New Anim" msgstr "Nieuwe Anim" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Nieuwe Animatie Opstellen" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Verander Animatie Naam:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Animatie Hernoemen" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Animatie wissen?" @@ -8229,11 +8238,6 @@ msgid "Animation name already exists!" msgstr "Animatienaam bestaat al!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Animatie Hernoemen" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Dupliceer Animatie" @@ -8377,10 +8381,6 @@ msgid "Pin AnimationPlayer" msgstr "Animatiespeler vastzetten" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Nieuwe Animatie Opstellen" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animatienaam:" @@ -21935,6 +21935,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Verbinding bewerken:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Selecteerafstand:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23214,6 +23226,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformatie Afgebroken." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27571,6 +27590,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABB Genereren" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Afstand:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 5960c6933e..e174b8a673 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -8095,11 +8095,20 @@ msgid "New Anim" msgstr "Nowa animacja" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Utwórz nowÄ… animacjÄ™" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ZmieÅ„ nazwÄ™ animacji:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "ZmieÅ„ nazwÄ™ animacji" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Usunąć animacjÄ™?" @@ -8117,11 +8126,6 @@ msgid "Animation name already exists!" msgstr "Nazwa animacji już istnieje!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "ZmieÅ„ nazwÄ™ animacji" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplikuj animacjÄ™" @@ -8265,10 +8269,6 @@ msgid "Pin AnimationPlayer" msgstr "Przypnij AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Utwórz nowÄ… animacjÄ™" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nazwa animacji:" @@ -21708,6 +21708,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Edytuj połączenie:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Wybierz odlegÅ‚ość:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23002,6 +23014,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformacja Zaniechana." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27392,6 +27411,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generowanie AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "PrzesuniÄ™cie:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 139d252495..f60daf2f7b 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -7885,11 +7885,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7908,11 +7917,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8056,10 +8060,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21175,6 +21175,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Slit th' Node" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Edit" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22334,6 +22346,13 @@ msgstr "" msgid "Transform Normals" msgstr "Slit th' Node" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -26410,6 +26429,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Discharge ye' Variable" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index c0af7140fc..7db8765ae3 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -16,20 +16,21 @@ # ssantos <ssantos@web.de>, 2018, 2019, 2020, 2021. # Gonçalo Dinis Guerreiro João <goncalojoao205@gmail.com>, 2019. # Manuela Silva <mmsrs@sky.com>, 2020. -# Murilo Gama <murilovsky2030@gmail.com>, 2020. +# Murilo Gama <murilovsky2030@gmail.com>, 2020, 2022. # Ricardo Subtil <ricasubtil@gmail.com>, 2020. # André Silva <andre.olivais@gmail.com>, 2021. # Danilo Conceição Rosa <danilorosa@protonmail.com>, 2022. # Kaycke <kaycke@ymail.com>, 2022. # Renu <ifpilucas@gmail.com>, 2022. # El_ExpertPlayer <xpertnathan37@gmail.com>, 2022. +# Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-13 03:39+0000\n" -"Last-Translator: El_ExpertPlayer <xpertnathan37@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -37,7 +38,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -61,7 +62,7 @@ msgstr "V-Sync ativado" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "V-Sync Via Compositor" +msgstr "V-Sync via Compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" @@ -143,7 +144,7 @@ msgstr "Tamanho" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "Troca Endiana" +msgstr "Troca Endian" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -230,7 +231,7 @@ msgstr "Rede" #: core/io/file_access_network.cpp msgid "Remote FS" -msgstr "SF Remoto" +msgstr "FS Remoto" #: core/io/file_access_network.cpp msgid "Page Size" @@ -238,11 +239,11 @@ msgstr "Tamanho da Página" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "Leitura de página em frente" +msgstr "Página Lida Adiante" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "Modo de blocagem ativado" +msgstr "Modo de Bloqueio Ativado" #: core/io/http_client.cpp msgid "Connection" @@ -294,11 +295,11 @@ msgstr "Tamanho Máximo do Amortecedor de OutPut" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Fluxo de pares" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "Grande Endian" #: core/io/stream_peer.cpp msgid "Data Array" @@ -306,7 +307,7 @@ msgstr "Lista de dados" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Bloquear Handshake" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -329,9 +330,8 @@ msgstr "" "Número de \"bytes\" insuficientes para descodificar, ou o formato é inválido." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "Entrada inválida %i (não passada) na expressão" +msgstr "Entrada inválida %d (não passada) na expressão" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -368,21 +368,19 @@ msgstr "Estado" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Fila de Mensagens" #: core/message_queue.cpp msgid "Max Size (KB)" msgstr "Tamanho Máximo (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Modo Mover" +msgstr "Modo Mouse" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Apagar entrada" +msgstr "Usar Entrada Acumulada" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -395,60 +393,53 @@ msgstr "Alt" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "Controle de Versões" +msgstr "Controle" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Meta" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "Comunidade" +msgstr "Comando" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" -msgstr "Predefinições" +msgstr "Pressionado" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Pequisar" +msgstr "Código de Digitalização" #: core/os/input_event.cpp -#, fuzzy msgid "Physical Scancode" -msgstr "Chave FÃsica" +msgstr "Código de Digitalização FÃsico" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "Eco" #: core/os/input_event.cpp scene/gui/base_button.cpp -#, fuzzy msgid "Button Mask" -msgstr "Botão" +msgstr "Mascara de Botão" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp msgid "Global Position" msgstr "Posição Global" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" -msgstr "Vetor" +msgstr "Fator" #: core/os/input_event.cpp msgid "Button Index" @@ -460,12 +451,11 @@ msgstr "Clique duplo" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "Inclinar" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "Predefinições" +msgstr "Pressione" #: core/os/input_event.cpp msgid "Relative" @@ -500,7 +490,7 @@ msgstr "Ação" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "Força" #: core/os/input_event.cpp msgid "Delta" @@ -539,14 +529,12 @@ msgstr "Valor do Controlador" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "Ação" +msgstr "Aplicação" #: core/project_settings.cpp main/main.cpp -#, fuzzy msgid "Config" -msgstr "Configurar Ajuste" +msgstr "Configurações" #: core/project_settings.cpp msgid "Project Settings Override" @@ -584,39 +572,36 @@ msgid "Main Scene" msgstr "Cena Principal" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "Desativar Autotile" +msgstr "Desativar stdout" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "Item Desativado" +msgstr "Desativar stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Use o diretório de dados ocultos do projeto" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Usar Diretório de Usuário Personalizado" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "Nome de Diretório de Usuário Personalizado" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Mostrar Tudo" +msgstr "Exibição" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Largura" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -624,23 +609,20 @@ msgstr "" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "Luz" +msgstr "Altura" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Sempre no topo" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "Esquerda Wide" +msgstr "Largura de Teste" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "Em teste" +msgstr "Altura de Teste" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -668,70 +650,60 @@ msgstr "Nomear a Cena" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "Pesquisar em Extensões de Arquivo" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "Caminho de Pesquisa para Modelos de Script" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Sistema de Controlo de Versões" +msgstr "Carregamento Automático de Controle de Versão na inicialização" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Controle de Versões" +msgstr "Nome do Plug-in de Controle de Versão" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp -#, fuzzy msgid "Input" -msgstr "Adicionar entrada" +msgstr "Entrada" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "Aceitar UI" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "Selecionar" +msgstr "Selecionar IU" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "Cancelar" +msgstr "Cancelar IU" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "Caminho de Foco" +msgstr "Foco da IU em Seguida" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "Caminho de Foco" +msgstr "Foco da IU Anterior" #: core/project_settings.cpp -#, fuzzy msgid "UI Left" -msgstr "Topo Esquerda" +msgstr "IU Esquerda" #: core/project_settings.cpp -#, fuzzy msgid "UI Right" -msgstr "Topo Direita" +msgstr "IU Direita" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "UI Acima" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "Para baixo" +msgstr "IU Baixo" #: core/project_settings.cpp msgid "UI Page Up" @@ -739,16 +711,15 @@ msgstr "UI Página Acima" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "UI Página Inferior" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "UI Inicio" #: core/project_settings.cpp -#, fuzzy msgid "UI End" -msgstr "No Fim" +msgstr "IU Final" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -769,12 +740,11 @@ msgstr "FÃsica" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp -#, fuzzy msgid "Smooth Trimesh Collision" -msgstr "Criar Irmão de Colisão Trimesh" +msgstr "Colisão Trimesh Suave" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -796,7 +766,7 @@ msgstr "Renderizar" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Qualidade" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -806,7 +776,7 @@ msgstr "Filtros" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "Intensidade da Nitidez" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -831,55 +801,52 @@ msgid "Profiler" msgstr "Analisador" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "Criar Função" +msgstr "Funções Máximas" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "Expressão" +msgstr "Compressão" #: core/project_settings.cpp -#, fuzzy msgid "Formats" -msgstr "Formato" +msgstr "Formatos" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "Correspondência de Longa Distância" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "NÃvel de Compressão" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "Tamanho da Janela de Registro" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "Módulos" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp msgid "Connect Timeout Seconds" @@ -887,15 +854,15 @@ msgstr "Segundos de Timeout da Conexão" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "Fluxo de Pacotes de Pares" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "Buffer máximo (Potência de 2)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp msgid "Certificates" @@ -908,9 +875,8 @@ msgid "Resource" msgstr "Recurso" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "Fechar Cena" +msgstr "Local para Cena" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -920,22 +886,20 @@ msgid "Path" msgstr "Caminho" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "Fonte" +msgstr "Código Fonte" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" msgstr "Localização" #: core/translation.cpp -#, fuzzy msgid "Test" -msgstr "Em teste" +msgstr "Testar" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "Alternativa" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -971,17 +935,17 @@ msgstr "EiB" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "Buffers" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Tamanho do Buffer do PolÃgono da Tela (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Tamanho do buffer do Ãndice do polÃgono da tela (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -993,56 +957,52 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Ajuste Inteligente" +msgstr "Encaixe" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Usar Ajuste de Pixel" +msgstr "Usar o Encaixe Pixel da GPU" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "Tamanho de Buffer Imediato (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp -#, fuzzy msgid "Lightmapping" -msgstr "Consolidar Lightmaps" +msgstr "Mapeamento de Luz" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Use Bicubic Sampling" -msgstr "" +msgstr "Usar amostragem Bicúbica" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Elements" -msgstr "" +msgstr "Máximo de Elementos Renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Máximo de Luzes Renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "Centrar Seleção" +msgstr "Máximo de Reflexões Renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" -msgstr "" +msgstr "Máximo de Luzes por Objeto" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Dispersão de SubsuperfÃcie" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1058,25 +1018,24 @@ msgid "Scale" msgstr "Escala" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Follow Surface" -msgstr "Povoar superfÃcie" +msgstr "Seguir a SuperfÃcie" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "Amostras de Peso" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Rastreamento de Cone de Voxel" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Alta Qualidade" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "Tamanho Máximo do Buffer da Blend Shape (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1150,9 +1109,8 @@ msgstr "Anim Mudar Chamada" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Frame %" +msgstr "Quadro" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1163,16 +1121,14 @@ msgstr "Tempo" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" msgstr "Localização" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Passo da rotação:" +msgstr "Rotação" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1180,14 +1136,13 @@ msgid "Value" msgstr "Valor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Valor:" +msgstr "Contagem de Argumentos" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumentos" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1197,31 +1152,27 @@ msgid "Type" msgstr "Tipo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "Definir Manipulador" +msgstr "Dentro do Controle" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "Definir Manipulador" +msgstr "Fora do Controle" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Fluxo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento Inicial" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Compensação:" +msgstr "Deslocamento Final" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1234,9 +1185,8 @@ msgid "Animation" msgstr "Animação" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" -msgstr "Easing In-Out" +msgstr "Flexibilização" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1345,19 +1295,16 @@ msgid "Remove this track." msgstr "Remover esta Pista." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Tempo (s): " +msgstr "Tempo (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Posição" +msgstr "Posição:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Passo da rotação:" +msgstr "Rotação:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1374,44 +1321,36 @@ msgid "Type:" msgstr "Tipo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Modelo de exportação inválido:" +msgstr "(Inválido, tipo esperado: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "Easing In-Out" +msgstr "Flexibilização:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Definir Manipulador" +msgstr "Em manuseio:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Definir Manipulador" +msgstr "Fora de controle:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Item Rádio" +msgstr "Fluxo:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "ReinÃcio (s):" +msgstr "InÃcio (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "Aparecer (s):" +msgstr "Fim (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animações:" +msgstr "Clipe de Animação:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1495,14 +1434,12 @@ msgstr "Remover Pista de Animação" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "Editor" +msgstr "Editores" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "Anim Inserir Pista & Chave" +msgstr "Confirmar Inserir Faixa" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1628,9 +1565,8 @@ msgid "Add Method Track Key" msgstr "Adicionar Chave da Pista Método" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Método não encontrado no objeto: " +msgstr "Método não encontrado no objeto:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1650,7 +1586,7 @@ msgstr "Métodos" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bezier" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2240,7 +2176,7 @@ msgstr "Abrir" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Proprietários de: %s (Total: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2806,7 +2742,7 @@ msgstr "Escolha" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp #, fuzzy @@ -2814,9 +2750,8 @@ msgid "Completed with errors." msgstr "Copiar Caminho do Nó" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Pacote Instalado com sucesso!" +msgstr "Completado com sucesso." #: editor/editor_export.cpp #, fuzzy @@ -2936,11 +2871,11 @@ msgstr "Formato Binário" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 Bits" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "Incorporar PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -2949,19 +2884,19 @@ msgstr "TextureRegion" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy @@ -3013,7 +2948,7 @@ msgstr "" #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "Converter Recursos de Texto em Binário na Exportação" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3334,7 +3269,7 @@ msgstr "Alternar Ficheiros Escondidos" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -msgstr "" +msgstr "Desativar Aviso de Sobrescrita" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3437,7 +3372,7 @@ msgstr "A (Re)Importar Recursos" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "Reimportar Arquivos Importados Ausentes" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3548,7 +3483,7 @@ msgstr "Ajuda" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "Classificar Funções em Ordem Alfabética" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4336,6 +4271,8 @@ msgstr "%d mais Ficheiros" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" +"Não foi possÃvel gravar no arquivo '%s', arquivo em uso, bloqueado ou sem " +"permissões." #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp @@ -4355,11 +4292,11 @@ msgstr "Mostrar Grelha Sempre" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "Redimensionar se Houver Muitas Guias" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "" +msgstr "Largura MÃnima" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" @@ -4372,15 +4309,15 @@ msgstr "Limpar SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "" +msgstr "Sempre Abra a SaÃda na Reprodução" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" -msgstr "" +msgstr "Sempre Feche a SaÃda na Parada" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "Salvar ao Perder o Foco" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4417,7 +4354,7 @@ msgstr "Obter Nó da Cena" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "Mostrar Miniatura ao Passar o Mouse Por Cima" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4429,7 +4366,7 @@ msgstr "Estilo de Nome da Propriedade Predefinida" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "FloatStep Padrão" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4438,15 +4375,15 @@ msgstr "Desativar Botão" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Desdobramento Automático de Cenas Estrangeiras" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Edição Horizontal do Vector2" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Edição de Tipo de Vetor Horizontal" #: editor/editor_node.cpp #, fuzzy @@ -4460,7 +4397,7 @@ msgstr "Abrir no Inspetor" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "" +msgstr "Modo Seletor de Cores Padrão" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4627,12 +4564,12 @@ msgid "" "mobile device).\n" "You don't need to enable it to use the GDScript debugger locally." msgstr "" -"Quando esta opção é ativada, ao usar distribuição por um clique o executável " -"irá tentar ligar-se ao endereço IP deste computador, para que o projeto " -"possa ser depurado.\n" -"Esta opção foi criada para ser usada pela depuração remota (tipicamente com " -"um aparelho móvel).\n" -"Não é necessário ativá-la para usar o depurador de GDScript localmente." +"Quando esta opção está habilitada, Distribuição por um clique que fará o " +"executável tentar se conectar ao IP deste computador e então o projeto atual " +"pode ser depurado.\n" +"Essa opção foi pensada para ser usada em depuração remota (normalmente com " +"dispositivos móveis).\n" +"Você não precisa habilitá-la para usar o depurador do GDScript localmente." #: editor/editor_node.cpp msgid "Small Deploy with Network Filesystem" @@ -4649,9 +4586,9 @@ msgid "" msgstr "" "Quando esta opção é ativada, a distribuição por um clique para Android vai " "exportar um executável sem os dados do projeto.\n" -"O Sistema de Ficheiros será fornecido ao Projeto pelo Editor sobre a rede.\n" -"Em Android, a distribuição irá usar a ligação USB para melhor performance. " -"Esta opção acelera o teste de jogos pesados." +"O sistema de arquivos será fornecido ao projeto pelo editor sobre a rede.\n" +"Em Android, a distribuição irá usar o cabo USB para melhor performance. Esta " +"opção acelera o teste para projetos com assets grandes ." #: editor/editor_node.cpp msgid "Visible Collision Shapes" @@ -4662,8 +4599,8 @@ msgid "" "When this option is enabled, collision shapes and raycast nodes (for 2D and " "3D) will be visible in the running project." msgstr "" -"Quando esta opção está ativada, as formas de colisões e nós raycast (para 2D " -"e 3D) serão visÃveis no projeto em execução." +"Quando esta opção está ativada, as formas de colisões e nós de raycast (para " +"2D e 3D) serão visÃveis no projeto em execução." #: editor/editor_node.cpp msgid "Visible Navigation" @@ -5115,7 +5052,7 @@ msgstr "Depurador" #: editor/editor_profiler.cpp msgid "Profiler Frame History Size" -msgstr "" +msgstr "Tamanho do Histórico do Perfilador de Quadro" #: editor/editor_profiler.cpp #, fuzzy @@ -5332,23 +5269,23 @@ msgstr "Mostrar Tudo" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Escala de Exibição Personalizada" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "" +msgstr "Tamanho da Fonte Principal" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Tamanho da Fonte do Código" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "Fonte Suave" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Alinhar Fonte" #: editor/editor_settings.cpp #, fuzzy @@ -5357,7 +5294,7 @@ msgstr "Cena Principal" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "" +msgstr "Fonte Principal em Negrito" #: editor/editor_settings.cpp #, fuzzy @@ -5366,15 +5303,15 @@ msgstr "Adicionar Ponto Nó" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" -msgstr "" +msgstr "Atenuar Editor na Caixa de Diálogo de Popup" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Duração do Modo de Baixo Consumo do Processador (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Duração do Modo de Baixo Consumo do Processador Fora de Foco (µsec)" #: editor/editor_settings.cpp #, fuzzy @@ -5383,11 +5320,11 @@ msgstr "Modo Livre de Distrações" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "Abrir Capturas de Tela Automaticamente" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Máximo de Itens de Dicionário de Array por Página" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5401,81 +5338,71 @@ msgstr "Predefinições" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Ãcone e Cor da Fonte" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "Cores" +msgstr "Cor Base" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Escolher cor" +msgstr "Cor de Destaque" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "Contraste" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "Opacidade da Linha de Relacionamento" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "A guardar lightmaps" +msgstr "Destacar Guias" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "Pixeis da Margem" +msgstr "Tamanho da Borda" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" -msgstr "" +msgstr "Usar Cabeçalhos de Nós de Gráficos" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "Loop da Animação" +msgstr "Espaçamento Adicional" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "Editor de Tema" +msgstr "Tema Personalizado" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Roda Botão Direito" +msgstr "Mostrar Botão de Script" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "Direções" +msgstr "Diretórios" #: editor/editor_settings.cpp msgid "Autoscan Project Path" -msgstr "Autoscan Caminho do Projeto" +msgstr "Verificação Automática do Caminho do Projeto" #: editor/editor_settings.cpp msgid "Default Project Path" -msgstr "Caminho do Projeto Predefinido" +msgstr "Caminho Padrão do Projeto" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "Guardar" +msgstr "Ao Salvar" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "Copiar Recurso" +msgstr "Comprimir Recursos Binários" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" -msgstr "" +msgstr "Salvar com Segurança no Backup e Renomear" #: editor/editor_settings.cpp #, fuzzy @@ -5488,7 +5415,7 @@ msgstr "Tamanho da Miniatura" #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "Painéis" #: editor/editor_settings.cpp #, fuzzy @@ -5497,7 +5424,7 @@ msgstr "Obter Ãrvore da Cena" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "Iniciar Diálogo de Criação Totalmente Expandido" #: editor/editor_settings.cpp #, fuzzy @@ -5511,7 +5438,7 @@ msgstr "Editor de Grupo" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" -msgstr "" +msgstr "Intervalo de Atualização Automática" #: editor/editor_settings.cpp #, fuzzy @@ -5526,13 +5453,12 @@ msgstr "Editor de Tema" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Line Spacing" -msgstr "" +msgstr "Espaçamento de Linha" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "Iluminação direta" +msgstr "Destaque" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5541,15 +5467,15 @@ msgstr "Destaque de Sintaxe" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "Destacar Todas as Ocorrências" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "" +msgstr "Destacar Linha Atual" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" -msgstr "" +msgstr "Destacar Linhas com Tipo Seguro" #: editor/editor_settings.cpp #, fuzzy @@ -5582,11 +5508,11 @@ msgstr "Navegação" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "" +msgstr "Rolagem Suave" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "Velocidade de Rolagem V" #: editor/editor_settings.cpp #, fuzzy @@ -5595,15 +5521,15 @@ msgstr "Mostrar Origem" #: editor/editor_settings.cpp msgid "Minimap Width" -msgstr "" +msgstr "Largura do Minimapa" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Botões extra do Mouse para Navegar no Histórico" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "Aparência" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Show Line Numbers" @@ -5615,7 +5541,7 @@ msgstr "Números da Linha Preenchidos com Zeros" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" -msgstr "" +msgstr "Mostrar Barra de Favoritos" #: editor/editor_settings.cpp #, fuzzy @@ -5624,27 +5550,27 @@ msgstr "Saltar Pontos de Paragem" #: editor/editor_settings.cpp msgid "Show Info Gutter" -msgstr "" +msgstr "Mostrar Barra de Informações" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "Agrupamento de Código" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Quebra de Palavras" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Exibir Guias de Comprimento de Linha" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Diretriz de Comprimento de Linha de Coluna FlexÃvel" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Diretriz de Comprimento de Linha de Coluna RÃgida" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5653,7 +5579,7 @@ msgstr "Editor de Script" #: editor/editor_settings.cpp msgid "Show Members Overview" -msgstr "" +msgstr "Mostrar Visão Geral dos Membros" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5667,19 +5593,19 @@ msgstr "Apagar Espaços nos Limites" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "" +msgstr "Segundos de Intervalo de Salvamento Automático" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "" +msgstr "Restaurar Scripts ao Carregar" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" -msgstr "" +msgstr "Auto Recarrega e Analisa de Scripts ao Salvar" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "Recarregamento Automático de Scripts em Caso de Mudança Externa" #: editor/editor_settings.cpp #, fuzzy @@ -5688,27 +5614,27 @@ msgstr "Forçar Shader de Reserva" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "Ordenar Esquema de Membros em Ordem Alfabética" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" -msgstr "" +msgstr "Cursor" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "Rolar Além do Final do Arquivo" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "Cursor em Bloco" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "Cursor Piscando" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "Velocidade do Piscamento do Cursor" #: editor/editor_settings.cpp #, fuzzy @@ -5723,23 +5649,23 @@ msgstr "Conclusão" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "Atraso de Análise de Inatividade" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "Autocompletar Parênteses" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "Atraso no Auto Completar do Código" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "Mostrar Sugestão de Chamada Abaixo da Linha Atual" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "Deslocamento da Sugestão de Chamada" #: editor/editor_settings.cpp #, fuzzy @@ -5762,15 +5688,15 @@ msgstr "Mostrar Ajudantes" #: editor/editor_settings.cpp msgid "Help Font Size" -msgstr "" +msgstr "Tamanho da Fonte de Ajuda" #: editor/editor_settings.cpp msgid "Help Source Font Size" -msgstr "" +msgstr "Tamanho da Fonte de Código de Ajuda" #: editor/editor_settings.cpp msgid "Help Title Font Size" -msgstr "" +msgstr "Tamanho da Fonte do TÃtulo da Ajuda" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" @@ -5787,11 +5713,11 @@ msgstr "Pré-visualização" #: editor/editor_settings.cpp msgid "Primary Grid Color" -msgstr "" +msgstr "Cor da Grade Primária" #: editor/editor_settings.cpp msgid "Secondary Grid Color" -msgstr "" +msgstr "Cor da Grade Secundária" #: editor/editor_settings.cpp #, fuzzy @@ -5828,7 +5754,7 @@ msgstr "Ponto" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "Forma" #: editor/editor_settings.cpp msgid "Primary Grid Steps" @@ -5840,15 +5766,15 @@ msgstr "Tamanho da Grelha" #: editor/editor_settings.cpp msgid "Grid Division Level Max" -msgstr "" +msgstr "NÃvel Máximo de Divisão de Grade" #: editor/editor_settings.cpp msgid "Grid Division Level Min" -msgstr "" +msgstr "NÃvel MÃnimo de Divisão de Grade" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "Viés de NÃvel de Divisão de Grade" #: editor/editor_settings.cpp #, fuzzy @@ -5882,7 +5808,7 @@ msgstr "Predefinição" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" -msgstr "" +msgstr "Número de threads da CPU para Baking do Mapa de luz" #: editor/editor_settings.cpp #, fuzzy @@ -5906,11 +5832,11 @@ msgstr "Diminuir Zoom" #: editor/editor_settings.cpp msgid "Emulate Numpad" -msgstr "" +msgstr "Emular Teclado Numérico" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "Emular Mouse de 3 Botões" #: editor/editor_settings.cpp #, fuzzy @@ -5929,7 +5855,7 @@ msgstr "Modificado" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "Panorama do Mouse Distorcido" #: editor/editor_settings.cpp #, fuzzy @@ -5938,11 +5864,11 @@ msgstr "Modo Navegação" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "Sensibilidade da Órbita" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "Inércia da Órbita" #: editor/editor_settings.cpp #, fuzzy @@ -6006,7 +5932,7 @@ msgstr "Ajuste Inteligente" #: editor/editor_settings.cpp msgid "Bone Width" -msgstr "" +msgstr "Largura do Osso" #: editor/editor_settings.cpp #, fuzzy @@ -6024,11 +5950,11 @@ msgstr "Cor dos Ossos Selecionados" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "Cor do Osso IK" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "Color do Contorno do Osso" #: editor/editor_settings.cpp msgid "Bone Outline Size" @@ -6036,19 +5962,19 @@ msgstr "Tamanho do Contorno dos Ossos" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "Cor da borda do Viewport" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "Restringir a Visualização do Editor" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "Panorâmica Simples" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "Rolar para Arrastar" #: editor/editor_settings.cpp msgid "Pan Speed" @@ -6061,7 +5987,7 @@ msgstr "Editor UV de PolÃgono 2D" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "Raio do Ponto de Captura" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6075,7 +6001,7 @@ msgstr "Renomear Animação" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "Criar Faixas de Bézier Padrão" #: editor/editor_settings.cpp #, fuzzy @@ -6084,84 +6010,77 @@ msgstr "Criar Pista(s) RESET" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" -msgstr "" +msgstr "Camadas de Cebola Cor Passada" #: editor/editor_settings.cpp msgid "Onion Layers Future Color" -msgstr "" +msgstr "Camadas de Cebola Cor Futura" #: editor/editor_settings.cpp -#, fuzzy msgid "Visual Editors" -msgstr "Editor de Grupo" +msgstr "Editor Visual" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "Opacidade do Minimapa" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "Posicionamento da Janela" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "Rect Completo" +msgstr "Retângulo" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "Definir posição Curve Out" +msgstr "Posição Personalizada do Retângulo" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "Tela" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Save" -msgstr "Corte automático" +msgstr "Salvamento Automático" #: editor/editor_settings.cpp msgid "Save Before Running" -msgstr "Guardar Antes de Executar" +msgstr "Salvar Antes de Executar" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Size" -msgstr "Vista de Frente" +msgstr "Tamanho da Fonte" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Remote Host" -msgstr "Hospedeiro Remoto" +msgstr "Host Remoto" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "Remover Ponto" +msgstr "Porta Remota" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "Configurações do Editor" +msgstr "Editor de Certificados SSL" #: editor/editor_settings.cpp msgid "HTTP Proxy" -msgstr "" +msgstr "Proxy HTTP" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "Host" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "Porta" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6175,36 +6094,35 @@ msgstr "Ordem de Classificação" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "Cor do SÃmbolo" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "Cor da Palavra-Chave" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "Cor da Palavra-Chave do Fluxo de Controle" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "Mudar tipo base" +msgstr "Cor do Tipo Base" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "Cor do Tipo de Motor" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "Cor do Tipo de Usuário" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "Cor do Comentário" #: editor/editor_settings.cpp msgid "String Color" -msgstr "Cor da Cadeia" +msgstr "Cor da String" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6214,29 +6132,27 @@ msgstr "Cor de Fundo" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Background Color" -msgstr "Conclusão da Cor de Fundo" +msgstr "Cor de Preenchimento de Fundo" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Importar Selecionado" +msgstr "Cor de Preenchimento Selecionada" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "Cor de Preenchimento Existente" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Cor de Preenchimento de Rolagem" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Cor de Preenchimento de Fonte" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "Próximo Piso" +msgstr "Cor do Texto" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Line Number Color" @@ -6248,86 +6164,75 @@ msgstr "Cor do Número da Linha Segura" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "Cor do Cursor" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Background Color" msgstr "Cor de Fundo do Cursor" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "Apagar Selecionado" +msgstr "Cor do Texto Selecionado" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "Apenas seleção" +msgstr "Cor da Seleção" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Cor da Incompatibilidade de Fechamento de Chaves" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "Cena Atual" +msgstr "Cor da Linha Atual" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Cor da Diretriz do Comprimento da Linha" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "Destaque de Sintaxe" +msgstr "Cor da Palavra Destacada" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Cor do Número" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Função" +msgstr "Cor da Função" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "Mudar nome da Variável" +msgstr "Cor da Variável de Membro" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Escolher cor" +msgstr "Cor da Marca" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "Marcadores" +msgstr "Cor dos Favoritos" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "Pontos de paragem" +msgstr "Color do Breakpoint" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "Cor da Linha em Execução" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Cor do Agrupamento de Código" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "Resultados da Pesquisa" +msgstr "Color dos Resultados da Pesquisa" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "Resultados da Pesquisa" +msgstr "Cor da Borda dos Resultados da Pesquisa" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." @@ -6336,14 +6241,12 @@ msgstr "" "mais precisas." #: editor/editor_spin_slider.cpp scene/gui/button.cpp -#, fuzzy msgid "Flat" -msgstr "Plano 0" +msgstr "Flat" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "Modo Colisão" +msgstr "Ocultar Slider" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6639,7 +6542,7 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "Servidor de Arquivos" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp @@ -6707,6 +6610,11 @@ msgid "" "After renaming to an unknown extension, the file won't be shown in the " "editor anymore." msgstr "" +"Esta extensão de arquivo não é reconhecida pelo editor.\n" +"Se você de qualquer maneira quiser renomeá-lo, use o gerenciador de arquivos " +"do seu sistema operacional.\n" +"Após renomear para uma extensão desconhecida, o arquivo não será mais " +"exibido no editor." #: editor/filesystem_dock.cpp msgid "" @@ -7007,11 +6915,11 @@ msgstr "Gerir Grupos" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Usar Ambiente" #: editor/import/resource_importer_bitmask.cpp #, fuzzy @@ -7021,7 +6929,7 @@ msgstr "Criar Pasta" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "Limite" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7034,7 +6942,7 @@ msgstr "Componentes" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "Delimitador" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7043,7 +6951,7 @@ msgstr "Função Cor." #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "Sem BPTC Se RGB" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -7051,13 +6959,13 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "Flags" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "Repetir" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp @@ -7074,12 +6982,12 @@ msgstr "Sinais" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "Anisotrópico" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7106,23 +7014,21 @@ msgid "Generate Tangents" msgstr "Gerar Pontos" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "Modo Escalar" +msgstr "Escalar Forma" #: editor/import/resource_importer_obj.cpp msgid "Offset Mesh" -msgstr "Malha de Compensação" +msgstr "Forma de Compensação" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "Expressão" +msgstr "Compressão Octaédrica" #: editor/import/resource_importer_obj.cpp msgid "Optimize Mesh Flags" -msgstr "Otimizar Flags da Malha" +msgstr "Otimizar Flags da Forma" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7166,29 +7072,24 @@ msgstr "Importar como Cenas Múltiplas + Materiais" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" -msgstr "Nó" +msgstr "Nós" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "Voltar" +msgstr "Tipo da Raiz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "Nome do Remoto" +msgstr "Nome da Raiz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "Escala" +msgstr "Escala da Raiz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "CustomNode" +msgstr "Script Personalizado" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp msgid "Storage" @@ -7196,54 +7097,47 @@ msgstr "Armazenamento" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "Usar Nomes Legados" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" msgstr "Materiais" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "Reimportar" +msgstr "Manter ao Reimportar" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" -msgstr "Malha" +msgstr "Malhas" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "Modificar tangente da curva" +msgstr "Assegurar Tangentes" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Light Baking" -msgstr "Consolidar Lightmaps" +msgstr "Baking de Luz" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "Consolidar Lightmaps" +msgstr "Tamanho do Texel do Mapa de Luz" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Skins" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "Usar Ajuste de Escala" +msgstr "Usar Skins com Nome" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "Abrir um Ficheiro" +msgstr "Arquivos Externos" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "Armazenar no Subdiretório" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7319,13 +7213,12 @@ msgid "Generating Lightmaps" msgstr "A gerar Lightmaps" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "A gerar para Malha: " +msgstr "Gerar para Forma:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." -msgstr "A executar Script Customizado..." +msgstr "A executar Script Personalizado..." #: editor/import/resource_importer_scene.cpp msgid "Couldn't load post-import script:" @@ -7352,155 +7245,148 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Textura detectada como usada como mapa normal em 3D. Ativando a " +"compactação de textura vermelho-verde para reduzir o uso de memória (o canal " +"azul é descartado)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: Textura detectada como usada em 3D. Ativando filtro, repetição, geração " +"de mapa MIP e compressão de textura VRAM." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, Detectar 3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "Pixeis Sólidos" +msgstr "Pixel 2D" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "Qualidade com Perdas" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "Modo Seleção" +msgstr "Modo HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Mapa Normal" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Process" -msgstr "Pós-processamento" +msgstr "Processo" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "Corrigir Borda Alfa" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Premult Alpha" -msgstr "Editar PolÃgono" +msgstr "Pré-multiplicar Alfa" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Hdr como Srgb" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Invert Color" -msgstr "Vértice" +msgstr "Inverter Cor" #: editor/import/resource_importer_texture.cpp msgid "Normal Map Invert Y" -msgstr "Mapa Normal Inverter Y" +msgstr "Inverter Y no Mapa Normal" #: editor/import/resource_importer_texture.cpp msgid "Size Limit" -msgstr "Limite do Tamanho" +msgstr "Tamanho Limite" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "Detectar 3D" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"Aviso, nenhuma compactação de VRAM de PC adequada ativada nas configurações " +"do projeto. Esta textura não será exibida corretamente no PC." #: editor/import/resource_importer_texture_atlas.cpp msgid "Atlas File" -msgstr "Ficheiro Atlas" +msgstr "Arquivo de Atlas" #: editor/import/resource_importer_texture_atlas.cpp msgid "Import Mode" msgstr "Modo de Importação" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Crop To Region" -msgstr "Definir Região Tile" +msgstr "Cortar Para Região" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Aparar Borda Alfa da Região" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "Forçar Impulso" +msgstr "Força" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8 Bits" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "Mono" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate" -msgstr "Nó Mix" +msgstr "Taxa Máxima" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate Hz" -msgstr "Nó Mix" +msgstr "Taxa Máxima Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "Aparar" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "Formato" +msgstr "Normalizar" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "Modo Mover" +msgstr "Modo de Loop" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "Modo Mover" +msgstr "Inicio do Loop" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "Modo Mover" +msgstr "Fim do Loop" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7597,7 +7483,7 @@ msgstr "Localização" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "Localização não disponÃvel para o idioma atual." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8045,11 +7931,20 @@ msgid "New Anim" msgstr "Nova Animação" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Criar Nova Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Mudar o Nome da Animação:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renomear Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Apagar Animação?" @@ -8067,11 +7962,6 @@ msgid "Animation name already exists!" msgstr "Já existe o nome da Animação!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renomear Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicar Animação" @@ -8216,10 +8106,6 @@ msgid "Pin AnimationPlayer" msgstr "Pregar AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Criar Nova Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nome da Animação:" @@ -8473,7 +8359,7 @@ msgstr "Filtros..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "Usar Threads" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8705,7 +8591,7 @@ msgstr "Em teste" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "Falha ao obter a configuração do repositório." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8762,7 +8648,7 @@ msgstr "Consolidar Lightmaps" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "LightMap Bake" -msgstr "" +msgstr "Bake de Mapa de Luz" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -9279,7 +9165,7 @@ msgstr "Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Esconder" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -9636,11 +9522,11 @@ msgstr "Gradiente Editado" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "Trocar pontos de preenchimento do Gradiente de Textura 2D" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "Trocar Pontos de Preenchimento de Gradiente" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp #, fuzzy @@ -9664,7 +9550,7 @@ msgstr "Ãcone" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10461,7 +10347,7 @@ msgstr "Sincronizar Ossos com PolÃgono" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "Definir cast_to" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10792,11 +10678,11 @@ msgstr "Resultados da Pesquisa" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "Abrir Script Dominante na Mudança de Cena" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "Externo" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10815,11 +10701,11 @@ msgstr "Selecionar Ficheiro de Modelo" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "Destacar Script Atual" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "Tamanho do Histórico de Temperatura do Script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10842,7 +10728,7 @@ msgstr "Nome do Script:" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "Flags de Execução" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -11356,7 +11242,7 @@ msgstr "Pré-visualização Cinemática" #: editor/plugins/spatial_editor_plugin.cpp msgid "(Not in GLES2)" -msgstr "" +msgstr "(Não em GLES2)" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -11657,11 +11543,11 @@ msgstr "Pós" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Tamanho do Gizmo do Manipulador" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Opacidade do Gizmo do Manipulador" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -12347,41 +12233,41 @@ msgid "Add Item Type" msgstr "Adicionar Tipo de Item" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Variation Base Type" -msgstr "Definir tipo de variável" +msgstr "Definir Tipo Base da Variação" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Base Type" -msgstr "Mudar tipo base" +msgstr "Definir Tipo Base" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" -msgstr "Mostrar Predefinição" +msgstr "Mostrar Padrão" #: editor/plugins/theme_editor_plugin.cpp msgid "Show default type items alongside items that have been overridden." -msgstr "" -"Mostrar itens do tipo predefinido ao lado de itens que foram sobrepostos." +msgstr "Mostrar itens do tipo padrão ao lado de itens que foram sobrepostos." #: editor/plugins/theme_editor_plugin.cpp msgid "Override All" -msgstr "Sobrepor Tudo" +msgstr "Substituir Tudo" #: editor/plugins/theme_editor_plugin.cpp msgid "Override all default type items." -msgstr "Sobrepõe todos os itens de tipo predefinido." +msgstr "Substituir todos os itens de tipo padrão." #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." msgstr "" +"Selecione o tipo de base de variação em uma lista de tipos disponÃveis." #: editor/plugins/theme_editor_plugin.cpp msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" +"Um tipo associado a uma classe integrada não pode ser marcado como uma " +"variação de outro tipo." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12626,7 +12512,7 @@ msgstr "Pintar TileMap" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "Largura MÃnima da Paleta" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -14219,11 +14105,13 @@ msgstr "Executável" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "Exporte o projeto para todas as predefinições definidas." #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"Todas as predefinições devem ter um caminho de exportação definido para que " +"Exportar Tudo funcione." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14335,6 +14223,8 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"Nota: A chave de criptografia precisa ser armazenada no binário,\n" +"você precisa construir os modelos de exportação da fonte." #: editor/project_export.cpp #, fuzzy @@ -15493,7 +15383,7 @@ msgstr "Tornar Local" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Another node already uses this unique name in the scene." -msgstr "" +msgstr "Outro nó já usa esse nome exclusivo na cena." #: editor/scene_tree_dock.cpp #, fuzzy @@ -15579,7 +15469,7 @@ msgstr "Sub-recursos" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "Acesso como Nome Exclusivo da Cena" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15684,7 +15574,7 @@ msgstr "Centrar Seleção" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Derivar Globais de Script Por Nome" #: editor/scene_tree_dock.cpp #, fuzzy @@ -15717,6 +15607,9 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"Este nó pode ser acessado de qualquer lugar na cena, precedendo-o com o " +"prefixo '%s' em um caminho de nó.\n" +"Clique para desabilitar isso." #: editor/scene_tree_editor.cpp msgid "" @@ -16010,15 +15903,15 @@ msgstr "Filtrar Tiles" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Mudar Automático para Ãrvore de Cena Remota" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "Intervalo de Atualização da Ãrvore de Cena Remota" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Intervalo de Atualização de Inspeção Remota" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16116,7 +16009,7 @@ msgstr "Mudar raio da luz" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "Reprodutor de Fluxo 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -16126,7 +16019,7 @@ msgstr "Mudar ângulo de emissão de AudioStreamPlayer3D" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "Câmera" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -16138,7 +16031,7 @@ msgstr "Mudar tamanho da Câmara" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "Notificador de Visibilidade" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -16149,23 +16042,20 @@ msgid "Change Particles AABB" msgstr "Mudar partÃculas AABB" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "Selecionar Propriedade" +msgstr "Sonda de Reflexão" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "Mudar Extensões de Sonda" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "Consolidar Sonda GI" +msgstr "Sonda GI" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "Iluminação indireta" +msgstr "Iluminação Indireta Pré-feita" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -16196,57 +16086,52 @@ msgid "Change Ray Shape Length" msgstr "Mudar comprimento da forma raio" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge" -msgstr "Modo Navegação" +msgstr "Borda de Navegação" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "Modo Navegação" +msgstr "Borda de Navegação Desabilitada" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid" -msgstr "Modo Navegação" +msgstr "Sólido de Navegação" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid Disabled" -msgstr "Modo Navegação" +msgstr "Sólido de Navegação Desativado" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "Corpo de Articulação A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "Corpo de Articulação B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "Borda da Sala" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "Sobreposição de Sala" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" msgstr "Definir Posição do Ponto do Room" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "Definir Margem" +msgstr "Margem do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "Borda do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "Seta do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -16254,18 +16139,16 @@ msgstr "Definir Posição do Ponto do Portal" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "Portal Frente" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "Voltar" +msgstr "Portal Atras" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "Modo Oclusão" +msgstr "Oclusor" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16276,440 +16159,397 @@ msgid "Set Occluder Sphere Position" msgstr "Definir Posição da Esfera do Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "Definir Posição do Ponto do Portal" +msgstr "Definir a Posição do Ponto do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "Definir posição do Ponto da curva" +msgstr "Definir a Posição do Ponto do OrifÃcio do Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "Criar PolÃgono Oclusor" +msgstr "Frente do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "Criar PolÃgono Oclusor" +msgstr "Parte de Trás do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "Criar PolÃgono Oclusor" +msgstr "Buraco Oclusor" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "FÃsica do Godot" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "Usar BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "Modo Colisão" +msgstr "Margem de Colisão BVH" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "Definir Manipulador" +msgstr "Gerenciador de Falhas" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "Conjunto MultiNó" +msgstr "Servidor com Multi-Thread" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "Pré-alocação de pool RID" #: main/main.cpp -#, fuzzy msgid "Debugger stdout" -msgstr "Depurador" +msgstr "Depurador stdout" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "Máximo de Caracteres Por Segundo" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "Máximo de Mensagens Por Quadro" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "Máximo de Erros Por Segundo" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "Máximo de Avisos Por Segundo" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "Esvaziar stdout Na Impressão" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "Registro de Log" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "Log de Arquivo" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "Ativar Filtragem" +msgstr "Ativar Log de Arquivos" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "Copiar Caminho" +msgstr "Caminho de Log" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "Máximo de Arquivos de Log" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "Driver" #: main/main.cpp -#, fuzzy msgid "Driver Name" -msgstr "Nome do Script:" +msgstr "Nome do Driver" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "Alternar para GLES2" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Use a Solução Alternativa do Nvidia Rect Flicker" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "Permitir hiDPI" #: main/main.cpp -#, fuzzy msgid "V-Sync" -msgstr "Sinc" +msgstr "Sincronização Vertical" #: main/main.cpp -#, fuzzy msgid "Use V-Sync" -msgstr "Usar Ajuste" +msgstr "Usar Sincronização Vertical" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "Transparência Por Pixel" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "Permitido" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "Uso Pretendido" #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "Seleção de Frame" +msgstr "Alocação de Framebuffer" #: main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Energy Saving" -msgstr "Erro Ao Gravar" +msgstr "Economia de Energia" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "Threads" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "Alternar Modo" +msgstr "Modelo de Thread" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "Thread Segura BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "Portátil" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Orientation" -msgstr "Documentação Online" +msgstr "Orientação" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp -#, fuzzy msgid "Common" -msgstr "Comunidade" +msgstr "Comum" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "Frame de FÃsica %" +msgstr "FÃsica FPS" #: main/main.cpp -#, fuzzy msgid "Force FPS" -msgstr "Forçar Impulso" +msgstr "Forçar FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Ativar a Seleção Consciente de Pausa" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "Interface Gráfica" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Desabilitar Soltar o Mouse na Entrada da Interface Gráfica" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "stdout" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "Imprimir FPS" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "stdout Verboso" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "Modo de Interpolação" +msgstr "Interpolação FÃsica" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "Ativar Filtragem" +msgstr "Ativar Avisos" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "Seleção de Frame" +msgstr "Atraso de Quadro Msec" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "Modo de Baixo Uso do Processador" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "Sincronização Delta Após Desenhar" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "Esconder Indicador de Home" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "Todos os Aparelhos" +msgstr "Dispositivos de Entrada" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "Ponto" +msgstr "Pontuação" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "Atraso de Toque" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Shaders" -msgstr "Shader" +msgstr "Shaders" #: main/main.cpp -#, fuzzy msgid "Debug Shader Fallbacks" -msgstr "Forçar Shader de Reserva" +msgstr "Depurar Fallbacks do Shader" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp #: scene/resources/world.cpp -#, fuzzy msgid "Environment" -msgstr "Ver ambiente" +msgstr "Ambiente" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "Cor Clara Padrão" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "Plano de Fundo de Inicialização" #: main/main.cpp -#, fuzzy msgid "Show Image" -msgstr "Mostrar ossos" +msgstr "Mostrar Imagem" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "Imagem" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Tamanho Máximo" #: main/main.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Use Filter" -msgstr "Filtro:" +msgstr "Usar Filtro" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "Cores" +msgstr "Cor de Fundo" #: main/main.cpp -#, fuzzy msgid "macOS Native Icon" -msgstr "Definir Ãcone de Tile" +msgstr "Ãcone Nativo do macOS" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "Ãcone nativo do Windows" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Liberação Ãgil de Eventos" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "Emular Toque do Mouse" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "Emular o Mouse do Toque" #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "Botão do rato" +msgstr "Cursor do Mouse" #: main/main.cpp -#, fuzzy msgid "Custom Image" -msgstr "CustomNode" +msgstr "Imagem Personalizada" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "Imagem de Ponto de Acesso Personalizada" #: main/main.cpp -#, fuzzy msgid "Tooltip Position Offset" -msgstr "Compensação da rotação:" +msgstr "Deslocamento de Posição da Dica" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "Depurador" +msgstr "Agente Depurador" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait For Debugger" -msgstr "Depurador" +msgstr "Esperar o Depurador" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait Timeout" -msgstr "Timeout de Espera" +msgstr "Tempo Limite de Espera" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "Execução" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "PolÃtica de Exceção não Tratada" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "Localizar Tipo de Nó" +msgstr "Tipo de Loop Principal" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp -#, fuzzy msgid "Stretch" -msgstr "Trazer" +msgstr "Esticar" #: main/main.cpp -#, fuzzy msgid "Aspect" -msgstr "Inspetor" +msgstr "Aspecto" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "Encolher" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "Auto Aceitar Sair" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "Voltar" +msgstr "Sair em Voltar" #: main/main.cpp scene/main/viewport.cpp -#, fuzzy msgid "Snap Controls To Pixels" -msgstr "Ajustar aos Lados do Nó" +msgstr "Ajustar Controles aos Pixels" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "Fontes Dinâmicas" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "Usar Sobreamostragem" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "Mundo Suave Ativo" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16728,13 +16568,12 @@ msgid "Change Torus Outer Radius" msgstr "Mudar Raio Externo do Toro" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Operation" -msgstr "Opções" +msgstr "Operação" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "Calcular Tangentes" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16792,7 +16631,7 @@ msgstr "Mostrar Guias" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "Cone" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16806,7 +16645,7 @@ msgstr "Mudar Raio Externo do Toro" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "Lados do Anel" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp @@ -16817,11 +16656,11 @@ msgstr "PolÃgonos" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "Graus de Rotação" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "Girar Lados" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16835,11 +16674,11 @@ msgstr "Criar vértice interno" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "Intervalo de Caminho" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "Simplifique o Ângulo do Caminho" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16888,15 +16727,15 @@ msgstr "Mostrar Grelha Sempre" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "Retransmissão do Servidor" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "Verificar DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "Nome do Host DTLS" #: modules/enet/networked_multiplayer_enet.cpp #, fuzzy @@ -16905,11 +16744,11 @@ msgstr "Usar Ajuste" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "Usar FBX" #: modules/gdnative/gdnative.cpp #, fuzzy @@ -17019,7 +16858,7 @@ msgstr "Script" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" -msgstr "" +msgstr "Função de Definição de Cor" #: modules/gdscript/editor/gdscript_highlighter.cpp #, fuzzy @@ -17028,19 +16867,19 @@ msgstr "Copiar Caminho do Nó" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "Pilha Máxima de Chamadas" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "Tratar Avisos como Erros" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "Excluir Complementos" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "Autocompletar Setters e Getters" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -17095,7 +16934,7 @@ msgstr "Mostrar SÃmbolos Nativos No Editor" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "Usar Thread" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -17147,11 +16986,11 @@ msgstr "Instância" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "Visualização de Buffer de Ãndices Esparsos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "Deslocamento de Bytes de Ãndices Esparsos" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -17160,11 +16999,11 @@ msgstr "A analisar geometria..." #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Visualização de Buffer de Valores Esparsos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Deslocamento de Bytes de Valores Esparsos" #: modules/gltf/gltf_buffer_view.cpp #, fuzzy @@ -17178,7 +17017,7 @@ msgstr "Tema Predefinido" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "Passo de Byte" #: modules/gltf/gltf_buffer_view.cpp #, fuzzy @@ -17192,7 +17031,7 @@ msgstr "Tamanho:" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Zfar" #: modules/gltf/gltf_camera.cpp #, fuzzy @@ -17214,7 +17053,7 @@ msgstr "Cores" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "Intensidade" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp #, fuzzy @@ -17223,11 +17062,11 @@ msgstr "Mudar" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "Ângulo do Cone Interno" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "Ângulo do Cone Externo" #: modules/gltf/gltf_mesh.cpp #, fuzzy @@ -17251,7 +17090,7 @@ msgstr "Plataforma" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "Skin" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp #, fuzzy @@ -17270,11 +17109,11 @@ msgstr "Ponto" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" -msgstr "" +msgstr "Raizes" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "Nomes Únicos" #: modules/gltf/gltf_skeleton.cpp #, fuzzy @@ -17293,7 +17132,7 @@ msgstr "Focar na Origem" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Inverter Ligações" #: modules/gltf/gltf_skin.cpp #, fuzzy @@ -17302,27 +17141,27 @@ msgstr "Mover Junta" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Articulação I ao Osso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Junta I A Nomear" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Skin Godot" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "Imagem Difusa" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "Fator Difuso" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "Fator de Brilho" #: modules/gltf/gltf_spec_gloss.cpp msgid "Specular Factor" @@ -17330,11 +17169,11 @@ msgstr "Fator Especular" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" -msgstr "" +msgstr "Imagem Brilhante Especular" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17353,7 +17192,7 @@ msgstr "Com Dados" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" -msgstr "" +msgstr "Usar Ligações de Skin Nomeadas" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17362,7 +17201,7 @@ msgstr "Vista de Trás" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "Assessores" #: modules/gltf/gltf_state.cpp #, fuzzy @@ -17382,11 +17221,11 @@ msgstr "Funcionalidades" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "Imagens" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "Câmeras" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp #, fuzzy @@ -17434,7 +17273,7 @@ msgstr "Consolidar Lightmaps" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "Célula" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -17460,7 +17299,7 @@ msgstr "Centro" #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "Máscara" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp #, fuzzy @@ -17638,19 +17477,19 @@ msgstr "Consolidar Lightmaps" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "Contagem de Raios de Baixa Qualidade" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "Contagem de Raios de Média Qualidade" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "Contagem de Raios de Alta Qualidade" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "Contagem de Raios de Ultra Qualidade" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp @@ -17662,11 +17501,11 @@ msgstr "Compensação:" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" -msgstr "" +msgstr "Altura do Olho" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy @@ -17680,15 +17519,15 @@ msgstr "Vista sem sombras" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "Excesso de Amostra" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17776,7 +17615,7 @@ msgstr "Feito!" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "Sem Emenda" #: modules/opensimplex/noise_texture.cpp #, fuzzy @@ -17785,11 +17624,11 @@ msgstr "Escala aleatória:" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "Força da Colisão" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "Ruido" #: modules/opensimplex/noise_texture.cpp #, fuzzy @@ -17798,11 +17637,11 @@ msgstr "Compensação da grelha:" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "Oitavas" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "Periodo" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17811,11 +17650,11 @@ msgstr "Perspetiva" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "Lacunaridade" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "Sujeito" #: modules/regex/regex.cpp #, fuzzy @@ -17829,15 +17668,15 @@ msgstr "Configuração:" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Descobrir se Multicast" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Descobrir Porta Local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Descobrir IPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17851,7 +17690,7 @@ msgstr "Definir tipo de variável" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "URL de controle IGD" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -17860,7 +17699,7 @@ msgstr "Definir tipo de variável" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD Nosso Endereço" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -18541,7 +18380,7 @@ msgstr "SubCall" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" -msgstr "" +msgstr "Titulo" #: modules/visual_script/visual_script_nodes.cpp msgid "Construct %s" @@ -18611,19 +18450,19 @@ msgstr "Modo Prioridade" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "" +msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h msgid "Max Channel In Buffer (KB)" -msgstr "" +msgstr "Buffer máximo de canal (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" -msgstr "" +msgstr "Verificar SSL" #: modules/websocket/websocket_client.cpp msgid "Trusted SSL Certificate" -msgstr "" +msgstr "Certificado SSL Confiável" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18637,7 +18476,7 @@ msgstr "Tamanho Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" -msgstr "" +msgstr "Máximo de Pacotes de Entrada" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18646,7 +18485,7 @@ msgstr "Tamanho Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "Máximo de Pacotes de Saida" #: modules/websocket/websocket_macros.h #, fuzzy @@ -18655,7 +18494,7 @@ msgstr "Analisador de Rede" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "Associar IP" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18664,7 +18503,7 @@ msgstr "Caminho da Chave Privada SSH" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" -msgstr "" +msgstr "Certificado SSL" #: modules/websocket/websocket_server.cpp #, fuzzy @@ -18692,11 +18531,11 @@ msgstr "Funcionalidades Principais:" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" -msgstr "" +msgstr "Tipos de Espaço de Referência Solicitados" #: modules/webxr/webxr_interface.cpp msgid "Reference Space Type" -msgstr "" +msgstr "Tipo de Espaço de Referência" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18715,7 +18554,7 @@ msgstr "Ajuste Inteligente" #: platform/android/export/export.cpp msgid "Android SDK Path" -msgstr "" +msgstr "Caminho do SDK Android" #: platform/android/export/export.cpp #, fuzzy @@ -18724,35 +18563,35 @@ msgstr "Depurador" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "Depuração do Usuário do Armazenamento de Chaves" #: platform/android/export/export.cpp msgid "Debug Keystore Pass" -msgstr "" +msgstr "Depurar Senha de Armazenamento de Chaves" #: platform/android/export/export.cpp msgid "Force System User" -msgstr "" +msgstr "Forçar Usuário do Sistema" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Desligar o ADB na SaÃda" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "Ãcones do Inicializador" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principal 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Primeiro Plano Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Plano de Fundo Adaptável 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18782,7 +18621,7 @@ msgstr "O pacote deve ter pelo menos um separador '.'." #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" -msgstr "" +msgstr "Usar Compilação Personalizada" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18821,7 +18660,7 @@ msgstr "Senha" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "Implantação com Um Clique" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18830,7 +18669,7 @@ msgstr "Inspecionar instância anterior" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "Código" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18864,7 +18703,7 @@ msgstr "Nome de Classe:" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "Reter Dados na Desinstalação" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18898,11 +18737,11 @@ msgstr "Empacotamento" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Frequência de Rastreamento Manual" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "Atravessar" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18936,7 +18775,7 @@ msgstr "Interface do Utilizador" #: platform/android/export/export_plugin.cpp msgid "Allow" -msgstr "" +msgstr "Permitir" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy @@ -18955,7 +18794,7 @@ msgstr "Expressão" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "Sal" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19086,6 +18925,11 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"Módulo \"GodotPaymentV3\" inválido incluÃdo na configuração do projeto " +"\"android/modules\" (alterado no Godot 3.2.2).\n" +"Substitua-o pelo plug-in primário \"GodotGooglePlayBilling\".\n" +"Observe que o singleton também foi renomeado de \"GodotPayments\" para " +"\"GodotGooglePlayBilling\"." #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -19132,15 +18976,12 @@ msgid "Code Signing" msgstr "Sinal" #: platform/android/export/export_plugin.cpp -#, fuzzy 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' não foi encontrado.\n" -"Verifique se o comando está disponÃvel na diretoria Android SDK build-" -"tools.\n" -"O % resultante não está assinado." +"'apksigner' não foi encontrado. Verifique se o comando está disponÃvel no " +"diretório do Android SDK build-tools. O %s resultante não está assinado." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19155,9 +18996,8 @@ msgid "Could not find keystore, unable to export." msgstr "Incapaz de encontrar keystore e exportar." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Não consegui iniciar o subprocesso!" +msgstr "Não foi possÃvel iniciar o executável apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19189,9 +19029,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Nome de ficheiro inválido! APK Android exige a extensão *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Formato de exportação não suportado!\n" +msgstr "Formato de exportação não suportado!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19202,15 +19041,13 @@ msgstr "" "versão. Reinstale no menu 'Projeto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Incompatibilidade da versão Android:\n" -" Modelo instalado: %s\n" -" Versão Godot: %s\n" -"Reinstale o modelo de compilação Android no menu 'Projeto'." +"Incompatibilidade de versão de compilação do Android: Modelo instalado: %s, " +"versão Godot: %s. Por favor, reinstale o modelo de compilação do Android no " +"menu 'Projeto'." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19221,9 +19058,8 @@ msgstr "" "do projeto" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Incapaz de exportar ficheiros do projeto para projeto gradle\n" +msgstr "Incapaz de exportar ficheiros do projeto para projeto gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19234,14 +19070,13 @@ msgid "Building Android Project (gradle)" msgstr "A compilar Projeto Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Falhou a compilação do projeto Android, verifique o erro na saÃda.\n" -"Em alternativa visite docs.godotengine.org para a documentação sobre " -"compilação Android." +"Falhou a compilação do projeto Android, verifique o erro na saÃda. Em " +"alternativa visite docs.godotengine.org para a documentação sobre compilação " +"Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19265,23 +19100,18 @@ msgid "Creating APK..." msgstr "A criar APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Incapaz de encontrar modelo APK para exportar:\n" -"%s" +msgstr "Incapaz de encontrar modelo APK para exportar: \"%s\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Bibliotecas em falta no modelo de exportação para as arquiteturas " -"selecionadas: %s.\n" -"Construa um modelo com todas as bibliotecas necessárias, ou desmarque as " -"arquiteturas em falta na predefinição de exportação." +"selecionadas: %s. Construa um modelo com todas as bibliotecas necessárias, " +"ou desmarque as arquiteturas em falta no preset de exportação." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -19310,67 +19140,67 @@ msgstr "O carácter \"%s\" não é permitido no Identificador." #: platform/iphone/export/export.cpp msgid "Landscape Launch Screens" -msgstr "" +msgstr "Telas de Inicialização de Paisagem" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" -msgstr "" +msgstr "iPhone 2436 X 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "" +msgstr "iPhone 2208 X 1242" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "" +msgstr "iPad 1024 X 768" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "" +msgstr "iPad 2048 X 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" -msgstr "" +msgstr "Telas de Lançamento de Retrato" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "" +msgstr "iPhone 640 X 960" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "" +msgstr "iPhone 640 X 1136" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "" +msgstr "iPhone 750 X 1334" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "" +msgstr "iPhone 1125 X 2436" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "" +msgstr "iPad 768 X 1024" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "" +msgstr "iPad 1536 X 2048" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "" +msgstr "iPhone 1242 X 2208" #: platform/iphone/export/export.cpp msgid "App Store Team ID" -msgstr "" +msgstr "ID da Equipe na App Store" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Debug" -msgstr "" +msgstr "Depuração de UUID do Perfil de Provisionamento" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Debug" -msgstr "" +msgstr "Depuração de Identidade de Sinal de Código" #: platform/iphone/export/export.cpp #, fuzzy @@ -19379,11 +19209,11 @@ msgstr "Exportar com Depuração" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Release" -msgstr "" +msgstr "Liberação de UUID do Perfil de Provisionamento" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Release" -msgstr "" +msgstr "Liberação de Identidade de Sinal de Código" #: platform/iphone/export/export.cpp #, fuzzy @@ -19392,11 +19222,11 @@ msgstr "Modo exportação:" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" -msgstr "" +msgstr "FamÃlia de Dispositivos Visados" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "Informações" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19440,11 +19270,11 @@ msgstr "Interface do Utilizador" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" -msgstr "" +msgstr "AcessÃvel a partir do Aplicativo de Arquivos" #: platform/iphone/export/export.cpp msgid "Accessible From iTunes Sharing" -msgstr "" +msgstr "AcessÃvel a partir do Compartilhamento do iTunes" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19468,43 +19298,43 @@ msgstr "Descrições da Propriedade" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" -msgstr "" +msgstr "iPhone 120 X 120" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "" +msgstr "iPhone 180 X 180" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "" +msgstr "iPad 76 X 76" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "" +msgstr "iPad 152 X 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "" +msgstr "iPad 167 X 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "App Store 1024 X 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" -msgstr "" +msgstr "Destaque 40 X 40" #: platform/iphone/export/export.cpp msgid "Spotlight 80 X 80" -msgstr "" +msgstr "Destaque 80 X 80" #: platform/iphone/export/export.cpp msgid "Storyboard" -msgstr "" +msgstr "Storyboard" #: platform/iphone/export/export.cpp msgid "Use Launch Screen Storyboard" -msgstr "" +msgstr "Use o Storyboard da Tela de Inicialização" #: platform/iphone/export/export.cpp #, fuzzy @@ -19590,7 +19420,7 @@ msgstr "Incapaz de ler ficheiro:" #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp #, fuzzy @@ -19609,15 +19439,15 @@ msgstr "Expressão" #: platform/javascript/export/export.cpp msgid "For Desktop" -msgstr "" +msgstr "Para Desktop" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "Para Mobile" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp #, fuzzy @@ -19631,15 +19461,15 @@ msgstr "CustomNode" #: platform/javascript/export/export.cpp msgid "Head Include" -msgstr "" +msgstr "Incluir Cabeçalho" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" -msgstr "" +msgstr "PolÃtica de Redimensionamento da Tela" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" -msgstr "" +msgstr "Focar Tela ao Iniciar" #: platform/javascript/export/export.cpp #, fuzzy @@ -19648,23 +19478,23 @@ msgstr "Filtrar sinais" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "" +msgstr "Aplicativo da Web Progressivo" #: platform/javascript/export/export.cpp msgid "Offline Page" -msgstr "" +msgstr "Pagina Offline" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Ãcone 144 X 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Ãcone 180 X 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Ãcone 512 X 512" #: platform/javascript/export/export.cpp #, fuzzy @@ -19683,15 +19513,15 @@ msgstr "Erro ao iniciar servidor HTTP:" #: platform/javascript/export/export.cpp msgid "Web" -msgstr "" +msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "Host HTTP" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Porta HTTP" #: platform/javascript/export/export.cpp #, fuzzy @@ -19700,15 +19530,15 @@ msgstr "Usar Ajuste" #: platform/javascript/export/export.cpp msgid "SSL Key" -msgstr "" +msgstr "Chave SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." -msgstr "" +msgstr "Não é possÃvel obter acesso ao sistema de arquivos." #: platform/osx/export/codesign.cpp msgid "Failed to get Info.plist hash." -msgstr "" +msgstr "Falha ao obter o hash de Info.plist." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19717,7 +19547,7 @@ msgstr "Nome do projeto inválido." #: platform/osx/export/codesign.cpp msgid "Invalid Info.plist, no bundle id." -msgstr "" +msgstr "Info.plist inválido, sem ID de pacote." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19731,7 +19561,7 @@ msgstr "Não consegui criar pasta." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." -msgstr "" +msgstr "Falha ao extrair o binário fino." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19740,7 +19570,7 @@ msgstr "Caminho base inválido." #: platform/osx/export/codesign.cpp msgid "Already signed!" -msgstr "" +msgstr "Já assinado!" #: platform/osx/export/codesign.cpp #, fuzzy @@ -19749,7 +19579,7 @@ msgstr "Falha ao carregar recurso." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." -msgstr "" +msgstr "Falha ao criar a subpasta _CodeSignature." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19768,19 +19598,19 @@ msgstr "Extensão inválida." #: platform/osx/export/codesign.cpp msgid "Can't resize signature load command." -msgstr "" +msgstr "Não é possÃvel redimensionar o comando de carregamento de assinatura." #: platform/osx/export/codesign.cpp msgid "Failed to create fat binary." -msgstr "" +msgstr "Falha ao criar binário gordo." #: platform/osx/export/codesign.cpp msgid "Unknown bundle type." -msgstr "" +msgstr "Tipo de pacote desconhecido." #: platform/osx/export/codesign.cpp msgid "Unknown object type." -msgstr "" +msgstr "Tipo de objeto desconhecido." #: platform/osx/export/export.cpp #, fuzzy @@ -19789,7 +19619,7 @@ msgstr "Categoria:" #: platform/osx/export/export.cpp msgid "High Res" -msgstr "" +msgstr "Alta resolução" #: platform/osx/export/export.cpp #, fuzzy @@ -19798,7 +19628,7 @@ msgstr "Descrição" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Descrição de Uso do Catálogo de Endereços" #: platform/osx/export/export.cpp #, fuzzy @@ -19822,15 +19652,15 @@ msgstr "Descrições do Método" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Descrição do Uso da Pasta de Downloads" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" -msgstr "" +msgstr "Descrição do Uso de Volumes de Rede" #: platform/osx/export/export.cpp msgid "Removable Volumes Usage Description" -msgstr "" +msgstr "Descrição de Uso de Volumes RemovÃveis" #: platform/osx/export/export.cpp platform/windows/export/export.cpp #, fuzzy @@ -19850,7 +19680,7 @@ msgstr "Tempo" #: platform/osx/export/export.cpp msgid "Hardened Runtime" -msgstr "" +msgstr "Tempo de Execução Reforçado" #: platform/osx/export/export.cpp #, fuzzy @@ -19984,9 +19814,8 @@ msgid "Could not open icon file \"%s\"." msgstr "Incapaz de exportar ficheiros do projeto" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Não consegui iniciar o subprocesso!" +msgstr "Não foi possÃvel iniciar o executável xcrun." #: platform/osx/export/export.cpp #, fuzzy @@ -20058,9 +19887,8 @@ msgid "DMG Creation" msgstr "Direções" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Não consegui iniciar o subprocesso!" +msgstr "Não foi possÃvel iniciar o executável hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20139,9 +19967,8 @@ msgid "ZIP Creation" msgstr "Projeto" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Incapaz de exportar ficheiros do projeto para projeto gradle\n" +msgstr "Não foi possÃvel abrir o arquivo para ler do caminho \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -21576,6 +21403,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Editar Conexão:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Distância de escolha:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22858,6 +22697,13 @@ msgstr "" msgid "Transform Normals" msgstr "Normais da Transformação" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27238,6 +27084,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "A gerar AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Compensação:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index df7e56059b..230c927086 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -140,13 +140,14 @@ # blue wemes <bluewemes@gmail.com>, 2022. # José Miranda Neto <dodimi95@gmail.com>, 2022. # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. +# Kaycke <kaycke@ymail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" -"Last-Translator: lucas rossy brasil coelho <lucasrossy270@gmail.com>\n" +"PO-Revision-Date: 2022-06-29 10:04+0000\n" +"Last-Translator: Douglas Leão <djlsplays@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -490,14 +491,12 @@ msgid "Max Size (KB)" msgstr "Tamanho Máximo (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Modo de Movimentação" +msgstr "Modo do cursor" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Deletar Entrada" +msgstr "Usar entrada acumulada" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -713,7 +712,7 @@ msgstr "Nome do Diretório de Usuário Personalizado" #: platform/uwp/os_uwp.cpp #, fuzzy msgid "Display" -msgstr "Exibir Tudo" +msgstr "Exibição" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -727,9 +726,8 @@ msgstr "Largura" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "Luz" +msgstr "Altura" #: core/project_settings.cpp msgid "Always On Top" @@ -738,12 +736,12 @@ msgstr "Sempre no topo" #: core/project_settings.cpp #, fuzzy msgid "Test Width" -msgstr "Largura Esquerda" +msgstr "Largura de teste" #: core/project_settings.cpp #, fuzzy msgid "Test Height" -msgstr "Testando" +msgstr "Teste de altura" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -783,9 +781,8 @@ msgid "Version Control Autoload On Startup" msgstr "Carregamento Automático na Inicialização" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Controle de Versão" +msgstr "Nome do plugin de controle de Versão" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -1084,7 +1081,6 @@ msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" msgstr "Encaixe inteligente" @@ -1118,9 +1114,8 @@ msgid "Max Renderable Lights" msgstr "Máximo de luzes renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Max Renderable Reflections" -msgstr "Seleção Central" +msgstr "Reflexões máximas renderizáveis" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Lights Per Object" @@ -1128,7 +1123,7 @@ msgstr "Máximo de luzes por objeto" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" -msgstr "" +msgstr "Dispersão Subsuperficial" #: drivers/gles3/rasterizer_scene_gles3.cpp editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1149,11 +1144,11 @@ msgstr "Seguir SuperfÃcie" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" -msgstr "" +msgstr "Amostras de Peso" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Rastreamento de Cone Voxel" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1235,9 +1230,8 @@ msgstr "Alterar Chamada da Animação" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Frame %" +msgstr "Quadro" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1248,7 +1242,6 @@ msgstr "Tempo" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" msgstr "Localização" @@ -1264,14 +1257,13 @@ msgid "Value" msgstr "Valor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "Quantidade" +msgstr "Quantia de argumentos" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumentos" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1295,17 +1287,15 @@ msgstr "Definir Manipulador" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "Fluxo" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Deslocamento da Grade:" +msgstr "Iniciar deslocamento" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Deslocamento H" +msgstr "Terminar deslocamento" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1433,14 +1423,12 @@ msgid "Time (s):" msgstr "Tempo (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Posição" +msgstr "Posição:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Rotação" +msgstr "Rotação:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1467,32 +1455,28 @@ msgid "Easing:" msgstr "Facilitar Entrada-SaÃda" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Definir Manipulador" +msgstr "Definir Manipulador:" #: editor/animation_track_editor.cpp #, fuzzy msgid "Out-Handle:" -msgstr "Definir Manipulador" +msgstr "Definir Manipulador:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "Par de stream" +msgstr "Transmissão:" #: editor/animation_track_editor.cpp #, fuzzy msgid "Start (s):" -msgstr "ReinÃcio(s):" +msgstr "InÃcio(s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "[i]Fade In[/i](s):" +msgstr "Final (is):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" msgstr "Animações:" @@ -1731,7 +1715,7 @@ msgstr "Métodos" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bézier" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2321,7 +2305,7 @@ msgstr "Abrir" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "Proprietários de: %s (Total: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2884,22 +2868,19 @@ msgstr "Escolher" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with errors." -msgstr "Copiar Caminho do Nó" +msgstr "ConcluÃdo com erros." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Pacote instalado com sucesso!" +msgstr "ConcluÃdo com sucesso." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Falhou:" +msgstr "Falhou." #: editor/editor_export.cpp msgid "Storing File:" @@ -2924,14 +2905,12 @@ msgid "Cannot create file \"%s\"." msgstr "Não foi possÃvel criar a pasta." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Não foi possÃvel exportar os arquivos do projeto" +msgstr "Falha ao exportar arquivos do projeto." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Não é possÃvel abrir arquivo para escrita:" +msgstr "Não é possÃvel abrir arquivo para leitura a partir do caminho \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3014,11 +2993,11 @@ msgstr "Formato Binário" #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 Bits" #: editor/editor_export.cpp msgid "Embed PCK" -msgstr "" +msgstr "Incorporar PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy @@ -3027,19 +3006,19 @@ msgstr "Região da Textura" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy @@ -3064,19 +3043,16 @@ msgid "Prepare Template" msgstr "Gerenciar Templates" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "O caminho de exportação informado não existe:" +msgstr "O caminho de exportação informado não existe." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Arquivo de modelo não encontrado:" +msgstr "Arquivo de modelo não encontrado: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Template de exportação inválido:" +msgstr "Falha ao copiar o modelo de exportação." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -3090,7 +3066,7 @@ msgstr "Em exportações de 32 bits, o PCK embutido não pode ser maior que 4GB. #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "Converter Recursos de Texto para Binário na Exportação" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3411,7 +3387,7 @@ msgstr "Mostrar Arquivos Ocultos" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" -msgstr "" +msgstr "Desativar Aviso de Substituição" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3514,7 +3490,7 @@ msgstr "(Re)Importando Assets" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "Reimportar Arquivos Importados Ausentes" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3625,7 +3601,7 @@ msgstr "Ajuda" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "Classificar Funções em Ordem Alfabética" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -4412,6 +4388,8 @@ msgstr "%d mais arquivo(s)" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" +"Não foi possÃvel gravar no arquivo '%s', arquivo em uso, bloqueado ou sem " +"permissões." #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp @@ -4429,11 +4407,11 @@ msgstr "Sempre Mostrar Grade" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "Redimensionar se houver muitas guias" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "" +msgstr "Largura MÃnima" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" @@ -4446,15 +4424,15 @@ msgstr "Limpar SaÃda" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "" +msgstr "Sempre abrir a saÃda ao jogar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" -msgstr "" +msgstr "Sempre fechar a saÃda ao parar" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "Salvar em caso de perda de foco" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4489,7 +4467,7 @@ msgstr "Restaurar Cenas ao Carregar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "Mostrar miniatura ao passar o mouse" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4502,7 +4480,7 @@ msgstr "Caminho Padrão do Projeto" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "" +msgstr "Passo de ponto flutuante padrão" #: editor/editor_node.cpp scene/gui/tree.cpp #, fuzzy @@ -4511,11 +4489,11 @@ msgstr "Botão Desativado" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" -msgstr "" +msgstr "Desdobrar cenas estrangeiras automaticamente" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Edição Horizontal do Vector2" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" @@ -4689,7 +4667,7 @@ msgstr "Sair para a Lista de Projetos" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "Distribuir com Depuragem Remota" +msgstr "Implantar com Depuração Remota" #: editor/editor_node.cpp msgid "" @@ -8130,11 +8108,20 @@ msgid "New Anim" msgstr "Nova Animação" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Criar Nova Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Alterar Nome da Animação:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Renomear Animação" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Excluir Animação?" @@ -8152,11 +8139,6 @@ msgid "Animation name already exists!" msgstr "O nome da animação já existe!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Renomear Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicar Animação" @@ -8303,10 +8285,6 @@ msgid "Pin AnimationPlayer" msgstr "Fixar AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Criar Nova Animação" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nome da Animação:" @@ -10882,7 +10860,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp msgid "Search Results" -msgstr "Pesquisar resultados" +msgstr "Resultados de Pesquisa" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" @@ -13246,15 +13224,15 @@ msgstr "Nenhuma mensagem de commit foi fornecida." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" -msgstr "Confirmação" +msgstr "Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Staged Changes" -msgstr "Mudanças em fases" +msgstr "Alterações Preparadas" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unstaged Changes" -msgstr "Mudanças Não Fásicas" +msgstr "Alterações não Preparadas" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit:" @@ -13318,7 +13296,7 @@ msgstr "Preparar todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unstage all changes" -msgstr "Desfaça todas as alterações" +msgstr "Desfazer todas as alterações" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Message" @@ -13326,15 +13304,15 @@ msgstr "Mensagem de Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" -msgstr "Confirmar Mudanças" +msgstr "Criar Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit List" -msgstr "Lista de compromissos" +msgstr "Lista de Commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "Confirmar tamanho da lista" +msgstr "Tamanho da lista de commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branches" @@ -14439,7 +14417,6 @@ msgid "Export PCK/Zip..." msgstr "Exportar PCK/Zip..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." msgstr "Exportar Projeto…" @@ -14452,7 +14429,6 @@ msgid "Choose an export mode:" msgstr "Escolha um modo de exportação:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." msgstr "Exportar tudo…" @@ -15192,7 +15168,7 @@ msgstr "Plugins" #: editor/project_settings_editor.cpp msgid "Import Defaults" -msgstr "Importar padrões" +msgstr "Padrões de Importação" #: editor/property_editor.cpp msgid "Preset..." @@ -16019,9 +15995,8 @@ msgid "Attach Node Script" msgstr "Adicionar Script ao Nó" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "Remoto %s:" +msgstr "%s remoto:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -18510,9 +18485,8 @@ msgstr "Redimensionar Vetor" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Iterador" +msgstr "Operador" #: modules/visual_script/visual_script_nodes.cpp msgid "Invalid argument of type:" @@ -19247,9 +19221,8 @@ msgid "Could not find keystore, unable to export." msgstr "O keystore não foi encontrado, não foi possÃvel exportar." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Não se pôde iniciar sub-processo!" +msgstr "Não foi possÃvel iniciar o executável apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19293,15 +19266,13 @@ msgstr "" "'Projeto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Diferença na versão da build do Android:\n" -" Modelo instalado: %s\n" -" Versão do Godot: %s\n" -"Por favor reinstale o modelo de compilação do Android pelo menu 'Projeto'." +"Diferença na versão da build do Android: Modelo instalado: %s, Versão do " +"Godot: %s. Por favor reinstale o modelo de compilação do Android pelo menu " +"'Projeto'." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19326,14 +19297,13 @@ msgid "Building Android Project (gradle)" msgstr "Construindo Projeto Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"A construção do projeto Android falhou, verifique a saÃda para detalhes.\n" -"Alternativamente, visite docs.godotengine.org para ver a documentação de " -"compilação do Android." +"A compilação do projeto Android falhou, verifique a saÃda para detalhes. Ou " +"então visite docs.godotengine.org para ver a documentação de compilação do " +"Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19348,41 +19318,35 @@ msgstr "" "diretório do projeto gradle por saÃdas." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Pacote não encontrado: '%s'" +msgstr "Pacote não encontrado: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Criando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Não foi possÃvel encontrar o modelo de APK para exportar:\n" -"%s" +msgstr "Não foi possÃvel encontrar o modelo de APK para exportação: %s." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Faltam bibliotecas no modelo de exportação para as arquiteturas " -"selecionadas: %s.\n" -"Crie um modelo com todas as bibliotecas necessárias ou desmarque as " -"arquiteturas ausentes na predefinição de exportação." +"selecionadas: %s. Por favor, crie um modelo com todas as bibliotecas " +"necessárias ou desmarque as arquiteturas ausentes na predefinição de " +"exportação." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Adicionando arquivos..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Não foi possÃvel exportar os arquivos do projeto" +msgstr "Não foi possÃvel exportar os arquivos do projeto." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19653,9 +19617,8 @@ msgid "Run exported HTML in the system's default browser." msgstr "Rodar HTML exportado no navegador padrão do sistema." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Não foi possÃvel abrir o modelo para exportar:" +msgstr "Não foi possÃvel abrir o modelo para exportação: \"%s\"." #: platform/javascript/export/export.cpp #, fuzzy @@ -19673,9 +19636,8 @@ msgid "Icon Creation" msgstr "Definir Margem" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Não foi possÃvel ler o arquivo:" +msgstr "Não foi possÃvel ler o arquivo: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19755,9 +19717,8 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Não foi possÃvel ler o shell HTML:" +msgstr "Não foi possÃvel ler o shell HTML: \"%s\"." #: platform/javascript/export/export.cpp #, fuzzy @@ -19765,9 +19726,8 @@ msgid "Could not create HTTP server directory: %s." msgstr "Não foi possÃvel criar o diretório do servidor HTTP:" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Erro ao iniciar servidor HTTP:" +msgstr "Erro ao iniciar o servidor HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -20066,19 +20026,16 @@ msgid "Apple Team ID" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Não foi possÃvel exportar os arquivos do projeto" +msgstr "Não foi possÃvel abrir o arquivo de Ãcone \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Não se pôde iniciar sub-processo!" +msgstr "Não foi possÃvel iniciar o executável xcrun." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Localização" +msgstr "Falha na notarização." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20145,9 +20102,8 @@ msgid "DMG Creation" msgstr "Direções" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Não se pôde iniciar sub-processo!" +msgstr "Não foi possÃvel iniciar o executável hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20163,14 +20119,13 @@ msgid "Creating app bundle" msgstr "Criando Miniatura" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Não foi possÃvel encontrar o aplicativo de modelo para exportar:" +msgstr "" +"Não foi possÃvel encontrar o aplicativo de modelo para exportar: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Template de exportação inválido:" +msgstr "Formato de exportação inválido." #: platform/osx/export/export.cpp msgid "" @@ -20226,10 +20181,9 @@ msgid "ZIP Creation" msgstr "Projeção" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." msgstr "" -"Não foi possÃvel exportar os arquivos do projeto ao projeto do gradle\n" +"Não foi possÃvel abrir o arquivo para leitura a partir do caminho \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20638,9 +20592,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "O keystore não foi encontrado, não foi possÃvel exportar." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "O nome não é um identificador válido:" +msgstr "Tipo de identidade inválido." #: platform/windows/export/export.cpp #, fuzzy @@ -20660,9 +20613,8 @@ msgid "" msgstr "" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Não é possÃvel remover o arquivo temporário:" +msgstr "Falha ao remover o arquivo temporário \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -21644,6 +21596,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Margem de Ligação da Borda" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Distância do Caminho U" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22882,6 +22846,13 @@ msgstr "" msgid "Transform Normals" msgstr "Normais de Transformação" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27155,9 +27126,8 @@ msgid "Source Geometry Mode" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Source Group Name" -msgstr "Origem" +msgstr "Origem do Nome do Grupo" #: scene/resources/navigation_mesh.cpp msgid "Cells" @@ -27226,6 +27196,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Gerando AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Deslocamento Base" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index b6b92325e4..ddc340697c 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -8086,11 +8086,20 @@ msgid "New Anim" msgstr "Anim Nouă" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Creează AnimaÈ›ie Nouă" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Schimbă Numele AnimaÈ›iei:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "RedenumeÈ™te AnimaÈ›ia" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Ștergi AnimaÈ›ia?" @@ -8110,11 +8119,6 @@ msgid "Animation name already exists!" msgstr "EROARE: Numele animaÈ›iei există deja!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "RedenumeÈ™te AnimaÈ›ia" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicare AnimaÈ›ie" @@ -8262,10 +8266,6 @@ msgid "Pin AnimationPlayer" msgstr "LipeÈ™te AnimaÈ›ie" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Creează AnimaÈ›ie Nouă" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Nume AnimaÈ›ie:" @@ -21688,6 +21688,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Modifică Conexiunea:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Alege o Scenă Principală" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22899,6 +22911,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformare uniformă." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27139,6 +27158,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Generare AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Compensare Grilă:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index b920136351..755683fdf0 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -7919,11 +7919,20 @@ msgid "New Anim" msgstr "ÐÐ¾Ð²Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Создать новую анимацию" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Изменить Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Переименовать анимацию" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Удалить анимацию?" @@ -7941,11 +7950,6 @@ msgid "Animation name already exists!" msgstr "Такое название анимации уже ÑущеÑтвует!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Переименовать анимацию" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Дублировать анимацию" @@ -8091,10 +8095,6 @@ msgid "Pin AnimationPlayer" msgstr "Закрепить анимацию игрока" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Создать новую анимацию" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Ðазвание анимации:" @@ -21284,6 +21284,18 @@ msgstr "Размер Ñчейки" msgid "Edge Connection Margin" msgstr "Пограничное Ñоединение" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "РаÑÑтоÑние пути U" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22527,6 +22539,13 @@ msgstr "" msgid "Transform Normals" msgstr "Преобразование нормалей" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26845,6 +26864,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Базовое Ñмещение" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "Сферы" diff --git a/editor/translations/si.po b/editor/translations/si.po index d28d0a4f81..2e5042392f 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -7672,11 +7672,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7694,11 +7703,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7841,10 +7845,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20507,6 +20507,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "à·à·Šâ€à¶»à·’à¶:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21638,6 +21649,13 @@ msgstr "" msgid "Transform Normals" msgstr "3D රූපà·à¶±à·Šà¶à¶»à¶«à¶º ලුහුබදින්න" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25606,6 +25624,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 6615ae93a0..9e18f67b73 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -8107,11 +8107,20 @@ msgid "New Anim" msgstr "Nová Animácia" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "VytvoriÅ¥ Novú Animáciu" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "ZmeniÅ¥ Meno Animácie:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "PremenovaÅ¥ Animáciu" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Naozaj chcete vymazaÅ¥ Animáciu?" @@ -8129,11 +8138,6 @@ msgid "Animation name already exists!" msgstr "Toto meno Animácie už existuje!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "PremenovaÅ¥ Animáciu" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "DuplikovaÅ¥ Animáciu" @@ -8276,10 +8280,6 @@ msgid "Pin AnimationPlayer" msgstr "Pripnúť PrehrávaÄ Animácie" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "VytvoriÅ¥ Novú Animáciu" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Meno Animácie:" @@ -21618,6 +21618,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "UpraviÅ¥ Pripojenie:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Vyberte hlavnú scénu" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22830,6 +22842,13 @@ msgstr "" msgid "Transform Normals" msgstr "VytvoriÅ¥ adresár" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27063,6 +27082,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Odchýlka Mriežky:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index acb24489bd..b796c872f7 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -13,13 +13,14 @@ # Alex <alexrixhardson@gmail.com>, 2019. # Andrew Poženel <andrej.pozenel@outlook.com>, 2020, 2022. # Jakob Tadej VrtaÄnik <minecraftalka2@gmail.com>, 2021. +# Andrew Poženel <andrew.pozenel@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-04 10:56+0000\n" -"Last-Translator: Andrew Poženel <andrej.pozenel@outlook.com>\n" +"PO-Revision-Date: 2022-06-23 16:41+0000\n" +"Last-Translator: Andrew Poženel <andrew.pozenel@protonmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/" "godot/sl/>\n" "Language: sl\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -411,9 +412,8 @@ msgid "Pressed" msgstr "Prednastavitev..." #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "Preglej" +msgstr "Skenirna koda" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -421,7 +421,7 @@ msgstr "" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -884,7 +884,7 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -3868,7 +3868,7 @@ msgstr "" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: scene/main/node.cpp scene/resources/default_theme/default_theme.cpp msgid "Node" -msgstr "Gradnik" +msgstr "VozliÅ¡Äe" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -7220,7 +7220,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp msgid "Slices" @@ -8232,11 +8232,20 @@ msgid "New Anim" msgstr "Nova Animacija" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Ustvari Novo Animacijo" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Spremeni Ime Animacije:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Preimenuj Animacijo" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "IzbriÅ¡em animacijo?" @@ -8256,11 +8265,6 @@ msgid "Animation name already exists!" msgstr "NAPAKA: Animacija s tem imenom že obstaja!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Preimenuj Animacijo" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Podvoji Animacijo" @@ -8409,10 +8413,6 @@ msgid "Pin AnimationPlayer" msgstr "Prilepi animacijo" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Ustvari Novo Animacijo" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Ime Animacije:" @@ -9834,7 +9834,7 @@ msgstr "" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "" +msgstr "Raven 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -10062,7 +10062,7 @@ msgstr "" #: scene/resources/multimesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/texture.cpp msgid "Mesh" -msgstr "" +msgstr "Geometrijski objekt" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -10965,7 +10965,7 @@ msgstr "PrejÅ¡nji zavihek" #: editor/plugins/script_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp msgid "File" -msgstr "" +msgstr "Datoteka" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -11421,7 +11421,7 @@ msgstr "Zaženi" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "Ortogonalno" #: editor/plugins/spatial_editor_plugin.cpp modules/gltf/gltf_camera.cpp msgid "Perspective" @@ -11587,7 +11587,7 @@ msgstr "Lastnosti" #: editor/plugins/spatial_editor_plugin.cpp msgid "FPS: %d (%s ms)" -msgstr "" +msgstr "FPS: %d (%s ms)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -13649,7 +13649,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "geslo SSH" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -18664,7 +18664,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Medtem ko" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18995,7 +18995,7 @@ msgstr "Odstrani Gradnik VizualnaSkripta" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "" +msgstr "Donos" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -21913,6 +21913,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Napaka Pri Povezavi" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Izberi Glavno Sceno" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -23122,6 +23134,13 @@ msgstr "" msgid "Transform Normals" msgstr "Preoblikovanje Dialoga..." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26893,7 +26912,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "" +msgstr "UÄinek žarenja" #: scene/resources/environment.cpp msgid "HDR Threshold" @@ -27353,6 +27372,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Mrežni Zamik:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index c97aac239a..ae64fa2e6f 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -8093,11 +8093,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -8115,11 +8124,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8262,10 +8266,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21350,6 +21350,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Modifiko Lidhjen: " +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Zgjidh një Skenë Kryesore" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22513,6 +22525,13 @@ msgstr "" msgid "Transform Normals" msgstr "Binari i Transformimeve 3D" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26636,6 +26655,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Ndrysho Tipin e %s" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 55387743e7..89a0067fe9 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -8584,11 +8584,20 @@ msgid "New Anim" msgstr "Ðова анимација" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Ðаправи нову анимацију" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Измени име анимације:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Преименуј анимацију" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Обриши анимацију?" @@ -8608,11 +8617,6 @@ msgid "Animation name already exists!" msgstr "Грешка: име анимације већ поÑтоји!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Преименуј анимацију" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Дуплирај анимацију" @@ -8762,10 +8766,6 @@ msgid "Pin AnimationPlayer" msgstr "Ðалепи анимацију" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Ðаправи нову анимацију" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Име анимације:" @@ -23365,6 +23365,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Повезивање не уÑпешно" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Одабери ОдÑтојање:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -24678,6 +24690,13 @@ msgstr "" msgid "Transform Normals" msgstr "ТранÑформација прекинута." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -29061,6 +29080,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "ГенериÑање оÑног поравнаног граничниог оквира (AABB)" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "ОфÑет:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 21d94999a2..844e918f2d 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -7695,11 +7695,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7717,11 +7726,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7864,10 +7868,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20611,6 +20611,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Izmeni Konekciju:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21765,6 +21776,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformacija homogenosti." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25807,6 +25825,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "ObriÅ¡i Selekciju" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 54655bcecf..61e607d63d 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -8159,11 +8159,20 @@ msgid "New Anim" msgstr "Ny Anim" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Skapa Ny Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Ändra Animationsnamn:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Byt namn pÃ¥ Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Ta bort Animation?" @@ -8183,11 +8192,6 @@ msgid "Animation name already exists!" msgstr "ERROR: Animationsnamn finns redan!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Byt namn pÃ¥ Animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Duplicera Animation" @@ -8335,10 +8339,6 @@ msgid "Pin AnimationPlayer" msgstr "Klistra in Animation" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Skapa Ny Animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21687,6 +21687,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Redigera Koppling:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Välj en Huvudscen" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22906,6 +22918,13 @@ msgstr "" msgid "Transform Normals" msgstr "Transformera uniform." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27128,6 +27147,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Ta Bort Mall" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 7e39aed20c..431febd63c 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -7546,11 +7546,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7568,11 +7577,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7715,10 +7719,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20188,6 +20188,17 @@ msgstr "" msgid "Edge Connection Margin" msgstr "" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +msgid "Path Desired Distance" +msgstr "" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -21284,6 +21295,13 @@ msgstr "" msgid "Transform Normals" msgstr "" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -25064,6 +25082,14 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB Offset" +msgstr "" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index cf482896d4..df7f3a8c04 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -8119,11 +8119,20 @@ msgid "New Anim" msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "สร้างà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "ลบà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™?" @@ -8141,11 +8150,6 @@ msgid "Animation name already exists!" msgstr "ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à¸µà¹‰ มีà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "ทำซ้ำà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" @@ -8289,10 +8293,6 @@ msgid "Pin AnimationPlayer" msgstr "ปัà¸à¸«à¸¡à¸¸à¸” AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "สร้างà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" @@ -21698,6 +21698,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "ระยะà¸à¸²à¸£à¹€à¸¥à¸·à¸à¸:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22953,6 +22965,13 @@ msgstr "" msgid "Transform Normals" msgstr "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27291,6 +27310,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡ AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "เลื่à¸à¸™:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index 963d542e6d..f67f19ad11 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -7848,11 +7848,20 @@ msgid "New Anim" msgstr "Bagong Anim" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Gumawa ng Bagong Animasyon" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Baguhin ang Pangalan ng Animasyon:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Palitan ang Pangalan ng Animation" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Alisin ang Animation?" @@ -7870,11 +7879,6 @@ msgid "Animation name already exists!" msgstr "May nakapangalan na parehas sa Animation na ito!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Palitan ang Pangalan ng Animation" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8017,10 +8021,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Gumawa ng Bagong Animasyon" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Pangalan ng Animasyon:" @@ -20909,6 +20909,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Ayusin Ang Pagkakabit:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Pumili ng Pangunahing Eksena" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22099,6 +22111,13 @@ msgstr "" msgid "Transform Normals" msgstr "Track na Pang-3D Transform" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -26291,6 +26310,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Usog:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index ea437aaf30..89854afb02 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -72,13 +72,14 @@ # Emir Tunahan Alim <emrtnhalim@gmail.com>, 2022. # inci <incialien@gmail.com>, 2022. # Ramazan Aslan <legendraslan@gmail.com>, 2022. +# paledega <paledega@yandex.ru>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-12 13:19+0000\n" -"Last-Translator: Ramazan Aslan <legendraslan@gmail.com>\n" +"PO-Revision-Date: 2022-06-26 16:16+0000\n" +"Last-Translator: paledega <paledega@yandex.ru>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -86,7 +87,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -110,7 +111,7 @@ msgstr "V-Sync EtkinleÅŸtirildi" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "Compositor Üzerinden V-Sync" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" @@ -467,8 +468,9 @@ msgid "Pressed" msgstr "Basılmış" #: core/os/input_event.cpp +#, fuzzy msgid "Scancode" -msgstr "TuÅŸ Kodu" +msgstr "Tarama kodu" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -909,6 +911,7 @@ msgid "Modules" msgstr "Modüller" #: core/register_core_types.cpp +#, fuzzy msgid "TCP" msgstr "TCP" @@ -1109,7 +1112,7 @@ msgstr "" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Ücretsiz" +msgstr "Özgür" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -8115,11 +8118,20 @@ msgid "New Anim" msgstr "Yeni Animasyon" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Yeni Animasyon OluÅŸtur" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Animasyon İsmini DeÄŸiÅŸtir:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Animasyonu Yeniden Adlandır" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Animasyon Silinsin mi?" @@ -8137,11 +8149,6 @@ msgid "Animation name already exists!" msgstr "Animasyon ismi zaten var!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Animasyonu Yeniden Adlandır" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Animasyonu ÇoÄŸalt" @@ -8285,10 +8292,6 @@ msgid "Pin AnimationPlayer" msgstr "Animasyon Oynatıcıyı Sabitle" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Yeni Animasyon OluÅŸtur" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Animasyon Adı:" @@ -13290,6 +13293,7 @@ msgid "Select SSH private key path" msgstr "SSH özel anahtar yolu seç" #: editor/plugins/version_control_editor_plugin.cpp +#, fuzzy msgid "SSH Passphrase" msgstr "SSH Parolası" @@ -21654,6 +21658,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "BaÄŸlantıyı Düzenle:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Uzaklık Seç:" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22941,6 +22957,13 @@ msgstr "" msgid "Transform Normals" msgstr "Dönüşüm Durduruldu." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27324,6 +27347,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "AABB Üretimi" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Kaydırma:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 6d96ccc30b..719dc29d7a 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -7841,11 +7841,20 @@ msgid "New Anim" msgstr "Ðова анімаціÑ" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Створити нову анімацію" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Змінити ім'Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Перейменувати анімацію" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Видалити анімацію?" @@ -7863,11 +7872,6 @@ msgid "Animation name already exists!" msgstr "ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ–Ð· такою назвою вже Ñ–Ñнує!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Перейменувати анімацію" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Дублювати анімацію" @@ -8011,10 +8015,6 @@ msgid "Pin AnimationPlayer" msgstr "Пришпилити AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Створити нову анімацію" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Ðазва анімації:" @@ -21027,6 +21027,18 @@ msgstr "Розмір комірки" msgid "Edge Connection Margin" msgstr "Поле з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ€ÐµÐ±ÐµÑ€" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "U-відÑтань контуру" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22187,6 +22199,13 @@ msgstr "" msgid "Transform Normals" msgstr "Перетворити нормалі" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "Вектор" @@ -26093,6 +26112,16 @@ msgstr "Розміри планки" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Базове зміщеннÑ" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 79cb7b84e2..76cd6b6495 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -7799,11 +7799,20 @@ msgid "New Anim" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "" @@ -7821,11 +7830,6 @@ msgid "Animation name already exists!" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -7969,10 +7973,6 @@ msgid "Pin AnimationPlayer" msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -20963,6 +20963,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr ".تمام کا انتخاب" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "ایک مینو منظر چنیں" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22114,6 +22126,13 @@ msgstr "" msgid "Transform Normals" msgstr "سب سکریپشن بنائیں" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "" @@ -26143,6 +26162,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr ".تمام کا انتخاب" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index a16d75a4bc..2b4093cc17 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -7953,11 +7953,20 @@ msgid "New Anim" msgstr "Hoạt ảnh má»›i" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Tạo Hoạt ảnh má»›i" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "Äổi tên Hoạt ảnh:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Äổi tên hoạt hình" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "Xoá hoạt hình?" @@ -7975,11 +7984,6 @@ msgid "Animation name already exists!" msgstr "Tên Hoạt ảnh đã tồn tại!" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "Äổi tên hoạt hình" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "Nhân đôi hoạt hình" @@ -8124,10 +8128,6 @@ msgid "Pin AnimationPlayer" msgstr "Ghim AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "Tạo Hoạt ảnh má»›i" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "Tên hoạt hình:" @@ -21559,6 +21559,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "Chỉnh sá»a kết nối:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "Chá»n ô" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22819,6 +22831,13 @@ msgstr "" msgid "Transform Normals" msgstr "Há»§y Biến đổi." +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27106,6 +27125,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "Äang sinh AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "Äá»™ dá»i:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index ea23349421..4a15f6acf3 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -89,7 +89,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-06-19 11:52+0000\n" +"PO-Revision-Date: 2022-06-20 06:44+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -716,14 +716,12 @@ msgid "Script Templates Search Path" msgstr "è„šæœ¬æ¨¡æ¿æœç´¢è·¯å¾„" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨åŠ è½½" +msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨åŠ è½½ç‰ˆæœ¬æŽ§åˆ¶" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "版本控制" +msgstr "版本控制æ’ä»¶å" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -2788,7 +2786,6 @@ msgid "Completed with errors." msgstr "已完æˆï¼Œå˜åœ¨é”™è¯¯ã€‚" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." msgstr "æˆåŠŸå®Œæˆã€‚" @@ -7738,11 +7735,20 @@ msgid "New Anim" msgstr "新建动画" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "创建新动画" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "修改动画å称:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "é‡å‘½å动画" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "是å¦åˆ 除动画?" @@ -7760,11 +7766,6 @@ msgid "Animation name already exists!" msgstr "动画åç§°å·²å˜åœ¨ï¼" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "é‡å‘½å动画" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "å¤åˆ¶åŠ¨ç”»" @@ -7907,10 +7908,6 @@ msgid "Pin AnimationPlayer" msgstr "固定 AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "创建新动画" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "动画å称:" @@ -20564,6 +20561,18 @@ msgstr "å•å…ƒæ ¼å¤§å°" msgid "Edge Connection Margin" msgstr "边界连接边è·" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "ç›®æ ‡æœŸæœ›è·ç¦»" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "ç›®æ ‡æœŸæœ›è·ç¦»" @@ -21684,6 +21693,13 @@ msgstr "软件蒙皮" msgid "Transform Normals" msgstr "å˜æ¢æ³•线" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" msgstr "上å‘é‡" @@ -25465,6 +25481,16 @@ msgstr "凸å°èŒƒå›´" msgid "Walkable Low Height Spans" msgstr "å¯è¡Œèµ°ä½Žé«˜åº¦èŒƒå›´" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "æ£åœ¨ç”Ÿæˆ AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "基础åç§»" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "çƒä½“" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 01c72c6ee1..114f6b0a45 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -8183,11 +8183,20 @@ msgid "New Anim" msgstr "新增動畫" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "更改動畫å稱:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "釿–°å‘½åå‹•ç•«" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "刪除動畫?" @@ -8207,11 +8216,6 @@ msgid "Animation name already exists!" msgstr "錯誤:動畫å稱已å˜åœ¨ï¼" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "釿–°å‘½åå‹•ç•«" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "" @@ -8363,10 +8367,6 @@ msgid "Pin AnimationPlayer" msgstr "貼上動畫" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "" @@ -21801,6 +21801,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "編輯連接" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "鏿“‡ä¸»å ´æ™¯" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22988,6 +23000,13 @@ msgstr "" msgid "Transform Normals" msgstr "縮放selection" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27170,6 +27189,15 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +msgid "Baking AABB" +msgstr "" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "移除é¸é …" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index be888529cc..bcf6650997 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -8040,11 +8040,20 @@ msgid "New Anim" msgstr "新增動畫" #: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "建立新動畫" + +#: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" msgstr "更改動畫å稱:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "釿–°å‘½åå‹•ç•«" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Animation?" msgstr "是å¦åˆªé™¤å‹•畫?" @@ -8062,11 +8071,6 @@ msgid "Animation name already exists!" msgstr "å‹•ç•«å稱已å˜åœ¨ï¼" #: editor/plugins/animation_player_editor_plugin.cpp -#: editor/plugins/sprite_frames_editor_plugin.cpp -msgid "Rename Animation" -msgstr "釿–°å‘½åå‹•ç•«" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" msgstr "é‡è¤‡å‹•ç•«" @@ -8210,10 +8214,6 @@ msgid "Pin AnimationPlayer" msgstr "固定 AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp -msgid "Create New Animation" -msgstr "建立新動畫" - -#: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" msgstr "å‹•ç•«å稱:" @@ -21463,6 +21463,18 @@ msgstr "" msgid "Edge Connection Margin" msgstr "編輯連接內容:" +#: scene/2d/navigation_2d.cpp +msgid "" +"'Navigation2D' node and 'Navigation2D.get_simple_path()' are deprecated and " +"will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " +"instead." +msgstr "" + +#: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp +#, fuzzy +msgid "Path Desired Distance" +msgstr "鏿“‡è·é›¢ï¼š" + #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "" @@ -22720,6 +22732,13 @@ msgstr "" msgid "Transform Normals" msgstr "已䏿¢è®Šæ›ã€‚" +#: scene/3d/navigation.cpp +msgid "" +"'Navigation' node and 'Navigation.get_simple_path()' are deprecated and will " +"be removed in a future version. Use 'NavigationServer.map_get_path()' " +"instead." +msgstr "" + #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy msgid "Up Vector" @@ -27081,6 +27100,16 @@ msgstr "" msgid "Walkable Low Height Spans" msgstr "" +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB" +msgstr "æ£åœ¨ç”¢ç”Ÿ AABB" + +#: scene/resources/navigation_mesh.cpp +#, fuzzy +msgid "Baking AABB Offset" +msgstr "å移:" + #: scene/resources/occluder_shape.cpp msgid "Spheres" msgstr "" diff --git a/main/main.cpp b/main/main.cpp index bfb0eacdfc..00b7483406 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -175,6 +175,7 @@ static Vector2 init_custom_pos; static bool use_debug_profiler = false; #ifdef DEBUG_ENABLED static bool debug_collisions = false; +static bool debug_paths = false; static bool debug_navigation = false; #endif static int frame_delay = 0; @@ -357,6 +358,7 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" --remote-debug <uri> Remote debug (<protocol>://<host/IP>[:<port>], e.g. tcp://127.0.0.1:6007).\n"); #if defined(DEBUG_ENABLED) OS::get_singleton()->print(" --debug-collisions Show collision shapes when running the scene.\n"); + OS::get_singleton()->print(" --debug-paths Show path lines when running the scene.\n"); OS::get_singleton()->print(" --debug-navigation Show navigation polygons when running the scene.\n"); OS::get_singleton()->print(" --debug-stringnames Print all StringName allocations to stdout when the engine quits.\n"); #endif @@ -671,6 +673,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph packed_data->add_pack_source(zip_packed_data); #endif + // Default exit code, can be modified for certain errors. + Error exit_code = ERR_INVALID_PARAMETER; + I = args.front(); while (I) { #ifdef OSX_ENABLED @@ -686,10 +691,12 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph if (I->get() == "-h" || I->get() == "--help" || I->get() == "/?") { // display help show_help = true; + exit_code = OK; goto error; } else if (I->get() == "--version") { print_line(get_full_version_string()); + exit_code = OK; goto error; } else if (I->get() == "-v" || I->get() == "--verbose") { // verbose output @@ -1107,6 +1114,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph #if defined(DEBUG_ENABLED) } else if (I->get() == "--debug-collisions") { debug_collisions = true; + } else if (I->get() == "--debug-paths") { + debug_paths = true; } else if (I->get() == "--debug-navigation") { debug_navigation = true; } else if (I->get() == "--debug-stringnames") { @@ -1632,7 +1641,7 @@ error: OS::get_singleton()->finalize_core(); locale = String(); - return ERR_INVALID_PARAMETER; + return exit_code; } Error Main::setup2(Thread::ID p_main_tid_override) { @@ -2375,6 +2384,9 @@ bool Main::start() { if (debug_collisions) { sml->set_debug_collisions_hint(true); } + if (debug_paths) { + sml->set_debug_paths_hint(true); + } if (debug_navigation) { sml->set_debug_navigation_hint(true); } diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index 1daf8ff7a9..6055d3df33 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -1059,22 +1059,22 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code bool known_type = assigned.type.has_type; bool is_shared = Variant::is_type_shared(assigned.type.builtin_type); - if (!known_type) { - // Jump shared values since they are already updated in-place. - gen->write_jump_if_shared(assigned); - } - if (known_type && !is_shared) { + if (!known_type || !is_shared) { + if (!known_type) { + // Jump shared values since they are already updated in-place. + gen->write_jump_if_shared(assigned); + } if (!info.is_named) { gen->write_set(info.base, info.key, assigned); - if (info.key.mode == GDScriptCodeGenerator::Address::TEMPORARY) { - gen->pop_temporary(); - } } else { gen->write_set_named(info.base, info.name, assigned); } + if (!known_type) { + gen->write_end_jump_if_shared(); + } } - if (!known_type) { - gen->write_end_jump_if_shared(); + if (!info.is_named && info.key.mode == GDScriptCodeGenerator::Address::TEMPORARY) { + gen->pop_temporary(); } if (assigned.mode == GDScriptCodeGenerator::Address::TEMPORARY) { gen->pop_temporary(); diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 9e347eed5a..ca430b0f72 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -3605,8 +3605,12 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node variable->export_info.type = Variant::OBJECT; variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; variable->export_info.hint_string = export_type.native_type; + } else if (ClassDB::is_parent_class(export_type.native_type, SNAME("Node"))) { + variable->export_info.type = Variant::OBJECT; + variable->export_info.hint = PROPERTY_HINT_NODE_TYPE; + variable->export_info.hint_string = export_type.native_type; } else { - push_error(R"(Export type can only be built-in, a resource, or an enum.)", variable); + push_error(R"(Export type can only be built-in, a resource, a node, or an enum.)", variable); return false; } break; diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp index 16a8e728e4..1d56dae982 100644 --- a/modules/gdscript/gdscript_vm.cpp +++ b/modules/gdscript/gdscript_vm.cpp @@ -1897,7 +1897,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a VariantInternal::initialize(ret, Variant::OBJECT); Object **ret_opaque = VariantInternal::get_object(ret); method->ptrcall(base_obj, argptrs, ret_opaque); - VariantInternal::object_assign(ret, *ret_opaque); // Set so ID is correct too. + VariantInternal::update_object_id(ret); #ifdef DEBUG_ENABLED if (GDScriptLanguage::get_singleton()->profiling) { diff --git a/modules/gdscript/tests/gdscript_test_runner.cpp b/modules/gdscript/tests/gdscript_test_runner.cpp index de5cd10e7c..ff4832bde0 100644 --- a/modules/gdscript/tests/gdscript_test_runner.cpp +++ b/modules/gdscript/tests/gdscript_test_runner.cpp @@ -363,7 +363,7 @@ void GDScriptTest::disable_stdout() { OS::get_singleton()->set_stderr_enabled(false); } -void GDScriptTest::print_handler(void *p_this, const String &p_message, bool p_error) { +void GDScriptTest::print_handler(void *p_this, const String &p_message, bool p_error, bool p_rich) { TestResult *result = (TestResult *)p_this; result->output += p_message + "\n"; } diff --git a/modules/gdscript/tests/gdscript_test_runner.h b/modules/gdscript/tests/gdscript_test_runner.h index d6c6419e21..ee21afd9c9 100644 --- a/modules/gdscript/tests/gdscript_test_runner.h +++ b/modules/gdscript/tests/gdscript_test_runner.h @@ -86,7 +86,7 @@ private: TestResult execute_test_code(bool p_is_generating); public: - static void print_handler(void *p_this, const String &p_message, bool p_error); + static void print_handler(void *p_this, const String &p_message, bool p_error, bool p_rich); static void error_handler(void *p_this, const char *p_function, const char *p_file, int p_line, const char *p_error, const char *p_explanation, bool p_editor_notify, ErrorHandlerType p_type); TestResult run_test(); bool generate_output(); diff --git a/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd new file mode 100644 index 0000000000..d2f3a3e18f --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd @@ -0,0 +1,19 @@ +func test(): + var dictionary1: Variant = {1:Vector2()} + dictionary1[1].x = 2 + var dictionary2: Dictionary = {3:Vector2()} + dictionary2[3].x = 4 + var array1: Variant = [[Vector2()]] + array1[0][0].x = 5 + var array2: Array = [[Vector2()]] + array2[0][0].x = 6 + var array3: Array[Array] = [[Vector2()]] + array3[0][0].x = 7 + var transform = Transform3D() + transform.basis.x = Vector3(8.0, 9.0, 7.0) + print(dictionary1) + print(dictionary2) + print(array1) + print(array2) + print(array3) + print(transform) diff --git a/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out new file mode 100644 index 0000000000..5e7ccf534a --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out @@ -0,0 +1,7 @@ +GDTEST_OK +{1:(2, 0)} +{3:(4, 0)} +[[(5, 0)]] +[[(6, 0)]] +[[(7, 0)]] +[X: (8, 9, 7), Y: (0, 1, 0), Z: (0, 0, 1), O: (0, 0, 0)] diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/GD.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/GD.cs index 74aa38386f..bb076a9633 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/GD.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/GD.cs @@ -239,6 +239,27 @@ namespace Godot } /// <summary> + /// Converts one or more arguments of any type to string in the best way possible and prints them to the console. The following BBCode tags are supported: b, i, u, s, indent, code, url, center, right, color, bgcolor, fgcolor. Color tags only support named colors such as [code]red[/code], [i]not[/i] hexadecimal color codes. Unsupported tags will be left as-is in standard output. + /// When printing to standard output, the supported subset of BBCode is converted to ANSI escape codes for the terminal emulator to display. Displaying ANSI escape codes is currently only supported on Linux and macOS. Support for ANSI escape codes may vary across terminal emulators, especially for italic and strikethrough. + /// + /// Note: Consider using <see cref="PushError(string)"/> and <see cref="PushWarning(string)"/> + /// to print error and warning messages instead of <see cref="Print(object[])"/> or <see cref="PrintRich(object[])"/>. + /// This distinguishes them from print messages used for debugging purposes, + /// while also displaying a stack trace when an error or warning is printed. + /// </summary> + /// <example> + /// <code> + /// GD.PrintRich("[b]Hello world![/b]"); // Prints out "Hello world!" in bold. + /// </code> + /// </example> + /// <param name="what">Arguments that will be printed.</param> + /// </summary> + public static void PrintRich(params object[] what) + { + godot_icall_GD_print_rich(GetPrintParams(what)); + } + + /// <summary> /// Prints the current stack trace information to the console. /// </summary> public static void PrintStack() @@ -562,6 +583,9 @@ namespace Godot internal static extern void godot_icall_GD_print(object[] what); [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void godot_icall_GD_print_rich(object[] what); + + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void godot_icall_GD_printerr(object[] what); [MethodImpl(MethodImplOptions.InternalCall)] diff --git a/modules/mono/glue/gd_glue.cpp b/modules/mono/glue/gd_glue.cpp index 8aead217cf..8b1c2b729e 100644 --- a/modules/mono/glue/gd_glue.cpp +++ b/modules/mono/glue/gd_glue.cpp @@ -90,6 +90,27 @@ void godot_icall_GD_print(MonoArray *p_what) { print_line(str); } +void godot_icall_GD_print_rich(MonoArray *p_what) { + String str; + int length = mono_array_length(p_what); + + for (int i = 0; i < length; i++) { + MonoObject *elem = mono_array_get(p_what, MonoObject *, i); + + MonoException *exc = nullptr; + String elem_str = GDMonoMarshal::mono_object_to_variant_string(elem, &exc); + + if (exc) { + GDMonoUtils::set_pending_exception(exc); + return; + } + + str += elem_str; + } + + print_line_rich(str); +} + void godot_icall_GD_printerr(MonoArray *p_what) { String str; int length = mono_array_length(p_what); @@ -300,6 +321,7 @@ void godot_register_gd_icalls() { GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_pusherror", godot_icall_GD_pusherror); GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_pushwarning", godot_icall_GD_pushwarning); GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_print", godot_icall_GD_print); + GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_print_rich", godot_icall_GD_print_rich); GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_printerr", godot_icall_GD_printerr); GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_printraw", godot_icall_GD_printraw); GDMonoUtils::add_internal_call("Godot.GD::godot_icall_GD_prints", godot_icall_GD_prints); diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index 5a451a6dab..a5f7faffef 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -87,16 +87,19 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("_avoidance_done", "new_velocity"), &NavigationAgent2D::_avoidance_done); + ADD_GROUP("Pathfinding", ""); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:px"), "set_path_desired_distance", "get_path_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "target_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:px"), "set_target_desired_distance", "get_target_desired_distance"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "10,100,1,suffix:px"), "set_path_max_distance", "get_path_max_distance"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + + ADD_GROUP("Avoidance", ""); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius", PROPERTY_HINT_RANGE, "0.1,500,0.01,suffix:px"), "set_radius", "get_radius"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "neighbor_dist", PROPERTY_HINT_RANGE, "0.1,100000,0.01,suffix:px"), "set_neighbor_dist", "get_neighbor_dist"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_neighbors", PROPERTY_HINT_RANGE, "1,10000,1"), "set_max_neighbors", "get_max_neighbors"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_horizon", PROPERTY_HINT_RANGE, "0.1,10000,0.01,suffix:s"), "set_time_horizon", "get_time_horizon"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_speed", PROPERTY_HINT_RANGE, "0.1,100000,0.01,suffix:px/s"), "set_max_speed", "get_max_speed"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "10,100,1,suffix:px"), "set_path_max_distance", "get_path_max_distance"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_SIGNAL(MethodInfo("path_changed")); ADD_SIGNAL(MethodInfo("target_reached")); diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index ba90a275e6..8eb48ffb30 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -87,13 +87,13 @@ bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_toleranc void Path2D::_notification(int p_what) { switch (p_what) { - // Draw the curve if navigation debugging is enabled. + // Draw the curve if path debugging is enabled. case NOTIFICATION_DRAW: { if (!curve.is_valid()) { break; } - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_navigation_hint()) { + if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_paths_hint()) { return; } @@ -102,12 +102,10 @@ void Path2D::_notification(int p_what) { } #ifdef TOOLS_ENABLED - const real_t line_width = 2 * EDSCALE; + const real_t line_width = get_tree()->get_debug_paths_width() * EDSCALE; #else - const real_t line_width = 2; + const real_t line_width = get_tree()->get_debug_paths_width(); #endif - const Color color = Color(0.5, 0.6, 1.0, 0.7); - _cached_draw_pts.resize(curve->get_point_count() * 8); int count = 0; @@ -119,7 +117,7 @@ void Path2D::_notification(int p_what) { } } - draw_polyline(_cached_draw_pts, color, line_width, true); + draw_polyline(_cached_draw_pts, get_tree()->get_debug_paths_color(), line_width, true); } break; } } @@ -129,7 +127,7 @@ void Path2D::_curve_changed() { return; } - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_navigation_hint()) { + if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_paths_hint()) { return; } diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index e5ec444335..3752713d6a 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -91,18 +91,21 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("_avoidance_done", "new_velocity"), &NavigationAgent3D::_avoidance_done); + ADD_GROUP("Pathfinding", ""); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_path_desired_distance", "get_path_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "target_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_target_desired_distance", "get_target_desired_distance"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_radius", "get_radius"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "agent_height_offset", PROPERTY_HINT_RANGE, "-100.0,100,0.01,suffix:m"), "set_agent_height_offset", "get_agent_height_offset"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "0.01,100,0.1,suffix:m"), "set_path_max_distance", "get_path_max_distance"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + + ADD_GROUP("Avoidance", ""); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:m"), "set_radius", "get_radius"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "neighbor_dist", PROPERTY_HINT_RANGE, "0.1,10000,0.01,suffix:m"), "set_neighbor_dist", "get_neighbor_dist"); ADD_PROPERTY(PropertyInfo(Variant::INT, "max_neighbors", PROPERTY_HINT_RANGE, "1,10000,1"), "set_max_neighbors", "get_max_neighbors"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_horizon", PROPERTY_HINT_RANGE, "0.01,100,0.01,suffix:s"), "set_time_horizon", "get_time_horizon"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_speed", PROPERTY_HINT_RANGE, "0.1,10000,0.01,suffix:m/s"), "set_max_speed", "get_max_speed"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "0.01,100,0.1,suffix:m"), "set_path_max_distance", "get_path_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_y"), "set_ignore_y", "get_ignore_y"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_SIGNAL(MethodInfo("path_changed")); ADD_SIGNAL(MethodInfo("target_reached")); diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index e13cf6f9c8..f53e783fbd 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -30,6 +30,92 @@ #include "path_3d.h" +Path3D::Path3D() { + SceneTree *st = SceneTree::get_singleton(); + if (st && st->is_debugging_paths_hint()) { + debug_instance = RS::get_singleton()->instance_create(); + set_notify_transform(true); + _update_debug_mesh(); + } +} + +Path3D::~Path3D() { + if (debug_instance.is_valid()) { + RS::get_singleton()->free(debug_instance); + } + if (debug_mesh.is_valid()) { + RS::get_singleton()->free(debug_mesh->get_rid()); + } +} + +void Path3D::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + SceneTree *st = SceneTree::get_singleton(); + if (st && st->is_debugging_paths_hint()) { + _update_debug_mesh(); + } + } break; + + case NOTIFICATION_EXIT_TREE: { + SceneTree *st = SceneTree::get_singleton(); + if (st && st->is_debugging_paths_hint()) { + RS::get_singleton()->instance_set_visible(debug_instance, false); + } + } break; + + case NOTIFICATION_TRANSFORM_CHANGED: { + if (is_inside_tree() && debug_instance.is_valid()) { + RS::get_singleton()->instance_set_transform(debug_instance, get_global_transform()); + } + } break; + } +} + +void Path3D::_update_debug_mesh() { + SceneTree *st = SceneTree::get_singleton(); + if (!(st && st->is_debugging_paths_hint())) { + return; + } + + if (!debug_mesh.is_valid()) { + debug_mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); + } + + if (!(curve.is_valid())) { + RS::get_singleton()->instance_set_visible(debug_instance, false); + return; + } + if (curve->get_point_count() < 2) { + RS::get_singleton()->instance_set_visible(debug_instance, false); + return; + } + + Vector<Vector3> vertex_array; + + for (int i = 1; i < curve->get_point_count(); i++) { + Vector3 line_end = curve->get_point_position(i); + Vector3 line_start = curve->get_point_position(i - 1); + vertex_array.push_back(line_start); + vertex_array.push_back(line_end); + } + + Array mesh_array; + mesh_array.resize(Mesh::ARRAY_MAX); + mesh_array[Mesh::ARRAY_VERTEX] = vertex_array; + + debug_mesh->clear_surfaces(); + debug_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, mesh_array); + + RS::get_singleton()->instance_set_base(debug_instance, debug_mesh->get_rid()); + RS::get_singleton()->mesh_surface_set_material(debug_mesh->get_rid(), 0, st->get_debug_paths_material()->get_rid()); + if (is_inside_tree()) { + RS::get_singleton()->instance_set_scenario(debug_instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_transform(debug_instance, get_global_transform()); + RS::get_singleton()->instance_set_visible(debug_instance, is_visible_in_tree()); + } +} + void Path3D::_curve_changed() { if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) { update_gizmos(); @@ -48,6 +134,10 @@ void Path3D::_curve_changed() { } } } + SceneTree *st = SceneTree::get_singleton(); + if (st && st->is_debugging_paths_hint()) { + _update_debug_mesh(); + } } void Path3D::set_curve(const Ref<Curve3D> &p_curve) { diff --git a/scene/3d/path_3d.h b/scene/3d/path_3d.h index cb67a044d1..7c7284534e 100644 --- a/scene/3d/path_3d.h +++ b/scene/3d/path_3d.h @@ -41,14 +41,23 @@ class Path3D : public Node3D { void _curve_changed(); + RID debug_instance; + Ref<ArrayMesh> debug_mesh; + +private: + void _update_debug_mesh(); + protected: + void _notification(int p_what); + static void _bind_methods(); public: void set_curve(const Ref<Curve3D> &p_curve); Ref<Curve3D> get_curve() const; - Path3D() {} + Path3D(); + ~Path3D(); }; class PathFollow3D : public Node3D { diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 6df50bc491..69917f6992 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -471,7 +471,6 @@ void GeometryInstance3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "visibility_range_end", PROPERTY_HINT_RANGE, "0.0,4096.0,0.01,suffix:m"), "set_visibility_range_end", "get_visibility_range_end"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "visibility_range_end_margin", PROPERTY_HINT_RANGE, "0.0,4096.0,0.01,suffix:m"), "set_visibility_range_end_margin", "get_visibility_range_end_margin"); ADD_PROPERTY(PropertyInfo(Variant::INT, "visibility_range_fade_mode", PROPERTY_HINT_ENUM, "Disabled,Self,Dependencies"), "set_visibility_range_fade_mode", "get_visibility_range_fade_mode"); - //ADD_SIGNAL( MethodInfo("visibility_changed")); BIND_ENUM_CONSTANT(SHADOW_CASTING_SETTING_OFF); BIND_ENUM_CONSTANT(SHADOW_CASTING_SETTING_ON); @@ -494,7 +493,6 @@ void GeometryInstance3D::_bind_methods() { } GeometryInstance3D::GeometryInstance3D() { - //RS::get_singleton()->instance_geometry_set_baked_light_texture_index(get_instance(),0); } GeometryInstance3D::~GeometryInstance3D() { diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index e5f98bd65e..9e0d9b9a2a 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -126,7 +126,7 @@ private: float extra_cull_margin = 0.0; LightmapScale lightmap_scale = LIGHTMAP_SCALE_1X; - GIMode gi_mode = GI_MODE_DISABLED; + GIMode gi_mode = GI_MODE_STATIC; bool ignore_occlusion_culling = false; const StringName *_instance_uniform_get_remap(const StringName p_name) const; diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 1d537837bd..4f6975deb1 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -104,11 +104,11 @@ double AnimationNodeAnimation::process(double p_time, bool p_seek, bool p_seek_r if (anim->get_loop_mode() == Animation::LOOP_PINGPONG) { if (!Math::is_zero_approx(anim_size)) { if ((int)Math::floor(abs(time - prev_time) / anim_size) % 2 == 0) { - if (prev_time > 0 && time <= 0) { + if (prev_time >= 0 && time < 0) { backward = !backward; pingponged = -1; } - if (prev_time < anim_size && time >= anim_size) { + if (prev_time <= anim_size && time > anim_size) { backward = !backward; pingponged = 1; } diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index 8dcf538b8f..2ee7f4fa43 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -68,6 +68,34 @@ StringName AnimationNodeStateMachineTransition::get_advance_condition_name() con return advance_condition_name; } +void AnimationNodeStateMachineTransition::set_advance_expression(const String &p_expression) { + advance_expression = p_expression; + + String advance_expression_stripped = advance_expression.strip_edges(); + if (advance_expression_stripped == String()) { + expression.unref(); + return; + } + + if (expression.is_null()) { + expression.instantiate(); + } + + expression->parse(advance_expression_stripped); +} + +String AnimationNodeStateMachineTransition::get_advance_expression() const { + return advance_expression; +} + +void AnimationNodeStateMachineTransition::set_advance_expression_base_node(const NodePath &p_expression_base_node) { + advance_expression_base_node = p_expression_base_node; +} + +NodePath AnimationNodeStateMachineTransition::get_advance_expression_base_node() const { + return advance_expression_base_node; +} + void AnimationNodeStateMachineTransition::set_xfade_time(float p_xfade) { ERR_FAIL_COND(p_xfade < 0); xfade = p_xfade; @@ -115,11 +143,22 @@ void AnimationNodeStateMachineTransition::_bind_methods() { ClassDB::bind_method(D_METHOD("set_priority", "priority"), &AnimationNodeStateMachineTransition::set_priority); ClassDB::bind_method(D_METHOD("get_priority"), &AnimationNodeStateMachineTransition::get_priority); + ClassDB::bind_method(D_METHOD("set_advance_expression", "text"), &AnimationNodeStateMachineTransition::set_advance_expression); + ClassDB::bind_method(D_METHOD("get_advance_expression"), &AnimationNodeStateMachineTransition::get_advance_expression); + + ClassDB::bind_method(D_METHOD("set_advance_expression_base_node", "path"), &AnimationNodeStateMachineTransition::set_advance_expression_base_node); + ClassDB::bind_method(D_METHOD("get_advance_expression_base_node"), &AnimationNodeStateMachineTransition::get_advance_expression_base_node); + + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "xfade_time", PROPERTY_HINT_RANGE, "0,240,0.01,suffix:s"), "set_xfade_time", "get_xfade_time"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "priority", PROPERTY_HINT_RANGE, "0,32,1"), "set_priority", "get_priority"); + ADD_GROUP("Switch", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "switch_mode", PROPERTY_HINT_ENUM, "Immediate,Sync,At End"), "set_switch_mode", "get_switch_mode"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_advance"), "set_auto_advance", "has_auto_advance"); + ADD_GROUP("Advance", "advance_"); ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "advance_condition"), "set_advance_condition", "get_advance_condition"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "xfade_time", PROPERTY_HINT_RANGE, "0,240,0.01,suffix:s"), "set_xfade_time", "get_xfade_time"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "priority", PROPERTY_HINT_RANGE, "0,32,1"), "set_priority", "get_priority"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "advance_expression", PROPERTY_HINT_EXPRESSION, ""), "set_advance_expression", "get_advance_expression"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "advance_expression_base_node"), "set_advance_expression_base_node", "get_advance_expression_base_node"); + ADD_GROUP("Disabling", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); BIND_ENUM_CONSTANT(SWITCH_MODE_IMMEDIATE); @@ -577,6 +616,29 @@ bool AnimationNodeStateMachinePlayback::_check_advance_condition(const Ref<Anima return true; } + if (transition->expression.is_valid()) { + AnimationTree *tree_base = state_machine->get_animation_tree(); + ERR_FAIL_COND_V(tree_base == nullptr, false); + + NodePath advance_expression_base_node_path; + if (!transition->advance_expression_base_node.is_empty()) { + advance_expression_base_node_path = transition->advance_expression_base_node; + } else { + advance_expression_base_node_path = tree_base->get_advance_expression_base_node(); + } + + Node *expression_base = tree_base->get_node_or_null(advance_expression_base_node_path); + if (expression_base) { + Ref<Expression> exp = transition->expression; + bool ret = exp->execute(Array(), tree_base, false, Engine::get_singleton()->is_editor_hint()); // Avoids allowing the user to crash the system with an expression by only allowing const calls. + if (!exp->has_execute_failed()) { + if (ret) { + return true; + } + } + } + } + return false; } diff --git a/scene/animation/animation_node_state_machine.h b/scene/animation/animation_node_state_machine.h index 20f2d6f858..d4e58ca3d3 100644 --- a/scene/animation/animation_node_state_machine.h +++ b/scene/animation/animation_node_state_machine.h @@ -31,6 +31,7 @@ #ifndef ANIMATION_NODE_STATE_MACHINE_H #define ANIMATION_NODE_STATE_MACHINE_H +#include "core/math/expression.h" #include "scene/animation/animation_tree.h" class AnimationNodeStateMachineTransition : public Resource { @@ -51,6 +52,11 @@ private: float xfade = 0.0; bool disabled = false; int priority = 1; + String advance_expression; + NodePath advance_expression_base_node; + + friend class AnimationNodeStateMachinePlayback; + Ref<Expression> expression; protected: static void _bind_methods(); @@ -67,6 +73,12 @@ public: StringName get_advance_condition_name() const; + void set_advance_expression(const String &p_expression); + String get_advance_expression() const; + + void set_advance_expression_base_node(const NodePath &p_expression_base_node); + NodePath get_advance_expression_base_node() const; + void set_xfade_time(float p_xfade); float get_xfade_time() const; diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 2afe9ac35f..2e87dbf9da 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -283,10 +283,12 @@ void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim, Node *p_root_ov setup_pass++; for (int i = 0; i < a->get_track_count(); i++) { + p_anim->node_cache.write[i] = nullptr; + if (!a->track_is_enabled(i)) { continue; } - p_anim->node_cache.write[i] = nullptr; + Ref<Resource> resource; Vector<StringName> leftover_path; Node *child = parent->get_node_and_resource(a->track_get_path(i), resource, leftover_path); diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index bcd49d75fa..8c8822ac3f 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -136,6 +136,11 @@ double AnimationNode::_pre_process(const StringName &p_base_path, AnimationNode return t; } +AnimationTree *AnimationNode::get_animation_tree() const { + ERR_FAIL_COND_V(!state, nullptr); + return state->tree; +} + void AnimationNode::make_invalid(const String &p_reason) { ERR_FAIL_COND(!state); state->valid = false; @@ -1704,6 +1709,14 @@ NodePath AnimationTree::get_animation_player() const { return animation_player; } +void AnimationTree::set_advance_expression_base_node(const NodePath &p_advance_expression_base_node) { + advance_expression_base_node = p_advance_expression_base_node; +} + +NodePath AnimationTree::get_advance_expression_base_node() const { + return advance_expression_base_node; +} + bool AnimationTree::is_state_invalid() const { return !state.valid; } @@ -1899,6 +1912,9 @@ void AnimationTree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_animation_player", "root"), &AnimationTree::set_animation_player); ClassDB::bind_method(D_METHOD("get_animation_player"), &AnimationTree::get_animation_player); + ClassDB::bind_method(D_METHOD("set_advance_expression_base_node", "node"), &AnimationTree::set_advance_expression_base_node); + ClassDB::bind_method(D_METHOD("get_advance_expression_base_node"), &AnimationTree::get_advance_expression_base_node); + ClassDB::bind_method(D_METHOD("set_root_motion_track", "path"), &AnimationTree::set_root_motion_track); ClassDB::bind_method(D_METHOD("get_root_motion_track"), &AnimationTree::get_root_motion_track); @@ -1912,6 +1928,8 @@ void AnimationTree::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "tree_root", PROPERTY_HINT_RESOURCE_TYPE, "AnimationRootNode"), "set_tree_root", "get_tree_root"); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "anim_player", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "AnimationPlayer"), "set_animation_player", "get_animation_player"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "advance_expression_base_node", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Node"), "set_advance_expression_base_node", "get_advance_expression_base_node"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "active"), "set_active", "is_active"); ADD_PROPERTY(PropertyInfo(Variant::INT, "process_callback", PROPERTY_HINT_ENUM, "Physics,Idle,Manual"), "set_process_callback", "get_process_callback"); ADD_GROUP("Root Motion", "root_motion_"); diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index b646efede4..0bfe615c9b 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -107,6 +107,7 @@ protected: double blend_input(int p_input, double p_time, bool p_seek, bool p_seek_root, real_t p_blend, FilterAction p_filter = FILTER_IGNORE, bool p_optimize = true); void make_invalid(const String &p_reason); + AnimationTree *get_animation_tree() const; static void _bind_methods(); @@ -270,6 +271,7 @@ private: HashSet<TrackCache *> playing_caches; Ref<AnimationNode> root; + NodePath advance_expression_base_node = NodePath(String(".")); AnimationProcessCallback process_callback = ANIMATION_PROCESS_IDLE; bool active = false; @@ -332,6 +334,9 @@ public: void set_animation_player(const NodePath &p_player); NodePath get_animation_player() const; + void set_advance_expression_base_node(const NodePath &p_advance_expression_base_node); + NodePath get_advance_expression_base_node() const; + TypedArray<String> get_configuration_warnings() const override; bool is_state_invalid() const; diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 118e77c009..6e2db68db0 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -2344,7 +2344,7 @@ void Control::set_focus_mode(FocusMode p_focus_mode) { static Control *_next_control(Control *p_from) { if (p_from->is_set_as_top_level()) { - return nullptr; // can't go above + return nullptr; // Can't go above. } Control *parent = Object::cast_to<Control>(p_from->get_parent()); @@ -2364,7 +2364,7 @@ static Control *_next_control(Control *p_from) { return c; } - //no next in parent, try the same in parent + // No next in parent, try the same in parent. return _next_control(parent); } @@ -2388,7 +2388,7 @@ Control *Control::find_next_valid_focus() const { } } - // find next child + // Find next child. Control *next_child = nullptr; @@ -2404,7 +2404,7 @@ Control *Control::find_next_valid_focus() const { if (!next_child) { next_child = _next_control(from); - if (!next_child) { //nothing else.. go up and find either window or subwindow + if (!next_child) { // Nothing else. Go up and find either window or subwindow. next_child = const_cast<Control *>(this); while (next_child && !next_child->is_set_as_top_level()) { next_child = cast_to<Control>(next_child->get_parent()); @@ -2422,7 +2422,7 @@ Control *Control::find_next_valid_focus() const { } } - if (next_child == this) { // no next control-> + if (next_child == from || next_child == this) { // No next control. return (get_focus_mode() == FOCUS_ALL) ? next_child : nullptr; } if (next_child) { @@ -2454,7 +2454,7 @@ static Control *_prev_control(Control *p_from) { return p_from; } - //no prev in parent, try the same in parent + // No prev in parent, try the same in parent. return _prev_control(child); } @@ -2478,12 +2478,12 @@ Control *Control::find_prev_valid_focus() const { } } - // find prev child + // Find prev child. Control *prev_child = nullptr; if (from->is_set_as_top_level() || !Object::cast_to<Control>(from->get_parent())) { - //find last of the children + // Find last of the children. prev_child = _prev_control(from); @@ -2506,7 +2506,7 @@ Control *Control::find_prev_valid_focus() const { } } - if (prev_child == this) { // no prev control-> + if (prev_child == from || prev_child == this) { // No prev control. return (get_focus_mode() == FOCUS_ALL) ? prev_child : nullptr; } diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp index 0690acbe16..9459bed63b 100644 --- a/scene/gui/gradient_edit.cpp +++ b/scene/gui/gradient_edit.cpp @@ -382,7 +382,7 @@ void GradientEdit::_color_changed(const Color &p_color) { emit_signal(SNAME("ramp_changed")); } -void GradientEdit::set_ramp(const Vector<real_t> &p_offsets, const Vector<Color> &p_colors) { +void GradientEdit::set_ramp(const Vector<float> &p_offsets, const Vector<Color> &p_colors) { ERR_FAIL_COND(p_offsets.size() != p_colors.size()); points.clear(); for (int i = 0; i < p_offsets.size(); i++) { @@ -396,8 +396,8 @@ void GradientEdit::set_ramp(const Vector<real_t> &p_offsets, const Vector<Color> update(); } -Vector<real_t> GradientEdit::get_offsets() const { - Vector<real_t> ret; +Vector<float> GradientEdit::get_offsets() const { + Vector<float> ret; for (int i = 0; i < points.size(); i++) { ret.push_back(points[i].offset); } diff --git a/scene/gui/gradient_edit.h b/scene/gui/gradient_edit.h index 4e3c6525f9..3badcd45ba 100644 --- a/scene/gui/gradient_edit.h +++ b/scene/gui/gradient_edit.h @@ -67,8 +67,8 @@ protected: static void _bind_methods(); public: - void set_ramp(const Vector<real_t> &p_offsets, const Vector<Color> &p_colors); - Vector<real_t> get_offsets() const; + void set_ramp(const Vector<float> &p_offsets, const Vector<Color> &p_colors); + Vector<float> get_offsets() const; Vector<Color> get_colors() const; void set_points(Vector<Gradient::Point> &p_points); Vector<Gradient::Point> &get_points(); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index dd77877c7d..18f69ecc82 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -659,6 +659,14 @@ bool SceneTree::is_debugging_collisions_hint() const { return debug_collisions_hint; } +void SceneTree::set_debug_paths_hint(bool p_enabled) { + debug_paths_hint = p_enabled; +} + +bool SceneTree::is_debugging_paths_hint() const { + return debug_paths_hint; +} + void SceneTree::set_debug_navigation_hint(bool p_enabled) { debug_navigation_hint = p_enabled; } @@ -684,6 +692,22 @@ Color SceneTree::get_debug_collision_contact_color() const { return debug_collision_contact_color; } +void SceneTree::set_debug_paths_color(const Color &p_color) { + debug_paths_color = p_color; +} + +Color SceneTree::get_debug_paths_color() const { + return debug_paths_color; +} + +void SceneTree::set_debug_paths_width(float p_width) { + debug_paths_width = p_width; +} + +float SceneTree::get_debug_paths_width() const { + return debug_paths_width; +} + void SceneTree::set_debug_navigation_color(const Color &p_color) { debug_navigation_color = p_color; } @@ -700,6 +724,23 @@ Color SceneTree::get_debug_navigation_disabled_color() const { return debug_navigation_disabled_color; } +Ref<Material> SceneTree::get_debug_paths_material() { + if (debug_paths_material.is_valid()) { + return debug_paths_material; + } + + Ref<StandardMaterial3D> _debug_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); + _debug_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); + _debug_material->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); + _debug_material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true); + _debug_material->set_flag(StandardMaterial3D::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); + _debug_material->set_albedo(get_debug_paths_color()); + + debug_paths_material = _debug_material; + + return debug_paths_material; +} + Ref<Material> SceneTree::get_debug_navigation_material() { if (navigation_material.is_valid()) { return navigation_material; @@ -1207,6 +1248,8 @@ void SceneTree::_bind_methods() { ClassDB::bind_method(D_METHOD("set_debug_collisions_hint", "enable"), &SceneTree::set_debug_collisions_hint); ClassDB::bind_method(D_METHOD("is_debugging_collisions_hint"), &SceneTree::is_debugging_collisions_hint); + ClassDB::bind_method(D_METHOD("set_debug_paths_hint", "enable"), &SceneTree::set_debug_paths_hint); + ClassDB::bind_method(D_METHOD("is_debugging_paths_hint"), &SceneTree::is_debugging_paths_hint); ClassDB::bind_method(D_METHOD("set_debug_navigation_hint", "enable"), &SceneTree::set_debug_navigation_hint); ClassDB::bind_method(D_METHOD("is_debugging_navigation_hint"), &SceneTree::is_debugging_navigation_hint); @@ -1268,6 +1311,7 @@ void SceneTree::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_accept_quit"), "set_auto_accept_quit", "is_auto_accept_quit"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "quit_on_go_back"), "set_quit_on_go_back", "is_quit_on_go_back"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_collisions_hint"), "set_debug_collisions_hint", "is_debugging_collisions_hint"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_paths_hint"), "set_debug_paths_hint", "is_debugging_paths_hint"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_navigation_hint"), "set_debug_navigation_hint", "is_debugging_navigation_hint"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused"), "set_pause", "is_paused"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "edited_scene_root", PROPERTY_HINT_RESOURCE_TYPE, "Node", PROPERTY_USAGE_NONE), "set_edited_scene_root", "get_edited_scene_root"); @@ -1344,6 +1388,8 @@ SceneTree::SceneTree() { } debug_collisions_color = GLOBAL_DEF("debug/shapes/collision/shape_color", Color(0.0, 0.6, 0.7, 0.42)); debug_collision_contact_color = GLOBAL_DEF("debug/shapes/collision/contact_color", Color(1.0, 0.2, 0.1, 0.8)); + debug_paths_color = GLOBAL_DEF("debug/shapes/paths/geometry_color", Color(0.1, 1.0, 0.7, 0.4)); + debug_paths_width = GLOBAL_DEF("debug/shapes/paths/geometry_width", 2.0); debug_navigation_color = GLOBAL_DEF("debug/shapes/navigation/geometry_color", Color(0.1, 1.0, 0.7, 0.4)); debug_navigation_disabled_color = GLOBAL_DEF("debug/shapes/navigation/disabled_geometry_color", Color(1.0, 0.7, 0.1, 0.4)); collision_debug_contacts = GLOBAL_DEF("debug/shapes/collision/max_contacts_displayed", 10000); diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 67a17a69f2..a34aa8e2cd 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -97,6 +97,7 @@ private: #ifdef DEBUG_ENABLED bool debug_collisions_hint = false; + bool debug_paths_hint = false; bool debug_navigation_hint = false; #endif bool paused = false; @@ -146,9 +147,12 @@ private: Color debug_collisions_color; Color debug_collision_contact_color; + Color debug_paths_color; + float debug_paths_width = 1.0f; Color debug_navigation_color; Color debug_navigation_disabled_color; Ref<ArrayMesh> debug_contact_mesh; + Ref<Material> debug_paths_material; Ref<Material> navigation_material; Ref<Material> navigation_disabled_material; Ref<Material> collision_material; @@ -297,12 +301,18 @@ public: void set_debug_collisions_hint(bool p_enabled); bool is_debugging_collisions_hint() const; + void set_debug_paths_hint(bool p_enabled); + bool is_debugging_paths_hint() const; + void set_debug_navigation_hint(bool p_enabled); bool is_debugging_navigation_hint() const; #else void set_debug_collisions_hint(bool p_enabled) {} bool is_debugging_collisions_hint() const { return false; } + void set_debug_paths_hint(bool p_enabled) {} + bool is_debugging_paths_hint() const { return false; } + void set_debug_navigation_hint(bool p_enabled) {} bool is_debugging_navigation_hint() const { return false; } #endif @@ -313,12 +323,19 @@ public: void set_debug_collision_contact_color(const Color &p_color); Color get_debug_collision_contact_color() const; + void set_debug_paths_color(const Color &p_color); + Color get_debug_paths_color() const; + + void set_debug_paths_width(float p_width); + float get_debug_paths_width() const; + void set_debug_navigation_color(const Color &p_color); Color get_debug_navigation_color() const; void set_debug_navigation_disabled_color(const Color &p_color); Color get_debug_navigation_disabled_color() const; + Ref<Material> get_debug_paths_material(); Ref<Material> get_debug_navigation_material(); Ref<Material> get_debug_navigation_disabled_material(); Ref<Material> get_debug_collision_material(); diff --git a/servers/movie_writer/movie_writer.cpp b/servers/movie_writer/movie_writer.cpp index 8560d92aa2..9f96b8cfda 100644 --- a/servers/movie_writer/movie_writer.cpp +++ b/servers/movie_writer/movie_writer.cpp @@ -30,7 +30,6 @@ #include "movie_writer.h" #include "core/config/project_settings.h" -#include "core/io/dir_access.h" MovieWriter *MovieWriter::writers[MovieWriter::MAX_WRITERS]; uint32_t MovieWriter::writer_count = 0; @@ -170,139 +169,3 @@ void MovieWriter::add_frame(const Ref<Image> &p_image) { void MovieWriter::end() { write_end(); } -///////////////////////////////////////// - -uint32_t MovieWriterPNGWAV::get_audio_mix_rate() const { - return mix_rate; -} -AudioServer::SpeakerMode MovieWriterPNGWAV::get_audio_speaker_mode() const { - return speaker_mode; -} - -void MovieWriterPNGWAV::get_supported_extensions(List<String> *r_extensions) const { - r_extensions->push_back("png"); -} - -bool MovieWriterPNGWAV::handles_file(const String &p_path) const { - return p_path.get_extension().to_lower() == "png"; -} - -String MovieWriterPNGWAV::zeros_str(uint32_t p_index) { - char zeros[MAX_TRAILING_ZEROS + 1]; - for (uint32_t i = 0; i < MAX_TRAILING_ZEROS; i++) { - uint32_t idx = MAX_TRAILING_ZEROS - i - 1; - uint32_t digit = (p_index / uint32_t(Math::pow(double(10), double(idx)))) % 10; - zeros[i] = '0' + digit; - } - zeros[MAX_TRAILING_ZEROS] = 0; - return zeros; -} - -Error MovieWriterPNGWAV::write_begin(const Size2i &p_movie_size, uint32_t p_fps, const String &p_base_path) { - // Quick & Dirty PNGWAV Code based on - https://docs.microsoft.com/en-us/windows/win32/directshow/avi-riff-file-reference - - base_path = p_base_path.get_basename(); - if (base_path.is_relative_path()) { - base_path = "res://" + base_path; - } - - { - //Remove existing files before writing anew - uint32_t idx = 0; - Ref<DirAccess> d = DirAccess::open(base_path.get_base_dir()); - String file = base_path.get_file(); - while (true) { - String path = file + zeros_str(idx) + ".png"; - if (d->remove(path) != OK) { - break; - } - } - } - - f_wav = FileAccess::open(base_path + ".wav", FileAccess::WRITE_READ); - ERR_FAIL_COND_V(f_wav.is_null(), ERR_CANT_OPEN); - - fps = p_fps; - - f_wav->store_buffer((const uint8_t *)"RIFF", 4); - int total_size = 4 /* WAVE */ + 8 /* fmt+size */ + 16 /* format */ + 8 /* data+size */; - f_wav->store_32(total_size); //will store final later - f_wav->store_buffer((const uint8_t *)"WAVE", 4); - - /* FORMAT CHUNK */ - - f_wav->store_buffer((const uint8_t *)"fmt ", 4); - - uint32_t channels = 2; - switch (speaker_mode) { - case AudioServer::SPEAKER_MODE_STEREO: - channels = 2; - break; - case AudioServer::SPEAKER_SURROUND_31: - channels = 4; - break; - case AudioServer::SPEAKER_SURROUND_51: - channels = 6; - break; - case AudioServer::SPEAKER_SURROUND_71: - channels = 8; - break; - } - - f_wav->store_32(16); //standard format, no extra fields - f_wav->store_16(1); // compression code, standard PCM - f_wav->store_16(channels); //CHANNELS: 2 - - f_wav->store_32(mix_rate); - - /* useless stuff the format asks for */ - - int bits_per_sample = 32; - int blockalign = bits_per_sample / 8 * channels; - int bytes_per_sec = mix_rate * blockalign; - - audio_block_size = (mix_rate / fps) * blockalign; - - f_wav->store_32(bytes_per_sec); - f_wav->store_16(blockalign); // block align (unused) - f_wav->store_16(bits_per_sample); - - /* DATA CHUNK */ - - f_wav->store_buffer((const uint8_t *)"data", 4); - - f_wav->store_32(0); //data size... wooh - wav_data_size_pos = f_wav->get_position(); - - return OK; -} - -Error MovieWriterPNGWAV::write_frame(const Ref<Image> &p_image, const int32_t *p_audio_data) { - ERR_FAIL_COND_V(!f_wav.is_valid(), ERR_UNCONFIGURED); - - Vector<uint8_t> png_buffer = p_image->save_png_to_buffer(); - - Ref<FileAccess> fi = FileAccess::open(base_path + zeros_str(frame_count) + ".png", FileAccess::WRITE); - fi->store_buffer(png_buffer.ptr(), png_buffer.size()); - f_wav->store_buffer((const uint8_t *)p_audio_data, audio_block_size); - - frame_count++; - - return OK; -} - -void MovieWriterPNGWAV::write_end() { - if (f_wav.is_valid()) { - uint32_t total_size = 4 /* WAVE */ + 8 /* fmt+size */ + 16 /* format */ + 8 /* data+size */; - uint32_t datasize = f_wav->get_position() - wav_data_size_pos; - f_wav->seek(4); - f_wav->store_32(total_size + datasize); - f_wav->seek(0x28); - f_wav->store_32(datasize); - } -} - -MovieWriterPNGWAV::MovieWriterPNGWAV() { - mix_rate = GLOBAL_GET("editor/movie_writer/mix_rate"); - speaker_mode = AudioServer::SpeakerMode(int(GLOBAL_GET("editor/movie_writer/speaker_mode"))); -} diff --git a/servers/movie_writer/movie_writer.h b/servers/movie_writer/movie_writer.h index 11e739df39..1ec6e93052 100644 --- a/servers/movie_writer/movie_writer.h +++ b/servers/movie_writer/movie_writer.h @@ -85,39 +85,4 @@ public: void end(); }; -class MovieWriterPNGWAV : public MovieWriter { - GDCLASS(MovieWriterPNGWAV, MovieWriter) - - enum { - MAX_TRAILING_ZEROS = 8 // more than 10 days at 60fps, no hard drive can put up with this anyway :) - }; - - uint32_t mix_rate = 48000; - AudioServer::SpeakerMode speaker_mode = AudioServer::SPEAKER_MODE_STEREO; - String base_path; - uint32_t frame_count = 0; - uint32_t fps = 0; - - uint32_t audio_block_size = 0; - - Ref<FileAccess> f_wav; - uint32_t wav_data_size_pos = 0; - - String zeros_str(uint32_t p_index); - -protected: - virtual uint32_t get_audio_mix_rate() const override; - virtual AudioServer::SpeakerMode get_audio_speaker_mode() const override; - virtual void get_supported_extensions(List<String> *r_extensions) const override; - - virtual Error write_begin(const Size2i &p_movie_size, uint32_t p_fps, const String &p_base_path) override; - virtual Error write_frame(const Ref<Image> &p_image, const int32_t *p_audio_data) override; - virtual void write_end() override; - - virtual bool handles_file(const String &p_path) const override; - -public: - MovieWriterPNGWAV(); -}; - -#endif // VIDEO_WRITER_H +#endif // MOVIE_WRITER_H diff --git a/servers/movie_writer/movie_writer_mjpeg.h b/servers/movie_writer/movie_writer_mjpeg.h index 822bedfedf..233267df30 100644 --- a/servers/movie_writer/movie_writer_mjpeg.h +++ b/servers/movie_writer/movie_writer_mjpeg.h @@ -70,4 +70,4 @@ public: MovieWriterMJPEG(); }; -#endif // MOVIE_WRITER_AVIJPEG_H +#endif // MOVIE_WRITER_MJPEG_H diff --git a/servers/movie_writer/movie_writer_pngwav.cpp b/servers/movie_writer/movie_writer_pngwav.cpp new file mode 100644 index 0000000000..bd79b0bd98 --- /dev/null +++ b/servers/movie_writer/movie_writer_pngwav.cpp @@ -0,0 +1,168 @@ +/*************************************************************************/ +/* movie_writer_pngwav.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "movie_writer_pngwav.h" +#include "core/config/project_settings.h" +#include "core/io/dir_access.h" + +uint32_t MovieWriterPNGWAV::get_audio_mix_rate() const { + return mix_rate; +} +AudioServer::SpeakerMode MovieWriterPNGWAV::get_audio_speaker_mode() const { + return speaker_mode; +} + +void MovieWriterPNGWAV::get_supported_extensions(List<String> *r_extensions) const { + r_extensions->push_back("png"); +} + +bool MovieWriterPNGWAV::handles_file(const String &p_path) const { + return p_path.get_extension().to_lower() == "png"; +} + +String MovieWriterPNGWAV::zeros_str(uint32_t p_index) { + char zeros[MAX_TRAILING_ZEROS + 1]; + for (uint32_t i = 0; i < MAX_TRAILING_ZEROS; i++) { + uint32_t idx = MAX_TRAILING_ZEROS - i - 1; + uint32_t digit = (p_index / uint32_t(Math::pow(double(10), double(idx)))) % 10; + zeros[i] = '0' + digit; + } + zeros[MAX_TRAILING_ZEROS] = 0; + return zeros; +} + +Error MovieWriterPNGWAV::write_begin(const Size2i &p_movie_size, uint32_t p_fps, const String &p_base_path) { + // Quick & Dirty PNGWAV Code based on - https://docs.microsoft.com/en-us/windows/win32/directshow/avi-riff-file-reference + + base_path = p_base_path.get_basename(); + if (base_path.is_relative_path()) { + base_path = "res://" + base_path; + } + + { + //Remove existing files before writing anew + uint32_t idx = 0; + Ref<DirAccess> d = DirAccess::open(base_path.get_base_dir()); + String file = base_path.get_file(); + while (true) { + String path = file + zeros_str(idx) + ".png"; + if (d->remove(path) != OK) { + break; + } + } + } + + f_wav = FileAccess::open(base_path + ".wav", FileAccess::WRITE_READ); + ERR_FAIL_COND_V(f_wav.is_null(), ERR_CANT_OPEN); + + fps = p_fps; + + f_wav->store_buffer((const uint8_t *)"RIFF", 4); + int total_size = 4 /* WAVE */ + 8 /* fmt+size */ + 16 /* format */ + 8 /* data+size */; + f_wav->store_32(total_size); //will store final later + f_wav->store_buffer((const uint8_t *)"WAVE", 4); + + /* FORMAT CHUNK */ + + f_wav->store_buffer((const uint8_t *)"fmt ", 4); + + uint32_t channels = 2; + switch (speaker_mode) { + case AudioServer::SPEAKER_MODE_STEREO: + channels = 2; + break; + case AudioServer::SPEAKER_SURROUND_31: + channels = 4; + break; + case AudioServer::SPEAKER_SURROUND_51: + channels = 6; + break; + case AudioServer::SPEAKER_SURROUND_71: + channels = 8; + break; + } + + f_wav->store_32(16); //standard format, no extra fields + f_wav->store_16(1); // compression code, standard PCM + f_wav->store_16(channels); //CHANNELS: 2 + + f_wav->store_32(mix_rate); + + /* useless stuff the format asks for */ + + int bits_per_sample = 32; + int blockalign = bits_per_sample / 8 * channels; + int bytes_per_sec = mix_rate * blockalign; + + audio_block_size = (mix_rate / fps) * blockalign; + + f_wav->store_32(bytes_per_sec); + f_wav->store_16(blockalign); // block align (unused) + f_wav->store_16(bits_per_sample); + + /* DATA CHUNK */ + + f_wav->store_buffer((const uint8_t *)"data", 4); + + f_wav->store_32(0); //data size... wooh + wav_data_size_pos = f_wav->get_position(); + + return OK; +} + +Error MovieWriterPNGWAV::write_frame(const Ref<Image> &p_image, const int32_t *p_audio_data) { + ERR_FAIL_COND_V(!f_wav.is_valid(), ERR_UNCONFIGURED); + + Vector<uint8_t> png_buffer = p_image->save_png_to_buffer(); + + Ref<FileAccess> fi = FileAccess::open(base_path + zeros_str(frame_count) + ".png", FileAccess::WRITE); + fi->store_buffer(png_buffer.ptr(), png_buffer.size()); + f_wav->store_buffer((const uint8_t *)p_audio_data, audio_block_size); + + frame_count++; + + return OK; +} + +void MovieWriterPNGWAV::write_end() { + if (f_wav.is_valid()) { + uint32_t total_size = 4 /* WAVE */ + 8 /* fmt+size */ + 16 /* format */ + 8 /* data+size */; + uint32_t datasize = f_wav->get_position() - wav_data_size_pos; + f_wav->seek(4); + f_wav->store_32(total_size + datasize); + f_wav->seek(0x28); + f_wav->store_32(datasize); + } +} + +MovieWriterPNGWAV::MovieWriterPNGWAV() { + mix_rate = GLOBAL_GET("editor/movie_writer/mix_rate"); + speaker_mode = AudioServer::SpeakerMode(int(GLOBAL_GET("editor/movie_writer/speaker_mode"))); +} diff --git a/servers/movie_writer/movie_writer_pngwav.h b/servers/movie_writer/movie_writer_pngwav.h new file mode 100644 index 0000000000..64608ce387 --- /dev/null +++ b/servers/movie_writer/movie_writer_pngwav.h @@ -0,0 +1,71 @@ +/*************************************************************************/ +/* movie_writer_pngwav.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef MOVIE_WRITER_PNGWAV_H +#define MOVIE_WRITER_PNGWAV_H + +#include "servers/movie_writer/movie_writer.h" + +class MovieWriterPNGWAV : public MovieWriter { + GDCLASS(MovieWriterPNGWAV, MovieWriter) + + enum { + MAX_TRAILING_ZEROS = 8 // more than 10 days at 60fps, no hard drive can put up with this anyway :) + }; + + uint32_t mix_rate = 48000; + AudioServer::SpeakerMode speaker_mode = AudioServer::SPEAKER_MODE_STEREO; + String base_path; + uint32_t frame_count = 0; + uint32_t fps = 0; + + uint32_t audio_block_size = 0; + + Ref<FileAccess> f_wav; + uint32_t wav_data_size_pos = 0; + + String zeros_str(uint32_t p_index); + +protected: + virtual uint32_t get_audio_mix_rate() const override; + virtual AudioServer::SpeakerMode get_audio_speaker_mode() const override; + virtual void get_supported_extensions(List<String> *r_extensions) const override; + + virtual Error write_begin(const Size2i &p_movie_size, uint32_t p_fps, const String &p_base_path) override; + virtual Error write_frame(const Ref<Image> &p_image, const int32_t *p_audio_data) override; + virtual void write_end() override; + + virtual bool handles_file(const String &p_path) const override; + +public: + MovieWriterPNGWAV(); +}; + +#endif // MOVIE_WRITER_PNGWAV_H diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index d7d2340119..db473f6296 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -59,6 +59,7 @@ #include "display_server.h" #include "movie_writer/movie_writer.h" #include "movie_writer/movie_writer_mjpeg.h" +#include "movie_writer/movie_writer_pngwav.h" #include "navigation_server_2d.h" #include "navigation_server_3d.h" #include "physics_2d/godot_physics_server_2d.h" diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index dd3d14f0a8..83f69e0674 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -536,7 +536,7 @@ class RenderForwardClustered : public RendererSceneRenderRD { AABB aabb; bool use_dynamic_gi = false; - bool use_baked_light = false; + bool use_baked_light = true; bool cast_double_sided_shadows = false; bool mirror = false; bool dirty_dependencies = false; diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index 1b2df0ab9f..82e6c52c43 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -591,7 +591,7 @@ protected: RID material_overlay; AABB aabb; - bool use_baked_light = false; + bool use_baked_light = true; bool cast_double_sided_shadows = false; // bool mirror = false; // !BAS! Does not seem used, we already have this in the main struct diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 90a7394344..eb4bc3d535 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -3129,14 +3129,14 @@ void RendererSceneRenderRD::render_buffers_configure(RID p_render_buffers, RID p if (rb->view_count == 1) { // copy as a convenience RenderBuffers::View view; - view.view_texture = rb->internal_texture; + view.view_texture = rb->texture; view.view_depth = rb->depth_texture; view.view_fb = rb->texture_fb; rb->views.push_back(view); } else { for (uint32_t i = 0; i < rb->view_count; i++) { RenderBuffers::View view; - view.view_texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->internal_texture, i, 0); + view.view_texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->texture, i, 0); view.view_depth = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->depth_texture, i, 0); if (!_render_buffers_can_be_storage()) { @@ -4150,6 +4150,9 @@ void RendererSceneRenderRD::_volumetric_fog_erase(RenderBuffers *rb) { if (rb->volumetric_fog->fog_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(rb->volumetric_fog->fog_uniform_set)) { RD::get_singleton()->free(rb->volumetric_fog->fog_uniform_set); } + if (rb->volumetric_fog->process_uniform_set_density.is_valid() && RD::get_singleton()->uniform_set_is_valid(rb->volumetric_fog->process_uniform_set_density)) { + RD::get_singleton()->free(rb->volumetric_fog->process_uniform_set_density); + } if (rb->volumetric_fog->process_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(rb->volumetric_fog->process_uniform_set)) { RD::get_singleton()->free(rb->volumetric_fog->process_uniform_set); } @@ -4482,7 +4485,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e RD::get_singleton()->compute_list_end(); } - if (rb->volumetric_fog->process_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(rb->volumetric_fog->process_uniform_set)) { + if (rb->volumetric_fog->process_uniform_set_density.is_null() || !RD::get_singleton()->uniform_set_is_valid(rb->volumetric_fog->process_uniform_set_density)) { //re create uniform set if needed Vector<RD::Uniform> uniforms; Vector<RD::Uniform> copy_uniforms; @@ -4682,7 +4685,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e rb->volumetric_fog->copy_uniform_set = RD::get_singleton()->uniform_set_create(copy_uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY), 0); - rb->volumetric_fog->process_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY), 0); + rb->volumetric_fog->process_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG), 0); RID aux7 = uniforms.write[7].get_id(0); RID aux8 = uniforms.write[8].get_id(0); @@ -4690,7 +4693,11 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e uniforms.write[7].set_id(0, aux8); uniforms.write[8].set_id(0, aux7); - rb->volumetric_fog->process_uniform_set2 = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, 0), 0); + rb->volumetric_fog->process_uniform_set2 = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_FOG), 0); + + uniforms.remove_at(8); + uniforms.write[7].set_id(0, aux7); + rb->volumetric_fog->process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY), 0); } bool using_sdfgi = env->volumetric_fog_gi_inject > 0.0001 && env->sdfgi_enabled && (rb->sdfgi != nullptr); @@ -4833,7 +4840,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[using_sdfgi ? VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY_WITH_SDFGI : VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY]); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, rb->volumetric_fog->process_uniform_set, 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, rb->volumetric_fog->process_uniform_set_density, 0); if (using_sdfgi) { RD::get_singleton()->compute_list_bind_uniform_set(compute_list, rb->volumetric_fog->sdfgi_uniform_set, 1); diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index c87fd6703f..3f03f857f7 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -799,6 +799,7 @@ private: RID fog_uniform_set; RID copy_uniform_set; + RID process_uniform_set_density; RID process_uniform_set; RID process_uniform_set2; RID sdfgi_uniform_set; diff --git a/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl b/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl index 347fd13b28..fdbd7d3e35 100644 --- a/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl +++ b/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl @@ -53,7 +53,6 @@ layout(set = 0, binding = 7) uniform sampler linear_sampler; #ifdef MODE_DENSITY layout(rgba16f, set = 0, binding = 8) uniform restrict writeonly image3D density_map; -layout(rgba16f, set = 0, binding = 9) uniform restrict readonly image3D fog_map; //unused #endif #ifdef MODE_FOG diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index c97ca3de5e..325907ee85 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -3282,7 +3282,7 @@ void RendererSceneCull::render_empty_scene(RID p_render_buffers, RID p_scenario, RendererSceneRender::CameraData camera_data; camera_data.set_camera(Transform3D(), CameraMatrix(), true, false); - scene_render->render_scene(p_render_buffers, &camera_data, nullptr, PagedArray<RendererSceneRender::GeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), RID(), RID(), p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr); + scene_render->render_scene(p_render_buffers, &camera_data, &camera_data, PagedArray<RendererSceneRender::GeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), RID(), RID(), p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr); #endif } diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index d1d3484871..4880221586 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -526,7 +526,7 @@ public: receive_shadows = true; visible = true; layer_mask = 1; - baked_light = false; + baked_light = true; dynamic_gi = false; redraw_if_visible = false; lightmap_slice_index = 0; diff --git a/thirdparty/README.md b/thirdparty/README.md index 1cc272b1bf..ed8eb9f48f 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -118,7 +118,7 @@ will limit its functionality to IPv4 only. ## etcpak - Upstream: https://github.com/wolfpld/etcpak -- Version: 1.0 (a77d5a37ddf48034cee8aeb9e8792a623c265b4c, 2022) +- Version: 1.0 (153f0e04a18b93c277684b577365210adcf8e11c, 2022) - License: BSD-3-Clause Files extracted from upstream source: @@ -759,7 +759,7 @@ Files extracted from upstream source: ## zstd - Upstream: https://github.com/facebook/zstd -- Version: 1.5.0 (a488ba114ec17ea1054b9057c26a046fc122b3b6, 2021) +- Version: 1.5.2 (e47e674cd09583ff0503f0f6defd6d23d8b718d3, 2022) - License: BSD-3-Clause Files extracted from upstream source: diff --git a/thirdparty/etcpak/ProcessRGB.cpp b/thirdparty/etcpak/ProcessRGB.cpp index fdb0967ce7..4dc3bf23af 100644 --- a/thirdparty/etcpak/ProcessRGB.cpp +++ b/thirdparty/etcpak/ProcessRGB.cpp @@ -3216,9 +3216,9 @@ etcpak_force_inline static uint16x8_t ErrorProbe_EAC_NEON( uint8x8_t recVal, uin uint8x8_t srcValWide; #ifndef __aarch64__ if( Index < 8 ) - srcValWide = vdup_lane_u8( vget_low_u8( alphaBlock ), ClampConstant( Index, 0, 8 ) ); + srcValWide = vdup_lane_u8( vget_low_u8( alphaBlock ), ClampConstant( Index, 0, 7 ) ); else - srcValWide = vdup_lane_u8( vget_high_u8( alphaBlock ), ClampConstant( Index - 8, 0, 8 ) ); + srcValWide = vdup_lane_u8( vget_high_u8( alphaBlock ), ClampConstant( Index - 8, 0, 7 ) ); #else srcValWide = vdup_laneq_u8( alphaBlock, Index ); #endif @@ -3256,9 +3256,9 @@ etcpak_force_inline static int16x8_t WidenMultiplier_EAC_NEON( int16x8_t multipl constexpr int Lane = GetMulSel( Index ); #ifndef __aarch64__ if( Lane < 4 ) - return vdupq_lane_s16( vget_low_s16( multipliers ), ClampConstant( Lane, 0, 4 ) ); + return vdupq_lane_s16( vget_low_s16( multipliers ), ClampConstant( Lane, 0, 3 ) ); else - return vdupq_lane_s16( vget_high_s16( multipliers ), ClampConstant( Lane - 4, 0, 4 ) ); + return vdupq_lane_s16( vget_high_s16( multipliers ), ClampConstant( Lane - 4, 0, 3 ) ); #else return vdupq_laneq_s16( multipliers, Lane ); #endif diff --git a/thirdparty/zstd/common/bitstream.h b/thirdparty/zstd/common/bitstream.h index 2e5a933ad3..84b6062ff3 100644 --- a/thirdparty/zstd/common/bitstream.h +++ b/thirdparty/zstd/common/bitstream.h @@ -143,10 +143,16 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val) { # if defined(_MSC_VER) /* Visual */ # if STATIC_BMI2 == 1 - return _lzcnt_u32(val) ^ 31; + return _lzcnt_u32(val) ^ 31; # else - unsigned long r = 0; - return _BitScanReverse(&r, val) ? (unsigned)r : 0; + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ return __builtin_clz (val) ^ 31; @@ -293,22 +299,22 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si switch(srcSize) { case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16); - /* fall-through */ + ZSTD_FALLTHROUGH; case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24); - /* fall-through */ + ZSTD_FALLTHROUGH; case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32); - /* fall-through */ + ZSTD_FALLTHROUGH; case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; - /* fall-through */ + ZSTD_FALLTHROUGH; case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; - /* fall-through */ + ZSTD_FALLTHROUGH; case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; - /* fall-through */ + ZSTD_FALLTHROUGH; default: break; } @@ -332,7 +338,16 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c U32 const regMask = sizeof(bitContainer)*8 - 1; /* if start > regMask, bitstream is corrupted, and result is undefined */ assert(nbBits < BIT_MASK_SIZE); + /* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better + * than accessing memory. When bmi2 instruction is not present, we consider + * such cpus old (pre-Haswell, 2013) and their performance is not of that + * importance. + */ +#if defined(__x86_64__) || defined(_M_X86) + return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1); +#else return (bitContainer >> (start & regMask)) & BIT_mask[nbBits]; +#endif } MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) diff --git a/thirdparty/zstd/common/compiler.h b/thirdparty/zstd/common/compiler.h index a951d0adea..516930c01e 100644 --- a/thirdparty/zstd/common/compiler.h +++ b/thirdparty/zstd/common/compiler.h @@ -11,6 +11,8 @@ #ifndef ZSTD_COMPILER_H #define ZSTD_COMPILER_H +#include "portability_macros.h" + /*-******************************************************* * Compiler specifics *********************************************************/ @@ -40,7 +42,7 @@ /** On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC). - This explictly marks such functions as __cdecl so that the code will still compile + This explicitly marks such functions as __cdecl so that the code will still compile if a CC other than __cdecl has been made the default. */ #if defined(_MSC_VER) @@ -92,29 +94,17 @@ /* target attribute */ -#ifndef __has_attribute - #define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ -#endif #if defined(__GNUC__) || defined(__ICCARM__) # define TARGET_ATTRIBUTE(target) __attribute__((__target__(target))) #else # define TARGET_ATTRIBUTE(target) #endif -/* Enable runtime BMI2 dispatch based on the CPU. - * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. +/* Target attribute for BMI2 dynamic dispatch. + * Enable lzcnt, bmi, and bmi2. + * We test for bmi1 & bmi2. lzcnt is included in bmi1. */ -#ifndef DYNAMIC_BMI2 - #if ((defined(__clang__) && __has_attribute(__target__)) \ - || (defined(__GNUC__) \ - && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ - && (defined(__x86_64__) || defined(_M_X86)) \ - && !defined(__BMI2__) - # define DYNAMIC_BMI2 1 - #else - # define DYNAMIC_BMI2 0 - #endif -#endif +#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2") /* prefetch * can be disabled, by declaring NO_PREFETCH build macro */ @@ -150,8 +140,9 @@ } /* vectorization - * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax */ -#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) + * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax, + * and some compilers, like Intel ICC and MCST LCC, do not support it at all. */ +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__) # if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5) # define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) # else @@ -197,25 +188,91 @@ #define STATIC_BMI2 0 #endif -/* compat. with non-clang compilers */ -#ifndef __has_builtin -# define __has_builtin(x) 0 +/* compile time determination of SIMD support */ +#if !defined(ZSTD_NO_INTRINSICS) +# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) +# define ZSTD_ARCH_X86_SSE2 +# endif +# if defined(__ARM_NEON) || defined(_M_ARM64) +# define ZSTD_ARCH_ARM_NEON +# endif +# +# if defined(ZSTD_ARCH_X86_SSE2) +# include <emmintrin.h> +# elif defined(ZSTD_ARCH_ARM_NEON) +# include <arm_neon.h> +# endif #endif -/* compat. with non-clang compilers */ -#ifndef __has_feature -# define __has_feature(x) 0 +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define ZSTD_HAS_C_ATTRIBUTE(x) 0 #endif -/* detects whether we are being compiled under msan */ -#ifndef ZSTD_MEMORY_SANITIZER -# if __has_feature(memory_sanitizer) -# define ZSTD_MEMORY_SANITIZER 1 -# else -# define ZSTD_MEMORY_SANITIZER 0 -# endif +/* Only use C++ attributes in C++. Some compilers report support for C++ + * attributes when compiling with C. + */ +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0 #endif +/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute. + * - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough + * - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough + * - Else: __attribute__((__fallthrough__)) + */ +#ifndef ZSTD_FALLTHROUGH +# if ZSTD_HAS_C_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough) +# define ZSTD_FALLTHROUGH [[fallthrough]] +# elif __has_attribute(__fallthrough__) +/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon + * gcc complains about: a label can only be part of a statement and a declaration is not a statement. + */ +# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__)) +# else +# define ZSTD_FALLTHROUGH +# endif +#endif + +/*-************************************************************** +* Alignment check +*****************************************************************/ + +/* this test was initially positioned in mem.h, + * but this file is removed (or replaced) for linux kernel + * so it's now hosted in compiler.h, + * which remains valid for both user & kernel spaces. + */ + +#ifndef ZSTD_ALIGNOF +# if defined(__GNUC__) || defined(_MSC_VER) +/* covers gcc, clang & MSVC */ +/* note : this section must come first, before C11, + * due to a limitation in the kernel source generator */ +# define ZSTD_ALIGNOF(T) __alignof(T) + +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +/* C11 support */ +# include <stdalign.h> +# define ZSTD_ALIGNOF(T) alignof(T) + +# else +/* No known support for alignof() - imperfect backup */ +# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T)) + +# endif +#endif /* ZSTD_ALIGNOF */ + +/*-************************************************************** +* Sanitizer +*****************************************************************/ + #if ZSTD_MEMORY_SANITIZER /* Not all platforms that support msan provide sanitizers/msan_interface.h. * We therefore declare the functions we need ourselves, rather than trying to @@ -237,17 +294,6 @@ void __msan_poison(const volatile void *a, size_t size); intptr_t __msan_test_shadow(const volatile void *x, size_t size); #endif -/* detects whether we are being compiled under asan */ -#ifndef ZSTD_ADDRESS_SANITIZER -# if __has_feature(address_sanitizer) -# define ZSTD_ADDRESS_SANITIZER 1 -# elif defined(__SANITIZE_ADDRESS__) -# define ZSTD_ADDRESS_SANITIZER 1 -# else -# define ZSTD_ADDRESS_SANITIZER 0 -# endif -#endif - #if ZSTD_ADDRESS_SANITIZER /* Not all platforms that support asan provide sanitizers/asan_interface.h. * We therefore declare the functions we need ourselves, rather than trying to diff --git a/thirdparty/zstd/common/entropy_common.c b/thirdparty/zstd/common/entropy_common.c index 41cd69566b..4229b40c5e 100644 --- a/thirdparty/zstd/common/entropy_common.c +++ b/thirdparty/zstd/common/entropy_common.c @@ -43,8 +43,14 @@ static U32 FSE_ctz(U32 val) assert(val != 0); { # if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - return _BitScanForward(&r, val) ? (unsigned)r : 0; + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ return __builtin_ctz(val); # elif defined(__ICCARM__) /* IAR Intrinsic */ @@ -217,7 +223,7 @@ static size_t FSE_readNCount_body_default( } #if DYNAMIC_BMI2 -TARGET_ATTRIBUTE("bmi2") static size_t FSE_readNCount_body_bmi2( +BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2( short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, const void* headerBuffer, size_t hbSize) { @@ -299,7 +305,7 @@ HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats, ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32)); weightTotal = 0; { U32 n; for (n=0; n<oSize; n++) { - if (huffWeight[n] >= HUF_TABLELOG_MAX) return ERROR(corruption_detected); + if (huffWeight[n] > HUF_TABLELOG_MAX) return ERROR(corruption_detected); rankStats[huffWeight[n]]++; weightTotal += (1 << huffWeight[n]) >> 1; } } @@ -337,7 +343,7 @@ static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* r } #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, +static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats, U32* nbSymbolsPtr, U32* tableLogPtr, const void* src, size_t srcSize, void* workSpace, size_t wkspSize) diff --git a/thirdparty/zstd/common/error_private.h b/thirdparty/zstd/common/error_private.h index 6d8b9f7763..007d81066a 100644 --- a/thirdparty/zstd/common/error_private.h +++ b/thirdparty/zstd/common/error_private.h @@ -22,6 +22,8 @@ extern "C" { * Dependencies ******************************************/ #include "../zstd_errors.h" /* enum list */ +#include "compiler.h" +#include "debug.h" #include "zstd_deps.h" /* size_t */ @@ -73,6 +75,83 @@ ERR_STATIC const char* ERR_getErrorName(size_t code) return ERR_getErrorString(ERR_getErrorCode(code)); } +/** + * Ignore: this is an internal helper. + * + * This is a helper function to help force C99-correctness during compilation. + * Under strict compilation modes, variadic macro arguments can't be empty. + * However, variadic function arguments can be. Using a function therefore lets + * us statically check that at least one (string) argument was passed, + * independent of the compilation flags. + */ +static INLINE_KEYWORD UNUSED_ATTR +void _force_has_format_string(const char *format, ...) { + (void)format; +} + +/** + * Ignore: this is an internal helper. + * + * We want to force this function invocation to be syntactically correct, but + * we don't want to force runtime evaluation of its arguments. + */ +#define _FORCE_HAS_FORMAT_STRING(...) \ + if (0) { \ + _force_has_format_string(__VA_ARGS__); \ + } + +#define ERR_QUOTE(str) #str + +/** + * Return the specified error if the condition evaluates to true. + * + * In debug modes, prints additional information. + * In order to do that (particularly, printing the conditional that failed), + * this can't just wrap RETURN_ERROR(). + */ +#define RETURN_ERROR_IF(cond, err, ...) \ + if (cond) { \ + RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } + +/** + * Unconditionally return the specified error. + * + * In debug modes, prints additional information. + */ +#define RETURN_ERROR(err, ...) \ + do { \ + RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ + __FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return ERROR(err); \ + } while(0); + +/** + * If the provided expression evaluates to an error code, returns that error code. + * + * In debug modes, prints additional information. + */ +#define FORWARD_IF_ERROR(err, ...) \ + do { \ + size_t const err_code = (err); \ + if (ERR_isError(err_code)) { \ + RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ + __FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \ + _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ + RAWLOG(3, ": " __VA_ARGS__); \ + RAWLOG(3, "\n"); \ + return err_code; \ + } \ + } while(0); + #if defined (__cplusplus) } #endif diff --git a/thirdparty/zstd/common/fse.h b/thirdparty/zstd/common/fse.h index 19dd4febcd..714bfd3e7f 100644 --- a/thirdparty/zstd/common/fse.h +++ b/thirdparty/zstd/common/fse.h @@ -336,8 +336,9 @@ size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue); /* FSE_buildCTable_wksp() : * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`). * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`. + * See FSE_buildCTable_wksp() for breakdown of workspace usage. */ -#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (maxSymbolValue + 2 + (1ull << (tableLog - 2))) +#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */) #define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)) size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); diff --git a/thirdparty/zstd/common/fse_decompress.c b/thirdparty/zstd/common/fse_decompress.c index f4ff58fa0a..a5a358015f 100644 --- a/thirdparty/zstd/common/fse_decompress.c +++ b/thirdparty/zstd/common/fse_decompress.c @@ -365,7 +365,7 @@ static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, co } #if DYNAMIC_BMI2 -TARGET_ATTRIBUTE("bmi2") static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) +BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize) { return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1); } diff --git a/thirdparty/zstd/common/huf.h b/thirdparty/zstd/common/huf.h index 3d47ced030..85518481ec 100644 --- a/thirdparty/zstd/common/huf.h +++ b/thirdparty/zstd/common/huf.h @@ -89,9 +89,9 @@ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, /** HUF_compress4X_wksp() : * Same as HUF_compress2(), but uses externally allocated `workSpace`. - * `workspace` must have minimum alignment of 4, and be at least as large as HUF_WORKSPACE_SIZE */ -#define HUF_WORKSPACE_SIZE ((6 << 10) + 256) -#define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32)) + * `workspace` must be at least as large as HUF_WORKSPACE_SIZE */ +#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */) +#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64)) HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, @@ -116,11 +116,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, /* *** Constants *** */ -#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */ +#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */ #define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */ #define HUF_SYMBOLVALUE_MAX 255 -#define HUF_TABLELOG_ABSOLUTEMAX 15 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ +#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */ #if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX) # error "HUF_TABLELOG_MAX is too large !" #endif @@ -136,15 +136,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, /* static allocation of HUF's Compression Table */ /* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */ -struct HUF_CElt_s { - U16 val; - BYTE nbBits; -}; /* typedef'd to HUF_CElt */ -typedef struct HUF_CElt_s HUF_CElt; /* consider it an incomplete type */ -#define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1) /* Use tables of U32, for proper alignment */ -#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32)) +typedef size_t HUF_CElt; /* consider it an incomplete type */ +#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */ +#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t)) #define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ - HUF_CElt name[HUF_CTABLE_SIZE_U32(maxSymbolValue)] /* no final ; */ + HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */ /* static allocation of HUF's DTable */ typedef U32 HUF_DTable; @@ -194,6 +190,7 @@ size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSym size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog); size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize); size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable); +size_t HUF_compress4X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2); size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue); @@ -206,12 +203,13 @@ typedef enum { * Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. * If it uses hufTable it does not modify hufTable or repeat. * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. - * If preferRepeat then the old table will always be used if valid. */ + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ size_t HUF_compress4X_repeat(void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2); + HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible); /** HUF_buildCTable_wksp() : * Same as HUF_buildCTable(), but using externally allocated scratch buffer. @@ -249,11 +247,10 @@ size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, * Loading a CTable saved with HUF_writeCTable() */ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights); -/** HUF_getNbBits() : +/** HUF_getNbBitsFromCTable() : * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX - * Note 1 : is not inlined, as HUF_CElt definition is private - * Note 2 : const void* used, so that it can provide a statically allocated table as argument (which uses type U32) */ -U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue); + * Note 1 : is not inlined, as HUF_CElt definition is private */ +U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue); /* * HUF_decompress() does the following: @@ -305,18 +302,20 @@ size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* c /* ====================== */ size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog); -size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U32 unsigned */ +size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U64 U64 */ size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable); +size_t HUF_compress1X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2); /** HUF_compress1X_repeat() : * Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none. * If it uses hufTable it does not modify hufTable or repeat. * If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used. - * If preferRepeat then the old table will always be used if valid. */ + * If preferRepeat then the old table will always be used if valid. + * If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ size_t HUF_compress1X_repeat(void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */ - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2); + HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible); size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */ #ifndef HUF_FORCE_DECOMPRESS_X1 @@ -354,6 +353,9 @@ size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t ds #ifndef HUF_FORCE_DECOMPRESS_X2 size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2); #endif +#ifndef HUF_FORCE_DECOMPRESS_X1 +size_t HUF_readDTableX2_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2); +#endif #endif /* HUF_STATIC_LINKING_ONLY */ diff --git a/thirdparty/zstd/common/mem.h b/thirdparty/zstd/common/mem.h index 9f3b81ab9d..85581c3847 100644 --- a/thirdparty/zstd/common/mem.h +++ b/thirdparty/zstd/common/mem.h @@ -51,6 +51,8 @@ extern "C" { # include <stdint.h> /* intptr_t */ # endif typedef uint8_t BYTE; + typedef uint8_t U8; + typedef int8_t S8; typedef uint16_t U16; typedef int16_t S16; typedef uint32_t U32; @@ -63,6 +65,8 @@ extern "C" { # error "this implementation requires char to be exactly 8-bit type" #endif typedef unsigned char BYTE; + typedef unsigned char U8; + typedef signed char S8; #if USHRT_MAX != 65535 # error "this implementation requires short to be exactly 16-bit type" #endif @@ -153,8 +157,22 @@ MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; } MEM_STATIC unsigned MEM_isLittleEndian(void) { +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + return 1; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + return 0; +#elif defined(__clang__) && __LITTLE_ENDIAN__ + return 1; +#elif defined(__clang__) && __BIG_ENDIAN__ + return 0; +#elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86) + return 1; +#elif defined(__DMC__) && defined(_M_IX86) + return 1; +#else const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ return one.c[0]; +#endif } #if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2) diff --git a/thirdparty/zstd/common/pool.c b/thirdparty/zstd/common/pool.c index ea70b8b65a..2e37cdd73c 100644 --- a/thirdparty/zstd/common/pool.c +++ b/thirdparty/zstd/common/pool.c @@ -86,7 +86,7 @@ static void* POOL_thread(void* opaque) { { POOL_job const job = ctx->queue[ctx->queueHead]; ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize; ctx->numThreadsBusy++; - ctx->queueEmpty = ctx->queueHead == ctx->queueTail; + ctx->queueEmpty = (ctx->queueHead == ctx->queueTail); /* Unlock the mutex, signal a pusher, and run the job */ ZSTD_pthread_cond_signal(&ctx->queuePushCond); ZSTD_pthread_mutex_unlock(&ctx->queueMutex); @@ -105,6 +105,7 @@ static void* POOL_thread(void* opaque) { assert(0); /* Unreachable */ } +/* ZSTD_createThreadPool() : public access point */ POOL_ctx* ZSTD_createThreadPool(size_t numThreads) { return POOL_create (numThreads, 0); } @@ -114,7 +115,8 @@ POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { } POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, - ZSTD_customMem customMem) { + ZSTD_customMem customMem) +{ POOL_ctx* ctx; /* Check parameters */ if (!numThreads) { return NULL; } @@ -192,7 +194,7 @@ void ZSTD_freeThreadPool (ZSTD_threadPool* pool) { POOL_free (pool); } -size_t POOL_sizeof(POOL_ctx *ctx) { +size_t POOL_sizeof(const POOL_ctx* ctx) { if (ctx==NULL) return 0; /* supports sizeof NULL */ return sizeof(*ctx) + ctx->queueSize * sizeof(POOL_job) @@ -257,7 +259,8 @@ static int isQueueFull(POOL_ctx const* ctx) { } -static void POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque) +static void +POOL_add_internal(POOL_ctx* ctx, POOL_function function, void *opaque) { POOL_job const job = {function, opaque}; assert(ctx != NULL); @@ -313,7 +316,9 @@ POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) { return POOL_create_advanced(numThreads, queueSize, ZSTD_defaultCMem); } -POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) { +POOL_ctx* +POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) +{ (void)numThreads; (void)queueSize; (void)customMem; @@ -341,7 +346,7 @@ int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque) { return 1; } -size_t POOL_sizeof(POOL_ctx* ctx) { +size_t POOL_sizeof(const POOL_ctx* ctx) { if (ctx==NULL) return 0; /* supports sizeof NULL */ assert(ctx == &g_poolCtx); return sizeof(*ctx); diff --git a/thirdparty/zstd/common/pool.h b/thirdparty/zstd/common/pool.h index e18aa0708f..0ebde1805d 100644 --- a/thirdparty/zstd/common/pool.h +++ b/thirdparty/zstd/common/pool.h @@ -53,7 +53,7 @@ int POOL_resize(POOL_ctx* ctx, size_t numThreads); * @return threadpool memory usage * note : compatible with NULL (returns 0 in this case) */ -size_t POOL_sizeof(POOL_ctx* ctx); +size_t POOL_sizeof(const POOL_ctx* ctx); /*! POOL_function : * The function type that can be added to a thread pool. @@ -70,7 +70,7 @@ void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque); /*! POOL_tryAdd() : - * Add the job `function(opaque)` to thread pool _if_ a worker is available. + * Add the job `function(opaque)` to thread pool _if_ a queue slot is available. * Returns immediately even if not (does not block). * @return : 1 if successful, 0 if not. */ diff --git a/thirdparty/zstd/common/portability_macros.h b/thirdparty/zstd/common/portability_macros.h new file mode 100644 index 0000000000..2143817f57 --- /dev/null +++ b/thirdparty/zstd/common/portability_macros.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_PORTABILITY_MACROS_H +#define ZSTD_PORTABILITY_MACROS_H + +/** + * This header file contains macro defintions to support portability. + * This header is shared between C and ASM code, so it MUST only + * contain macro definitions. It MUST not contain any C code. + * + * This header ONLY defines macros to detect platforms/feature support. + * + */ + + +/* compat. with non-clang compilers */ +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif + +/* compat. with non-clang compilers */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif + +/* detects whether we are being compiled under msan */ +#ifndef ZSTD_MEMORY_SANITIZER +# if __has_feature(memory_sanitizer) +# define ZSTD_MEMORY_SANITIZER 1 +# else +# define ZSTD_MEMORY_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under asan */ +#ifndef ZSTD_ADDRESS_SANITIZER +# if __has_feature(address_sanitizer) +# define ZSTD_ADDRESS_SANITIZER 1 +# elif defined(__SANITIZE_ADDRESS__) +# define ZSTD_ADDRESS_SANITIZER 1 +# else +# define ZSTD_ADDRESS_SANITIZER 0 +# endif +#endif + +/* detects whether we are being compiled under dfsan */ +#ifndef ZSTD_DATAFLOW_SANITIZER +# if __has_feature(dataflow_sanitizer) +# define ZSTD_DATAFLOW_SANITIZER 1 +# else +# define ZSTD_DATAFLOW_SANITIZER 0 +# endif +#endif + +/* Mark the internal assembly functions as hidden */ +#ifdef __ELF__ +# define ZSTD_HIDE_ASM_FUNCTION(func) .hidden func +#else +# define ZSTD_HIDE_ASM_FUNCTION(func) +#endif + +/* Enable runtime BMI2 dispatch based on the CPU. + * Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default. + */ +#ifndef DYNAMIC_BMI2 + #if ((defined(__clang__) && __has_attribute(__target__)) \ + || (defined(__GNUC__) \ + && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \ + && (defined(__x86_64__) || defined(_M_X64)) \ + && !defined(__BMI2__) + # define DYNAMIC_BMI2 1 + #else + # define DYNAMIC_BMI2 0 + #endif +#endif + +/** + * Only enable assembly for GNUC comptabile compilers, + * because other platforms may not support GAS assembly syntax. + * + * Only enable assembly for Linux / MacOS, other platforms may + * work, but they haven't been tested. This could likely be + * extended to BSD systems. + * + * Disable assembly when MSAN is enabled, because MSAN requires + * 100% of code to be instrumented to work. + */ +#if defined(__GNUC__) +# if defined(__linux__) || defined(__linux) || defined(__APPLE__) +# if ZSTD_MEMORY_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# elif ZSTD_DATAFLOW_SANITIZER +# define ZSTD_ASM_SUPPORTED 0 +# else +# define ZSTD_ASM_SUPPORTED 1 +# endif +# else +# define ZSTD_ASM_SUPPORTED 0 +# endif +#else +# define ZSTD_ASM_SUPPORTED 0 +#endif + +/** + * Determines whether we should enable assembly for x86-64 + * with BMI2. + * + * Enable if all of the following conditions hold: + * - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM + * - Assembly is supported + * - We are compiling for x86-64 and either: + * - DYNAMIC_BMI2 is enabled + * - BMI2 is supported at compile time + */ +#if !defined(ZSTD_DISABLE_ASM) && \ + ZSTD_ASM_SUPPORTED && \ + defined(__x86_64__) && \ + (DYNAMIC_BMI2 || defined(__BMI2__)) +# define ZSTD_ENABLE_ASM_X86_64_BMI2 1 +#else +# define ZSTD_ENABLE_ASM_X86_64_BMI2 0 +#endif + +#endif /* ZSTD_PORTABILITY_MACROS_H */ diff --git a/thirdparty/zstd/common/xxhash.c b/thirdparty/zstd/common/xxhash.c index 926b33604e..d49497cf1c 100644 --- a/thirdparty/zstd/common/xxhash.c +++ b/thirdparty/zstd/common/xxhash.c @@ -5,7 +5,7 @@ * You can contact the author at : * - xxHash homepage: http://www.xxhash.com * - xxHash source repository : https://github.com/Cyan4973/xxHash - * + * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). @@ -13,812 +13,12 @@ */ -/* ************************************* -* Tuning parameters -***************************************/ -/*!XXH_FORCE_MEMORY_ACCESS : - * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. - * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. - * The below switch allow to select different access method for improved performance. - * Method 0 (default) : use `memcpy()`. Safe and portable. - * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). - * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. - * Method 2 : direct access. This method doesn't depend on compiler but violate C standard. - * It can generate buggy code on targets which do not support unaligned memory accesses. - * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) - * See http://stackoverflow.com/a/32095106/646947 for details. - * Prefer these methods in priority order (0 > 1 > 2) - */ -#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if (defined(__INTEL_COMPILER) && !defined(WIN32)) || \ - (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) || \ - defined(__ICCARM__) -# define XXH_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/*!XXH_ACCEPT_NULL_INPUT_POINTER : - * If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer. - * When this option is enabled, xxHash output for null input pointers will be the same as a null-length input. - * By default, this option is disabled. To enable it, uncomment below define : - */ -/* #define XXH_ACCEPT_NULL_INPUT_POINTER 1 */ - -/*!XXH_FORCE_NATIVE_FORMAT : - * By default, xxHash library provides endian-independent Hash values, based on little-endian convention. - * Results are therefore identical for little-endian and big-endian CPU. - * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format. - * Should endian-independence be of no importance for your application, you may set the #define below to 1, - * to improve speed for Big-endian CPU. - * This option has no impact on Little_Endian CPU. - */ -#ifndef XXH_FORCE_NATIVE_FORMAT /* can be defined externally */ -# define XXH_FORCE_NATIVE_FORMAT 0 -#endif -/*!XXH_FORCE_ALIGN_CHECK : - * This is a minor performance trick, only useful with lots of very small keys. - * It means : check for aligned/unaligned input. - * The check costs one initial branch per hash; set to 0 when the input data - * is guaranteed to be aligned. +/* + * xxhash.c instantiates functions defined in xxhash.h */ -#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ -# if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) -# define XXH_FORCE_ALIGN_CHECK 0 -# else -# define XXH_FORCE_ALIGN_CHECK 1 -# endif -#endif - -/* ************************************* -* Includes & Memory related functions -***************************************/ -/* Modify the local functions below should you wish to use some other memory routines */ -/* for ZSTD_malloc(), ZSTD_free() */ -#define ZSTD_DEPS_NEED_MALLOC -#include "zstd_deps.h" /* size_t, ZSTD_malloc, ZSTD_free, ZSTD_memcpy */ -static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } -static void XXH_free (void* p) { ZSTD_free(p); } -static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } +#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */ +#define XXH_IMPLEMENTATION /* access definitions */ -#ifndef XXH_STATIC_LINKING_ONLY -# define XXH_STATIC_LINKING_ONLY -#endif #include "xxhash.h" - - -/* ************************************* -* Compiler Specific Options -***************************************/ -#include "compiler.h" - - -/* ************************************* -* Basic Types -***************************************/ -#include "mem.h" /* BYTE, U32, U64, size_t */ - -#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) - -/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; } -static U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; } - -#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) - -/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ -/* currently only defined for gcc and icc */ -typedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign; - -static U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } -static U64 XXH_read64(const void* ptr) { return ((const unalign*)ptr)->u64; } - -#else - -/* portable and safe solution. Generally efficient. - * see : http://stackoverflow.com/a/32095106/646947 - */ - -static U32 XXH_read32(const void* memPtr) -{ - U32 val; - ZSTD_memcpy(&val, memPtr, sizeof(val)); - return val; -} - -static U64 XXH_read64(const void* memPtr) -{ - U64 val; - ZSTD_memcpy(&val, memPtr, sizeof(val)); - return val; -} - -#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ - - -/* **************************************** -* Compiler-specific Functions and Macros -******************************************/ -#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) - -/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */ -#if defined(_MSC_VER) -# define XXH_rotl32(x,r) _rotl(x,r) -# define XXH_rotl64(x,r) _rotl64(x,r) -#else -#if defined(__ICCARM__) -# include <intrinsics.h> -# define XXH_rotl32(x,r) __ROR(x,(32 - r)) -#else -# define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r))) -#endif -# define XXH_rotl64(x,r) ((x << r) | (x >> (64 - r))) -#endif - -#if defined(_MSC_VER) /* Visual Studio */ -# define XXH_swap32 _byteswap_ulong -# define XXH_swap64 _byteswap_uint64 -#elif GCC_VERSION >= 403 -# define XXH_swap32 __builtin_bswap32 -# define XXH_swap64 __builtin_bswap64 -#else -static U32 XXH_swap32 (U32 x) -{ - return ((x << 24) & 0xff000000 ) | - ((x << 8) & 0x00ff0000 ) | - ((x >> 8) & 0x0000ff00 ) | - ((x >> 24) & 0x000000ff ); -} -static U64 XXH_swap64 (U64 x) -{ - return ((x << 56) & 0xff00000000000000ULL) | - ((x << 40) & 0x00ff000000000000ULL) | - ((x << 24) & 0x0000ff0000000000ULL) | - ((x << 8) & 0x000000ff00000000ULL) | - ((x >> 8) & 0x00000000ff000000ULL) | - ((x >> 24) & 0x0000000000ff0000ULL) | - ((x >> 40) & 0x000000000000ff00ULL) | - ((x >> 56) & 0x00000000000000ffULL); -} -#endif - - -/* ************************************* -* Architecture Macros -***************************************/ -typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; - -/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */ -#ifndef XXH_CPU_LITTLE_ENDIAN - static const int g_one = 1; -# define XXH_CPU_LITTLE_ENDIAN (*(const char*)(&g_one)) -#endif - - -/* *************************** -* Memory reads -*****************************/ -typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; - -FORCE_INLINE_TEMPLATE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); - else - return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr); -} - -FORCE_INLINE_TEMPLATE U32 XXH_readLE32(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE32_align(ptr, endian, XXH_unaligned); -} - -static U32 XXH_readBE32(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); -} - -FORCE_INLINE_TEMPLATE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align) -{ - if (align==XXH_unaligned) - return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); - else - return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr); -} - -FORCE_INLINE_TEMPLATE U64 XXH_readLE64(const void* ptr, XXH_endianess endian) -{ - return XXH_readLE64_align(ptr, endian, XXH_unaligned); -} - -static U64 XXH_readBE64(const void* ptr) -{ - return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); -} - - -/* ************************************* -* Macros -***************************************/ -#define XXH_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */ - - -/* ************************************* -* Constants -***************************************/ -static const U32 PRIME32_1 = 2654435761U; -static const U32 PRIME32_2 = 2246822519U; -static const U32 PRIME32_3 = 3266489917U; -static const U32 PRIME32_4 = 668265263U; -static const U32 PRIME32_5 = 374761393U; - -static const U64 PRIME64_1 = 11400714785074694791ULL; -static const U64 PRIME64_2 = 14029467366897019727ULL; -static const U64 PRIME64_3 = 1609587929392839161ULL; -static const U64 PRIME64_4 = 9650029242287828579ULL; -static const U64 PRIME64_5 = 2870177450012600261ULL; - -XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } - - -/* ************************** -* Utils -****************************/ -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dstState, const XXH32_state_t* restrict srcState) -{ - ZSTD_memcpy(dstState, srcState, sizeof(*dstState)); -} - -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dstState, const XXH64_state_t* restrict srcState) -{ - ZSTD_memcpy(dstState, srcState, sizeof(*dstState)); -} - - -/* *************************** -* Simple Hash Functions -*****************************/ - -static U32 XXH32_round(U32 seed, U32 input) -{ - seed += input * PRIME32_2; - seed = XXH_rotl32(seed, 13); - seed *= PRIME32_1; - return seed; -} - -FORCE_INLINE_TEMPLATE U32 XXH32_endian_align(const void* input, size_t len, U32 seed, XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* bEnd = p + len; - U32 h32; -#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align) - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)16; - } -#endif - - if (len>=16) { - const BYTE* const limit = bEnd - 16; - U32 v1 = seed + PRIME32_1 + PRIME32_2; - U32 v2 = seed + PRIME32_2; - U32 v3 = seed + 0; - U32 v4 = seed - PRIME32_1; - - do { - v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4; - v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4; - v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4; - v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4; - } while (p<=limit); - - h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); - } else { - h32 = seed + PRIME32_5; - } - - h32 += (U32) len; - - while (p+4<=bEnd) { - h32 += XXH_get32bits(p) * PRIME32_3; - h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; - p+=4; - } - - while (p<bEnd) { - h32 += (*p) * PRIME32_5; - h32 = XXH_rotl32(h32, 11) * PRIME32_1 ; - p++; - } - - h32 ^= h32 >> 15; - h32 *= PRIME32_2; - h32 ^= h32 >> 13; - h32 *= PRIME32_3; - h32 ^= h32 >> 16; - - return h32; -} - - -XXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH32_CREATESTATE_STATIC(state); - XXH32_reset(state, seed); - XXH32_update(state, input, len); - return XXH32_digest(state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - - -static U64 XXH64_round(U64 acc, U64 input) -{ - acc += input * PRIME64_2; - acc = XXH_rotl64(acc, 31); - acc *= PRIME64_1; - return acc; -} - -static U64 XXH64_mergeRound(U64 acc, U64 val) -{ - val = XXH64_round(0, val); - acc ^= val; - acc = acc * PRIME64_1 + PRIME64_4; - return acc; -} - -FORCE_INLINE_TEMPLATE U64 XXH64_endian_align(const void* input, size_t len, U64 seed, XXH_endianess endian, XXH_alignment align) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - U64 h64; -#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align) - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (p==NULL) { - len=0; - bEnd=p=(const BYTE*)(size_t)32; - } -#endif - - if (len>=32) { - const BYTE* const limit = bEnd - 32; - U64 v1 = seed + PRIME64_1 + PRIME64_2; - U64 v2 = seed + PRIME64_2; - U64 v3 = seed + 0; - U64 v4 = seed - PRIME64_1; - - do { - v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8; - v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8; - v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8; - v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8; - } while (p<=limit); - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - - } else { - h64 = seed + PRIME64_5; - } - - h64 += (U64) len; - - while (p+8<=bEnd) { - U64 const k1 = XXH64_round(0, XXH_get64bits(p)); - h64 ^= k1; - h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; - p+=8; - } - - if (p+4<=bEnd) { - h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; - h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - p+=4; - } - - while (p<bEnd) { - h64 ^= (*p) * PRIME64_5; - h64 = XXH_rotl64(h64, 11) * PRIME64_1; - p++; - } - - h64 ^= h64 >> 33; - h64 *= PRIME64_2; - h64 ^= h64 >> 29; - h64 *= PRIME64_3; - h64 ^= h64 >> 32; - - return h64; -} - - -XXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed) -{ -#if 0 - /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ - XXH64_CREATESTATE_STATIC(state); - XXH64_reset(state, seed); - XXH64_update(state, input, len); - return XXH64_digest(state); -#else - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if (XXH_FORCE_ALIGN_CHECK) { - if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned); - } } - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned); - else - return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned); -#endif -} - - -/* ************************************************** -* Advanced Hash Functions -****************************************************/ - -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) -{ - return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) -{ - return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); -} -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) -{ - XXH_free(statePtr); - return XXH_OK; -} - - -/*** Hash feed ***/ - -XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed) -{ - XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - ZSTD_memset(&state, 0, sizeof(state)-4); /* do not write into reserved, for future removal */ - state.v1 = seed + PRIME32_1 + PRIME32_2; - state.v2 = seed + PRIME32_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME32_1; - ZSTD_memcpy(statePtr, &state, sizeof(state)); - return XXH_OK; -} - - -XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed) -{ - XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ - ZSTD_memset(&state, 0, sizeof(state)-8); /* do not write into reserved, for future removal */ - state.v1 = seed + PRIME64_1 + PRIME64_2; - state.v2 = seed + PRIME64_2; - state.v3 = seed + 0; - state.v4 = seed - PRIME64_1; - ZSTD_memcpy(statePtr, &state, sizeof(state)); - return XXH_OK; -} - - -FORCE_INLINE_TEMPLATE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (input==NULL) return XXH_ERROR; -#endif - - state->total_len_32 += (unsigned)len; - state->large_len |= (len>=16) | (state->total_len_32>=16); - - if (state->memsize + len < 16) { /* fill in tmp buffer */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len); - state->memsize += (unsigned)len; - return XXH_OK; - } - - if (state->memsize) { /* some data left from previous update */ - XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, 16-state->memsize); - { const U32* p32 = state->mem32; - state->v1 = XXH32_round(state->v1, XXH_readLE32(p32, endian)); p32++; - state->v2 = XXH32_round(state->v2, XXH_readLE32(p32, endian)); p32++; - state->v3 = XXH32_round(state->v3, XXH_readLE32(p32, endian)); p32++; - state->v4 = XXH32_round(state->v4, XXH_readLE32(p32, endian)); p32++; - } - p += 16-state->memsize; - state->memsize = 0; - } - - if (p <= bEnd-16) { - const BYTE* const limit = bEnd - 16; - U32 v1 = state->v1; - U32 v2 = state->v2; - U32 v3 = state->v3; - U32 v4 = state->v4; - - do { - v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4; - v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4; - v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4; - v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - - return XXH_OK; -} - -XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH32_update_endian(state_in, input, len, XXH_bigEndian); -} - - - -FORCE_INLINE_TEMPLATE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian) -{ - const BYTE * p = (const BYTE*)state->mem32; - const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize; - U32 h32; - - if (state->large_len) { - h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18); - } else { - h32 = state->v3 /* == seed */ + PRIME32_5; - } - - h32 += state->total_len_32; - - while (p+4<=bEnd) { - h32 += XXH_readLE32(p, endian) * PRIME32_3; - h32 = XXH_rotl32(h32, 17) * PRIME32_4; - p+=4; - } - - while (p<bEnd) { - h32 += (*p) * PRIME32_5; - h32 = XXH_rotl32(h32, 11) * PRIME32_1; - p++; - } - - h32 ^= h32 >> 15; - h32 *= PRIME32_2; - h32 ^= h32 >> 13; - h32 *= PRIME32_3; - h32 ^= h32 >> 16; - - return h32; -} - - -XXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH32_digest_endian(state_in, XXH_littleEndian); - else - return XXH32_digest_endian(state_in, XXH_bigEndian); -} - - - -/* **** XXH64 **** */ - -FORCE_INLINE_TEMPLATE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian) -{ - const BYTE* p = (const BYTE*)input; - const BYTE* const bEnd = p + len; - -#ifdef XXH_ACCEPT_NULL_INPUT_POINTER - if (input==NULL) return XXH_ERROR; -#endif - - state->total_len += len; - - if (state->memsize + len < 32) { /* fill in tmp buffer */ - if (input != NULL) { - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, len); - } - state->memsize += (U32)len; - return XXH_OK; - } - - if (state->memsize) { /* tmp buffer is full */ - XXH_memcpy(((BYTE*)state->mem64) + state->memsize, input, 32-state->memsize); - state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0, endian)); - state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1, endian)); - state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2, endian)); - state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3, endian)); - p += 32-state->memsize; - state->memsize = 0; - } - - if (p+32 <= bEnd) { - const BYTE* const limit = bEnd - 32; - U64 v1 = state->v1; - U64 v2 = state->v2; - U64 v3 = state->v3; - U64 v4 = state->v4; - - do { - v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8; - v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8; - v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8; - v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8; - } while (p<=limit); - - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; - } - - if (p < bEnd) { - XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); - state->memsize = (unsigned)(bEnd-p); - } - - return XXH_OK; -} - -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_update_endian(state_in, input, len, XXH_littleEndian); - else - return XXH64_update_endian(state_in, input, len, XXH_bigEndian); -} - - - -FORCE_INLINE_TEMPLATE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian) -{ - const BYTE * p = (const BYTE*)state->mem64; - const BYTE* const bEnd = (const BYTE*)state->mem64 + state->memsize; - U64 h64; - - if (state->total_len >= 32) { - U64 const v1 = state->v1; - U64 const v2 = state->v2; - U64 const v3 = state->v3; - U64 const v4 = state->v4; - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); - } else { - h64 = state->v3 + PRIME64_5; - } - - h64 += (U64) state->total_len; - - while (p+8<=bEnd) { - U64 const k1 = XXH64_round(0, XXH_readLE64(p, endian)); - h64 ^= k1; - h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; - p+=8; - } - - if (p+4<=bEnd) { - h64 ^= (U64)(XXH_readLE32(p, endian)) * PRIME64_1; - h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; - p+=4; - } - - while (p<bEnd) { - h64 ^= (*p) * PRIME64_5; - h64 = XXH_rotl64(h64, 11) * PRIME64_1; - p++; - } - - h64 ^= h64 >> 33; - h64 *= PRIME64_2; - h64 ^= h64 >> 29; - h64 *= PRIME64_3; - h64 ^= h64 >> 32; - - return h64; -} - - -XXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in) -{ - XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN; - - if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT) - return XXH64_digest_endian(state_in, XXH_littleEndian); - else - return XXH64_digest_endian(state_in, XXH_bigEndian); -} - - -/* ************************** -* Canonical representation -****************************/ - -/*! Default XXH result types are basic unsigned 32 and 64 bits. -* The canonical representation follows human-readable write convention, aka big-endian (large digits first). -* These functions allow transformation of hash result into and from its canonical format. -* This way, hash values can be written into a file or buffer, and remain comparable across different systems and programs. -*/ - -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); - ZSTD_memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) -{ - XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); - if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); - ZSTD_memcpy(dst, &hash, sizeof(*dst)); -} - -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) -{ - return XXH_readBE32(src); -} - -XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) -{ - return XXH_readBE64(src); -} diff --git a/thirdparty/zstd/common/xxhash.h b/thirdparty/zstd/common/xxhash.h index 16c1f1617b..8ebbfdd626 100644 --- a/thirdparty/zstd/common/xxhash.h +++ b/thirdparty/zstd/common/xxhash.h @@ -1,20 +1,36 @@ /* - * xxHash - Extremely Fast Hash algorithm - * Header File - * Copyright (c) Yann Collet, Facebook, Inc. + * xxHash - Fast Hash algorithm + * Copyright (c) Yann Collet, Facebook, Inc. + * + * You can contact the author at : + * - xxHash homepage: http://www.xxhash.com + * - xxHash source repository : https://github.com/Cyan4973/xxHash * - * You can contact the author at : - * - xxHash source repository : https://github.com/Cyan4973/xxHash - * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). * You may select, at your option, one of the above-listed licenses. */ -/* Notice extracted from xxHash homepage : -xxHash is an extremely fast Hash algorithm, running at RAM speed limits. +#ifndef XXH_NO_XXH3 +# define XXH_NO_XXH3 +#endif + +#ifndef XXH_NAMESPACE +# define XXH_NAMESPACE ZSTD_ +#endif + +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ +/* TODO: update */ +/* Notice extracted from xxHash homepage: + +xxHash is an extremely fast hash algorithm, running at RAM speed limits. It also successfully passes all tests from the SMHasher suite. Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) @@ -22,7 +38,7 @@ Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo Name Speed Q.Score Author xxHash 5.4 GB/s 10 CrapWow 3.2 GB/s 2 Andrew -MumurHash 3a 2.7 GB/s 10 Austin Appleby +MurmurHash 3a 2.7 GB/s 10 Austin Appleby SpookyHash 2.0 GB/s 10 Bob Jenkins SBox 1.4 GB/s 9 Bret Mulvey Lookup3 1.2 GB/s 9 Bob Jenkins @@ -37,8 +53,13 @@ Q.Score is a measure of quality of the hash function. It depends on successfully passing SMHasher test set. 10 is a perfect score. -A 64-bits version, named XXH64, is available since r35. -It offers much better speed, but for 64-bits applications only. +Note: SMHasher's CRC32 implementation is not the fastest one. +Other speed-oriented implementations can be faster, +especially in combination with PCLMUL instruction: +https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735 + +A 64-bit version, named XXH64, is available since r35. +It offers much better speed, but for 64-bit applications only. Name Speed on 64 bits Speed on 32 bits XXH64 13.8 GB/s 1.9 GB/s XXH32 6.8 GB/s 6.0 GB/s @@ -48,33 +69,34 @@ XXH32 6.8 GB/s 6.0 GB/s extern "C" { #endif -#ifndef XXHASH_H_5627135585666179 -#define XXHASH_H_5627135585666179 1 - - -/* **************************** -* Definitions -******************************/ -#include "zstd_deps.h" -typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; - - /* **************************** -* API modifier -******************************/ -/** XXH_PRIVATE_API -* This is useful if you want to include xxhash functions in `static` mode -* in order to inline them, and remove their symbol from the public list. -* Methodology : -* #define XXH_PRIVATE_API -* #include "xxhash.h" -* `xxhash.c` is automatically included. -* It's not useful to compile and link it as a separate module anymore. -*/ -#ifdef XXH_PRIVATE_API -# ifndef XXH_STATIC_LINKING_ONLY -# define XXH_STATIC_LINKING_ONLY -# endif + * INLINE mode + ******************************/ +/*! + * XXH_INLINE_ALL (and XXH_PRIVATE_API) + * Use these build macros to inline xxhash into the target unit. + * Inlining improves performance on small inputs, especially when the length is + * expressed as a compile-time constant: + * + * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html + * + * It also keeps xxHash symbols private to the unit, so they are not exported. + * + * Usage: + * #define XXH_INLINE_ALL + * #include "xxhash.h" + * + * Do not compile and link xxhash.o as a separate object, as it is not useful. + */ +#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \ + && !defined(XXH_INLINE_ALL_31684351384) + /* this section should be traversed only once */ +# define XXH_INLINE_ALL_31684351384 + /* give access to the advanced API, required to compile implementations */ +# undef XXH_STATIC_LINKING_ONLY /* avoid macro redef */ +# define XXH_STATIC_LINKING_ONLY + /* make all functions private */ +# undef XXH_PUBLIC_API # if defined(__GNUC__) # define XXH_PUBLIC_API static __inline __attribute__((unused)) # elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) @@ -82,45 +104,205 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; # elif defined(_MSC_VER) # define XXH_PUBLIC_API static __inline # else -# define XXH_PUBLIC_API static /* this version may generate warnings for unused static functions; disable the relevant warning */ + /* note: this version may generate warnings for unused static functions */ +# define XXH_PUBLIC_API static # endif -#else -# define XXH_PUBLIC_API /* do nothing */ -#endif /* XXH_PRIVATE_API */ -/*!XXH_NAMESPACE, aka Namespace Emulation : + /* + * This part deals with the special case where a unit wants to inline xxHash, + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. + * Without further action, the new include would just be ignored, + * and functions would effectively _not_ be inlined (silent failure). + * The following macros solve this situation by prefixing all inlined names, + * avoiding naming collision with previous inclusions. + */ + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE -If you want to include _and expose_ xxHash functions from within your own library, -but also want to avoid symbol collisions with another library which also includes xxHash, + /* employ the namespace for XXH_INLINE_ALL */ +# define XXH_NAMESPACE XXH_INLINE_ + /* + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. + * Alternative solution: do not redeclare them. + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. + */ +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id +# define XXH_OK XXH_IPREF(XXH_OK) +# define XXH_ERROR XXH_IPREF(XXH_ERROR) +# define XXH_errorcode XXH_IPREF(XXH_errorcode) +# define XXH32_canonical_t XXH_IPREF(XXH32_canonical_t) +# define XXH64_canonical_t XXH_IPREF(XXH64_canonical_t) +# define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t) +# define XXH32_state_s XXH_IPREF(XXH32_state_s) +# define XXH32_state_t XXH_IPREF(XXH32_state_t) +# define XXH64_state_s XXH_IPREF(XXH64_state_s) +# define XXH64_state_t XXH_IPREF(XXH64_state_t) +# define XXH3_state_s XXH_IPREF(XXH3_state_s) +# define XXH3_state_t XXH_IPREF(XXH3_state_t) +# define XXH128_hash_t XXH_IPREF(XXH128_hash_t) + /* Ensure the header is parsed again, even if it was previously included */ +# undef XXHASH_H_5627135585666179 +# undef XXHASH_H_STATIC_13879238742 +#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ -you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library -with the value of XXH_NAMESPACE (so avoid to keep it NULL and avoid numeric values). -Note that no change is required within the calling program as long as it includes `xxhash.h` : -regular symbol name will be automatically translated by this header. -*/ + +/* **************************************************************** + * Stable API + *****************************************************************/ +#ifndef XXHASH_H_5627135585666179 +#define XXHASH_H_5627135585666179 1 + + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ +/* specific declaration modes for Windows */ +#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) +# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) +# ifdef XXH_EXPORT +# define XXH_PUBLIC_API __declspec(dllexport) +# elif XXH_IMPORT +# define XXH_PUBLIC_API __declspec(dllimport) +# endif +# else +# define XXH_PUBLIC_API /* do nothing */ +# endif +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Emulate a namespace by transparently prefixing all symbols. + * + * If you want to include _and expose_ xxHash functions from within your own + * library, but also want to avoid symbol collisions with other libraries which + * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix + * any public symbol from xxhash library with the value of XXH_NAMESPACE + * (therefore, avoid empty or numeric values). + * + * Note that no change is required within the calling program as long as it + * includes `xxhash.h`: Regular symbol names will be automatically translated + * by this header. + */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + #ifdef XXH_NAMESPACE # define XXH_CAT(A,B) A##B # define XXH_NAME2(A,B) XXH_CAT(A,B) -# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) -# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) # define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) +/* XXH32 */ +# define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) # define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) -# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) # define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) -# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) # define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) -# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) # define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) -# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) # define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) -# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) # define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) -# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) # define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) -# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) # define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) +/* XXH64 */ +# define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) +# define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) +# define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) +# define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) +# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) +# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) +# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) +# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) # define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) +/* XXH3_64bits */ +# define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) +# define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) +# define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) +# define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) +# define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) +# define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) +# define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) +# define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) +# define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) +# define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) +# define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) +# define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) +/* XXH3_128bits */ +# define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) +# define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) +# define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) +# define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) +# define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) +# define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) +# define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) +# define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) +# define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) +# define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) +# define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) +# define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) +# define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) #endif @@ -128,156 +310,5375 @@ regular symbol name will be automatically translated by this header. * Version ***************************************/ #define XXH_VERSION_MAJOR 0 -#define XXH_VERSION_MINOR 6 -#define XXH_VERSION_RELEASE 2 +#define XXH_VERSION_MINOR 8 +#define XXH_VERSION_RELEASE 1 #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ XXH_PUBLIC_API unsigned XXH_versionNumber (void); /* **************************** -* Simple Hash Functions +* Common basic types ******************************/ -typedef unsigned int XXH32_hash_t; -typedef unsigned long long XXH64_hash_t; - -XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed); -XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed); - -/*! -XXH32() : - Calculate the 32-bits hash of sequence "length" bytes stored at memory address "input". - The memory between input & input+length must be valid (allocated and read-accessible). - "seed" can be used to alter the result predictably. - Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s -XXH64() : - Calculate the 64-bits hash of sequence of length "len" stored at memory address "input". - "seed" can be used to alter the result predictably. - This function runs 2x faster on 64-bits systems, but slower on 32-bits systems (see benchmark). -*/ +#include <stddef.h> /* size_t */ +typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; -/* **************************** -* Streaming Hash Functions -******************************/ -typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ -typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ +/*-********************************************************************** +* 32-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* Don't show <stdint.h> include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; -/*! State allocation, compatible with dynamic libraries */ +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include <stdint.h> + typedef uint32_t XXH32_hash_t; -XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +#else +# include <limits.h> +# if UINT_MAX == 0xFFFFFFFFUL + typedef unsigned int XXH32_hash_t; +# else +# if ULONG_MAX == 0xFFFFFFFFUL + typedef unsigned long XXH32_hash_t; +# else +# error "unsupported platform: need a 32-bit type" +# endif +# endif +#endif -XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); -XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); +/*! + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. + * + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ + */ + +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); + +/*! + * Streaming functions generate the xxHash value from an incremental input. + * This method is slower than single-call functions, due to state management. + * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. + * + * An XXH state must first be allocated using `XXH*_createState()`. + * + * Start a new hash by initializing the state with a seed using `XXH*_reset()`. + * + * Then, feed the hash state by calling `XXH*_update()` as many times as necessary. + * + * The function returns an error code, with 0 meaning OK, and any other value + * meaning there is an error. + * + * Finally, a hash value can be produced anytime, by using `XXH*_digest()`. + * This function returns the nn-bits hash as an int or long long. + * + * It's still possible to continue inserting input into the hash state after a + * digest, and generate new hash values later on by invoking `XXH*_digest()`. + * + * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include <stdio.h> + * #include <xxhash.h> + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. + */ +typedef struct XXH32_state_s XXH32_state_t; + +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); -/* hash streaming */ +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); -XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, unsigned int seed); +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); -XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned long long seed); -XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); -XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); +/******* Canonical representation *******/ /* -These functions generate the xxHash of an input provided in multiple segments. -Note that, for small input, they are slower than single-call functions, due to state management. -For small input, prefer `XXH32()` and `XXH64()` . + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * This the simplest and fastest format for further post-processing. + * + * However, this leaves open the question of what is the order on the byte level, + * since little and big endian conventions will store the same number differently. + * + * The canonical representation settles this issue by mandating big-endian + * convention, the same convention as human-readable numbers (large digits first). + * + * When writing hash values to storage, sending them over a network, or printing + * them, it's highly recommended to use the canonical representation to ensure + * portability across a wider range of systems, present and future. + * + * The following functions allow transformation of hash values to and from + * canonical format. + */ + +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); -XXH state must first be allocated, using XXH*_createState() . +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); -Start a new hash by initializing state with a seed, using XXH*_reset(). -Then, feed the hash state by calling XXH*_update() as many times as necessary. -Obviously, input must be allocated and read accessible. -The function returns an error code, with 0 meaning OK, and any other value meaning there is an error. +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif -Finally, a hash value can be produced anytime, by using XXH*_digest(). -This function returns the nn-bits hash as an int or long long. +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif -It's still possible to continue inserting input into the hash state after a digest, -and generate some new hashes later on, by calling again XXH*_digest(). +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif -When done, free XXH state space if it was allocated dynamically. +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough */ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif +/*! + * @} + * @ingroup public + * @{ + */ -/* ************************** -* Utils -****************************/ -#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* ! C99 */ -# define restrict /* disable restrict */ +#ifndef XXH_NO_LONG_LONG +/*-********************************************************************** +* 64-bit hash +************************************************************************/ +#if defined(XXH_DOXYGEN) /* don't include <stdint.h> */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include <stdint.h> + typedef uint64_t XXH64_hash_t; +#else +# include <limits.h> +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif #endif -XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dst_state, const XXH32_state_t* restrict src_state); -XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dst_state, const XXH64_state_t* restrict src_state); +/*! + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ -/* ************************** -* Canonical representation -****************************/ -/* Default result type for XXH functions are primitive unsigned 32 and 64 bits. -* The canonical representation uses human-readable write convention, aka big-endian (large digits first). -* These functions allow transformation of hash result into and from its canonical format. -* This way, hash values can be written into a file / memory, and remain comparable on different systems and programs. -*/ -typedef struct { unsigned char digest[4]; } XXH32_canonical_t; -typedef struct { unsigned char digest[8]; } XXH64_canonical_t; +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. + * + * This function usually runs faster on 64-bit systems, but slower on 32-bit + * systems (see benchmark). + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); -XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); -XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); +/******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ +typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); +XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); -XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); +XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t; +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); +#ifndef XXH_NO_XXH3 +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: + * - Improved speed for both small and large inputs + * - True 64-bit and 128-bit outputs + * - SIMD acceleration + * - Improved 32-bit viability + * + * Speed analysis methodology is explained here: + * + * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html + * + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. + * + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. + * + * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. + * + * XXH3 offers 2 variants, _64bits and _128bits. + * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. + * It's also generally simpler to manipulate a scalar return type than a struct. + * + * The API supports one-shot hashing, streaming mode, and custom secrets. + */ + +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + +/* XXH3_64bits(): + * default 64-bit variant, using default secret and default seed of 0. + * It's the fastest variant. */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); + +/* + * XXH3_64bits_withSeed(): + * This variant generates a custom secret on the fly + * based on default secret altered using the `seed` value. + * While this operation is decently fast, note that it's not completely free. + * Note: seed==0 produces the same results as XXH3_64bits(). + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); + +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + +/* + * XXH3_64bits_withSecret(): + * It's possible to provide any blob of bytes as a "secret" to generate the hash. + * This makes it more difficult for an external actor to prepare an intentional collision. + * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. + * Avoid "trivial" or structured data such as repeated sequences or a text document. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. + */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ +typedef struct XXH3_state_s XXH3_state_t; +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); +XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state); + +/* + * XXH3_64bits_reset(): + * Initialize with default parameters. + * digest will be equivalent to `XXH3_64bits()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr); +/* + * XXH3_64bits_reset_withSeed(): + * Generate a custom secret from `seed`, and store it into `statePtr`. + * digest will be equivalent to `XXH3_64bits_withSeed()`. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +/* + * XXH3_64bits_reset_withSecret(): + * `secret` is referenced, it _must outlive_ the hash streaming session. + * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`, + * and the quality of produced hash values depends on secret's entropy + * (secret's content should look like a bunch of random bytes). + * When in doubt about the randomness of a candidate `secret`, + * consider employing `XXH3_generateSecret()` instead (see below). + */ +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); + +/* note : canonical representation of XXH3 is the same as XXH64 + * since they both produce XXH64_hash_t values */ + + +/*-********************************************************************** +* XXH3 128-bit variant +************************************************************************/ + +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ +typedef struct { + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ +} XXH128_hash_t; + +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); + +/******* Streaming *******/ +/* + * Streaming requires state maintenance. + * This operation costs memory and CPU. + * As a consequence, streaming is slower than one-shot hashing. + * For better performance, prefer one-shot functions whenever applicable. + * + * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits(). + * Use already declared XXH3_createState() and XXH3_freeState(). + * + * All reset and streaming functions have same meaning as their 64-bit counterpart. + */ + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); + +XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length); +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr); + +/* Following helper functions make it possible to compare XXH128_hast_t values. + * Since XXH128_hash_t is a structure, this capability is not offered by the language. + * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */ + +/*! + * XXH128_isEqual(): + * Return: 1 if `h1` and `h2` are equal, 0 if they are not. + */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); + +/*! + * XXH128_cmp(): + * + * This comparator is compatible with stdlib's `qsort()`/`bsearch()`. + * + * return: >0 if *h128_1 > *h128_2 + * =0 if *h128_1 == *h128_2 + * <0 if *h128_1 < *h128_2 + */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2); + + +/******* Canonical representation *******/ +typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t; +XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash); +XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src); + + +#endif /* !XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ + +/*! + * @} + */ #endif /* XXHASH_H_5627135585666179 */ -/* ================================================================================================ - This section contains definitions which are not guaranteed to remain stable. - They may change in future versions, becoming incompatible with a different version of the library. - They shall only be used with static linking. - Never use these definitions in association with dynamic linking ! -=================================================================================================== */ -#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXH_STATIC_H_3543687687345) -#define XXH_STATIC_H_3543687687345 - -/* These definitions are only meant to allow allocation of XXH state - statically, on stack, or in a struct for example. - Do not use members directly. */ - - struct XXH32_state_s { - unsigned total_len_32; - unsigned large_len; - unsigned v1; - unsigned v2; - unsigned v3; - unsigned v4; - unsigned mem32[4]; /* buffer defined as U32 for alignment */ - unsigned memsize; - unsigned reserved; /* never read nor write, will be removed in a future version */ - }; /* typedef'd to XXH32_state_t */ - - struct XXH64_state_s { - unsigned long long total_len; - unsigned long long v1; - unsigned long long v2; - unsigned long long v3; - unsigned long long v4; - unsigned long long mem64[4]; /* buffer defined as U64 for alignment */ - unsigned memsize; - unsigned reserved[2]; /* never read nor write, will be removed in a future version */ - }; /* typedef'd to XXH64_state_t */ - - -# ifdef XXH_PRIVATE_API -# include "xxhash.c" /* include xxhash functions as `static`, for inlining */ +#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) +#define XXHASH_H_STATIC_13879238742 +/* **************************************************************************** + * This section contains declarations which are not guaranteed to remain stable. + * They may change in future versions, becoming incompatible with a different + * version of the library. + * These declarations should only be used with static linking. + * Never use them in association with dynamic linking! + ***************************************************************************** */ + +/* + * These definitions are only present to allow static allocation + * of XXH states, on stack or in a struct, for example. + * Never **ever** access their members directly. + */ + +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ +struct XXH32_state_s { + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */ +}; /* typedef'd to XXH32_state_t */ + + +#ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ + +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ +struct XXH64_state_s { + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */ +}; /* typedef'd to XXH64_state_t */ + + +#ifndef XXH_NO_XXH3 + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ +# include <stdalign.h> +# define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) +#elif defined(__GNUC__) +# define XXH_ALIGN(n) __attribute__ ((aligned(n))) +#elif defined(_MSC_VER) +# define XXH_ALIGN(n) __declspec(align(n)) +#else +# define XXH_ALIGN(n) /* disabled */ +#endif + +/* Old GCC versions only accept the attribute after the type in structures. */ +#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ + && defined(__GNUC__) +# define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) +#else +# define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type +#endif + +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ +#define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ +#define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ +struct XXH3_state_s { + XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ + XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ + XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ + XXH32_hash_t bufferedSize; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ + size_t nbStripesSoFar; + /*!< Number or stripes processed. */ + XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ + size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ + size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ + XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ + XXH64_hash_t reserved64; + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ + /* note: there may be some padding at the end due to alignment on 64 bytes */ +}; /* typedef'd to XXH3_state_t */ + +#undef XXH_ALIGN_MEMBER + +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, + * it should be initialized with XXH3_INITSTATE() or a memset() + * in case its first reset uses XXH3_NNbits_reset_withSeed(). + * This init can be omitted if the first reset uses default or _withSecret mode. + * This operation isn't necessary when the state is created with XXH3_createState(). + * Note that this doesn't prepare the state for a streaming operation, + * it's still necessary to use XXH3_NNbits_reset*() afterwards. + */ +#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } + + +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + +/* === Experimental API === */ +/* Symbols defined below must be considered tied to a specific library version. */ + +/* + * XXH3_generateSecret(): + * + * Derive a high-entropy secret from any user-defined content, named customSeed. + * The generated secret can be used in combination with `*_withSecret()` functions. + * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed, + * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. + * + * The function accepts as input a custom seed of any length and any content, + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN + * + * The generated secret can then be used with any `*_withSecret()` variant. + * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, + * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` + * are part of this list. They all accept a `secret` parameter + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * _and_ feature very high entropy (consist of random-looking bytes). + * These conditions can be a high bar to meet, so + * XXH3_generateSecret() can be employed to ensure proper quality. + * + * customSeed can be anything. It can have any size, even small ones, + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. + * + * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. + */ +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); + + +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); + +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); + +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + + +#endif /* XXH_NO_XXH3 */ +#endif /* XXH_NO_LONG_LONG */ +#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) +# define XXH_IMPLEMENTATION +#endif + +#endif /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */ + + +/* ======================================================================== */ +/* ======================================================================== */ +/* ======================================================================== */ + + +/*-********************************************************************** + * xxHash implementation + *-********************************************************************** + * xxHash's implementation used to be hosted inside xxhash.c. + * + * However, inlining requires implementation to be visible to the compiler, + * hence be included alongside the header. + * Previously, implementation was hosted inside xxhash.c, + * which was then #included when inlining was activated. + * This construction created issues with a few build and install systems, + * as it required xxhash.c to be stored in /include directory. + * + * xxHash implementation is now directly integrated within xxhash.h. + * As a consequence, xxhash.c is no longer needed in /include. + * + * xxhash.c is still available and is still useful. + * In a "normal" setup, when xxhash is not inlined, + * xxhash.h only exposes the prototypes and public symbols, + * while xxhash.c can be built into an object file xxhash.o + * which can then be linked into the final binary. + ************************************************************************/ + +#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \ + || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387) +# define XXH_IMPLEM_13a8737387 + +/* ************************************* +* Tuning parameters +***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN +/*! + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * + * By default, access to unaligned memory is controlled by `memcpy()`, which is + * safe and portable. + * + * Unfortunately, on some target/compiler combinations, the generated assembly + * is sub-optimal. + * + * The below switch allow selection of a different access method + * in the search for improved performance. + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't + * inline small `memcpy()` calls, and it might also be faster on big-endian + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) + */ +# define XXH_FORCE_MEMORY_ACCESS 0 + +/*! + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). + * + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). + * + * In these cases, the alignment check can be removed by setting this macro to 0. + * Then the code will always use unaligned memory access. + * Align check is automatically disabled on x86, x64 & arm64, + * which are platforms known to offer good unaligned memory accesses performance. + * + * This option does not affect XXH3 (only XXH32 and XXH64). + */ +# define XXH_FORCE_ALIGN_CHECK 0 + +/*! + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. + * + * By default, xxHash tries to force the compiler to inline almost all internal + * functions. + * + * This can usually improve performance due to reduced jumping and improved + * constant folding, but significantly increases the size of the binary which + * might not be favorable. + * + * Additionally, sometimes the forced inlining can be detrimental to performance, + * depending on the architecture. + * + * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the + * compiler full control on whether to inline or not. + * + * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using + * -fno-inline with GCC or Clang, this will automatically be defined. + */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + +#ifndef XXH_NO_INLINE_HINTS +# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ + || defined(__NO_INLINE__) /* -O0, -fno-inline */ +# define XXH_NO_INLINE_HINTS 1 +# else +# define XXH_NO_INLINE_HINTS 0 +# endif +#endif + +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + +/*! + * @defgroup impl Implementation + * @{ + */ + + +/* ************************************* +* Includes & Memory related functions +***************************************/ +/* Modify the local functions below should you wish to use some other memory routines */ +/* for ZSTD_malloc(), ZSTD_free() */ +#define ZSTD_DEPS_NEED_MALLOC +#include "zstd_deps.h" /* size_t, ZSTD_malloc, ZSTD_free, ZSTD_memcpy */ +static void* XXH_malloc(size_t s) { return ZSTD_malloc(s); } +static void XXH_free (void* p) { ZSTD_free(p); } +static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_memcpy(dest,src,size); } + + +/* ************************************* +* Compiler Specific Options +***************************************/ +#ifdef _MSC_VER /* Visual Studio warning fix */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +#endif + +#if XXH_NO_INLINE_HINTS /* disable inlining hints */ +# if defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __attribute__((unused)) +# else +# define XXH_FORCE_INLINE static +# endif +# define XXH_NO_INLINE static +/* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) +#elif defined(_MSC_VER) /* Visual Studio */ +# define XXH_FORCE_INLINE static __forceinline +# define XXH_NO_INLINE static __declspec(noinline) +#elif defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ +# define XXH_FORCE_INLINE static inline +# define XXH_NO_INLINE static +#else +# define XXH_FORCE_INLINE static +# define XXH_NO_INLINE static +#endif + + + +/* ************************************* +* Debug +***************************************/ +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * + * XXH_DEBUGLEVEL is expected to be defined externally, typically via the + * compiler's command line options. The value must be a number. + */ +#ifndef XXH_DEBUGLEVEL +# ifdef DEBUGLEVEL /* backwards compat */ +# define XXH_DEBUGLEVEL DEBUGLEVEL +# else +# define XXH_DEBUGLEVEL 0 +# endif +#endif + +#if (XXH_DEBUGLEVEL>=1) +# include <assert.h> /* note: can still be disabled with NDEBUG */ +# define XXH_ASSERT(c) assert(c) +#else +# define XXH_ASSERT(c) ((void)0) +#endif + +/* note: use after variable declarations */ +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include <assert.h> +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif + +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (eg eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif + +/* ************************************* +* Basic Types +***************************************/ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) +# include <stdint.h> + typedef uint8_t xxh_u8; +#else + typedef unsigned char xxh_u8; +#endif +typedef XXH32_hash_t xxh_u32; + +#ifdef XXH_OLD_NAMES +# define BYTE xxh_u8 +# define U8 xxh_u8 +# define U32 xxh_u32 +#endif + +/* *** Memory access *** */ + +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE32 and XXH_readBE32. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* + * Force direct memory access. Only works on CPU which support unaligned memory + * access in hardware. + */ +static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; +#endif +static xxh_u32 XXH_read32(const void* ptr) +{ + typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign; + return ((const xxh_unalign*)ptr)->u32; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u32 XXH_read32(const void* memPtr) +{ + xxh_u32 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + + +/* *** Endianness *** */ + +/*! + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * + * Defined to 1 if the target is little endian, or 0 if it is big endian. + * It can be defined externally, for example on the compiler command line. + * + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. + */ +#ifndef XXH_CPU_LITTLE_ENDIAN +/* + * Try to detect endianness automatically, to avoid the nonstandard behavior + * in `XXH_isLittleEndian()` + */ +# if defined(_WIN32) /* Windows is always little endian */ \ + || defined(__LITTLE_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 1 +# elif defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_CPU_LITTLE_ENDIAN 0 +# else +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. + */ +static int XXH_isLittleEndian(void) +{ + /* + * Portable and well-defined behavior. + * Don't use static: it is detrimental to performance. + */ + const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; + return one.c[0]; +} +# define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() +# endif +#endif + + + + +/* **************************************** +* Compiler-specific Functions and Macros +******************************************/ +#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + +#ifdef __has_builtin +# define XXH_HAS_BUILTIN(x) __has_builtin(x) +#else +# define XXH_HAS_BUILTIN(x) 0 +#endif + +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ +#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ + && XXH_HAS_BUILTIN(__builtin_rotateleft64) +# define XXH_rotl32 __builtin_rotateleft32 +# define XXH_rotl64 __builtin_rotateleft64 +/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */ +#elif defined(_MSC_VER) +# define XXH_rotl32(x,r) _rotl(x,r) +# define XXH_rotl64(x,r) _rotl64(x,r) +#else +# define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +# define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) +#endif + +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap32 _byteswap_ulong +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap32 __builtin_bswap32 +#else +static xxh_u32 XXH_swap32 (xxh_u32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} +#endif + + +/* *************************** +* Memory reads +*****************************/ + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; + +/* + * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. + * + * This is ideal for older compilers which don't inline memcpy. + */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u32)bytePtr[1] << 8) + | ((xxh_u32)bytePtr[2] << 16) + | ((xxh_u32)bytePtr[3] << 24); +} + +XXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[3] + | ((xxh_u32)bytePtr[2] << 8) + | ((xxh_u32)bytePtr[1] << 16) + | ((xxh_u32)bytePtr[0] << 24); +} + +#else +XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); +} + +static xxh_u32 XXH_readBE32(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u32 +XXH_readLE32_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) { + return XXH_readLE32(ptr); + } else { + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); + } +} + + +/* ************************************* +* Misc +***************************************/ +/*! @ingroup public */ +XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } + + +/* ******************************************************************* +* 32-bit hash functions +*********************************************************************/ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ + +#ifdef XXH_OLD_NAMES +# define PRIME32_1 XXH_PRIME32_1 +# define PRIME32_2 XXH_PRIME32_2 +# define PRIME32_3 XXH_PRIME32_3 +# define PRIME32_4 XXH_PRIME32_4 +# define PRIME32_5 XXH_PRIME32_5 +#endif + +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ +static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) +{ + acc += input * XXH_PRIME32_2; + acc = XXH_rotl32(acc, 13); + acc *= XXH_PRIME32_1; +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) + /* + * UGLY HACK: + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. + * + * The reason we want to avoid vectorization is because despite working on + * 4 integers at a time, there are multiple factors slowing XXH32 down on + * SSE4: + * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on + * newer chips!) making it slightly slower to multiply four integers at + * once compared to four integers independently. Even when pmulld was + * fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE + * just to multiply unless doing a long operation. + * + * - Four instructions are required to rotate, + * movqda tmp, v // not required with VEX encoding + * pslld tmp, 13 // tmp <<= 13 + * psrld v, 19 // x >>= 19 + * por v, tmp // x |= tmp + * compared to one for scalar: + * roll v, 13 // reliably fast across the board + * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason + * + * - Instruction level parallelism is actually more beneficial here because + * the SIMD actually serializes this operation: While v1 is rotating, v2 + * can load data, while v3 can multiply. SSE forces them to operate + * together. + * + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. + */ + XXH_COMPILER_GUARD(acc); +#endif + return acc; +} + +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ +static xxh_u32 XXH32_avalanche(xxh_u32 h32) +{ + h32 ^= h32 >> 15; + h32 *= XXH_PRIME32_2; + h32 ^= h32 >> 13; + h32 *= XXH_PRIME32_3; + h32 ^= h32 >> 16; + return(h32); +} + +#define XXH_get32bits(p) XXH_readLE32_align(p, align) + +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ +static xxh_u32 +XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ +#define XXH_PROCESS1 do { \ + h32 += (*ptr++) * XXH_PRIME32_5; \ + h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \ +} while (0) + +#define XXH_PROCESS4 do { \ + h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \ + ptr += 4; \ + h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ +} while (0) + + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { + len &= 15; + while (len >= 4) { + XXH_PROCESS4; + len -= 4; + } + while (len > 0) { + XXH_PROCESS1; + --len; + } + return XXH32_avalanche(h32); + } else { + switch(len&15) /* or switch(bEnd - p) */ { + case 12: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 8: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 4: XXH_PROCESS4; + return XXH32_avalanche(h32); + + case 13: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 9: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 5: XXH_PROCESS4; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 14: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 10: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 6: XXH_PROCESS4; + XXH_PROCESS1; + XXH_PROCESS1; + return XXH32_avalanche(h32); + + case 15: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 11: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 7: XXH_PROCESS4; + XXH_FALLTHROUGH; + case 3: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 2: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 1: XXH_PROCESS1; + XXH_FALLTHROUGH; + case 0: return XXH32_avalanche(h32); + } + XXH_ASSERT(0); + return h32; /* reaching this point is deemed impossible */ + } +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1 XXH_PROCESS1 +# define PROCESS4 XXH_PROCESS4 +#else +# undef XXH_PROCESS1 +# undef XXH_PROCESS4 +#endif + +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ +XXH_FORCE_INLINE xxh_u32 +XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) +{ + xxh_u32 h32; + + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=16) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 15; + xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + xxh_u32 v2 = seed + XXH_PRIME32_2; + xxh_u32 v3 = seed + 0; + xxh_u32 v4 = seed - XXH_PRIME32_1; + + do { + v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; + v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; + v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; + v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; + } while (input < limit); + + h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); + } else { + h32 = seed + XXH_PRIME32_5; + } + + h32 += (xxh_u32)len; + + return XXH32_finalize(h32, input, len&15, align); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) +{ +#if 0 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH32_state_t state; + XXH32_reset(&state, seed); + XXH32_update(&state, (const xxh_u8*)input, len); + return XXH32_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); +#endif +} + + + +/******* Hash streaming *******/ +/*! + * @ingroup xxh32_family + */ +XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) +{ + return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + statePtr->v[1] = seed + XXH_PRIME32_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME32_1; + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH_errorcode +XXH32_update(XXH32_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len_32 += (XXH32_hash_t)len; + state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); + + if (state->memsize + len < 16) { /* fill in tmp buffer */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); + state->memsize += (XXH32_hash_t)len; + return XXH_OK; + } + + if (state->memsize) { /* some data left from previous update */ + XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); + { const xxh_u32* p32 = state->mem32; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); + } + p += 16-state->memsize; + state->memsize = 0; + } + + if (p <= bEnd-16) { + const xxh_u8* const limit = bEnd - 16; + + do { + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) +{ + xxh_u32 h32; + + if (state->large_len) { + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); + } else { + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; + } + + h32 += state->total_len_32; + + return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! + * @ingroup xxh32_family + * The default return values from XXH functions are unsigned 32 and 64 bit + * integers. + * + * The canonical representation uses big endian convention, the same convention + * as human-readable numbers (large digits first). + * + * This way, hash values can be written into a file or buffer, remaining + * comparable across different systems. + * + * The following functions allow transformation of hash values to and from their + * canonical format. + */ +XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) +{ + return XXH_readBE32(src); +} + + +#ifndef XXH_NO_LONG_LONG + +/* ******************************************************************* +* 64-bit hash functions +*********************************************************************/ +/*! + * @} + * @ingroup impl + * @{ + */ +/******* Memory access *******/ + +typedef XXH64_hash_t xxh_u64; + +#ifdef XXH_OLD_NAMES +# define U64 xxh_u64 +#endif + +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) +/* + * Manual byteshift. Best for old compilers which don't inline memcpy. + * We actually directly use XXH_readLE64 and XXH_readBE64. + */ +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) + +/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} + +#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) + +/* + * __pack instructions are safer, but compiler specific, hence potentially + * problematic for some compilers. + * + * Currently only defined for GCC and ICC. + */ +#ifdef XXH_OLD_NAMES +typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; +#endif +static xxh_u64 XXH_read64(const void* ptr) +{ + typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64; + return ((const xxh_unalign64*)ptr)->u64; +} + +#else + +/* + * Portable and safe solution. Generally efficient. + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html + */ +static xxh_u64 XXH_read64(const void* memPtr) +{ + xxh_u64 val; + XXH_memcpy(&val, memPtr, sizeof(val)); + return val; +} + +#endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ + +#if defined(_MSC_VER) /* Visual Studio */ +# define XXH_swap64 _byteswap_uint64 +#elif XXH_GCC_VERSION >= 403 +# define XXH_swap64 __builtin_bswap64 +#else +static xxh_u64 XXH_swap64(xxh_u64 x) +{ + return ((x << 56) & 0xff00000000000000ULL) | + ((x << 40) & 0x00ff000000000000ULL) | + ((x << 24) & 0x0000ff0000000000ULL) | + ((x << 8) & 0x000000ff00000000ULL) | + ((x >> 8) & 0x00000000ff000000ULL) | + ((x >> 24) & 0x0000000000ff0000ULL) | + ((x >> 40) & 0x000000000000ff00ULL) | + ((x >> 56) & 0x00000000000000ffULL); +} +#endif + + +/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */ +#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) + +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[0] + | ((xxh_u64)bytePtr[1] << 8) + | ((xxh_u64)bytePtr[2] << 16) + | ((xxh_u64)bytePtr[3] << 24) + | ((xxh_u64)bytePtr[4] << 32) + | ((xxh_u64)bytePtr[5] << 40) + | ((xxh_u64)bytePtr[6] << 48) + | ((xxh_u64)bytePtr[7] << 56); +} + +XXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr) +{ + const xxh_u8* bytePtr = (const xxh_u8 *)memPtr; + return bytePtr[7] + | ((xxh_u64)bytePtr[6] << 8) + | ((xxh_u64)bytePtr[5] << 16) + | ((xxh_u64)bytePtr[4] << 24) + | ((xxh_u64)bytePtr[3] << 32) + | ((xxh_u64)bytePtr[2] << 40) + | ((xxh_u64)bytePtr[1] << 48) + | ((xxh_u64)bytePtr[0] << 56); +} + +#else +XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); +} + +static xxh_u64 XXH_readBE64(const void* ptr) +{ + return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); +} +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH_readLE64_align(const void* ptr, XXH_alignment align) +{ + if (align==XXH_unaligned) + return XXH_readLE64(ptr); + else + return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); +} + + +/******* xxh64 *******/ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ + +#ifdef XXH_OLD_NAMES +# define PRIME64_1 XXH_PRIME64_1 +# define PRIME64_2 XXH_PRIME64_2 +# define PRIME64_3 XXH_PRIME64_3 +# define PRIME64_4 XXH_PRIME64_4 +# define PRIME64_5 XXH_PRIME64_5 +#endif + +static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) +{ + acc += input * XXH_PRIME64_2; + acc = XXH_rotl64(acc, 31); + acc *= XXH_PRIME64_1; + return acc; +} + +static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) +{ + val = XXH64_round(0, val); + acc ^= val; + acc = acc * XXH_PRIME64_1 + XXH_PRIME64_4; + return acc; +} + +static xxh_u64 XXH64_avalanche(xxh_u64 h64) +{ + h64 ^= h64 >> 33; + h64 *= XXH_PRIME64_2; + h64 ^= h64 >> 29; + h64 *= XXH_PRIME64_3; + h64 ^= h64 >> 32; + return h64; +} + + +#define XXH_get64bits(p) XXH_readLE64_align(p, align) + +static xxh_u64 +XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) +{ + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; + } + return XXH64_avalanche(h64); +} + +#ifdef XXH_OLD_NAMES +# define PROCESS1_64 XXH_PROCESS1_64 +# define PROCESS4_64 XXH_PROCESS4_64 +# define PROCESS8_64 XXH_PROCESS8_64 +#else +# undef XXH_PROCESS1_64 +# undef XXH_PROCESS4_64 +# undef XXH_PROCESS8_64 +#endif + +XXH_FORCE_INLINE xxh_u64 +XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) +{ + xxh_u64 h64; + if (input==NULL) XXH_ASSERT(len == 0); + + if (len>=32) { + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; + xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + xxh_u64 v2 = seed + XXH_PRIME64_2; + xxh_u64 v3 = seed + 0; + xxh_u64 v4 = seed - XXH_PRIME64_1; + + do { + v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; + v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; + v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; + v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; + } while (input<limit); + + h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); + h64 = XXH64_mergeRound(h64, v1); + h64 = XXH64_mergeRound(h64, v2); + h64 = XXH64_mergeRound(h64, v3); + h64 = XXH64_mergeRound(h64, v4); + + } else { + h64 = seed + XXH_PRIME64_5; + } + + h64 += (xxh_u64) len; + + return XXH64_finalize(h64, input, len, align); +} + + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t seed) +{ +#if 0 + /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ + XXH64_state_t state; + XXH64_reset(&state, seed); + XXH64_update(&state, (const xxh_u8*)input, len); + return XXH64_digest(&state); +#else + if (XXH_FORCE_ALIGN_CHECK) { + if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); + } } + + return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); + +#endif +} + +/******* Hash Streaming *******/ + +/*! @ingroup xxh64_family*/ +XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) +{ + return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); +} +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) +{ + XXH_free(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState) +{ + XXH_memcpy(dstState, srcState, sizeof(*dstState)); +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, XXH64_hash_t seed) +{ + XXH_ASSERT(statePtr != NULL); + memset(statePtr, 0, sizeof(*statePtr)); + statePtr->v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2; + statePtr->v[1] = seed + XXH_PRIME64_2; + statePtr->v[2] = seed + 0; + statePtr->v[3] = seed - XXH_PRIME64_1; + return XXH_OK; +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH_errorcode +XXH64_update (XXH64_state_t* state, const void* input, size_t len) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + { const xxh_u8* p = (const xxh_u8*)input; + const xxh_u8* const bEnd = p + len; + + state->total_len += len; + + if (state->memsize + len < 32) { /* fill in tmp buffer */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); + state->memsize += (xxh_u32)len; + return XXH_OK; + } + + if (state->memsize) { /* tmp buffer is full */ + XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; + state->memsize = 0; + } + + if (p+32 <= bEnd) { + const xxh_u8* const limit = bEnd - 32; + + do { + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; + } while (p<=limit); + + } + + if (p < bEnd) { + XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); + state->memsize = (unsigned)(bEnd-p); + } + } + + return XXH_OK; +} + + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) +{ + xxh_u64 h64; + + if (state->total_len >= 32) { + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); + } else { + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; + } + + h64 += (xxh_u64) state->total_len; + + return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); +} + + +/******* Canonical representation *******/ + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) +{ + /* XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); */ + if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); + XXH_memcpy(dst, &hash, sizeof(*dst)); +} + +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) +{ + return XXH_readBE64(src); +} + +#ifndef XXH_NO_XXH3 + +/* ********************************************************************* +* XXH3 +* New generation hash designed for speed on small keys and vectorization +************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ + +/* === Compiler specifics === */ + +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +# define XXH_RESTRICT restrict +#else +/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ +# define XXH_RESTRICT /* disable */ +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) \ + || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \ + || defined(__clang__) +# define XXH_likely(x) __builtin_expect(x, 1) +# define XXH_unlikely(x) __builtin_expect(x, 0) +#else +# define XXH_likely(x) (x) +# define XXH_unlikely(x) (x) +#endif + +#if defined(__GNUC__) || defined(__clang__) +# if defined(__ARM_NEON__) || defined(__ARM_NEON) \ + || defined(__aarch64__) || defined(_M_ARM) \ + || defined(_M_ARM64) || defined(_M_ARM64EC) +# define inline __inline__ /* circumvent a clang bug */ +# include <arm_neon.h> +# undef inline +# elif defined(__AVX2__) +# include <immintrin.h> +# elif defined(__SSE2__) +# include <emmintrin.h> # endif +#endif + +#if defined(_MSC_VER) +# include <intrin.h> +#endif + +/* + * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while + * remaining a true 64-bit/128-bit hash function. + * + * This is done by prioritizing a subset of 64-bit operations that can be + * emulated without too many steps on the average 32-bit machine. + * + * For example, these two lines seem similar, and run equally fast on 64-bit: + * + * xxh_u64 x; + * x ^= (x >> 47); // good + * x ^= (x >> 13); // bad + * + * However, to a 32-bit machine, there is a major difference. + * + * x ^= (x >> 47) looks like this: + * + * x.lo ^= (x.hi >> (47 - 32)); + * + * while x ^= (x >> 13) looks like this: + * + * // note: funnel shifts are not usually cheap. + * x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13)); + * x.hi ^= (x.hi >> 13); + * + * The first one is significantly faster than the second, simply because the + * shift is larger than 32. This means: + * - All the bits we need are in the upper 32 bits, so we can ignore the lower + * 32 bits in the shift. + * - The shift result will always fit in the lower 32 bits, and therefore, + * we can ignore the upper 32 bits in the xor. + * + * Thanks to this optimization, XXH3 only requires these features to be efficient: + * + * - Usable unaligned access + * - A 32-bit or 64-bit ALU + * - If 32-bit, a decent ADC instruction + * - A 32 or 64-bit multiply with a 64-bit result + * - For the 128-bit variant, a decent byteswap helps short inputs. + * + * The first two are already required by XXH32, and almost all 32-bit and 64-bit + * platforms which can run XXH32 can run XXH3 efficiently. + * + * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one + * notable exception. + * + * First of all, Thumb-1 lacks support for the UMULL instruction which + * performs the important long multiply. This means numerous __aeabi_lmul + * calls. + * + * Second of all, the 8 functional registers are just not enough. + * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need + * Lo registers, and this shuffling results in thousands more MOVs than A32. + * + * A32 and T32 don't have this limitation. They can access all 14 registers, + * do a 32->64 multiply with UMULL, and the flexible operand allowing free + * shifts is helpful, too. + * + * Therefore, we do a quick sanity check. + * + * If compiling Thumb-1 for a target which supports ARM instructions, we will + * emit a warning, as it is not a "sane" platform to compile for. + * + * Usually, if this happens, it is because of an accident and you probably need + * to specify -march, as you likely meant to compile for a newer architecture. + * + * Credit: large sections of the vectorial and asm source code paths + * have been contributed by @easyaspi314 + */ +#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) +# warning "XXH3 is highly inefficient without ARM or Thumb-2." +#endif + +/* ========================================== + * Vectorization detection + * ========================================== */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment reqired for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif + +#ifndef XXH_VECTOR /* can be defined on command line */ +# if ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) +# define XXH_VECTOR XXH_NEON +# elif defined(__AVX512F__) +# define XXH_VECTOR XXH_AVX512 +# elif defined(__AVX2__) +# define XXH_VECTOR XXH_AVX2 +# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) +# define XXH_VECTOR XXH_SSE2 +# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ + || (defined(__s390x__) && defined(__VEC__)) \ + && defined(__GNUC__) /* TODO: IBM XL */ +# define XXH_VECTOR XXH_VSX +# else +# define XXH_VECTOR XXH_SCALAR +# endif +#endif + +/* + * Controls the alignment of the accumulator, + * for compatibility with aligned vector loads, which are usually faster. + */ +#ifndef XXH_ACC_ALIGN +# if defined(XXH_X86DISPATCH) +# define XXH_ACC_ALIGN 64 /* for compatibility with avx512 */ +# elif XXH_VECTOR == XXH_SCALAR /* scalar */ +# define XXH_ACC_ALIGN 8 +# elif XXH_VECTOR == XXH_SSE2 /* sse2 */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX2 /* avx2 */ +# define XXH_ACC_ALIGN 32 +# elif XXH_VECTOR == XXH_NEON /* neon */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_VSX /* vsx */ +# define XXH_ACC_ALIGN 16 +# elif XXH_VECTOR == XXH_AVX512 /* avx512 */ +# define XXH_ACC_ALIGN 64 +# endif +#endif + +#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \ + || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512 +# define XXH_SEC_ALIGN XXH_ACC_ALIGN +#else +# define XXH_SEC_ALIGN 8 +#endif + +/* + * UGLY HACK: + * GCC usually generates the best code with -O3 for xxHash. + * + * However, when targeting AVX2, it is overzealous in its unrolling resulting + * in code roughly 3/4 the speed of Clang. + * + * There are other issues, such as GCC splitting _mm256_loadu_si256 into + * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which + * only applies to Sandy and Ivy Bridge... which don't even support AVX2. + * + * That is why when compiling the AVX2 version, it is recommended to use either + * -O2 -mavx2 -march=haswell + * or + * -O2 -mavx2 -mno-avx256-split-unaligned-load + * for decent performance, or to use Clang instead. + * + * Fortunately, we can control the first one with a pragma that forces GCC into + * -O2, but the other one we can't control without "failed to inline always + * inline function due to target mismatch" warnings. + */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ +# pragma GCC push_options +# pragma GCC optimize("-O2") +#endif + + +#if XXH_VECTOR == XXH_NEON +/* + * NEON's setup for vmlal_u32 is a little more complicated than it is on + * SSE2, AVX2, and VSX. + * + * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast. + * + * To do the same operation, the 128-bit 'Q' register needs to be split into + * two 64-bit 'D' registers, performing this operation:: + * + * [ a | b ] + * | '---------. .--------' | + * | x | + * | .---------' '--------. | + * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ] + * + * Due to significant changes in aarch64, the fastest method for aarch64 is + * completely different than the fastest method for ARMv7-A. + * + * ARMv7-A treats D registers as unions overlaying Q registers, so modifying + * D11 will modify the high half of Q5. This is similar to how modifying AH + * will only affect bits 8-15 of AX on x86. + * + * VZIP takes two registers, and puts even lanes in one register and odd lanes + * in the other. + * + * On ARMv7-A, this strangely modifies both parameters in place instead of + * taking the usual 3-operand form. + * + * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the + * lower and upper halves of the Q register to end up with the high and low + * halves where we want - all in one instruction. + * + * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] } + * + * Unfortunately we need inline assembly for this: Instructions modifying two + * registers at once is not possible in GCC or Clang's IR, and they have to + * create a copy. + * + * aarch64 requires a different approach. + * + * In order to make it easier to write a decent compiler for aarch64, many + * quirks were removed, such as conditional execution. + * + * NEON was also affected by this. + * + * aarch64 cannot access the high bits of a Q-form register, and writes to a + * D-form register zero the high bits, similar to how writes to W-form scalar + * registers (or DWORD registers on x86_64) work. + * + * The formerly free vget_high intrinsics now require a vext (with a few + * exceptions) + * + * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent + * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one + * operand. + * + * The equivalent of the VZIP.32 on the lower and upper halves would be this + * mess: + * + * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] } + * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] } + * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] } + * + * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN): + * + * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32); + * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF); + * + * This is available on ARMv7-A, but is less efficient than a single VZIP.32. + */ + +/*! + * Function-like macro: + * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) + * { + * outLo = (uint32x2_t)(in & 0xFFFFFFFF); + * outHi = (uint32x2_t)(in >> 32); + * in = UNDEFINED; + * } + */ +# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ + && (defined(__GNUC__) || defined(__clang__)) \ + && (defined(__arm__) || defined(__thumb__) || defined(_M_ARM)) +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ + /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \ + /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \ + __asm__("vzip.32 %e0, %f0" : "+w" (in)); \ + (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \ + (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \ + } while (0) +# else +# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ + do { \ + (outLo) = vmovn_u64 (in); \ + (outHi) = vshrn_n_u64 ((in), 32); \ + } while (0) +# endif + +/*! + * @ingroup tuning + * @brief Controls the NEON to scalar ratio for XXH3 + * + * On AArch64 when not optimizing for size, XXH3 will run 6 lanes using NEON and + * 2 lanes on scalar by default. + * + * This can be set to 2, 4, 6, or 8. ARMv7 will default to all 8 NEON lanes, as the + * emulated 64-bit arithmetic is too slow. + * + * Modern ARM CPUs are _very_ sensitive to how their pipelines are used. + * + * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but it can't + * have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions, + * you are only using 2/3 of the CPU bandwidth. + * + * This is even more noticable on the more advanced cores like the A76 which + * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. + * + * Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the + * remaining lanes will use scalar instructions. This improves the bandwidth + * and also gives the integer pipelines something to do besides twiddling loop + * counters and pointers. + * + * This change benefits CPUs with large micro-op buffers without negatively affecting + * other CPUs: + * + * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. | + * |:----------------------|:--------------------|----------:|-----------:|------:| + * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% | + * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% | + * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% | + * + * It also seems to fix some bad codegen on GCC, making it almost as fast as clang. + * + * @see XXH3_accumulate_512_neon() + */ +# ifndef XXH3_NEON_LANES +# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \ + && !defined(__OPTIMIZE_SIZE__) +# define XXH3_NEON_LANES 6 +# else +# define XXH3_NEON_LANES XXH_ACC_NB +# endif +# endif +#endif /* XXH_VECTOR == XXH_NEON */ + +/* + * VSX and Z Vector helpers. + * + * This is very messy, and any pull requests to clean this up are welcome. + * + * There are a lot of problems with supporting VSX and s390x, due to + * inconsistent intrinsics, spotty coverage, and multiple endiannesses. + */ +#if XXH_VECTOR == XXH_VSX +# if defined(__s390x__) +# include <s390intrin.h> +# else +/* gcc's altivec.h can have the unwanted consequence to unconditionally + * #define bool, vector, and pixel keywords, + * with bad consequences for programs already using these keywords for other purposes. + * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined. + * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler, + * but it seems that, in some cases, it isn't. + * Force the build macro to be defined, so that keywords are not altered. + */ +# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__) +# define __APPLE_ALTIVEC__ +# endif +# include <altivec.h> +# endif + +typedef __vector unsigned long long xxh_u64x2; +typedef __vector unsigned char xxh_u8x16; +typedef __vector unsigned xxh_u32x4; + +# ifndef XXH_VSX_BE +# if defined(__BIG_ENDIAN__) \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +# define XXH_VSX_BE 1 +# elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ +# warning "-maltivec=be is not recommended. Please use native endianness." +# define XXH_VSX_BE 1 +# else +# define XXH_VSX_BE 0 +# endif +# endif /* !defined(XXH_VSX_BE) */ + +# if XXH_VSX_BE +# if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) +# define XXH_vec_revb vec_revb +# else +/*! + * A polyfill for POWER9's vec_revb(). + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) +{ + xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, + 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; + return vec_perm(val, val, vByteSwap); +} +# endif +# endif /* XXH_VSX_BE */ + +/*! + * Performs an unaligned vector load and byte swaps it on big endian. + */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) +{ + xxh_u64x2 ret; + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); +# if XXH_VSX_BE + ret = XXH_vec_revb(ret); +# endif + return ret; +} + +/* + * vec_mulo and vec_mule are very problematic intrinsics on PowerPC + * + * These intrinsics weren't added until GCC 8, despite existing for a while, + * and they are endian dependent. Also, their meaning swap depending on version. + * */ +# if defined(__s390x__) + /* s390x is always big endian, no issue on this platform */ +# define XXH_vec_mulo vec_mulo +# define XXH_vec_mule vec_mule +# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) +/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */ +# define XXH_vec_mulo __builtin_altivec_vmulouw +# define XXH_vec_mule __builtin_altivec_vmuleuw +# else +/* gcc needs inline assembly */ +/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) +{ + xxh_u64x2 result; + __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); + return result; +} +# endif /* XXH_vec_mulo, XXH_vec_mule */ +#endif /* XXH_VECTOR == XXH_VSX */ + + +/* prefetch + * can be disabled, by declaring XXH_NO_PREFETCH build macro */ +#if defined(XXH_NO_PREFETCH) +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +#else +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ +# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ +# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) +# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) +# define XXH_PREFETCH(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */) +# else +# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ +# endif +#endif /* XXH_NO_PREFETCH */ + + +/* ========================================== + * XXH3 default settings + * ========================================== */ + +#define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ + +#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) +# error "default keyset is not large enough" +#endif + +/*! Pseudorandom secret taken directly from FARSH. */ +XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { + 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, + 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, + 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, + 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, + 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, + 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, + 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, + 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, + 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, + 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, + 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, + 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, +}; + + +#ifdef XXH_OLD_NAMES +# define kSecret XXH3_kSecret +#endif + +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. + * + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't + * need to (but it shouldn't need to anyways, it is about 7 instructions to do + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we + * use that instead of the normal method. + * + * If you are compiling for platforms like Thumb-1 and don't have a better option, + * you may also want to write your own long multiply routine here. + * + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. + */ +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) +# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) +#else +/* + * Downcast + upcast is usually better than masking on older compilers like + * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers. + * + * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands + * and perform a full 64x64 multiply -- entirely redundant on 32-bit. + */ +# define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) +#endif + +/*! + * @brief Calculates a 64->128-bit long multiply. + * + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. + */ +static XXH128_hash_t +XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) +{ + /* + * GCC/Clang __uint128_t method. + * + * On most 64-bit targets, GCC and Clang define a __uint128_t type. + * This is usually the best way as it usually uses a native long 64-bit + * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. + * + * Usually. + * + * Despite being a 32-bit platform, Clang (and emscripten) define this type + * despite not having the arithmetic for it. This results in a laggy + * compiler builtin call which calculates a full 128-bit multiply. + * In that case it is best to use the portable one. + * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 + */ +#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \ + && defined(__SIZEOF_INT128__) \ + || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) + + __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs; + XXH128_hash_t r128; + r128.low64 = (xxh_u64)(product); + r128.high64 = (xxh_u64)(product >> 64); + return r128; + + /* + * MSVC for x64's _umul128 method. + * + * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); + * + * This compiles to single operand MUL on x64. + */ +#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(_umul128) +#endif + xxh_u64 product_high; + xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); + XXH128_hash_t r128; + r128.low64 = product_low; + r128.high64 = product_high; + return r128; + + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) || defined(_M_ARM64EC) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + +#else + /* + * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. + * + * This is a fast and simple grade school multiply, which is shown below + * with base 10 arithmetic instead of base 0x100000000. + * + * 9 3 // D2 lhs = 93 + * x 7 5 // D2 rhs = 75 + * ---------- + * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15 + * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45 + * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21 + * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63 + * --------- + * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27 + * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67 + * --------- + * 6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975 + * + * The reasons for adding the products like this are: + * 1. It avoids manual carry tracking. Just like how + * (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX. + * This avoids a lot of complexity. + * + * 2. It hints for, and on Clang, compiles to, the powerful UMAAL + * instruction available in ARM's Digital Signal Processing extension + * in 32-bit ARMv6 and later, which is shown below: + * + * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) + * { + * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; + * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); + * *RdHi = (xxh_u32)(product >> 32); + * } + * + * This instruction was designed for efficient long multiplication, and + * allows this to be calculated in only 4 instructions at speeds + * comparable to some 64-bit ALUs. + * + * 3. It isn't terrible on other platforms. Usually this will be a couple + * of 32-bit ADD/ADCs. + */ + + /* First calculate all of the cross products. */ + xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); + xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); + xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); + xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); + + /* Now add the products together. These will never overflow. */ + xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; + xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; + xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); + + XXH128_hash_t r128; + r128.low64 = lower; + r128.high64 = upper; + return r128; +#endif +} + +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. + * + * The reason for the separate function is to prevent passing too many structs + * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() + */ +static xxh_u64 +XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) +{ + XXH128_hash_t product = XXH_mult64to128(lhs, rhs); + return product.low64 ^ product.high64; +} + +/*! Seems to produce slightly better code on GCC for some reason. */ +XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) +{ + XXH_ASSERT(0 <= shift && shift < 64); + return v64 ^ (v64 >> shift); +} + +/* + * This is a fast avalanche stage, + * suitable when input bits are already partially mixed + */ +static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) +{ + h64 = XXH_xorshift64(h64, 37); + h64 *= 0x165667919E3779F9ULL; + h64 = XXH_xorshift64(h64, 32); + return h64; +} + +/* + * This is a stronger avalanche, + * inspired by Pelle Evensen's rrmxmx + * preferable when input has not been previously mixed + */ +static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len) +{ + /* this mix is inspired by Pelle Evensen's rrmxmx */ + h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24); + h64 *= 0x9FB21C651E98DF25ULL; + h64 ^= (h64 >> 35) + len ; + h64 *= 0x9FB21C651E98DF25ULL; + return XXH_xorshift64(h64, 28); +} + + +/* ========================================== + * Short keys + * ========================================== + * One of the shortcomings of XXH32 and XXH64 was that their performance was + * sub-optimal on short lengths. It used an iterative algorithm which strongly + * favored lengths that were a multiple of 4 or 8. + * + * Instead of iterating over individual inputs, we use a set of single shot + * functions which piece together a range of lengths and operate in constant time. + * + * Additionally, the number of multiplies has been significantly reduced. This + * reduces latency, especially when emulating 64-bit multiplies on 32-bit. + * + * Depending on the platform, this may or may not be faster than XXH32, but it + * is almost guaranteed to be faster than XXH64. + */ + +/* + * At very short lengths, there isn't enough input to fully hide secrets, or use + * the entire secret. + * + * There is also only a limited amount of mixing we can do before significantly + * impacting performance. + * + * Therefore, we use different sections of the secret and always mix two secret + * samples with an XOR. This should have no effect on performance on the + * seedless or withSeed variants because everything _should_ be constant folded + * by modern compilers. + * + * The XOR mixing hides individual parts of the secret and increases entropy. + * + * This adds an extra layer of strength for custom secrets. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combined = { input[0], 0x01, input[0], input[0] } + * len = 2: combined = { input[1], 0x02, input[0], input[1] } + * len = 3: combined = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const keyed = (xxh_u64)combined ^ bitflip; + return XXH64_avalanche(keyed); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input1 = XXH_readLE32(input); + xxh_u32 const input2 = XXH_readLE32(input + len - 4); + xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed; + xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32); + xxh_u64 const keyed = input64 ^ bitflip; + return XXH3_rrmxmx(keyed, len); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; + xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; + xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; + xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2; + xxh_u64 const acc = len + + XXH_swap64(input_lo) + input_hi + + XXH3_mul128_fold64(input_lo, input_hi); + return XXH3_avalanche(acc); + } +} + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (XXH_likely(len > 8)) return XXH3_len_9to16_64b(input, len, secret, seed); + if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed); + if (len) return XXH3_len_1to3_64b(input, len, secret, seed); + return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64))); + } +} + +/* + * DISCLAIMER: There are known *seed-dependent* multicollisions here due to + * multiplication by zero, affecting hashes of lengths 17 to 240. + * + * However, they are very unlikely. + * + * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all + * unseeded non-cryptographic hashes, it does not attempt to defend itself + * against specially crafted inputs, only random inputs. + * + * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes + * cancelling out the secret is taken an arbitrary number of times (addressed + * in XXH3_accumulate_512), this collision is very unlikely with random inputs + * and/or proper seeding: + * + * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a + * function that is only called up to 16 times per hash with up to 240 bytes of + * input. + * + * This is not too bad for a non-cryptographic hash function, especially with + * only 64 bit outputs. + * + * The 128-bit variant (which trades some speed for strength) is NOT affected + * by this, although it is always a good idea to use a proper seed if you care + * about strength. + */ +XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) +{ +#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__i386__) && defined(__SSE2__) /* x86 + SSE2 */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable like XXH32 hack */ + /* + * UGLY HACK: + * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in + * slower code. + * + * By forcing seed64 into a register, we disrupt the cost model and + * cause it to scalarize. See `XXH32_round()` + * + * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600, + * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on + * GCC 9.2, despite both emitting scalar code. + * + * GCC generates much better scalar code than Clang for the rest of XXH3, + * which is why finding a more optimal codepath is an interest. + */ + XXH_COMPILER_GUARD(seed64); +#endif + { xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 const input_hi = XXH_readLE64(input+8); + return XXH3_mul128_fold64( + input_lo ^ (XXH_readLE64(secret) + seed64), + input_hi ^ (XXH_readLE64(secret+8) - seed64) + ); + } +} + +/* For mid range keys, XXH3 uses a Mum-hash variant. */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { xxh_u64 acc = len * XXH_PRIME64_1; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc += XXH3_mix16B(input+48, secret+96, seed); + acc += XXH3_mix16B(input+len-64, secret+112, seed); + } + acc += XXH3_mix16B(input+32, secret+64, seed); + acc += XXH3_mix16B(input+len-48, secret+80, seed); + } + acc += XXH3_mix16B(input+16, secret+32, seed); + acc += XXH3_mix16B(input+len-32, secret+48, seed); + } + acc += XXH3_mix16B(input+0, secret+0, seed); + acc += XXH3_mix16B(input+len-16, secret+16, seed); + + return XXH3_avalanche(acc); + } +} + +#define XXH3_MIDSIZE_MAX 240 + +XXH_NO_INLINE XXH64_hash_t +XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + #define XXH3_MIDSIZE_STARTOFFSET 3 + #define XXH3_MIDSIZE_LASTOFFSET 17 + + { xxh_u64 acc = len * XXH_PRIME64_1; + int const nbRounds = (int)len / 16; + int i; + for (i=0; i<8; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); + } + acc = XXH3_avalanche(acc); + XXH_ASSERT(nbRounds >= 8); +#if defined(__clang__) /* Clang */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86. + * In everywhere else, it uses scalar code. + * + * For 64->128-bit multiplies, even if the NEON was 100% optimal, it + * would still be slower than UMAAL (see XXH_mult64to128). + * + * Unfortunately, Clang doesn't handle the long multiplies properly and + * converts them to the nonexistent "vmulq_u64" intrinsic, which is then + * scalarized into an ugly mess of VMOV.32 instructions. + * + * This mess is difficult to avoid without turning autovectorization + * off completely, but they are usually relatively minor and/or not + * worth it to fix. + * + * This loop is the easiest to fix, as unlike XXH32, this pragma + * _actually works_ because it is a loop vectorization instead of an + * SLP vectorization. + */ + #pragma clang loop vectorize(disable) +#endif + for (i=8 ; i < nbRounds; i++) { + acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); + } + /* last bytes */ + acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); + return XXH3_avalanche(acc); + } +} + + +/* ======= Long Keys ======= */ + +#define XXH_STRIPE_LEN 64 +#define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ +#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64)) + +#ifdef XXH_OLD_NAMES +# define STRIPE_LEN XXH_STRIPE_LEN +# define ACC_NB XXH_ACC_NB +#endif + +XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) +{ + if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); + XXH_memcpy(dst, &v64, sizeof(v64)); +} + +/* Several intrinsic functions below are supposed to accept __int64 as argument, + * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ . + * However, several environments do not define __int64 type, + * requiring a workaround. + */ +#if !defined (__VMS) \ + && (defined (__cplusplus) \ + || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) + typedef int64_t xxh_i64; +#else + /* the following type must have a width of 64-bit */ + typedef long long xxh_i64; +#endif + + +/* + * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized. + * + * It is a hardened version of UMAC, based off of FARSH's implementation. + * + * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD + * implementations, and it is ridiculously fast. + * + * We harden it by mixing the original input to the accumulators as well as the product. + * + * This means that in the (relatively likely) case of a multiply by zero, the + * original input is preserved. + * + * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve + * cross-pollination, as otherwise the upper and lower halves would be + * essentially independent. + * + * This doesn't matter on 64-bit hashes since they all get merged together in + * the end, so we skip the extra step. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) + +#ifndef XXH_TARGET_AVX512 +# define XXH_TARGET_AVX512 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + __m512i* const xacc = (__m512i *) acc; + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + + { + /* data_vec = input[0]; */ + __m512i const data_vec = _mm512_loadu_si512 (input); + /* key_vec = secret[0]; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + /* data_key = data_vec ^ key_vec; */ + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m512i const product = _mm512_mul_epu32 (data_key, data_key_lo); + /* xacc[0] += swap(data_vec); */ + __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2)); + __m512i const sum = _mm512_add_epi64(*xacc, data_swap); + /* xacc[0] += product; */ + *xacc = _mm512_add_epi64(product, sum); + } +} + +/* + * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing. + * + * Multiplication isn't perfect, as explained by Google in HighwayHash: + * + * // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to + * // varying degrees. In descending order of goodness, bytes + * // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32. + * // As expected, the upper and lower bytes are much worse. + * + * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291 + * + * Since our algorithm uses a pseudorandom secret to add some variance into the + * mix, we don't need to (or want to) mix as often or as much as HighwayHash does. + * + * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid + * extraction. + * + * Both XXH3_64bits and XXH3_128bits use this subroutine. + */ + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 63) == 0); + XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); + { __m512i* const xacc = (__m512i*) acc; + const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); + + /* xacc[0] ^= (xacc[0] >> 47) */ + __m512i const acc_vec = *xacc; + __m512i const shifted = _mm512_srli_epi64 (acc_vec, 47); + __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted); + /* xacc[0] ^= secret; */ + __m512i const key_vec = _mm512_loadu_si512 (secret); + __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec); + + /* xacc[0] *= XXH_PRIME32_1; */ + __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1)); + __m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32); + __m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32); + *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32)); + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX512 void +XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64); + XXH_ASSERT(((size_t)customSecret & 63) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); + + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; + int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); + for (i=0; i < nbRounds; ++i) { + /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', + * this will warn "discards 'const' qualifier". */ + union { + const __m512i* cp; + void* p; + } remote_const_void; + remote_const_void.cp = src + i; + dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) + +#ifndef XXH_TARGET_AVX2 +# define XXH_TARGET_AVX2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xinput = (const __m256i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* data_vec = xinput[i]; */ + __m256i const data_vec = _mm256_loadu_si256 (xinput+i); + /* key_vec = xsecret[i]; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m256i const product = _mm256_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm256_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void +XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 31) == 0); + { __m256i* const xacc = (__m256i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ + const __m256i* const xsecret = (const __m256i *) secret; + const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m256i const acc_vec = xacc[i]; + __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); + __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); + /* xacc[i] ^= xsecret; */ + __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); + __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); + __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0); + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6); + XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); + (void)(&XXH_writeLE64); + XXH_PREFETCH(customSecret); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); + + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; + +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dest); +# endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); + + /* GCC -O2 need unroll loop manually */ + dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); + dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed); + dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed); + dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed); + dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed); + dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed); + } +} + +#endif + +/* x86dispatch always generates SSE2 */ +#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) + +#ifndef XXH_TARGET_SSE2 +# define XXH_TARGET_SSE2 /* disable attribute target */ +#endif + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* SSE2 is just a half-scale version of the AVX2 version. */ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i *) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xinput = (const __m128i *) input; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* data_vec = xinput[i]; */ + __m128i const data_vec = _mm_loadu_si128 (xinput+i); + /* key_vec = xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + /* data_key = data_vec ^ key_vec; */ + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + /* data_key_lo = data_key >> 32; */ + __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + /* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */ + __m128i const product = _mm_mul_epu32 (data_key, data_key_lo); + /* xacc[i] += swap(data_vec); */ + __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); + __m128i const sum = _mm_add_epi64(xacc[i], data_swap); + /* xacc[i] += product; */ + xacc[i] = _mm_add_epi64(product, sum); + } } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void +XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + { __m128i* const xacc = (__m128i*) acc; + /* Unaligned. This is mainly for pointer arithmetic, and because + * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ + const __m128i* const xsecret = (const __m128i *) secret; + const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1); + + size_t i; + for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) { + /* xacc[i] ^= (xacc[i] >> 47) */ + __m128i const acc_vec = xacc[i]; + __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); + __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); + /* xacc[i] ^= xsecret[i]; */ + __m128i const key_vec = _mm_loadu_si128 (xsecret+i); + __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); + + /* xacc[i] *= XXH_PRIME32_1; */ + __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1)); + __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); + __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); + xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); + } + } +} + +XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + (void)(&XXH_writeLE64); + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); + +# if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; + __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); +# else + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); +# endif + int i; + + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; +# if defined(__GNUC__) || defined(__clang__) + /* + * On GCC & Clang, marking 'dest' as modified will cause the compiler: + * - do not extract the secret from sse registers in the internal loop + * - use less common registers, and avoid pushing these reg into stack + */ + XXH_COMPILER_GUARD(dst16); +# endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); + + for (i=0; i < nbRounds; ++i) { + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); + } } +} + +#endif + +#if (XXH_VECTOR == XXH_NEON) + +/* forward declarations for the scalar routines */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, size_t lane); + +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, size_t lane); + +/*! + * @internal + * @brief The bulk processing loop for NEON. + * + * The NEON code path is actually partially scalar when running on AArch64. This + * is to optimize the pipelining and can have up to 15% speedup depending on the + * CPU, and it also mitigates some GCC codegen issues. + * + * @see XXH3_NEON_LANES for configuring this and details about this optimization. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0); + { + uint64x2_t* const xacc = (uint64x2_t *) acc; + /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ + uint8_t const* const xinput = (const uint8_t *) input; + uint8_t const* const xsecret = (const uint8_t *) secret; + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* data_vec = xinput[i]; */ + uint8x16_t data_vec = vld1q_u8(xinput + (i * 16)); + /* key_vec = xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); + uint64x2_t data_key; + uint32x2_t data_key_lo, data_key_hi; + /* xacc[i] += swap(data_vec); */ + uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); + uint64x2_t const swapped = vextq_u64(data64, data64, 1); + xacc[i] = vaddq_u64 (xacc[i], swapped); + /* data_key = data_vec ^ key_vec; */ + data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec)); + /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (data_key >> 32); + * data_key = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */ + xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi); + + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { uint64x2_t* xacc = (uint64x2_t*) acc; + uint8_t const* xsecret = (uint8_t const*) secret; + uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1); + + size_t i; + /* NEON for the first few lanes (these loops are normally interleaved) */ + for (i=0; i < XXH3_NEON_LANES / 2; i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + uint64x2_t acc_vec = xacc[i]; + uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47); + uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); + + /* xacc[i] ^= xsecret[i]; */ + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); + + /* xacc[i] *= XXH_PRIME32_1 */ + uint32x2_t data_key_lo, data_key_hi; + /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF); + * data_key_hi = (uint32x2_t) (xacc[i] >> 32); + * xacc[i] = UNDEFINED; */ + XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi); + { /* + * prod_hi = (data_key >> 32) * XXH_PRIME32_1; + * + * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will + * incorrectly "optimize" this: + * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b)); + * shifted = vshll_n_u32(tmp, 32); + * to this: + * tmp = "vmulq_u64"(a, b); // no such thing! + * shifted = vshlq_n_u64(tmp, 32); + * + * However, unlike SSE, Clang lacks a 64-bit multiply routine + * for NEON, and it scalarizes two 64-bit multiplies instead. + * + * vmull_u32 has the same timing as vmul_u32, and it avoids + * this bug completely. + * See https://bugs.llvm.org/show_bug.cgi?id=39967 + */ + uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime); + /* xacc[i] = prod_hi << 32; */ + xacc[i] = vshlq_n_u64(prod_hi, 32); + /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */ + xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime); + } + } + /* Scalar for the remainder. This may be a zero iteration loop. */ + for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } + } +} + +#endif + +#if (XXH_VECTOR == XXH_VSX) + +XXH_FORCE_INLINE void +XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + /* presumed aligned */ + unsigned int* const xacc = (unsigned int*) acc; + xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ + xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ + xxh_u64x2 const v32 = { 32, 32 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* data_vec = xinput[i]; */ + xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i); + /* key_vec = xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + /* shuffled = (data_key << 32) | (data_key >> 32); */ + xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); + /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ + xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = (xxh_u64x2)vec_xl(0, xacc + 4 * i); + acc_vec += product; + + /* swap high and low halves */ +#ifdef __s390x__ + acc_vec += vec_permi(data_vec, data_vec, 2); +#else + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); +#endif + /* xacc[i] = acc_vec; */ + vec_xst((xxh_u32x4)acc_vec, 0, xacc + 4 * i); + } +} + +XXH_FORCE_INLINE void +XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + XXH_ASSERT((((size_t)acc) & 15) == 0); + + { xxh_u64x2* const xacc = (xxh_u64x2*) acc; + const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret; + /* constants */ + xxh_u64x2 const v32 = { 32, 32 }; + xxh_u64x2 const v47 = { 47, 47 }; + xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 }; + size_t i; + for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) { + /* xacc[i] ^= (xacc[i] >> 47); */ + xxh_u64x2 const acc_vec = xacc[i]; + xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47); + + /* xacc[i] ^= xsecret[i]; */ + xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i); + xxh_u64x2 const data_key = data_vec ^ key_vec; + + /* xacc[i] *= XXH_PRIME32_1 */ + /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF); */ + xxh_u64x2 const prod_even = XXH_vec_mule((xxh_u32x4)data_key, prime); + /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32); */ + xxh_u64x2 const prod_odd = XXH_vec_mulo((xxh_u32x4)data_key, prime); + xacc[i] = prod_odd + (prod_even << v32); + } } +} + +#endif + +/* scalar variants - universal */ + +/*! + * @internal + * @brief Scalar round for @ref XXH3_accumulate_512_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT input, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* xacc = (xxh_u64*) acc; + xxh_u8 const* xinput = (xxh_u8 const*) input; + xxh_u8 const* xsecret = (xxh_u8 const*) secret; + XXH_ASSERT(lane < XXH_ACC_NB); + XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); + { + xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8); + xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8); + xacc[lane ^ 1] += data_val; /* swap adjacent lanes */ + xacc[lane] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32); + } +} + +/*! + * @internal + * @brief Processes a 64 byte block of data using the scalar path. + */ +XXH_FORCE_INLINE void +XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, + const void* XXH_RESTRICT input, + const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarRound(acc, input, secret, i); + } +} + +/*! + * @internal + * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar(). + * + * This is extracted to its own function because the NEON path uses a combination + * of NEON and scalar. + */ +XXH_FORCE_INLINE void +XXH3_scalarScrambleRound(void* XXH_RESTRICT acc, + void const* XXH_RESTRICT secret, + size_t lane) +{ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ + XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); + XXH_ASSERT(lane < XXH_ACC_NB); + { + xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8); + xxh_u64 acc64 = xacc[lane]; + acc64 = XXH_xorshift64(acc64, 47); + acc64 ^= key64; + acc64 *= XXH_PRIME32_1; + xacc[lane] = acc64; + } +} + +/*! + * @internal + * @brief Scrambles the accumulators after a large chunk has been read + */ +XXH_FORCE_INLINE void +XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) +{ + size_t i; + for (i=0; i < XXH_ACC_NB; i++) { + XXH3_scalarScrambleRound(acc, secret, i); + } +} -#endif /* XXH_STATIC_LINKING_ONLY && XXH_STATIC_H_3543687687345 */ +XXH_FORCE_INLINE void +XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) +{ + /* + * We need a separate pointer for the hack below, + * which requires a non-const pointer. + * Any decent compiler will optimize this out otherwise. + */ + const xxh_u8* kSecretPtr = XXH3_kSecret; + XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); + +#if defined(__clang__) && defined(__aarch64__) + /* + * UGLY HACK: + * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are + * placed sequentially, in order, at the top of the unrolled loop. + * + * While MOVK is great for generating constants (2 cycles for a 64-bit + * constant compared to 4 cycles for LDR), it fights for bandwidth with + * the arithmetic instructions. + * + * I L S + * MOVK + * MOVK + * MOVK + * MOVK + * ADD + * SUB STR + * STR + * By forcing loads from memory (as the asm line causes Clang to assume + * that XXH3_kSecretPtr has been changed), the pipelines are used more + * efficiently: + * I L S + * LDR + * ADD LDR + * SUB STR + * STR + * + * See XXH3_NEON_LANES for details on the pipsline. + * + * XXH3_64bits_withSeed, len == 256, Snapdragon 835 + * without hack: 2654.4 MB/s + * with hack: 3202.9 MB/s + */ + XXH_COMPILER_GUARD(kSecretPtr); +#endif + /* + * Note: in debug mode, this overrides the asm optimization + * and Clang will emit MOVK chains again. + */ + XXH_ASSERT(kSecretPtr == XXH3_kSecret); + + { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; + int i; + for (i=0; i < nbRounds; i++) { + /* + * The asm hack causes Clang to assume that kSecretPtr aliases with + * customSecret, and on aarch64, this prevented LDP from merging two + * loads together for free. Putting the loads together before the stores + * properly generates LDP. + */ + xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i) + seed64; + xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64; + XXH_writeLE64((xxh_u8*)customSecret + 16*i, lo); + XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi); + } } +} + + +typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*); +typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*); +typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64); + + +#if (XXH_VECTOR == XXH_AVX512) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx512 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512 + +#elif (XXH_VECTOR == XXH_AVX2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_avx2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2 + +#elif (XXH_VECTOR == XXH_SSE2) + +#define XXH3_accumulate_512 XXH3_accumulate_512_sse2 +#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2 +#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2 + +#elif (XXH_VECTOR == XXH_NEON) + +#define XXH3_accumulate_512 XXH3_accumulate_512_neon +#define XXH3_scrambleAcc XXH3_scrambleAcc_neon +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#elif (XXH_VECTOR == XXH_VSX) + +#define XXH3_accumulate_512 XXH3_accumulate_512_vsx +#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#else /* scalar */ + +#define XXH3_accumulate_512 XXH3_accumulate_512_scalar +#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar +#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar + +#endif + + + +#ifndef XXH_PREFETCH_DIST +# ifdef __clang__ +# define XXH_PREFETCH_DIST 320 +# else +# if (XXH_VECTOR == XXH_AVX512) +# define XXH_PREFETCH_DIST 512 +# else +# define XXH_PREFETCH_DIST 384 +# endif +# endif /* __clang__ */ +#endif /* XXH_PREFETCH_DIST */ + +/* + * XXH3_accumulate() + * Loops over XXH3_accumulate_512(). + * Assumption: nbStripes will not overflow the secret size + */ +XXH_FORCE_INLINE void +XXH3_accumulate( xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, + const xxh_u8* XXH_RESTRICT secret, + size_t nbStripes, + XXH3_f_accumulate_512 f_acc512) +{ + size_t n; + for (n = 0; n < nbStripes; n++ ) { + const xxh_u8* const in = input + n*XXH_STRIPE_LEN; + XXH_PREFETCH(in + XXH_PREFETCH_DIST); + f_acc512(acc, + in, + secret + n*XXH_SECRET_CONSUME_RATE); + } +} + +XXH_FORCE_INLINE void +XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc, + const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; + size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock; + size_t const nb_blocks = (len - 1) / block_len; + + size_t n; + + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + + for (n = 0; n < nb_blocks; n++) { + XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN); + } + + /* last partial block */ + XXH_ASSERT(len > XXH_STRIPE_LEN); + { size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN; + XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); + XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512); + + /* last stripe */ + { const xxh_u8* const p = input + len - XXH_STRIPE_LEN; +#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */ + f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START); + } } +} + +XXH_FORCE_INLINE xxh_u64 +XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) +{ + return XXH3_mul128_fold64( + acc[0] ^ XXH_readLE64(secret), + acc[1] ^ XXH_readLE64(secret+8) ); +} + +static XXH64_hash_t +XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) +{ + xxh_u64 result64 = start; + size_t i = 0; + + for (i = 0; i < 4; i++) { + result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i); +#if defined(__clang__) /* Clang */ \ + && (defined(__arm__) || defined(__thumb__)) /* ARMv7 */ \ + && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \ + && !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */ + /* + * UGLY HACK: + * Prevent autovectorization on Clang ARMv7-a. Exact same problem as + * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b. + * XXH3_64bits, len == 256, Snapdragon 835: + * without hack: 2063.7 MB/s + * with hack: 2560.7 MB/s + */ + XXH_COMPILER_GUARD(result64); +#endif + } + + return XXH3_avalanche(result64); +} + +#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \ + XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 } + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, + const void* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + /* do not align on 8, so that the secret is different from the accumulator */ +#define XXH_SECRET_MERGEACCS_START 11 + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1); +} + +/* + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * XXH3_hashLong_64b_withSeed(): + * Generate a custom key based on alteration of default XXH3_kSecret with the seed, + * and then use this key for long mode hashing. + * + * This operation is decently fast but nonetheless costs a little bit of time. + * Try to avoid it whenever possible (typically when seed==0). + * + * It's important for performance that XXH3_hashLong is not inlined. Not sure + * why (uop cache maybe?), but the difference is large and easily measurable. + */ +XXH_FORCE_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len, + XXH64_hash_t seed, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed == 0) + return XXH3_hashLong_64b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed); + return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH64_hash_t +XXH3_hashLong_64b_withSeed(const void* input, size_t len, + XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_64b_withSeed_internal(input, len, seed, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + + +typedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH64_hash_t +XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong64_f f_hashLong) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secretLen` condition is not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + * Also, note that function signature doesn't offer room to return an error. + */ + if (len <= 16) + return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen); +} + + +/* === Public entry point === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) +{ + return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); +} + +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + + +/* === XXH3 streaming === */ + +/* + * Malloc's a pointer that is always aligned to align. + * + * This must be freed with `XXH_alignedFree()`. + * + * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte + * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2 + * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON. + * + * This underalignment previously caused a rather obvious crash which went + * completely unnoticed due to XXH3_createState() not actually being tested. + * Credit to RedSpah for noticing this bug. + * + * The alignment is done manually: Functions like posix_memalign or _mm_malloc + * are avoided: To maintain portability, we would have to write a fallback + * like this anyways, and besides, testing for the existence of library + * functions without relying on external build tools is impossible. + * + * The method is simple: Overallocate, manually align, and store the offset + * to the original behind the returned pointer. + * + * Align must be a power of 2 and 8 <= align <= 128. + */ +static void* XXH_alignedMalloc(size_t s, size_t align) +{ + XXH_ASSERT(align <= 128 && align >= 8); /* range check */ + XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */ + XXH_ASSERT(s != 0 && s < (s + align)); /* empty/overflow */ + { /* Overallocate to make room for manual realignment and an offset byte */ + xxh_u8* base = (xxh_u8*)XXH_malloc(s + align); + if (base != NULL) { + /* + * Get the offset needed to align this pointer. + * + * Even if the returned pointer is aligned, there will always be + * at least one byte to store the offset to the original pointer. + */ + size_t offset = align - ((size_t)base & (align - 1)); /* base % align */ + /* Add the offset for the now-aligned pointer */ + xxh_u8* ptr = base + offset; + + XXH_ASSERT((size_t)ptr % align == 0); + + /* Store the offset immediately before the returned pointer. */ + ptr[-1] = (xxh_u8)offset; + return ptr; + } + return NULL; + } +} +/* + * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass + * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout. + */ +static void XXH_alignedFree(void* p) +{ + if (p != NULL) { + xxh_u8* ptr = (xxh_u8*)p; + /* Get the offset byte we added in XXH_malloc. */ + xxh_u8 offset = ptr[-1]; + /* Free the original malloc'd pointer */ + xxh_u8* base = ptr - offset; + XXH_free(base); + } +} +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) +{ + XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); + if (state==NULL) return NULL; + XXH3_INITSTATE(state); + return state; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) +{ + XXH_alignedFree(statePtr); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) +{ + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); +} + +static void +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) +{ + size_t const initStart = offsetof(XXH3_state_t, bufferedSize); + size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; + XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart); + XXH_ASSERT(statePtr != NULL); + /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */ + memset((char*)statePtr + initStart, 0, initLength); + statePtr->acc[0] = XXH_PRIME32_3; + statePtr->acc[1] = XXH_PRIME64_1; + statePtr->acc[2] = XXH_PRIME64_2; + statePtr->acc[3] = XXH_PRIME64_3; + statePtr->acc[4] = XXH_PRIME64_4; + statePtr->acc[5] = XXH_PRIME32_2; + statePtr->acc[6] = XXH_PRIME64_5; + statePtr->acc[7] = XXH_PRIME32_1; + statePtr->seed = seed; + statePtr->useSeed = (seed != 0); + statePtr->extSecret = (const unsigned char*)secret; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; + statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset(XXH3_state_t* statePtr) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + if (statePtr == NULL) return XXH_ERROR; + XXH3_reset_internal(statePtr, 0, secret, secretSize); + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + if (statePtr == NULL) return XXH_ERROR; + if (seed==0) return XXH3_64bits_reset(statePtr); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ + return XXH_OK; +} + +/* Note : when XXH3_consumeStripes() is invoked, + * there must be a guarantee that at least one more byte must be consumed from input + * so that the function can blindly consume all stripes using the "normal" secret segment */ +XXH_FORCE_INLINE void +XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, + size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock, + const xxh_u8* XXH_RESTRICT input, size_t nbStripes, + const xxh_u8* XXH_RESTRICT secret, size_t secretLimit, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */ + XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock); + if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) { + /* need a scrambling operation */ + size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr; + size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock; + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512); + f_scramble(acc, secret + secretLimit); + XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512); + *nbStripesSoFarPtr = nbStripesAfterBlock; + } else { + XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512); + *nbStripesSoFarPtr += nbStripes; + } +} + +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_FORCE_INLINE XXH_errorcode +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + if (input==NULL) { + XXH_ASSERT(len == 0); + return XXH_OK; + } + + XXH_ASSERT(state != NULL); + { const xxh_u8* const bEnd = input + len; + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif + state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); + + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { + XXH_memcpy(state->buffer + state->bufferedSize, input, len); + state->bufferedSize += (XXH32_hash_t)len; + return XXH_OK; + } + + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) + XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ + + /* + * Internal buffer is partially filled (always, except at beginning) + * Complete it, then consume it. + */ + if (state->bufferedSize) { + size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; + XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); + input += loadSize; + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + state->bufferedSize = 0; + } + XXH_ASSERT(input < bEnd); + + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripesToEnd <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (input<limit); + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } + } + + /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); + XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); + state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif + } + + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + + +XXH_FORCE_INLINE void +XXH3_digest_long (XXH64_hash_t* acc, + const XXH3_state_t* state, + const unsigned char* secret) +{ + /* + * Digest on a local copy. This way, the state remains unaltered, and it can + * continue ingesting more input afterwards. + */ + XXH_memcpy(acc, state->acc, sizeof(state->acc)); + if (state->bufferedSize >= XXH_STRIPE_LEN) { + size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; + size_t nbStripesSoFar = state->nbStripesSoFar; + XXH3_consumeStripes(acc, + &nbStripesSoFar, state->nbStripesPerBlock, + state->buffer, nbStripes, + secret, state->secretLimit, + XXH3_accumulate_512, XXH3_scrambleAcc); + /* last stripe */ + XXH3_accumulate_512(acc, + state->buffer + state->bufferedSize - XXH_STRIPE_LEN, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } else { /* bufferedSize < XXH_STRIPE_LEN */ + xxh_u8 lastStripe[XXH_STRIPE_LEN]; + size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; + XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH3_accumulate_512(acc, + lastStripe, + secret + state->secretLimit - XXH_SECRET_LASTACC_START); + } +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + return XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + } + /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ + if (state->useSeed) + return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + + + +/* ========================================== + * XXH3 128 bits (a.k.a XXH128) + * ========================================== + * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant, + * even without counting the significantly larger output size. + * + * For example, extra steps are taken to avoid the seed-dependent collisions + * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B). + * + * This strength naturally comes at the cost of some speed, especially on short + * lengths. Note that longer hashes are about as fast as the 64-bit version + * due to it using only a slight modification of the 64-bit loop. + * + * XXH128 is also more oriented towards 64-bit machines. It is still extremely + * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64). + */ + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + /* A doubled version of 1to3_64b with different constants. */ + XXH_ASSERT(input != NULL); + XXH_ASSERT(1 <= len && len <= 3); + XXH_ASSERT(secret != NULL); + /* + * len = 1: combinedl = { input[0], 0x01, input[0], input[0] } + * len = 2: combinedl = { input[1], 0x02, input[0], input[1] } + * len = 3: combinedl = { input[2], 0x03, input[0], input[1] } + */ + { xxh_u8 const c1 = input[0]; + xxh_u8 const c2 = input[len >> 1]; + xxh_u8 const c3 = input[len - 1]; + xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24) + | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8); + xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13); + xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed; + xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed; + xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl; + xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph; + XXH128_hash_t h128; + h128.low64 = XXH64_avalanche(keyed_lo); + h128.high64 = XXH64_avalanche(keyed_hi); + return h128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(4 <= len && len <= 8); + seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; + { xxh_u32 const input_lo = XXH_readLE32(input); + xxh_u32 const input_hi = XXH_readLE32(input + len - 4); + xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32); + xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed; + xxh_u64 const keyed = input_64 ^ bitflip; + + /* Shift len to the left to ensure it is even, this avoids even multiplies. */ + XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2)); + + m128.high64 += (m128.low64 << 1); + m128.low64 ^= (m128.high64 >> 3); + + m128.low64 = XXH_xorshift64(m128.low64, 35); + m128.low64 *= 0x9FB21C651E98DF25ULL; + m128.low64 = XXH_xorshift64(m128.low64, 28); + m128.high64 = XXH3_avalanche(m128.high64); + return m128; + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(input != NULL); + XXH_ASSERT(secret != NULL); + XXH_ASSERT(9 <= len && len <= 16); + { xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed; + xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed; + xxh_u64 const input_lo = XXH_readLE64(input); + xxh_u64 input_hi = XXH_readLE64(input + len - 8); + XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1); + /* + * Put len in the middle of m128 to ensure that the length gets mixed to + * both the low and high bits in the 128x64 multiply below. + */ + m128.low64 += (xxh_u64)(len - 1) << 54; + input_hi ^= bitfliph; + /* + * Add the high 32 bits of input_hi to the high 32 bits of m128, then + * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to + * the high 64 bits of m128. + * + * The best approach to this operation is different on 32-bit and 64-bit. + */ + if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */ + /* + * 32-bit optimized version, which is more readable. + * + * On 32-bit, it removes an ADC and delays a dependency between the two + * halves of m128.high64, but it generates an extra mask on 64-bit. + */ + m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2); + } else { + /* + * 64-bit optimized (albeit more confusing) version. + * + * Uses some properties of addition and multiplication to remove the mask: + * + * Let: + * a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF) + * b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000) + * c = XXH_PRIME32_2 + * + * a + (b * c) + * Inverse Property: x + y - x == y + * a + (b * (1 + c - 1)) + * Distributive Property: x * (y + z) == (x * y) + (x * z) + * a + (b * 1) + (b * (c - 1)) + * Identity Property: x * 1 == x + * a + b + (b * (c - 1)) + * + * Substitute a, b, and c: + * input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + * + * Since input_hi.hi + input_hi.lo == input_hi, we get this: + * input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1)) + */ + m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1); + } + /* m128 ^= XXH_swap64(m128 >> 64); */ + m128.low64 ^= XXH_swap64(m128.high64); + + { /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */ + XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2); + h128.high64 += m128.high64 * XXH_PRIME64_2; + + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = XXH3_avalanche(h128.high64); + return h128; + } } +} + +/* + * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) +{ + XXH_ASSERT(len <= 16); + { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); + if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); + if (len) return XXH3_len_1to3_128b(input, len, secret, seed); + { XXH128_hash_t h128; + xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72); + xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88); + h128.low64 = XXH64_avalanche(seed ^ bitflipl); + h128.high64 = XXH64_avalanche( seed ^ bitfliph); + return h128; + } } +} + +/* + * A bit slower than XXH3_mix16B, but handles multiply by zero better. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, + const xxh_u8* secret, XXH64_hash_t seed) +{ + acc.low64 += XXH3_mix16B (input_1, secret+0, seed); + acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); + acc.high64 += XXH3_mix16B (input_2, secret+16, seed); + acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); + return acc; +} + + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(16 < len && len <= 128); + + { XXH128_hash_t acc; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + if (len > 32) { + if (len > 64) { + if (len > 96) { + acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); + } + acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); + } + acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); + } + acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_NO_INLINE XXH128_hash_t +XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH64_hash_t seed) +{ + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; + XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); + + { XXH128_hash_t acc; + int const nbRounds = (int)len / 32; + int i; + acc.low64 = len * XXH_PRIME64_1; + acc.high64 = 0; + for (i=0; i<4; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + (32 * i), + seed); + } + acc.low64 = XXH3_avalanche(acc.low64); + acc.high64 = XXH3_avalanche(acc.high64); + XXH_ASSERT(nbRounds >= 4); + for (i=4 ; i < nbRounds; i++) { + acc = XXH128_mix32B(acc, + input + (32 * i), + input + (32 * i) + 16, + secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)), + seed); + } + /* last bytes */ + acc = XXH128_mix32B(acc, + input + len - 16, + input + len - 32, + secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, + 0ULL - seed); + + { XXH128_hash_t h128; + h128.low64 = acc.low64 + acc.high64; + h128.high64 = (acc.low64 * XXH_PRIME64_1) + + (acc.high64 * XXH_PRIME64_4) + + ((len - seed) * XXH_PRIME64_2); + h128.low64 = XXH3_avalanche(h128.low64); + h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64); + return h128; + } + } +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len, + const xxh_u8* XXH_RESTRICT secret, size_t secretSize, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble) +{ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC; + + XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble); + + /* converge into final hash */ + XXH_STATIC_ASSERT(sizeof(acc) == 64); + XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)len * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + secretSize + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)len * XXH_PRIME64_2)); + return h128; + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; (void)secret; (void)secretLen; + return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/* + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. + */ +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)seed64; + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len, + XXH64_hash_t seed64, + XXH3_f_accumulate_512 f_acc512, + XXH3_f_scrambleAcc f_scramble, + XXH3_f_initCustomSecret f_initSec) +{ + if (seed64 == 0) + return XXH3_hashLong_128b_internal(input, len, + XXH3_kSecret, sizeof(XXH3_kSecret), + f_acc512, f_scramble); + { XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + f_initSec(secret, seed64); + return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret), + f_acc512, f_scramble); + } +} + +/* + * It's important for performance that XXH3_hashLong is not inlined. + */ +XXH_NO_INLINE XXH128_hash_t +XXH3_hashLong_128b_withSeed(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) +{ + (void)secret; (void)secretLen; + return XXH3_hashLong_128b_withSeed_internal(input, len, seed64, + XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret); +} + +typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t, + XXH64_hash_t, const void* XXH_RESTRICT, size_t); + +XXH_FORCE_INLINE XXH128_hash_t +XXH3_128bits_internal(const void* input, size_t len, + XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen, + XXH3_hashLong128_f f_hl128) +{ + XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN); + /* + * If an action is to be taken if `secret` conditions are not respected, + * it should be done here. + * For now, it's a contract pre-condition. + * Adding a check and a branch here would cost performance at every hash. + */ + if (len <= 16) + return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64); + if (len <= 128) + return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64); + return f_hl128(input, len, seed64, secret, secretLen); +} + + +/* === Public XXH128 API === */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) +{ + return XXH3_128bits_internal(input, len, 0, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_default); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) +{ + return XXH3_128bits_internal(input, len, 0, + (const xxh_u8*)secret, secretSize, + XXH3_hashLong_128b_withSecret); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_internal(input, len, seed, + XXH3_kSecret, sizeof(XXH3_kSecret), + XXH3_hashLong_128b_withSeed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128(const void* input, size_t len, XXH64_hash_t seed) +{ + return XXH3_128bits_withSeed(input, len, seed); +} + + +/* === XXH3 128-bit streaming === */ + +/* + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. + */ + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset(XXH3_state_t* statePtr) +{ + return XXH3_64bits_reset(statePtr); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) +{ + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSeed(statePtr, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate_512, XXH3_scrambleAcc); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) +{ + const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; + if (state->totalLen > XXH3_MIDSIZE_MAX) { + XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB]; + XXH3_digest_long(acc, state, secret); + XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); + { XXH128_hash_t h128; + h128.low64 = XXH3_mergeAccs(acc, + secret + XXH_SECRET_MERGEACCS_START, + (xxh_u64)state->totalLen * XXH_PRIME64_1); + h128.high64 = XXH3_mergeAccs(acc, + secret + state->secretLimit + XXH_STRIPE_LEN + - sizeof(acc) - XXH_SECRET_MERGEACCS_START, + ~((xxh_u64)state->totalLen * XXH_PRIME64_2)); + return h128; + } + } + /* len <= XXH3_MIDSIZE_MAX : short code */ + if (state->seed) + return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); + return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), + secret, state->secretLimit + XXH_STRIPE_LEN); +} + +/* 128-bit utility functions */ + +#include <string.h> /* memcmp, memcpy */ + +/* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) +{ + /* note : XXH128_hash_t is compact, it has no padding byte */ + return !(memcmp(&h1, &h2, sizeof(h1))); +} + +/* This prototype is compatible with stdlib's qsort(). + * return : >0 if *h128_1 > *h128_2 + * <0 if *h128_1 < *h128_2 + * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) +{ + XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; + XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; + int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); + /* note : bets that, in most cases, hash values are different */ + if (hcmp) return hcmp; + return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); +} + + +/*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) +{ + XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); + if (XXH_CPU_LITTLE_ENDIAN) { + hash.high64 = XXH_swap64(hash.high64); + hash.low64 = XXH_swap64(hash.low64); + } + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH128_hashFromCanonical(const XXH128_canonical_t* src) +{ + XXH128_hash_t h; + h.high64 = XXH_readBE64(src); + h.low64 = XXH_readBE64(src->digest + 8); + return h; +} + + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(secretBuffer != NULL); + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); +#else + /* production mode, assert() are disabled */ + if (secretBuffer == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; +#endif + + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } +#if (XXH_DEBUGLEVEL >= 1) + XXH_ASSERT(customSeed != NULL); +#else + if (customSeed == NULL) return XXH_ERROR; +#endif + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n<nbSeg16; n++) { + XXH128_hash_t const h128 = XXH128(&scrambler, sizeof(scrambler), n); + XXH3_combine16((char*)secretBuffer + n*16, h128); + } + /* last segment */ + XXH3_combine16((char*)secretBuffer + secretSize - 16, XXH128_hashFromCanonical(&scrambler)); + } + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API void +XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed) +{ + XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; + XXH3_initCustomSecret(secret, seed); + XXH_ASSERT(secretBuffer != NULL); + memcpy(secretBuffer, secret, XXH_SECRET_DEFAULT_SIZE); +} + + + +/* Pop our optimization override from above */ +#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \ + && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \ + && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */ +# pragma GCC pop_options +#endif + +#endif /* XXH_NO_LONG_LONG */ + +#endif /* XXH_NO_XXH3 */ + +/*! + * @} + */ +#endif /* XXH_IMPLEMENTATION */ #if defined (__cplusplus) diff --git a/thirdparty/zstd/common/zstd_internal.h b/thirdparty/zstd/common/zstd_internal.h index 68252e987e..e4d36ce090 100644 --- a/thirdparty/zstd/common/zstd_internal.h +++ b/thirdparty/zstd/common/zstd_internal.h @@ -19,10 +19,8 @@ /*-************************************* * Dependencies ***************************************/ -#if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON) -#include <arm_neon.h> -#endif #include "compiler.h" +#include "cpu.h" #include "mem.h" #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */ #include "error_private.h" @@ -60,81 +58,7 @@ extern "C" { #undef MAX #define MIN(a,b) ((a)<(b) ? (a) : (b)) #define MAX(a,b) ((a)>(b) ? (a) : (b)) - -/** - * Ignore: this is an internal helper. - * - * This is a helper function to help force C99-correctness during compilation. - * Under strict compilation modes, variadic macro arguments can't be empty. - * However, variadic function arguments can be. Using a function therefore lets - * us statically check that at least one (string) argument was passed, - * independent of the compilation flags. - */ -static INLINE_KEYWORD UNUSED_ATTR -void _force_has_format_string(const char *format, ...) { - (void)format; -} - -/** - * Ignore: this is an internal helper. - * - * We want to force this function invocation to be syntactically correct, but - * we don't want to force runtime evaluation of its arguments. - */ -#define _FORCE_HAS_FORMAT_STRING(...) \ - if (0) { \ - _force_has_format_string(__VA_ARGS__); \ - } - -/** - * Return the specified error if the condition evaluates to true. - * - * In debug modes, prints additional information. - * In order to do that (particularly, printing the conditional that failed), - * this can't just wrap RETURN_ERROR(). - */ -#define RETURN_ERROR_IF(cond, err, ...) \ - if (cond) { \ - RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return ERROR(err); \ - } - -/** - * Unconditionally return the specified error. - * - * In debug modes, prints additional information. - */ -#define RETURN_ERROR(err, ...) \ - do { \ - RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return ERROR(err); \ - } while(0); - -/** - * If the provided expression evaluates to an error code, returns that error code. - * - * In debug modes, prints additional information. - */ -#define FORWARD_IF_ERROR(err, ...) \ - do { \ - size_t const err_code = (err); \ - if (ERR_isError(err_code)) { \ - RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \ - __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \ - _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \ - RAWLOG(3, ": " __VA_ARGS__); \ - RAWLOG(3, "\n"); \ - return err_code; \ - } \ - } while(0); +#define BOUNDED(min,val,max) (MAX(min,MIN(val,max))) /*-************************************* @@ -143,7 +67,6 @@ void _force_has_format_string(const char *format, ...) { #define ZSTD_OPT_NUM (1<<12) #define ZSTD_REP_NUM 3 /* number of repcodes */ -#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1) static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 }; #define KB *(1 <<10) @@ -195,7 +118,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy /* Each table cannot take more than #symbols * FSELog bits */ #define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8) -static UNUSED_ATTR const U32 LL_bits[MaxLL+1] = { +static UNUSED_ATTR const U8 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, @@ -212,7 +135,7 @@ static UNUSED_ATTR const S16 LL_defaultNorm[MaxLL+1] = { #define LL_DEFAULTNORMLOG 6 /* for static allocation */ static UNUSED_ATTR const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG; -static UNUSED_ATTR const U32 ML_bits[MaxML+1] = { +static UNUSED_ATTR const U8 ML_bits[MaxML+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -247,19 +170,30 @@ static UNUSED_ATTR const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG; * Shared functions to include for inlining *********************************************/ static void ZSTD_copy8(void* dst, const void* src) { -#if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON) +#if defined(ZSTD_ARCH_ARM_NEON) vst1_u8((uint8_t*)dst, vld1_u8((const uint8_t*)src)); #else ZSTD_memcpy(dst, src, 8); #endif } - #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; } + +/* Need to use memmove here since the literal buffer can now be located within + the dst buffer. In circumstances where the op "catches up" to where the + literal buffer is, there can be partial overlaps in this call on the final + copy if the literal is being shifted by less than 16 bytes. */ static void ZSTD_copy16(void* dst, const void* src) { -#if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON) +#if defined(ZSTD_ARCH_ARM_NEON) vst1q_u8((uint8_t*)dst, vld1q_u8((const uint8_t*)src)); +#elif defined(ZSTD_ARCH_X86_SSE2) + _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((const __m128i*)src)); +#elif defined(__clang__) + ZSTD_memmove(dst, src, 16); #else - ZSTD_memcpy(dst, src, 16); + /* ZSTD_memmove is not inlined properly by gcc */ + BYTE copy16_buf[16]; + ZSTD_memcpy(copy16_buf, src, 16); + ZSTD_memcpy(dst, copy16_buf, 16); #endif } #define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; } @@ -288,8 +222,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e BYTE* op = (BYTE*)dst; BYTE* const oend = op + length; - assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN)); - if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) { /* Handle short offset copies. */ do { @@ -352,9 +284,9 @@ typedef enum { * Private declarations *********************************************/ typedef struct seqDef_s { - U32 offset; /* offset == rawOffset + ZSTD_REP_NUM, or equivalently, offCode + 1 */ + U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */ U16 litLength; - U16 matchLength; + U16 mlBase; /* mlBase == matchLength - MINMATCH */ } seqDef; /* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */ @@ -396,7 +328,7 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore { ZSTD_sequenceLength seqLen; seqLen.litLength = seq->litLength; - seqLen.matchLength = seq->matchLength + MINMATCH; + seqLen.matchLength = seq->mlBase + MINMATCH; if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) { if (seqStore->longLengthType == ZSTD_llt_literalLength) { seqLen.litLength += 0xFFFF; @@ -436,8 +368,14 @@ MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus # if STATIC_BMI2 == 1 return _lzcnt_u32(val)^31; # else - unsigned long r=0; - return _BitScanReverse(&r, val) ? (unsigned)r : 0; + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ return __builtin_clz (val) ^ 31; @@ -456,6 +394,63 @@ MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus } } +/** + * Counts the number of trailing zeros of a `size_t`. + * Most compilers should support CTZ as a builtin. A backup + * implementation is provided if the builtin isn't supported, but + * it may not be terribly efficient. + */ +MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val) +{ + if (MEM_64bits()) { +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 + return _tzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, (U64)val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return __builtin_ctzll((U64)val); +# else + static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, + 4, 25, 14, 28, 9, 34, 20, 56, + 5, 17, 26, 54, 15, 41, 29, 43, + 10, 31, 38, 35, 21, 45, 49, 57, + 63, 6, 12, 18, 24, 27, 33, 55, + 16, 53, 40, 42, 30, 37, 44, 48, + 62, 11, 23, 32, 52, 39, 36, 47, + 61, 22, 51, 46, 60, 50, 59, 58 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } else { /* 32 bits */ +# if defined(_MSC_VER) + if (val != 0) { + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# elif defined(__GNUC__) && (__GNUC__ >= 3) + return __builtin_ctz((U32)val); +# else + static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } +} + /* ZSTD_invalidateRepCodes() : * ensures next compression will not use repcodes from previous block. @@ -482,6 +477,14 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, const void* src, size_t srcSize); +/** + * @returns true iff the CPU supports dynamic BMI2 dispatch. + */ +MEM_STATIC int ZSTD_cpuSupportsBmi2(void) +{ + ZSTD_cpuid_t cpuid = ZSTD_cpuid(); + return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid); +} #if defined (__cplusplus) } diff --git a/thirdparty/zstd/common/zstd_trace.h b/thirdparty/zstd/common/zstd_trace.h index 2da5640771..f9121f7d8e 100644 --- a/thirdparty/zstd/common/zstd_trace.h +++ b/thirdparty/zstd/common/zstd_trace.h @@ -17,10 +17,19 @@ extern "C" { #include <stddef.h> -/* weak symbol support */ -#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && defined(__GNUC__) && \ +/* weak symbol support + * For now, enable conservatively: + * - Only GNUC + * - Only ELF + * - Only x86-64 and i386 + * Also, explicitly disable on platforms known not to work so they aren't + * forgotten in the future. + */ +#if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ + defined(__GNUC__) && defined(__ELF__) && \ + (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ - !defined(__CYGWIN__) + !defined(__CYGWIN__) && !defined(_AIX) # define ZSTD_HAVE_WEAK_SYMBOLS 1 #else # define ZSTD_HAVE_WEAK_SYMBOLS 0 diff --git a/thirdparty/zstd/compress/clevels.h b/thirdparty/zstd/compress/clevels.h new file mode 100644 index 0000000000..7ed2e00490 --- /dev/null +++ b/thirdparty/zstd/compress/clevels.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_CLEVELS_H +#define ZSTD_CLEVELS_H + +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +#include "../zstd.h" + +/*-===== Pre-defined compression levels =====-*/ + +#define ZSTD_MAX_CLEVEL 22 + +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif + +static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = { +{ /* "default" - for any srcSize > 256 KB */ + /* W, C, H, S, L, TL, strat */ + { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */ + { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */ + { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */ + { 21, 16, 17, 1, 5, 0, ZSTD_dfast }, /* level 3 */ + { 21, 18, 18, 1, 5, 0, ZSTD_dfast }, /* level 4 */ + { 21, 18, 19, 3, 5, 2, ZSTD_greedy }, /* level 5 */ + { 21, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6 */ + { 21, 19, 20, 4, 5, 8, ZSTD_lazy }, /* level 7 */ + { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 8 */ + { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */ + { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 10 */ + { 22, 21, 22, 6, 5, 16, ZSTD_lazy2 }, /* level 11 */ + { 22, 22, 23, 6, 5, 32, ZSTD_lazy2 }, /* level 12 */ + { 22, 22, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */ + { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */ + { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */ + { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */ + { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */ + { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */ + { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */ + { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */ + { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */ + { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */ +}, +{ /* for srcSize <= 256 KB */ + /* W, C, H, S, L, T, strat */ + { 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 18, 14, 14, 1, 5, 0, ZSTD_dfast }, /* level 2 */ + { 18, 16, 16, 1, 4, 0, ZSTD_dfast }, /* level 3 */ + { 18, 16, 17, 3, 5, 2, ZSTD_greedy }, /* level 4.*/ + { 18, 17, 18, 5, 5, 2, ZSTD_greedy }, /* level 5.*/ + { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/ + { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */ + { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/ + { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/ + { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */ + { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/ + { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 128 KB */ + /* W, C, H, S, L, T, strat */ + { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */ + { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */ + { 17, 15, 16, 2, 5, 0, ZSTD_dfast }, /* level 3 */ + { 17, 17, 17, 2, 4, 0, ZSTD_dfast }, /* level 4 */ + { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */ + { 17, 16, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */ + { 17, 16, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 17, 16, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ + { 17, 16, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ + { 17, 16, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ + { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */ + { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */ + { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/ + { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ + { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/ + { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/ + { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/ + { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/ + { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +{ /* for srcSize <= 16 KB */ + /* W, C, H, S, L, T, strat */ + { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ + { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */ + { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */ + { 14, 14, 15, 2, 4, 0, ZSTD_dfast }, /* level 3 */ + { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */ + { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/ + { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */ + { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */ + { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/ + { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/ + { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/ + { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/ + { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/ + { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/ + { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/ + { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/ + { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/ + { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/ + { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ + { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/ + { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ + { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/ +}, +}; + + + +#endif /* ZSTD_CLEVELS_H */ diff --git a/thirdparty/zstd/compress/fse_compress.c b/thirdparty/zstd/compress/fse_compress.c index b4297ec88a..5547b4ac09 100644 --- a/thirdparty/zstd/compress/fse_compress.c +++ b/thirdparty/zstd/compress/fse_compress.c @@ -75,13 +75,14 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableLog ? tableSize>>1 : 1) ; FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT); U32 const step = FSE_TABLESTEP(tableSize); + U32 const maxSV1 = maxSymbolValue+1; - U32* cumul = (U32*)workSpace; - FSE_FUNCTION_TYPE* tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSymbolValue + 2)); + U16* cumul = (U16*)workSpace; /* size = maxSV1 */ + FSE_FUNCTION_TYPE* const tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSV1+1)); /* size = tableSize */ U32 highThreshold = tableSize-1; - if ((size_t)workSpace & 3) return ERROR(GENERIC); /* Must be 4 byte aligned */ + assert(((size_t)workSpace & 1) == 0); /* Must be 2 bytes-aligned */ if (FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) > wkspSize) return ERROR(tableLog_tooLarge); /* CTable header */ tableU16[-2] = (U16) tableLog; @@ -98,20 +99,61 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, /* symbol start positions */ { U32 u; cumul[0] = 0; - for (u=1; u <= maxSymbolValue+1; u++) { + for (u=1; u <= maxSV1; u++) { if (normalizedCounter[u-1]==-1) { /* Low proba symbol */ cumul[u] = cumul[u-1] + 1; tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1); } else { - cumul[u] = cumul[u-1] + normalizedCounter[u-1]; + assert(normalizedCounter[u-1] >= 0); + cumul[u] = cumul[u-1] + (U16)normalizedCounter[u-1]; + assert(cumul[u] >= cumul[u-1]); /* no overflow */ } } - cumul[maxSymbolValue+1] = tableSize+1; + cumul[maxSV1] = (U16)(tableSize+1); } /* Spread symbols */ - { U32 position = 0; + if (highThreshold == tableSize - 1) { + /* Case for no low prob count symbols. Lay down 8 bytes at a time + * to reduce branch misses since we are operating on a small block + */ + BYTE* const spread = tableSymbol + tableSize; /* size = tableSize + 8 (may write beyond tableSize) */ + { U64 const add = 0x0101010101010101ull; + size_t pos = 0; + U64 sv = 0; + U32 s; + for (s=0; s<maxSV1; ++s, sv += add) { + int i; + int const n = normalizedCounter[s]; + MEM_write64(spread + pos, sv); + for (i = 8; i < n; i += 8) { + MEM_write64(spread + pos + i, sv); + } + assert(n>=0); + pos += (size_t)n; + } + } + /* Spread symbols across the table. Lack of lowprob symbols means that + * we don't need variable sized inner loop, so we can unroll the loop and + * reduce branch misses. + */ + { size_t position = 0; + size_t s; + size_t const unroll = 2; /* Experimentally determined optimal unroll */ + assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ + for (s = 0; s < (size_t)tableSize; s += unroll) { + size_t u; + for (u = 0; u < unroll; ++u) { + size_t const uPosition = (position + (u * step)) & tableMask; + tableSymbol[uPosition] = spread[s + u]; + } + position = (position + (unroll * step)) & tableMask; + } + assert(position == 0); /* Must have initialized all positions */ + } + } else { + U32 position = 0; U32 symbol; - for (symbol=0; symbol<=maxSymbolValue; symbol++) { + for (symbol=0; symbol<maxSV1; symbol++) { int nbOccurrences; int const freq = normalizedCounter[symbol]; for (nbOccurrences=0; nbOccurrences<freq; nbOccurrences++) { @@ -120,7 +162,6 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, while (position > highThreshold) position = (position + step) & tableMask; /* Low proba area */ } } - assert(position==0); /* Must have initialized all positions */ } @@ -144,16 +185,17 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, case -1: case 1: symbolTT[s].deltaNbBits = (tableLog << 16) - (1<<tableLog); - symbolTT[s].deltaFindState = total - 1; + assert(total <= INT_MAX); + symbolTT[s].deltaFindState = (int)(total - 1); total ++; break; default : - { - U32 const maxBitsOut = tableLog - BIT_highbit32 (normalizedCounter[s]-1); - U32 const minStatePlus = normalizedCounter[s] << maxBitsOut; + assert(normalizedCounter[s] > 1); + { U32 const maxBitsOut = tableLog - BIT_highbit32 ((U32)normalizedCounter[s]-1); + U32 const minStatePlus = (U32)normalizedCounter[s] << maxBitsOut; symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus; - symbolTT[s].deltaFindState = total - normalizedCounter[s]; - total += normalizedCounter[s]; + symbolTT[s].deltaFindState = (int)(total - (unsigned)normalizedCounter[s]); + total += (unsigned)normalizedCounter[s]; } } } } #if 0 /* debug : symbol costs */ @@ -164,32 +206,26 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, symbol, normalizedCounter[symbol], FSE_getMaxNbBits(symbolTT, symbol), (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256); - } - } + } } #endif return 0; } -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) -{ - FSE_FUNCTION_TYPE tableSymbol[FSE_MAX_TABLESIZE]; /* memset() is not necessary, even if static analyzer complain about it */ - return FSE_buildCTable_wksp(ct, normalizedCounter, maxSymbolValue, tableLog, tableSymbol, sizeof(tableSymbol)); -} -#endif - #ifndef FSE_COMMONDEFS_ONLY - /*-************************************************************** * FSE NCount encoding ****************************************************************/ size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog) { - size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog) >> 3) + 3; + size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog + + 4 /* bitCount initialized at 4 */ + + 2 /* first two symbols may use one additional bit each */) / 8) + + 1 /* round up to whole nb bytes */ + + 2 /* additional two bytes for bitstream flush */; return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */ } diff --git a/thirdparty/zstd/compress/huf_compress.c b/thirdparty/zstd/compress/huf_compress.c index 485906e678..2b3d6adc2a 100644 --- a/thirdparty/zstd/compress/huf_compress.c +++ b/thirdparty/zstd/compress/huf_compress.c @@ -53,6 +53,28 @@ unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxS /* ******************************************************* * HUF : Huffman block compression *********************************************************/ +#define HUF_WORKSPACE_MAX_ALIGNMENT 8 + +static void* HUF_alignUpWorkspace(void* workspace, size_t* workspaceSizePtr, size_t align) +{ + size_t const mask = align - 1; + size_t const rem = (size_t)workspace & mask; + size_t const add = (align - rem) & mask; + BYTE* const aligned = (BYTE*)workspace + add; + assert((align & (align - 1)) == 0); /* pow 2 */ + assert(align <= HUF_WORKSPACE_MAX_ALIGNMENT); + if (*workspaceSizePtr >= add) { + assert(add < align); + assert(((size_t)aligned & mask) == 0); + *workspaceSizePtr -= add; + return aligned; + } else { + *workspaceSizePtr = 0; + return NULL; + } +} + + /* HUF_compressWeights() : * Same as FSE_compress(), but dedicated to huff0's weights compression. * The use case needs much less stack memory. @@ -75,7 +97,7 @@ static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightT unsigned maxSymbolValue = HUF_TABLELOG_MAX; U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER; - HUF_CompressWeightsWksp* wksp = (HUF_CompressWeightsWksp*)workspace; + HUF_CompressWeightsWksp* wksp = (HUF_CompressWeightsWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); if (workspaceSize < sizeof(HUF_CompressWeightsWksp)) return ERROR(GENERIC); @@ -106,6 +128,40 @@ static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightT return (size_t)(op-ostart); } +static size_t HUF_getNbBits(HUF_CElt elt) +{ + return elt & 0xFF; +} + +static size_t HUF_getNbBitsFast(HUF_CElt elt) +{ + return elt; +} + +static size_t HUF_getValue(HUF_CElt elt) +{ + return elt & ~0xFF; +} + +static size_t HUF_getValueFast(HUF_CElt elt) +{ + return elt; +} + +static void HUF_setNbBits(HUF_CElt* elt, size_t nbBits) +{ + assert(nbBits <= HUF_TABLELOG_ABSOLUTEMAX); + *elt = nbBits; +} + +static void HUF_setValue(HUF_CElt* elt, size_t value) +{ + size_t const nbBits = HUF_getNbBits(*elt); + if (nbBits > 0) { + assert((value >> nbBits) == 0); + *elt |= value << (sizeof(HUF_CElt) * 8 - nbBits); + } +} typedef struct { HUF_CompressWeightsWksp wksp; @@ -117,9 +173,10 @@ size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize) { + HUF_CElt const* const ct = CTable + 1; BYTE* op = (BYTE*)dst; U32 n; - HUF_WriteCTableWksp* wksp = (HUF_WriteCTableWksp*)workspace; + HUF_WriteCTableWksp* wksp = (HUF_WriteCTableWksp*)HUF_alignUpWorkspace(workspace, &workspaceSize, ZSTD_ALIGNOF(U32)); /* check conditions */ if (workspaceSize < sizeof(HUF_WriteCTableWksp)) return ERROR(GENERIC); @@ -130,9 +187,10 @@ size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, for (n=1; n<huffLog+1; n++) wksp->bitsToWeight[n] = (BYTE)(huffLog + 1 - n); for (n=0; n<maxSymbolValue; n++) - wksp->huffWeight[n] = wksp->bitsToWeight[CTable[n].nbBits]; + wksp->huffWeight[n] = wksp->bitsToWeight[HUF_getNbBits(ct[n])]; /* attempt weights compression by FSE */ + if (maxDstSize < 1) return ERROR(dstSize_tooSmall); { CHECK_V_F(hSize, HUF_compressWeights(op+1, maxDstSize-1, wksp->huffWeight, maxSymbolValue, &wksp->wksp, sizeof(wksp->wksp)) ); if ((hSize>1) & (hSize < maxSymbolValue/2)) { /* FSE compressed */ op[0] = (BYTE)hSize; @@ -166,6 +224,7 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; /* large enough for values from 0 to 16 */ U32 tableLog = 0; U32 nbSymbols = 0; + HUF_CElt* const ct = CTable + 1; /* get symbol weights */ CHECK_V_F(readSize, HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX+1, rankVal, &nbSymbols, &tableLog, src, srcSize)); @@ -175,6 +234,8 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void if (tableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); if (nbSymbols > *maxSymbolValuePtr+1) return ERROR(maxSymbolValue_tooSmall); + CTable[0] = tableLog; + /* Prepare base value per rank */ { U32 n, nextRankStart = 0; for (n=1; n<=tableLog; n++) { @@ -186,13 +247,13 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void /* fill nbBits */ { U32 n; for (n=0; n<nbSymbols; n++) { const U32 w = huffWeight[n]; - CTable[n].nbBits = (BYTE)(tableLog + 1 - w) & -(w != 0); + HUF_setNbBits(ct + n, (BYTE)(tableLog + 1 - w) & -(w != 0)); } } /* fill val */ { U16 nbPerRank[HUF_TABLELOG_MAX+2] = {0}; /* support w=0=>n=tableLog+1 */ U16 valPerRank[HUF_TABLELOG_MAX+2] = {0}; - { U32 n; for (n=0; n<nbSymbols; n++) nbPerRank[CTable[n].nbBits]++; } + { U32 n; for (n=0; n<nbSymbols; n++) nbPerRank[HUF_getNbBits(ct[n])]++; } /* determine stating value per rank */ valPerRank[tableLog+1] = 0; /* for w==0 */ { U16 min = 0; @@ -202,18 +263,18 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void min >>= 1; } } /* assign value within rank, symbol order */ - { U32 n; for (n=0; n<nbSymbols; n++) CTable[n].val = valPerRank[CTable[n].nbBits]++; } + { U32 n; for (n=0; n<nbSymbols; n++) HUF_setValue(ct + n, valPerRank[HUF_getNbBits(ct[n])]++); } } *maxSymbolValuePtr = nbSymbols - 1; return readSize; } -U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue) +U32 HUF_getNbBitsFromCTable(HUF_CElt const* CTable, U32 symbolValue) { - const HUF_CElt* table = (const HUF_CElt*)symbolTable; + const HUF_CElt* ct = CTable + 1; assert(symbolValue <= HUF_SYMBOLVALUE_MAX); - return table[symbolValue].nbBits; + return (U32)HUF_getNbBits(ct[symbolValue]); } @@ -367,22 +428,118 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) } typedef struct { - U32 base; - U32 curr; + U16 base; + U16 curr; } rankPos; typedef nodeElt huffNodeTable[HUF_CTABLE_WORKSPACE_SIZE_U32]; -#define RANK_POSITION_TABLE_SIZE 32 +/* Number of buckets available for HUF_sort() */ +#define RANK_POSITION_TABLE_SIZE 192 typedef struct { huffNodeTable huffNodeTbl; rankPos rankPosition[RANK_POSITION_TABLE_SIZE]; } HUF_buildCTable_wksp_tables; +/* RANK_POSITION_DISTINCT_COUNT_CUTOFF == Cutoff point in HUF_sort() buckets for which we use log2 bucketing. + * Strategy is to use as many buckets as possible for representing distinct + * counts while using the remainder to represent all "large" counts. + * + * To satisfy this requirement for 192 buckets, we can do the following: + * Let buckets 0-166 represent distinct counts of [0, 166] + * Let buckets 166 to 192 represent all remaining counts up to RANK_POSITION_MAX_COUNT_LOG using log2 bucketing. + */ +#define RANK_POSITION_MAX_COUNT_LOG 32 +#define RANK_POSITION_LOG_BUCKETS_BEGIN (RANK_POSITION_TABLE_SIZE - 1) - RANK_POSITION_MAX_COUNT_LOG - 1 /* == 158 */ +#define RANK_POSITION_DISTINCT_COUNT_CUTOFF RANK_POSITION_LOG_BUCKETS_BEGIN + BIT_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) /* == 166 */ + +/* Return the appropriate bucket index for a given count. See definition of + * RANK_POSITION_DISTINCT_COUNT_CUTOFF for explanation of bucketing strategy. + */ +static U32 HUF_getIndex(U32 const count) { + return (count < RANK_POSITION_DISTINCT_COUNT_CUTOFF) + ? count + : BIT_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; +} + +/* Helper swap function for HUF_quickSortPartition() */ +static void HUF_swapNodes(nodeElt* a, nodeElt* b) { + nodeElt tmp = *a; + *a = *b; + *b = tmp; +} + +/* Returns 0 if the huffNode array is not sorted by descending count */ +MEM_STATIC int HUF_isSorted(nodeElt huffNode[], U32 const maxSymbolValue1) { + U32 i; + for (i = 1; i < maxSymbolValue1; ++i) { + if (huffNode[i].count > huffNode[i-1].count) { + return 0; + } + } + return 1; +} + +/* Insertion sort by descending order */ +HINT_INLINE void HUF_insertionSort(nodeElt huffNode[], int const low, int const high) { + int i; + int const size = high-low+1; + huffNode += low; + for (i = 1; i < size; ++i) { + nodeElt const key = huffNode[i]; + int j = i - 1; + while (j >= 0 && huffNode[j].count < key.count) { + huffNode[j + 1] = huffNode[j]; + j--; + } + huffNode[j + 1] = key; + } +} + +/* Pivot helper function for quicksort. */ +static int HUF_quickSortPartition(nodeElt arr[], int const low, int const high) { + /* Simply select rightmost element as pivot. "Better" selectors like + * median-of-three don't experimentally appear to have any benefit. + */ + U32 const pivot = arr[high].count; + int i = low - 1; + int j = low; + for ( ; j < high; j++) { + if (arr[j].count > pivot) { + i++; + HUF_swapNodes(&arr[i], &arr[j]); + } + } + HUF_swapNodes(&arr[i + 1], &arr[high]); + return i + 1; +} + +/* Classic quicksort by descending with partially iterative calls + * to reduce worst case callstack size. + */ +static void HUF_simpleQuickSort(nodeElt arr[], int low, int high) { + int const kInsertionSortThreshold = 8; + if (high - low < kInsertionSortThreshold) { + HUF_insertionSort(arr, low, high); + return; + } + while (low < high) { + int const idx = HUF_quickSortPartition(arr, low, high); + if (idx - low < high - idx) { + HUF_simpleQuickSort(arr, low, idx - 1); + low = idx + 1; + } else { + HUF_simpleQuickSort(arr, idx + 1, high); + high = idx - 1; + } + } +} + /** * HUF_sort(): * Sorts the symbols [0, maxSymbolValue] by count[symbol] in decreasing order. + * This is a typical bucket sorting strategy that uses either quicksort or insertion sort to sort each bucket. * * @param[out] huffNode Sorted symbols by decreasing count. Only members `.count` and `.byte` are filled. * Must have (maxSymbolValue + 1) entries. @@ -390,44 +547,52 @@ typedef struct { * @param[in] maxSymbolValue Maximum symbol value. * @param rankPosition This is a scratch workspace. Must have RANK_POSITION_TABLE_SIZE entries. */ -static void HUF_sort(nodeElt* huffNode, const unsigned* count, U32 maxSymbolValue, rankPos* rankPosition) -{ - int n; - int const maxSymbolValue1 = (int)maxSymbolValue + 1; +static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSymbolValue, rankPos rankPosition[]) { + U32 n; + U32 const maxSymbolValue1 = maxSymbolValue+1; /* Compute base and set curr to base. - * For symbol s let lowerRank = BIT_highbit32(count[n]+1) and rank = lowerRank + 1. - * Then 2^lowerRank <= count[n]+1 <= 2^rank. + * For symbol s let lowerRank = HUF_getIndex(count[n]) and rank = lowerRank + 1. + * See HUF_getIndex to see bucketing strategy. * We attribute each symbol to lowerRank's base value, because we want to know where * each rank begins in the output, so for rank R we want to count ranks R+1 and above. */ ZSTD_memset(rankPosition, 0, sizeof(*rankPosition) * RANK_POSITION_TABLE_SIZE); for (n = 0; n < maxSymbolValue1; ++n) { - U32 lowerRank = BIT_highbit32(count[n] + 1); + U32 lowerRank = HUF_getIndex(count[n]); + assert(lowerRank < RANK_POSITION_TABLE_SIZE - 1); rankPosition[lowerRank].base++; } + assert(rankPosition[RANK_POSITION_TABLE_SIZE - 1].base == 0); + /* Set up the rankPosition table */ for (n = RANK_POSITION_TABLE_SIZE - 1; n > 0; --n) { rankPosition[n-1].base += rankPosition[n].base; rankPosition[n-1].curr = rankPosition[n-1].base; } - /* Sort */ + + /* Insert each symbol into their appropriate bucket, setting up rankPosition table. */ for (n = 0; n < maxSymbolValue1; ++n) { U32 const c = count[n]; - U32 const r = BIT_highbit32(c+1) + 1; - U32 pos = rankPosition[r].curr++; - /* Insert into the correct position in the rank. - * We have at most 256 symbols, so this insertion should be fine. - */ - while ((pos > rankPosition[r].base) && (c > huffNode[pos-1].count)) { - huffNode[pos] = huffNode[pos-1]; - pos--; - } + U32 const r = HUF_getIndex(c) + 1; + U32 const pos = rankPosition[r].curr++; + assert(pos < maxSymbolValue1); huffNode[pos].count = c; huffNode[pos].byte = (BYTE)n; } -} + /* Sort each bucket. */ + for (n = RANK_POSITION_DISTINCT_COUNT_CUTOFF; n < RANK_POSITION_TABLE_SIZE - 1; ++n) { + U32 const bucketSize = rankPosition[n].curr-rankPosition[n].base; + U32 const bucketStartIdx = rankPosition[n].base; + if (bucketSize > 1) { + assert(bucketStartIdx < maxSymbolValue1); + HUF_simpleQuickSort(huffNode + bucketStartIdx, 0, bucketSize-1); + } + } + + assert(HUF_isSorted(huffNode, maxSymbolValue1)); +} /** HUF_buildCTable_wksp() : * Same as HUF_buildCTable(), but using externally allocated scratch buffer. @@ -490,6 +655,7 @@ static int HUF_buildTree(nodeElt* huffNode, U32 maxSymbolValue) */ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, int nonNullRank, U32 maxSymbolValue, U32 maxNbBits) { + HUF_CElt* const ct = CTable + 1; /* fill result into ctable (val, nbBits) */ int n; U16 nbPerRank[HUF_TABLELOG_MAX+1] = {0}; @@ -505,20 +671,20 @@ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, i min >>= 1; } } for (n=0; n<alphabetSize; n++) - CTable[huffNode[n].byte].nbBits = huffNode[n].nbBits; /* push nbBits per symbol, symbol order */ + HUF_setNbBits(ct + huffNode[n].byte, huffNode[n].nbBits); /* push nbBits per symbol, symbol order */ for (n=0; n<alphabetSize; n++) - CTable[n].val = valPerRank[CTable[n].nbBits]++; /* assign value within rank, symbol order */ + HUF_setValue(ct + n, valPerRank[HUF_getNbBits(ct[n])]++); /* assign value within rank, symbol order */ + CTable[0] = maxNbBits; } -size_t HUF_buildCTable_wksp (HUF_CElt* tree, const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize) +size_t HUF_buildCTable_wksp (HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize) { - HUF_buildCTable_wksp_tables* const wksp_tables = (HUF_buildCTable_wksp_tables*)workSpace; + HUF_buildCTable_wksp_tables* const wksp_tables = (HUF_buildCTable_wksp_tables*)HUF_alignUpWorkspace(workSpace, &wkspSize, ZSTD_ALIGNOF(U32)); nodeElt* const huffNode0 = wksp_tables->huffNodeTbl; nodeElt* const huffNode = huffNode0+1; int nonNullRank; /* safety checks */ - if (((size_t)workSpace & 3) != 0) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */ if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) return ERROR(workSpace_tooSmall); if (maxNbBits == 0) maxNbBits = HUF_TABLELOG_DEFAULT; @@ -536,96 +702,334 @@ size_t HUF_buildCTable_wksp (HUF_CElt* tree, const unsigned* count, U32 maxSymbo maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ - HUF_buildCTableFromTree(tree, huffNode, nonNullRank, maxSymbolValue, maxNbBits); + HUF_buildCTableFromTree(CTable, huffNode, nonNullRank, maxSymbolValue, maxNbBits); return maxNbBits; } size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) { + HUF_CElt const* ct = CTable + 1; size_t nbBits = 0; int s; for (s = 0; s <= (int)maxSymbolValue; ++s) { - nbBits += CTable[s].nbBits * count[s]; + nbBits += HUF_getNbBits(ct[s]) * count[s]; } return nbBits >> 3; } int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue) { + HUF_CElt const* ct = CTable + 1; int bad = 0; int s; for (s = 0; s <= (int)maxSymbolValue; ++s) { - bad |= (count[s] != 0) & (CTable[s].nbBits == 0); + bad |= (count[s] != 0) & (HUF_getNbBits(ct[s]) == 0); } return !bad; } size_t HUF_compressBound(size_t size) { return HUF_COMPRESSBOUND(size); } +/** HUF_CStream_t: + * Huffman uses its own BIT_CStream_t implementation. + * There are three major differences from BIT_CStream_t: + * 1. HUF_addBits() takes a HUF_CElt (size_t) which is + * the pair (nbBits, value) in the format: + * format: + * - Bits [0, 4) = nbBits + * - Bits [4, 64 - nbBits) = 0 + * - Bits [64 - nbBits, 64) = value + * 2. The bitContainer is built from the upper bits and + * right shifted. E.g. to add a new value of N bits + * you right shift the bitContainer by N, then or in + * the new value into the N upper bits. + * 3. The bitstream has two bit containers. You can add + * bits to the second container and merge them into + * the first container. + */ + +#define HUF_BITS_IN_CONTAINER (sizeof(size_t) * 8) + +typedef struct { + size_t bitContainer[2]; + size_t bitPos[2]; + + BYTE* startPtr; + BYTE* ptr; + BYTE* endPtr; +} HUF_CStream_t; + +/**! HUF_initCStream(): + * Initializes the bitstream. + * @returns 0 or an error code. + */ +static size_t HUF_initCStream(HUF_CStream_t* bitC, + void* startPtr, size_t dstCapacity) +{ + ZSTD_memset(bitC, 0, sizeof(*bitC)); + bitC->startPtr = (BYTE*)startPtr; + bitC->ptr = bitC->startPtr; + bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer[0]); + if (dstCapacity <= sizeof(bitC->bitContainer[0])) return ERROR(dstSize_tooSmall); + return 0; +} + +/*! HUF_addBits(): + * Adds the symbol stored in HUF_CElt elt to the bitstream. + * + * @param elt The element we're adding. This is a (nbBits, value) pair. + * See the HUF_CStream_t docs for the format. + * @param idx Insert into the bitstream at this idx. + * @param kFast This is a template parameter. If the bitstream is guaranteed + * to have at least 4 unused bits after this call it may be 1, + * otherwise it must be 0. HUF_addBits() is faster when fast is set. + */ +FORCE_INLINE_TEMPLATE void HUF_addBits(HUF_CStream_t* bitC, HUF_CElt elt, int idx, int kFast) +{ + assert(idx <= 1); + assert(HUF_getNbBits(elt) <= HUF_TABLELOG_ABSOLUTEMAX); + /* This is efficient on x86-64 with BMI2 because shrx + * only reads the low 6 bits of the register. The compiler + * knows this and elides the mask. When fast is set, + * every operation can use the same value loaded from elt. + */ + bitC->bitContainer[idx] >>= HUF_getNbBits(elt); + bitC->bitContainer[idx] |= kFast ? HUF_getValueFast(elt) : HUF_getValue(elt); + /* We only read the low 8 bits of bitC->bitPos[idx] so it + * doesn't matter that the high bits have noise from the value. + */ + bitC->bitPos[idx] += HUF_getNbBitsFast(elt); + assert((bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + /* The last 4-bits of elt are dirty if fast is set, + * so we must not be overwriting bits that have already been + * inserted into the bit container. + */ +#if DEBUGLEVEL >= 1 + { + size_t const nbBits = HUF_getNbBits(elt); + size_t const dirtyBits = nbBits == 0 ? 0 : BIT_highbit32((U32)nbBits) + 1; + (void)dirtyBits; + /* Middle bits are 0. */ + assert(((elt >> dirtyBits) << (dirtyBits + nbBits)) == 0); + /* We didn't overwrite any bits in the bit container. */ + assert(!kFast || (bitC->bitPos[idx] & 0xFF) <= HUF_BITS_IN_CONTAINER); + (void)dirtyBits; + } +#endif +} + +FORCE_INLINE_TEMPLATE void HUF_zeroIndex1(HUF_CStream_t* bitC) +{ + bitC->bitContainer[1] = 0; + bitC->bitPos[1] = 0; +} + +/*! HUF_mergeIndex1() : + * Merges the bit container @ index 1 into the bit container @ index 0 + * and zeros the bit container @ index 1. + */ +FORCE_INLINE_TEMPLATE void HUF_mergeIndex1(HUF_CStream_t* bitC) +{ + assert((bitC->bitPos[1] & 0xFF) < HUF_BITS_IN_CONTAINER); + bitC->bitContainer[0] >>= (bitC->bitPos[1] & 0xFF); + bitC->bitContainer[0] |= bitC->bitContainer[1]; + bitC->bitPos[0] += bitC->bitPos[1]; + assert((bitC->bitPos[0] & 0xFF) <= HUF_BITS_IN_CONTAINER); +} + +/*! HUF_flushBits() : +* Flushes the bits in the bit container @ index 0. +* +* @post bitPos will be < 8. +* @param kFast If kFast is set then we must know a-priori that +* the bit container will not overflow. +*/ +FORCE_INLINE_TEMPLATE void HUF_flushBits(HUF_CStream_t* bitC, int kFast) +{ + /* The upper bits of bitPos are noisy, so we must mask by 0xFF. */ + size_t const nbBits = bitC->bitPos[0] & 0xFF; + size_t const nbBytes = nbBits >> 3; + /* The top nbBits bits of bitContainer are the ones we need. */ + size_t const bitContainer = bitC->bitContainer[0] >> (HUF_BITS_IN_CONTAINER - nbBits); + /* Mask bitPos to account for the bytes we consumed. */ + bitC->bitPos[0] &= 7; + assert(nbBits > 0); + assert(nbBits <= sizeof(bitC->bitContainer[0]) * 8); + assert(bitC->ptr <= bitC->endPtr); + MEM_writeLEST(bitC->ptr, bitContainer); + bitC->ptr += nbBytes; + assert(!kFast || bitC->ptr <= bitC->endPtr); + if (!kFast && bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr; + /* bitContainer doesn't need to be modified because the leftover + * bits are already the top bitPos bits. And we don't care about + * noise in the lower values. + */ +} + +/*! HUF_endMark() + * @returns The Huffman stream end mark: A 1-bit value = 1. + */ +static HUF_CElt HUF_endMark(void) +{ + HUF_CElt endMark; + HUF_setNbBits(&endMark, 1); + HUF_setValue(&endMark, 1); + return endMark; +} + +/*! HUF_closeCStream() : + * @return Size of CStream, in bytes, + * or 0 if it could not fit into dstBuffer */ +static size_t HUF_closeCStream(HUF_CStream_t* bitC) +{ + HUF_addBits(bitC, HUF_endMark(), /* idx */ 0, /* kFast */ 0); + HUF_flushBits(bitC, /* kFast */ 0); + { + size_t const nbBits = bitC->bitPos[0] & 0xFF; + if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ + return (bitC->ptr - bitC->startPtr) + (nbBits > 0); + } +} + FORCE_INLINE_TEMPLATE void -HUF_encodeSymbol(BIT_CStream_t* bitCPtr, U32 symbol, const HUF_CElt* CTable) +HUF_encodeSymbol(HUF_CStream_t* bitCPtr, U32 symbol, const HUF_CElt* CTable, int idx, int fast) { - BIT_addBitsFast(bitCPtr, CTable[symbol].val, CTable[symbol].nbBits); + HUF_addBits(bitCPtr, CTable[symbol], idx, fast); } -#define HUF_FLUSHBITS(s) BIT_flushBits(s) +FORCE_INLINE_TEMPLATE void +HUF_compress1X_usingCTable_internal_body_loop(HUF_CStream_t* bitC, + const BYTE* ip, size_t srcSize, + const HUF_CElt* ct, + int kUnroll, int kFastFlush, int kLastFast) +{ + /* Join to kUnroll */ + int n = (int)srcSize; + int rem = n % kUnroll; + if (rem > 0) { + for (; rem > 0; --rem) { + HUF_encodeSymbol(bitC, ip[--n], ct, 0, /* fast */ 0); + } + HUF_flushBits(bitC, kFastFlush); + } + assert(n % kUnroll == 0); + + /* Join to 2 * kUnroll */ + if (n % (2 * kUnroll)) { + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, 0, 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, 0, kLastFast); + HUF_flushBits(bitC, kFastFlush); + n -= kUnroll; + } + assert(n % (2 * kUnroll) == 0); + + for (; n>0; n-= 2 * kUnroll) { + /* Encode kUnroll symbols into the bitstream @ index 0. */ + int u; + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - u], ct, /* idx */ 0, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll], ct, /* idx */ 0, /* fast */ kLastFast); + HUF_flushBits(bitC, kFastFlush); + /* Encode kUnroll symbols into the bitstream @ index 1. + * This allows us to start filling the bit container + * without any data dependencies. + */ + HUF_zeroIndex1(bitC); + for (u = 1; u < kUnroll; ++u) { + HUF_encodeSymbol(bitC, ip[n - kUnroll - u], ct, /* idx */ 1, /* fast */ 1); + } + HUF_encodeSymbol(bitC, ip[n - kUnroll - kUnroll], ct, /* idx */ 1, /* fast */ kLastFast); + /* Merge bitstream @ index 1 into the bitstream @ index 0 */ + HUF_mergeIndex1(bitC); + HUF_flushBits(bitC, kFastFlush); + } + assert(n == 0); + +} -#define HUF_FLUSHBITS_1(stream) \ - if (sizeof((stream)->bitContainer)*8 < HUF_TABLELOG_MAX*2+7) HUF_FLUSHBITS(stream) +/** + * Returns a tight upper bound on the output space needed by Huffman + * with 8 bytes buffer to handle over-writes. If the output is at least + * this large we don't need to do bounds checks during Huffman encoding. + */ +static size_t HUF_tightCompressBound(size_t srcSize, size_t tableLog) +{ + return ((srcSize * tableLog) >> 3) + 8; +} -#define HUF_FLUSHBITS_2(stream) \ - if (sizeof((stream)->bitContainer)*8 < HUF_TABLELOG_MAX*4+7) HUF_FLUSHBITS(stream) FORCE_INLINE_TEMPLATE size_t HUF_compress1X_usingCTable_internal_body(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) { + U32 const tableLog = (U32)CTable[0]; + HUF_CElt const* ct = CTable + 1; const BYTE* ip = (const BYTE*) src; BYTE* const ostart = (BYTE*)dst; BYTE* const oend = ostart + dstSize; BYTE* op = ostart; - size_t n; - BIT_CStream_t bitC; + HUF_CStream_t bitC; /* init */ if (dstSize < 8) return 0; /* not enough space to compress */ - { size_t const initErr = BIT_initCStream(&bitC, op, (size_t)(oend-op)); + { size_t const initErr = HUF_initCStream(&bitC, op, (size_t)(oend-op)); if (HUF_isError(initErr)) return 0; } - n = srcSize & ~3; /* join to mod 4 */ - switch (srcSize & 3) - { - case 3 : HUF_encodeSymbol(&bitC, ip[n+ 2], CTable); - HUF_FLUSHBITS_2(&bitC); - /* fall-through */ - case 2 : HUF_encodeSymbol(&bitC, ip[n+ 1], CTable); - HUF_FLUSHBITS_1(&bitC); - /* fall-through */ - case 1 : HUF_encodeSymbol(&bitC, ip[n+ 0], CTable); - HUF_FLUSHBITS(&bitC); - /* fall-through */ - case 0 : /* fall-through */ - default: break; - } - - for (; n>0; n-=4) { /* note : n&3==0 at this stage */ - HUF_encodeSymbol(&bitC, ip[n- 1], CTable); - HUF_FLUSHBITS_1(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 2], CTable); - HUF_FLUSHBITS_2(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 3], CTable); - HUF_FLUSHBITS_1(&bitC); - HUF_encodeSymbol(&bitC, ip[n- 4], CTable); - HUF_FLUSHBITS(&bitC); + if (dstSize < HUF_tightCompressBound(srcSize, (size_t)tableLog) || tableLog > 11) + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ MEM_32bits() ? 2 : 4, /* kFast */ 0, /* kLastFast */ 0); + else { + if (MEM_32bits()) { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: ZSTD_FALLTHROUGH; + case 9: ZSTD_FALLTHROUGH; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 2, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 7: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 3, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } else { + switch (tableLog) { + case 11: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 10: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 5, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + case 9: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 6, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 8: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 7, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 7: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 8, /* kFastFlush */ 1, /* kLastFast */ 0); + break; + case 6: ZSTD_FALLTHROUGH; + default: + HUF_compress1X_usingCTable_internal_body_loop(&bitC, ip, srcSize, ct, /* kUnroll */ 9, /* kFastFlush */ 1, /* kLastFast */ 1); + break; + } + } } + assert(bitC.ptr <= bitC.endPtr); - return BIT_closeCStream(&bitC); + return HUF_closeCStream(&bitC); } #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t HUF_compress1X_usingCTable_internal_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) @@ -667,9 +1071,13 @@ HUF_compress1X_usingCTable_internal(void* dst, size_t dstSize, size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) { - return HUF_compress1X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); + return HUF_compress1X_usingCTable_bmi2(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); } +size_t HUF_compress1X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2) +{ + return HUF_compress1X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, bmi2); +} static size_t HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, @@ -689,8 +1097,7 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, assert(op <= oend); { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart, (U16)cSize); op += cSize; } @@ -698,8 +1105,7 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, ip += segmentSize; assert(op <= oend); { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart+2, (U16)cSize); op += cSize; } @@ -707,8 +1113,7 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, ip += segmentSize; assert(op <= oend); { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, segmentSize, CTable, bmi2) ); - if (cSize==0) return 0; - assert(cSize <= 65535); + if (cSize == 0 || cSize > 65535) return 0; MEM_writeLE16(ostart+4, (U16)cSize); op += cSize; } @@ -717,7 +1122,7 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, assert(op <= oend); assert(ip <= iend); { CHECK_V_F(cSize, HUF_compress1X_usingCTable_internal(op, (size_t)(oend-op), ip, (size_t)(iend-ip), CTable, bmi2) ); - if (cSize==0) return 0; + if (cSize == 0 || cSize > 65535) return 0; op += cSize; } @@ -726,7 +1131,12 @@ HUF_compress4X_usingCTable_internal(void* dst, size_t dstSize, size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable) { - return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); + return HUF_compress4X_usingCTable_bmi2(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0); +} + +size_t HUF_compress4X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2) +{ + return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, bmi2); } typedef enum { HUF_singleStream, HUF_fourStreams } HUF_nbStreams_e; @@ -750,35 +1160,38 @@ static size_t HUF_compressCTable_internal( typedef struct { unsigned count[HUF_SYMBOLVALUE_MAX + 1]; - HUF_CElt CTable[HUF_SYMBOLVALUE_MAX + 1]; + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(HUF_SYMBOLVALUE_MAX)]; union { HUF_buildCTable_wksp_tables buildCTable_wksp; HUF_WriteCTableWksp writeCTable_wksp; + U32 hist_wksp[HIST_WKSP_SIZE_U32]; } wksps; } HUF_compress_tables_t; +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE 4096 +#define SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO 10 /* Must be >= 2 */ + /* HUF_compress_internal() : * `workSpace_align4` must be aligned on 4-bytes boundaries, - * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U32 unsigned */ + * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U64 unsigned */ static size_t HUF_compress_internal (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, HUF_nbStreams_e nbStreams, - void* workSpace_align4, size_t wkspSize, + void* workSpace, size_t wkspSize, HUF_CElt* oldHufTable, HUF_repeat* repeat, int preferRepeat, - const int bmi2) + const int bmi2, unsigned suspectUncompressible) { - HUF_compress_tables_t* const table = (HUF_compress_tables_t*)workSpace_align4; + HUF_compress_tables_t* const table = (HUF_compress_tables_t*)HUF_alignUpWorkspace(workSpace, &wkspSize, ZSTD_ALIGNOF(size_t)); BYTE* const ostart = (BYTE*)dst; BYTE* const oend = ostart + dstSize; BYTE* op = ostart; - HUF_STATIC_ASSERT(sizeof(*table) <= HUF_WORKSPACE_SIZE); - assert(((size_t)workSpace_align4 & 3) == 0); /* must be aligned on 4-bytes boundaries */ + HUF_STATIC_ASSERT(sizeof(*table) + HUF_WORKSPACE_MAX_ALIGNMENT <= HUF_WORKSPACE_SIZE); /* checks & inits */ - if (wkspSize < HUF_WORKSPACE_SIZE) return ERROR(workSpace_tooSmall); + if (wkspSize < sizeof(*table)) return ERROR(workSpace_tooSmall); if (!srcSize) return 0; /* Uncompressed */ if (!dstSize) return 0; /* cannot fit anything within dst budget */ if (srcSize > HUF_BLOCKSIZE_MAX) return ERROR(srcSize_wrong); /* current block size limit */ @@ -794,8 +1207,23 @@ HUF_compress_internal (void* dst, size_t dstSize, nbStreams, oldHufTable, bmi2); } + /* If uncompressible data is suspected, do a smaller sampling first */ + DEBUG_STATIC_ASSERT(SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO >= 2); + if (suspectUncompressible && srcSize >= (SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE * SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO)) { + size_t largestTotal = 0; + { unsigned maxSymbolValueBegin = maxSymbolValue; + CHECK_V_F(largestBegin, HIST_count_simple (table->count, &maxSymbolValueBegin, (const BYTE*)src, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestBegin; + } + { unsigned maxSymbolValueEnd = maxSymbolValue; + CHECK_V_F(largestEnd, HIST_count_simple (table->count, &maxSymbolValueEnd, (const BYTE*)src + srcSize - SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); + largestTotal += largestEnd; + } + if (largestTotal <= ((2 * SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) >> 7)+4) return 0; /* heuristic : probably not compressible enough */ + } + /* Scan input and build symbol stats */ - { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, workSpace_align4, wkspSize) ); + { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, table->wksps.hist_wksp, sizeof(table->wksps.hist_wksp)) ); if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */ if (largest <= (srcSize >> 7)+4) return 0; /* heuristic : probably not compressible enough */ } @@ -820,9 +1248,12 @@ HUF_compress_internal (void* dst, size_t dstSize, &table->wksps.buildCTable_wksp, sizeof(table->wksps.buildCTable_wksp)); CHECK_F(maxBits); huffLog = (U32)maxBits; - /* Zero unused symbols in CTable, so we can check it for validity */ - ZSTD_memset(table->CTable + (maxSymbolValue + 1), 0, - sizeof(table->CTable) - ((maxSymbolValue + 1) * sizeof(HUF_CElt))); + } + /* Zero unused symbols in CTable, so we can check it for validity */ + { + size_t const ctableSize = HUF_CTABLE_SIZE_ST(maxSymbolValue); + size_t const unusedSize = sizeof(table->CTable) - ctableSize * sizeof(HUF_CElt); + ZSTD_memset(table->CTable + ctableSize, 0, unusedSize); } /* Write table description header */ @@ -859,19 +1290,20 @@ size_t HUF_compress1X_wksp (void* dst, size_t dstSize, return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_singleStream, workSpace, wkspSize, - NULL, NULL, 0, 0 /*bmi2*/); + NULL, NULL, 0, 0 /*bmi2*/, 0); } size_t HUF_compress1X_repeat (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void* workSpace, size_t wkspSize, - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2) + HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, + int bmi2, unsigned suspectUncompressible) { return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_singleStream, workSpace, wkspSize, hufTable, - repeat, preferRepeat, bmi2); + repeat, preferRepeat, bmi2, suspectUncompressible); } /* HUF_compress4X_repeat(): @@ -885,22 +1317,23 @@ size_t HUF_compress4X_wksp (void* dst, size_t dstSize, return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_fourStreams, workSpace, wkspSize, - NULL, NULL, 0, 0 /*bmi2*/); + NULL, NULL, 0, 0 /*bmi2*/, 0); } /* HUF_compress4X_repeat(): * compress input using 4 streams. + * consider skipping quickly * re-use an existing huffman compression table */ size_t HUF_compress4X_repeat (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog, void* workSpace, size_t wkspSize, - HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2) + HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible) { return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_fourStreams, workSpace, wkspSize, - hufTable, repeat, preferRepeat, bmi2); + hufTable, repeat, preferRepeat, bmi2, suspectUncompressible); } #ifndef ZSTD_NO_UNUSED_FUNCTIONS @@ -918,7 +1351,7 @@ size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog) { - unsigned workSpace[HUF_WORKSPACE_SIZE_U32]; + U64 workSpace[HUF_WORKSPACE_SIZE_U64]; return HUF_compress1X_wksp(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, workSpace, sizeof(workSpace)); } @@ -926,7 +1359,7 @@ size_t HUF_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned huffLog) { - unsigned workSpace[HUF_WORKSPACE_SIZE_U32]; + U64 workSpace[HUF_WORKSPACE_SIZE_U64]; return HUF_compress4X_wksp(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, workSpace, sizeof(workSpace)); } diff --git a/thirdparty/zstd/compress/zstd_compress.c b/thirdparty/zstd/compress/zstd_compress.c index b7ee2980a7..f06456af92 100644 --- a/thirdparty/zstd/compress/zstd_compress.c +++ b/thirdparty/zstd/compress/zstd_compress.c @@ -12,7 +12,6 @@ * Dependencies ***************************************/ #include "../common/zstd_deps.h" /* INT_MAX, ZSTD_memset, ZSTD_memcpy */ -#include "../common/cpu.h" #include "../common/mem.h" #include "hist.h" /* HIST_countFast_wksp */ #define FSE_STATIC_LINKING_ONLY /* FSE_encodeSymbol */ @@ -42,6 +41,18 @@ # define ZSTD_COMPRESS_HEAPMODE 0 #endif +/*! + * ZSTD_HASHLOG3_MAX : + * Maximum size of the hash table dedicated to find 3-bytes matches, + * in log format, aka 17 => 1 << 17 == 128Ki positions. + * This structure is only used in zstd_opt. + * Since allocation is centralized for all strategies, it has to be known here. + * The actual (selected) size of the hash table is then stored in ZSTD_matchState_t.hashLog3, + * so that zstd_opt.c doesn't need to know about this constant. + */ +#ifndef ZSTD_HASHLOG3_MAX +# define ZSTD_HASHLOG3_MAX 17 +#endif /*-************************************* * Helper functions @@ -72,10 +83,10 @@ struct ZSTD_CDict_s { ZSTD_customMem customMem; U32 dictID; int compressionLevel; /* 0 indicates that advanced API was used to select CDict params */ - ZSTD_useRowMatchFinderMode_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use - * row-based matchfinder. Unless the cdict is reloaded, we will use - * the same greedy/lazy matchfinder at compression time. - */ + ZSTD_paramSwitch_e useRowMatchFinder; /* Indicates whether the CDict was created with params that would use + * row-based matchfinder. Unless the cdict is reloaded, we will use + * the same greedy/lazy matchfinder at compression time. + */ }; /* typedef'd to ZSTD_CDict within "zstd.h" */ ZSTD_CCtx* ZSTD_createCCtx(void) @@ -88,7 +99,7 @@ static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager) assert(cctx != NULL); ZSTD_memset(cctx, 0, sizeof(*cctx)); cctx->customMem = memManager; - cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()); + cctx->bmi2 = ZSTD_cpuSupportsBmi2(); { size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters); assert(!ZSTD_isError(err)); (void)err; @@ -214,35 +225,42 @@ static int ZSTD_rowMatchFinderSupported(const ZSTD_strategy strategy) { /* Returns true if the strategy and useRowMatchFinder mode indicate that we will use the row based matchfinder * for this compression. */ -static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_useRowMatchFinderMode_e mode) { - assert(mode != ZSTD_urm_auto); - return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_urm_enableRowMatchFinder); +static int ZSTD_rowMatchFinderUsed(const ZSTD_strategy strategy, const ZSTD_paramSwitch_e mode) { + assert(mode != ZSTD_ps_auto); + return ZSTD_rowMatchFinderSupported(strategy) && (mode == ZSTD_ps_enable); } -/* Returns row matchfinder usage enum given an initial mode and cParams */ -static ZSTD_useRowMatchFinderMode_e ZSTD_resolveRowMatchFinderMode(ZSTD_useRowMatchFinderMode_e mode, - const ZSTD_compressionParameters* const cParams) { -#if !defined(ZSTD_NO_INTRINSICS) && (defined(__SSE2__) || defined(__ARM_NEON)) +/* Returns row matchfinder usage given an initial mode and cParams */ +static ZSTD_paramSwitch_e ZSTD_resolveRowMatchFinderMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { +#if defined(ZSTD_ARCH_X86_SSE2) || defined(ZSTD_ARCH_ARM_NEON) int const kHasSIMD128 = 1; #else int const kHasSIMD128 = 0; #endif - if (mode != ZSTD_urm_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */ - mode = ZSTD_urm_disableRowMatchFinder; + if (mode != ZSTD_ps_auto) return mode; /* if requested enabled, but no SIMD, we still will use row matchfinder */ + mode = ZSTD_ps_disable; if (!ZSTD_rowMatchFinderSupported(cParams->strategy)) return mode; if (kHasSIMD128) { - if (cParams->windowLog > 14) mode = ZSTD_urm_enableRowMatchFinder; + if (cParams->windowLog > 14) mode = ZSTD_ps_enable; } else { - if (cParams->windowLog > 17) mode = ZSTD_urm_enableRowMatchFinder; + if (cParams->windowLog > 17) mode = ZSTD_ps_enable; } return mode; } +/* Returns block splitter usage (generally speaking, when using slower/stronger compression modes) */ +static ZSTD_paramSwitch_e ZSTD_resolveBlockSplitterMode(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17) ? ZSTD_ps_enable : ZSTD_ps_disable; +} + /* Returns 1 if the arguments indicate that we should allocate a chainTable, 0 otherwise */ static int ZSTD_allocateChainTable(const ZSTD_strategy strategy, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const U32 forDDSDict) { - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); /* We always should allocate a chaintable if we are allocating a matchstate for a DDS dictionary matchstate. * We do not allocate a chaintable if we are using ZSTD_fast, or are using the row-based matchfinder. */ @@ -253,16 +271,10 @@ static int ZSTD_allocateChainTable(const ZSTD_strategy strategy, * enable long distance matching (wlog >= 27, strategy >= btopt). * Returns 0 otherwise. */ -static U32 ZSTD_CParams_shouldEnableLdm(const ZSTD_compressionParameters* const cParams) { - return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27; -} - -/* Returns 1 if compression parameters are such that we should - * enable blockSplitter (wlog >= 17, strategy >= btopt). - * Returns 0 otherwise. - */ -static U32 ZSTD_CParams_useBlockSplitter(const ZSTD_compressionParameters* const cParams) { - return cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 17; +static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode, + const ZSTD_compressionParameters* const cParams) { + if (mode != ZSTD_ps_auto) return mode; + return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable; } static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( @@ -274,20 +286,13 @@ static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( cctxParams.cParams = cParams; /* Adjust advanced params according to cParams */ - if (ZSTD_CParams_shouldEnableLdm(&cParams)) { - DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including LDM into cctx params"); - cctxParams.ldmParams.enableLdm = 1; - /* LDM is enabled by default for optimal parser and window size >= 128MB */ + cctxParams.ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams.ldmParams.enableLdm, &cParams); + if (cctxParams.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_ldm_adjustParameters(&cctxParams.ldmParams, &cParams); assert(cctxParams.ldmParams.hashLog >= cctxParams.ldmParams.bucketSizeLog); assert(cctxParams.ldmParams.hashRateLog < 32); } - - if (ZSTD_CParams_useBlockSplitter(&cParams)) { - DEBUGLOG(4, "ZSTD_makeCCtxParamsFromCParams(): Including block splitting into cctx params"); - cctxParams.splitBlocks = 1; - } - + cctxParams.useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams.useBlockSplitter, &cParams); cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams); assert(!ZSTD_checkCParams(cParams)); return cctxParams; @@ -348,7 +353,10 @@ static void ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, ZSTD_par */ cctxParams->compressionLevel = compressionLevel; cctxParams->useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams->useRowMatchFinder, ¶ms->cParams); - DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d", cctxParams->useRowMatchFinder); + cctxParams->useBlockSplitter = ZSTD_resolveBlockSplitterMode(cctxParams->useBlockSplitter, ¶ms->cParams); + cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, ¶ms->cParams); + DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d, useBlockSplitter=%d ldm=%d", + cctxParams->useRowMatchFinder, cctxParams->useBlockSplitter, cctxParams->ldmParams.enableLdm); } size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params) @@ -518,9 +526,9 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) return bounds; case ZSTD_c_literalCompressionMode: - ZSTD_STATIC_ASSERT(ZSTD_lcm_auto < ZSTD_lcm_huffman && ZSTD_lcm_huffman < ZSTD_lcm_uncompressed); - bounds.lowerBound = ZSTD_lcm_auto; - bounds.upperBound = ZSTD_lcm_uncompressed; + ZSTD_STATIC_ASSERT(ZSTD_ps_auto < ZSTD_ps_enable && ZSTD_ps_enable < ZSTD_ps_disable); + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_targetCBlockSize: @@ -549,14 +557,14 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = 1; return bounds; - case ZSTD_c_splitBlocks: - bounds.lowerBound = 0; - bounds.upperBound = 1; + case ZSTD_c_useBlockSplitter: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_useRowMatchFinder: - bounds.lowerBound = (int)ZSTD_urm_auto; - bounds.upperBound = (int)ZSTD_urm_enableRowMatchFinder; + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; return bounds; case ZSTD_c_deterministicRefPrefix: @@ -625,7 +633,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_stableOutBuffer: case ZSTD_c_blockDelimiters: case ZSTD_c_validateSequences: - case ZSTD_c_splitBlocks: + case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: default: @@ -680,7 +688,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_stableOutBuffer: case ZSTD_c_blockDelimiters: case ZSTD_c_validateSequences: - case ZSTD_c_splitBlocks: + case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: break; @@ -780,7 +788,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, } case ZSTD_c_literalCompressionMode : { - const ZSTD_literalCompressionMode_e lcm = (ZSTD_literalCompressionMode_e)value; + const ZSTD_paramSwitch_e lcm = (ZSTD_paramSwitch_e)value; BOUNDCHECK(ZSTD_c_literalCompressionMode, lcm); CCtxParams->literalCompressionMode = lcm; return CCtxParams->literalCompressionMode; @@ -835,7 +843,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, return CCtxParams->enableDedicatedDictSearch; case ZSTD_c_enableLongDistanceMatching : - CCtxParams->ldmParams.enableLdm = (value!=0); + CCtxParams->ldmParams.enableLdm = (ZSTD_paramSwitch_e)value; return CCtxParams->ldmParams.enableLdm; case ZSTD_c_ldmHashLog : @@ -857,8 +865,8 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, return CCtxParams->ldmParams.bucketSizeLog; case ZSTD_c_ldmHashRateLog : - RETURN_ERROR_IF(value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN, - parameter_outOfBound, "Param out of bounds!"); + if (value!=0) /* 0 ==> default */ + BOUNDCHECK(ZSTD_c_ldmHashRateLog, value); CCtxParams->ldmParams.hashRateLog = value; return CCtxParams->ldmParams.hashRateLog; @@ -894,14 +902,14 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->validateSequences = value; return CCtxParams->validateSequences; - case ZSTD_c_splitBlocks: - BOUNDCHECK(ZSTD_c_splitBlocks, value); - CCtxParams->splitBlocks = value; - return CCtxParams->splitBlocks; + case ZSTD_c_useBlockSplitter: + BOUNDCHECK(ZSTD_c_useBlockSplitter, value); + CCtxParams->useBlockSplitter = (ZSTD_paramSwitch_e)value; + return CCtxParams->useBlockSplitter; case ZSTD_c_useRowMatchFinder: BOUNDCHECK(ZSTD_c_useRowMatchFinder, value); - CCtxParams->useRowMatchFinder = (ZSTD_useRowMatchFinderMode_e)value; + CCtxParams->useRowMatchFinder = (ZSTD_paramSwitch_e)value; return CCtxParams->useRowMatchFinder; case ZSTD_c_deterministicRefPrefix: @@ -1032,8 +1040,8 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_validateSequences : *value = (int)CCtxParams->validateSequences; break; - case ZSTD_c_splitBlocks : - *value = (int)CCtxParams->splitBlocks; + case ZSTD_c_useBlockSplitter : + *value = (int)CCtxParams->useBlockSplitter; break; case ZSTD_c_useRowMatchFinder : *value = (int)CCtxParams->useRowMatchFinder; @@ -1067,7 +1075,7 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams( return 0; } -ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize) +size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize) { DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %u bytes", (U32)pledgedSrcSize); RETURN_ERROR_IF(cctx->streamStage != zcss_init, stage_wrong, @@ -1147,14 +1155,14 @@ size_t ZSTD_CCtx_loadDictionary_advanced( return 0; } -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference( +size_t ZSTD_CCtx_loadDictionary_byReference( ZSTD_CCtx* cctx, const void* dict, size_t dictSize) { return ZSTD_CCtx_loadDictionary_advanced( cctx, dict, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto); } -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize) +size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize) { return ZSTD_CCtx_loadDictionary_advanced( cctx, dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto); @@ -1324,7 +1332,7 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, break; case ZSTD_cpm_createCDict: /* Assume a small source size when creating a dictionary - * with an unkown source size. + * with an unknown source size. */ if (dictSize && srcSize == ZSTD_CONTENTSIZE_UNKNOWN) srcSize = minSrcSize; @@ -1398,7 +1406,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( srcSizeHint = CCtxParams->srcSizeHint; } cParams = ZSTD_getCParams_internal(CCtxParams->compressionLevel, srcSizeHint, dictSize, mode); - if (CCtxParams->ldmParams.enableLdm) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG; + if (CCtxParams->ldmParams.enableLdm == ZSTD_ps_enable) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG; ZSTD_overrideCParams(&cParams, &CCtxParams->cParams); assert(!ZSTD_checkCParams(cParams)); /* srcSizeHint == 0 means 0 */ @@ -1407,7 +1415,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams( static size_t ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const U32 enableDedicatedDictSearch, const U32 forCCtx) { @@ -1440,7 +1448,7 @@ ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, /* tables are guaranteed to be sized in multiples of 64 bytes (or 16 uint32_t) */ ZSTD_STATIC_ASSERT(ZSTD_HASHLOG_MIN >= 4 && ZSTD_WINDOWLOG_MIN >= 4 && ZSTD_CHAINLOG_MIN >= 4); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u", (U32)chainSize, (U32)hSize, (U32)h3Size); @@ -1451,12 +1459,12 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( const ZSTD_compressionParameters* cParams, const ldmParams_t* ldmParams, const int isStatic, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const size_t buffInSize, const size_t buffOutSize, const U64 pledgedSrcSize) { - size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << cParams->windowLog), pledgedSrcSize)); + size_t const windowSize = (size_t) BOUNDED(1ULL, 1ULL << cParams->windowLog, pledgedSrcSize); size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); U32 const divider = (cParams->minMatch==3) ? 3 : 4; size_t const maxNbSeq = blockSize / divider; @@ -1469,7 +1477,7 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( size_t const ldmSpace = ZSTD_ldm_getTableSize(*ldmParams); size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(*ldmParams, blockSize); - size_t const ldmSeqSpace = ldmParams->enableLdm ? + size_t const ldmSeqSpace = ldmParams->enableLdm == ZSTD_ps_enable ? ZSTD_cwksp_aligned_alloc_size(maxNbLdmSeq * sizeof(rawSeq)) : 0; @@ -1496,8 +1504,8 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params) { ZSTD_compressionParameters const cParams = ZSTD_getCParamsFromCCtxParams(params, ZSTD_CONTENTSIZE_UNKNOWN, 0, ZSTD_cpm_noAttachDict); - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, - &cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, + &cParams); RETURN_ERROR_IF(params->nbWorkers > 0, GENERIC, "Estimate CCtx size is supported for single-threaded compression only."); /* estimateCCtxSize is for one-shot compression. So no buffers should @@ -1514,9 +1522,9 @@ size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ size_t noRowCCtxSize; size_t rowCCtxSize; - initialParams.useRowMatchFinder = ZSTD_urm_disableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_disable; noRowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); - initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_enable; rowCCtxSize = ZSTD_estimateCCtxSize_usingCCtxParams(&initialParams); return MAX(noRowCCtxSize, rowCCtxSize); } else { @@ -1561,7 +1569,7 @@ size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params) size_t const outBuffSize = (params->outBufferMode == ZSTD_bm_buffered) ? ZSTD_compressBound(blockSize) + 1 : 0; - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params->useRowMatchFinder, ¶ms->cParams); return ZSTD_estimateCCtxSize_usingCCtxParams_internal( &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, inBuffSize, outBuffSize, @@ -1576,9 +1584,9 @@ size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams) /* Pick bigger of not using and using row-based matchfinder for greedy and lazy strategies */ size_t noRowCCtxSize; size_t rowCCtxSize; - initialParams.useRowMatchFinder = ZSTD_urm_disableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_disable; noRowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); - initialParams.useRowMatchFinder = ZSTD_urm_enableRowMatchFinder; + initialParams.useRowMatchFinder = ZSTD_ps_enable; rowCCtxSize = ZSTD_estimateCStreamSize_usingCCtxParams(&initialParams); return MAX(noRowCCtxSize, rowCCtxSize); } else { @@ -1713,7 +1721,7 @@ static size_t ZSTD_reset_matchState(ZSTD_matchState_t* ms, ZSTD_cwksp* ws, const ZSTD_compressionParameters* cParams, - const ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + const ZSTD_paramSwitch_e useRowMatchFinder, const ZSTD_compResetPolicy_e crp, const ZSTD_indexResetPolicy_e forceResetIndex, const ZSTD_resetTarget_e forWho) @@ -1728,7 +1736,7 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, size_t const h3Size = hashLog3 ? ((size_t)1) << hashLog3 : 0; DEBUGLOG(4, "reset indices : %u", forceResetIndex == ZSTDirp_reset); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); if (forceResetIndex == ZSTDirp_reset) { ZSTD_window_init(&ms->window); ZSTD_cwksp_mark_tables_dirty(ws); @@ -1774,8 +1782,8 @@ ZSTD_reset_matchState(ZSTD_matchState_t* ms, if (ms->tagTable) ZSTD_memset(ms->tagTable, 0, tagTableSize); } { /* Switch to 32-entry rows if searchLog is 5 (or more) */ - U32 const rowLog = cParams->searchLog < 5 ? 4 : 5; - assert(cParams->hashLog > rowLog); + U32 const rowLog = BOUNDED(4, cParams->searchLog, 6); + assert(cParams->hashLog >= rowLog); ms->rowHashLog = cParams->hashLog - rowLog; } } @@ -1824,8 +1832,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_buffered_policy_e const zbuff) { ZSTD_cwksp* const ws = &zc->workspace; - DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d", - (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder); + DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u, useRowMatchFinder=%d useBlockSplitter=%d", + (U32)pledgedSrcSize, params->cParams.windowLog, (int)params->useRowMatchFinder, (int)params->useBlockSplitter); assert(!ZSTD_isError(ZSTD_checkCParams(params->cParams))); zc->isFirstBlock = 1; @@ -1836,8 +1844,10 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->appliedParams = *params; params = &zc->appliedParams; - assert(params->useRowMatchFinder != ZSTD_urm_auto); - if (params->ldmParams.enableLdm) { + assert(params->useRowMatchFinder != ZSTD_ps_auto); + assert(params->useBlockSplitter != ZSTD_ps_auto); + assert(params->ldmParams.enableLdm != ZSTD_ps_auto); + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* Adjust long distance matching parameters */ ZSTD_ldm_adjustParameters(&zc->appliedParams.ldmParams, ¶ms->cParams); assert(params->ldmParams.hashLog >= params->ldmParams.bucketSizeLog); @@ -1900,7 +1910,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->blockState.nextCBlock = (ZSTD_compressedBlockState_t*) ZSTD_cwksp_reserve_object(ws, sizeof(ZSTD_compressedBlockState_t)); RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate nextCBlock"); zc->entropyWorkspace = (U32*) ZSTD_cwksp_reserve_object(ws, ENTROPY_WORKSPACE_SIZE); - RETURN_ERROR_IF(zc->blockState.nextCBlock == NULL, memory_allocation, "couldn't allocate entropyWorkspace"); + RETURN_ERROR_IF(zc->entropyWorkspace == NULL, memory_allocation, "couldn't allocate entropyWorkspace"); } } ZSTD_cwksp_clear(ws); @@ -1937,7 +1947,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->outBuff = (char*)ZSTD_cwksp_reserve_buffer(ws, buffOutSize); /* ldm bucketOffsets table */ - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* TODO: avoid memset? */ size_t const numBuckets = ((size_t)1) << (params->ldmParams.hashLog - @@ -1964,7 +1974,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_resetTarget_CCtx), ""); /* ldm hash table */ - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* TODO: avoid memset? */ size_t const ldmHSize = ((size_t)1) << params->ldmParams.hashLog; zc->ldmState.hashTable = (ldmEntry_t*)ZSTD_cwksp_reserve_aligned(ws, ldmHSize * sizeof(ldmEntry_t)); @@ -1976,8 +1986,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, zc->ldmState.loadedDictEnd = 0; } - assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace)); DEBUGLOG(3, "wksp: finished allocating, %zd bytes remain available", ZSTD_cwksp_available_space(ws)); + assert(ZSTD_cwksp_estimated_space_within_bounds(ws, neededSpace, resizeWorkspace)); zc->initialized = 1; @@ -2115,7 +2125,7 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, } ZSTD_cwksp_mark_tables_dirty(&cctx->workspace); - assert(params.useRowMatchFinder != ZSTD_urm_auto); + assert(params.useRowMatchFinder != ZSTD_ps_auto); /* copy tables */ { size_t const chainSize = ZSTD_allocateChainTable(cdict_cParams->strategy, cdict->useRowMatchFinder, 0 /* DDS guaranteed disabled */) @@ -2209,8 +2219,12 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, { ZSTD_CCtx_params params = dstCCtx->requestedParams; /* Copy only compression parameters related to tables. */ params.cParams = srcCCtx->appliedParams.cParams; - assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_urm_auto); + assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto); params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder; + params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter; + params.ldmParams = srcCCtx->appliedParams.ldmParams; params.fParams = fParams; ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize, /* loadedDictSize */ 0, @@ -2296,6 +2310,8 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa int const nbRows = (int)size / ZSTD_ROWSIZE; int cellNb = 0; int rowNb; + /* Protect special index values < ZSTD_WINDOW_START_INDEX. */ + U32 const reducerThreshold = reducerValue + ZSTD_WINDOW_START_INDEX; assert((size & (ZSTD_ROWSIZE-1)) == 0); /* multiple of ZSTD_ROWSIZE */ assert(size < (1U<<31)); /* can be casted to int */ @@ -2315,12 +2331,17 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa for (rowNb=0 ; rowNb < nbRows ; rowNb++) { int column; for (column=0; column<ZSTD_ROWSIZE; column++) { - if (preserveMark) { - U32 const adder = (table[cellNb] == ZSTD_DUBT_UNSORTED_MARK) ? reducerValue : 0; - table[cellNb] += adder; + U32 newVal; + if (preserveMark && table[cellNb] == ZSTD_DUBT_UNSORTED_MARK) { + /* This write is pointless, but is required(?) for the compiler + * to auto-vectorize the loop. */ + newVal = ZSTD_DUBT_UNSORTED_MARK; + } else if (table[cellNb] < reducerThreshold) { + newVal = 0; + } else { + newVal = table[cellNb] - reducerValue; } - if (table[cellNb] < reducerValue) table[cellNb] = 0; - else table[cellNb] -= reducerValue; + table[cellNb] = newVal; cellNb++; } } } @@ -2375,9 +2396,9 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr) assert(nbSeq <= seqStorePtr->maxNbSeq); for (u=0; u<nbSeq; u++) { U32 const llv = sequences[u].litLength; - U32 const mlv = sequences[u].matchLength; + U32 const mlv = sequences[u].mlBase; llCodeTable[u] = (BYTE)ZSTD_LLcode(llv); - ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offset); + ofCodeTable[u] = (BYTE)ZSTD_highbit32(sequences[u].offBase); mlCodeTable[u] = (BYTE)ZSTD_MLcode(mlv); } if (seqStorePtr->longLengthType==ZSTD_llt_literalLength) @@ -2399,11 +2420,13 @@ static int ZSTD_useTargetCBlockSize(const ZSTD_CCtx_params* cctxParams) /* ZSTD_blockSplitterEnabled(): * Returns if block splitting param is being used * If used, compression will do best effort to split a block in order to improve compression ratio. + * At the time this function is called, the parameter must be finalized. * Returns 1 if true, 0 otherwise. */ static int ZSTD_blockSplitterEnabled(ZSTD_CCtx_params* cctxParams) { - DEBUGLOG(5, "ZSTD_blockSplitterEnabled(splitBlocks=%d)", cctxParams->splitBlocks); - return (cctxParams->splitBlocks != 0); + DEBUGLOG(5, "ZSTD_blockSplitterEnabled (useBlockSplitter=%d)", cctxParams->useBlockSplitter); + assert(cctxParams->useBlockSplitter != ZSTD_ps_auto); + return (cctxParams->useBlockSplitter == ZSTD_ps_enable); } /* Type returned by ZSTD_buildSequencesStatistics containing finalized symbol encoding types @@ -2546,6 +2569,7 @@ ZSTD_buildSequencesStatistics(seqStore_t* seqStorePtr, size_t nbSeq, * compresses both literals and sequences * Returns compressed size of block, or a zstd error. */ +#define SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO 20 MEM_STATIC size_t ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, const ZSTD_entropyCTables_t* prevEntropy, @@ -2580,15 +2604,19 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, /* Compress literals */ { const BYTE* const literals = seqStorePtr->litStart; + size_t const numSequences = seqStorePtr->sequences - seqStorePtr->sequencesStart; + size_t const numLiterals = seqStorePtr->lit - seqStorePtr->litStart; + /* Base suspicion of uncompressibility on ratio of literals to sequences */ + unsigned const suspectUncompressible = (numSequences == 0) || (numLiterals / numSequences >= SUSPECT_UNCOMPRESSIBLE_LITERAL_RATIO); size_t const litSize = (size_t)(seqStorePtr->lit - literals); size_t const cSize = ZSTD_compressLiterals( &prevEntropy->huf, &nextEntropy->huf, cctxParams->cParams.strategy, - ZSTD_disableLiteralsCompression(cctxParams), + ZSTD_literalsCompressionIsDisabled(cctxParams), op, dstCapacity, literals, litSize, entropyWorkspace, entropyWkspSize, - bmi2); + bmi2, suspectUncompressible); FORWARD_IF_ERROR(cSize, "ZSTD_compressLiterals failed"); assert(cSize <= dstCapacity); op += cSize; @@ -2693,7 +2721,7 @@ ZSTD_entropyCompressSeqStore(seqStore_t* seqStorePtr, /* ZSTD_selectBlockCompressor() : * Not static, but internal use only (used by long distance matcher) * assumption : strat is a valid strategy */ -ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRowMatchFinderMode_e useRowMatchFinder, ZSTD_dictMode_e dictMode) +ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e useRowMatchFinder, ZSTD_dictMode_e dictMode) { static const ZSTD_blockCompressor blockCompressor[4][ZSTD_STRATEGY_MAX+1] = { { ZSTD_compressBlock_fast /* default for 0 */, @@ -2758,7 +2786,7 @@ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRow ZSTD_compressBlock_lazy2_dedicatedDictSearch_row } }; DEBUGLOG(4, "Selecting a row-based matchfinder"); - assert(useRowMatchFinder != ZSTD_urm_auto); + assert(useRowMatchFinder != ZSTD_ps_auto); selectedCompressor = rowBasedBlockCompressors[(int)dictMode][(int)strat - (int)ZSTD_greedy]; } else { selectedCompressor = blockCompressor[(int)dictMode][(int)strat]; @@ -2825,7 +2853,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->blockState.nextCBlock->rep[i] = zc->blockState.prevCBlock->rep[i]; } if (zc->externSeqStore.pos < zc->externSeqStore.size) { - assert(!zc->appliedParams.ldmParams.enableLdm); + assert(zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_disable); /* Updates ldmSeqStore.pos */ lastLLSize = ZSTD_ldm_blockCompress(&zc->externSeqStore, @@ -2834,7 +2862,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, src, srcSize); assert(zc->externSeqStore.pos <= zc->externSeqStore.size); - } else if (zc->appliedParams.ldmParams.enableLdm) { + } else if (zc->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { rawSeqStore_t ldmSeqStore = kNullRawSeqStore; ldmSeqStore.seq = zc->ldmSequences; @@ -2882,9 +2910,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) assert(zc->seqCollector.maxSequences >= seqStoreSeqSize + 1); ZSTD_memcpy(updatedRepcodes.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); for (i = 0; i < seqStoreSeqSize; ++i) { - U32 rawOffset = seqStoreSeqs[i].offset - ZSTD_REP_NUM; + U32 rawOffset = seqStoreSeqs[i].offBase - ZSTD_REP_NUM; outSeqs[i].litLength = seqStoreSeqs[i].litLength; - outSeqs[i].matchLength = seqStoreSeqs[i].matchLength + MINMATCH; + outSeqs[i].matchLength = seqStoreSeqs[i].mlBase + MINMATCH; outSeqs[i].rep = 0; if (i == seqStore->longLengthPos) { @@ -2895,9 +2923,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) } } - if (seqStoreSeqs[i].offset <= ZSTD_REP_NUM) { + if (seqStoreSeqs[i].offBase <= ZSTD_REP_NUM) { /* Derive the correct offset corresponding to a repcode */ - outSeqs[i].rep = seqStoreSeqs[i].offset; + outSeqs[i].rep = seqStoreSeqs[i].offBase; if (outSeqs[i].litLength != 0) { rawOffset = updatedRepcodes.rep[outSeqs[i].rep - 1]; } else { @@ -2911,9 +2939,9 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) outSeqs[i].offset = rawOffset; /* seqStoreSeqs[i].offset == offCode+1, and ZSTD_updateRep() expects offCode so we provide seqStoreSeqs[i].offset - 1 */ - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, - seqStoreSeqs[i].offset - 1, - seqStoreSeqs[i].litLength == 0); + ZSTD_updateRep(updatedRepcodes.rep, + seqStoreSeqs[i].offBase - 1, + seqStoreSeqs[i].litLength == 0); literalsRead += outSeqs[i].litLength; } /* Insert last literals (if any exist) in the block as a sequence with ml == off == 0. @@ -3027,7 +3055,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi const ZSTD_hufCTables_t* prevHuf, ZSTD_hufCTables_t* nextHuf, ZSTD_hufCTablesMetadata_t* hufMetadata, - const int disableLiteralsCompression, + const int literalsCompressionIsDisabled, void* workspace, size_t wkspSize) { BYTE* const wkspStart = (BYTE*)workspace; @@ -3045,7 +3073,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi /* Prepare nextEntropy assuming reusing the existing table */ ZSTD_memcpy(nextHuf, prevHuf, sizeof(*prevHuf)); - if (disableLiteralsCompression) { + if (literalsCompressionIsDisabled) { DEBUGLOG(5, "set_basic - disabled"); hufMetadata->hType = set_basic; return 0; @@ -3192,7 +3220,7 @@ size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, ZSTD_buildBlockEntropyStats_literals(seqStorePtr->litStart, litSize, &prevEntropy->huf, &nextEntropy->huf, &entropyMetadata->hufMetadata, - ZSTD_disableLiteralsCompression(cctxParams), + ZSTD_literalsCompressionIsDisabled(cctxParams), workspace, wkspSize); FORWARD_IF_ERROR(entropyMetadata->hufMetadata.hufDesSize, "ZSTD_buildBlockEntropyStats_literals failed"); entropyMetadata->fseMetadata.fseTablesSize = @@ -3235,7 +3263,7 @@ static size_t ZSTD_estimateBlockSize_literal(const BYTE* literals, size_t litSiz static size_t ZSTD_estimateBlockSize_symbolType(symbolEncodingType_e type, const BYTE* codeTable, size_t nbSeq, unsigned maxCode, const FSE_CTable* fseCTable, - const U32* additionalBits, + const U8* additionalBits, short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, void* workspace, size_t wkspSize) { @@ -3319,19 +3347,20 @@ static size_t ZSTD_estimateBlockSize(const BYTE* literals, size_t litSize, * * Returns the estimated compressed size of the seqStore, or a zstd error. */ -static size_t ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, const ZSTD_CCtx* zc) { - ZSTD_entropyCTablesMetadata_t entropyMetadata; +static size_t ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(seqStore_t* seqStore, ZSTD_CCtx* zc) { + ZSTD_entropyCTablesMetadata_t* entropyMetadata = &zc->blockSplitCtx.entropyMetadata; + DEBUGLOG(6, "ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize()"); FORWARD_IF_ERROR(ZSTD_buildBlockEntropyStats(seqStore, &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, &zc->appliedParams, - &entropyMetadata, + entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */), ""); return ZSTD_estimateBlockSize(seqStore->litStart, (size_t)(seqStore->lit - seqStore->litStart), seqStore->ofCode, seqStore->llCode, seqStore->mlCode, (size_t)(seqStore->sequences - seqStore->sequencesStart), - &zc->blockState.nextCBlock->entropy, &entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE, - (int)(entropyMetadata.hufMetadata.hType == set_compressed), 1); + &zc->blockState.nextCBlock->entropy, entropyMetadata, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE, + (int)(entropyMetadata->hufMetadata.hType == set_compressed), 1); } /* Returns literals bytes represented in a seqStore */ @@ -3356,7 +3385,7 @@ static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) { size_t i; for (i = 0; i < nbSeqs; ++i) { seqDef seq = seqStore->sequencesStart[i]; - matchBytes += seq.matchLength + MINMATCH; + matchBytes += seq.mlBase + MINMATCH; if (i == seqStore->longLengthPos && seqStore->longLengthType == ZSTD_llt_matchLength) { matchBytes += 0x10000; } @@ -3405,11 +3434,13 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, /** * Returns the raw offset represented by the combination of offCode, ll0, and repcode history. - * offCode must be an offCode representing a repcode, therefore in the range of [0, 2]. + * offCode must represent a repcode in the numeric representation of ZSTD_storeSeq(). */ -static U32 ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offCode, const U32 ll0) { - U32 const adjustedOffCode = offCode + ll0; - assert(offCode < ZSTD_REP_NUM); +static U32 +ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offCode, const U32 ll0) +{ + U32 const adjustedOffCode = STORED_REPCODE(offCode) - 1 + ll0; /* [ 0 - 3 ] */ + assert(STORED_IS_REPCODE(offCode)); if (adjustedOffCode == ZSTD_REP_NUM) { /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 */ assert(rep[0] > 0); @@ -3420,11 +3451,16 @@ static U32 ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 /** * ZSTD_seqStore_resolveOffCodes() reconciles any possible divergences in offset history that may arise - * due to emission of RLE/raw blocks that disturb the offset history, and replaces any repcodes within - * the seqStore that may be invalid. + * due to emission of RLE/raw blocks that disturb the offset history, + * and replaces any repcodes within the seqStore that may be invalid. + * + * dRepcodes are updated as would be on the decompression side. + * cRepcodes are updated exactly in accordance with the seqStore. * - * dRepcodes are updated as would be on the decompression side. cRepcodes are updated exactly in - * accordance with the seqStore. + * Note : this function assumes seq->offBase respects the following numbering scheme : + * 0 : invalid + * 1-3 : repcode 1-3 + * 4+ : real_offset+3 */ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_t* const cRepcodes, seqStore_t* const seqStore, U32 const nbSeq) { @@ -3432,9 +3468,9 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ for (; idx < nbSeq; ++idx) { seqDef* const seq = seqStore->sequencesStart + idx; U32 const ll0 = (seq->litLength == 0); - U32 offCode = seq->offset - 1; - assert(seq->offset > 0); - if (offCode <= ZSTD_REP_MOVE) { + U32 const offCode = OFFBASE_TO_STORED(seq->offBase); + assert(seq->offBase > 0); + if (STORED_IS_REPCODE(offCode)) { U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offCode, ll0); U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offCode, ll0); /* Adjust simulated decompression repcode history if we come across a mismatch. Replace @@ -3442,14 +3478,14 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ * repcode history. */ if (dRawOffset != cRawOffset) { - seq->offset = cRawOffset + ZSTD_REP_NUM; + seq->offBase = cRawOffset + ZSTD_REP_NUM; } } /* Compression repcode history is always updated with values directly from the unmodified seqStore. * Decompression repcode history may use modified seq->offset value taken from compression repcode history. */ - *dRepcodes = ZSTD_updateRep(dRepcodes->rep, seq->offset - 1, ll0); - *cRepcodes = ZSTD_updateRep(cRepcodes->rep, offCode, ll0); + ZSTD_updateRep(dRepcodes->rep, OFFBASE_TO_STORED(seq->offBase), ll0); + ZSTD_updateRep(cRepcodes->rep, offCode, ll0); } } @@ -3458,11 +3494,13 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ * * Returns the total size of that block (including header) or a ZSTD error code. */ -static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const seqStore, - repcodes_t* const dRep, repcodes_t* const cRep, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, - U32 lastBlock, U32 isPartition) { +static size_t +ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const seqStore, + repcodes_t* const dRep, repcodes_t* const cRep, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + U32 lastBlock, U32 isPartition) +{ const U32 rleMaxLength = 25; BYTE* op = (BYTE*)dst; const BYTE* ip = (const BYTE*)src; @@ -3471,9 +3509,11 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const /* In case of an RLE or raw block, the simulated decompression repcode history must be reset */ repcodes_t const dRepOriginal = *dRep; + DEBUGLOG(5, "ZSTD_compressSeqStore_singleBlock"); if (isPartition) ZSTD_seqStore_resolveOffCodes(dRep, cRep, seqStore, (U32)(seqStore->sequences - seqStore->sequencesStart)); + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "Block header doesn't fit"); cSeqsSize = ZSTD_entropyCompressSeqStore(seqStore, &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy, &zc->appliedParams, @@ -3499,9 +3539,6 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const return 0; } - if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) - zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; - if (cSeqsSize == 0) { cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, srcSize, lastBlock); FORWARD_IF_ERROR(cSize, "Nocompress block failed"); @@ -3518,6 +3555,10 @@ static size_t ZSTD_compressSeqStore_singleBlock(ZSTD_CCtx* zc, seqStore_t* const cSize = ZSTD_blockHeaderSize + cSeqsSize; DEBUGLOG(4, "Writing out compressed block, size: %zu", cSize); } + + if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid) + zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check; + return cSize; } @@ -3528,7 +3569,6 @@ typedef struct { } seqStoreSplits; #define MIN_SEQUENCES_BLOCK_SPLITTING 300 -#define MAX_NB_SPLITS 196 /* Helper function to perform the recursive search for block splits. * Estimates the cost of seqStore prior to split, and estimates the cost of splitting the sequences in half. @@ -3539,29 +3579,33 @@ typedef struct { * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING). * In practice, recursion depth usually doesn't go beyond 4. * - * Furthermore, the number of splits is capped by MAX_NB_SPLITS. At MAX_NB_SPLITS == 196 with the current existing blockSize + * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize * maximum of 128 KB, this value is actually impossible to reach. */ -static void ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx, - const ZSTD_CCtx* zc, const seqStore_t* origSeqStore) { - seqStore_t fullSeqStoreChunk; - seqStore_t firstHalfSeqStore; - seqStore_t secondHalfSeqStore; +static void +ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t endIdx, + ZSTD_CCtx* zc, const seqStore_t* origSeqStore) +{ + seqStore_t* fullSeqStoreChunk = &zc->blockSplitCtx.fullSeqStoreChunk; + seqStore_t* firstHalfSeqStore = &zc->blockSplitCtx.firstHalfSeqStore; + seqStore_t* secondHalfSeqStore = &zc->blockSplitCtx.secondHalfSeqStore; size_t estimatedOriginalSize; size_t estimatedFirstHalfSize; size_t estimatedSecondHalfSize; size_t midIdx = (startIdx + endIdx)/2; - if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= MAX_NB_SPLITS) { + if (endIdx - startIdx < MIN_SEQUENCES_BLOCK_SPLITTING || splits->idx >= ZSTD_MAX_NB_BLOCK_SPLITS) { + DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences"); return; } - ZSTD_deriveSeqStoreChunk(&fullSeqStoreChunk, origSeqStore, startIdx, endIdx); - ZSTD_deriveSeqStoreChunk(&firstHalfSeqStore, origSeqStore, startIdx, midIdx); - ZSTD_deriveSeqStoreChunk(&secondHalfSeqStore, origSeqStore, midIdx, endIdx); - estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&fullSeqStoreChunk, zc); - estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&firstHalfSeqStore, zc); - estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&secondHalfSeqStore, zc); - DEBUGLOG(5, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", + DEBUGLOG(4, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx); + ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx); + ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx); + ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx); + estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc); + estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc); + estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc); + DEBUGLOG(4, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize); if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) { return; @@ -3596,17 +3640,19 @@ static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) * * Returns combined size of all blocks (which includes headers), or a ZSTD error code. */ -static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, - const void* src, size_t blockSize, U32 lastBlock, U32 nbSeq) { +static size_t +ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, + const void* src, size_t blockSize, U32 lastBlock, U32 nbSeq) +{ size_t cSize = 0; const BYTE* ip = (const BYTE*)src; BYTE* op = (BYTE*)dst; - U32 partitions[MAX_NB_SPLITS]; size_t i = 0; size_t srcBytesTotal = 0; + U32* partitions = zc->blockSplitCtx.partitions; /* size == ZSTD_MAX_NB_BLOCK_SPLITS */ + seqStore_t* nextSeqStore = &zc->blockSplitCtx.nextSeqStore; + seqStore_t* currSeqStore = &zc->blockSplitCtx.currSeqStore; size_t numSplits = ZSTD_deriveBlockSplits(zc, partitions, nbSeq); - seqStore_t nextSeqStore; - seqStore_t currSeqStore; /* If a block is split and some partitions are emitted as RLE/uncompressed, then repcode history * may become invalid. In order to reconcile potentially invalid repcodes, we keep track of two @@ -3626,6 +3672,7 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s repcodes_t cRep; ZSTD_memcpy(dRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); ZSTD_memcpy(cRep.rep, zc->blockState.prevCBlock->rep, sizeof(repcodes_t)); + ZSTD_memset(nextSeqStore, 0, sizeof(seqStore_t)); DEBUGLOG(4, "ZSTD_compressBlock_splitBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)", (unsigned)dstCapacity, (unsigned)zc->blockState.matchState.window.dictLimit, @@ -3643,36 +3690,36 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s return cSizeSingleBlock; } - ZSTD_deriveSeqStoreChunk(&currSeqStore, &zc->seqStore, 0, partitions[0]); + ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]); for (i = 0; i <= numSplits; ++i) { size_t srcBytes; size_t cSizeChunk; U32 const lastPartition = (i == numSplits); U32 lastBlockEntireSrc = 0; - srcBytes = ZSTD_countSeqStoreLiteralsBytes(&currSeqStore) + ZSTD_countSeqStoreMatchBytes(&currSeqStore); + srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore); srcBytesTotal += srcBytes; if (lastPartition) { /* This is the final partition, need to account for possible last literals */ srcBytes += blockSize - srcBytesTotal; lastBlockEntireSrc = lastBlock; } else { - ZSTD_deriveSeqStoreChunk(&nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]); + ZSTD_deriveSeqStoreChunk(nextSeqStore, &zc->seqStore, partitions[i], partitions[i+1]); } - cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, &currSeqStore, + cSizeChunk = ZSTD_compressSeqStore_singleBlock(zc, currSeqStore, &dRep, &cRep, op, dstCapacity, ip, srcBytes, lastBlockEntireSrc, 1 /* isPartition */); - DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(&currSeqStore, zc), cSizeChunk); + DEBUGLOG(5, "Estimated size: %zu actual size: %zu", ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(currSeqStore, zc), cSizeChunk); FORWARD_IF_ERROR(cSizeChunk, "Compressing chunk failed!"); ip += srcBytes; op += cSizeChunk; dstCapacity -= cSizeChunk; cSize += cSizeChunk; - currSeqStore = nextSeqStore; + *currSeqStore = *nextSeqStore; assert(cSizeChunk <= ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize); } /* cRep and dRep may have diverged during the compression. If so, we use the dRep repcodes @@ -3682,14 +3729,17 @@ static size_t ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, s return cSize; } -static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, U32 lastBlock) { +static size_t +ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 lastBlock) +{ const BYTE* ip = (const BYTE*)src; BYTE* op = (BYTE*)dst; U32 nbSeq; size_t cSize; DEBUGLOG(4, "ZSTD_compressBlock_splitBlock"); + assert(zc->appliedParams.useBlockSplitter == ZSTD_ps_enable); { const size_t bss = ZSTD_buildSeqStore(zc, src, srcSize); FORWARD_IF_ERROR(bss, "ZSTD_buildSeqStore failed"); @@ -3704,15 +3754,15 @@ static size_t ZSTD_compressBlock_splitBlock(ZSTD_CCtx* zc, nbSeq = (U32)(zc->seqStore.sequences - zc->seqStore.sequencesStart); } - assert(zc->appliedParams.splitBlocks == 1); cSize = ZSTD_compressBlock_splitBlock_internal(zc, dst, dstCapacity, src, srcSize, lastBlock, nbSeq); FORWARD_IF_ERROR(cSize, "Splitting blocks failed!"); return cSize; } -static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, - void* dst, size_t dstCapacity, - const void* src, size_t srcSize, U32 frame) +static size_t +ZSTD_compressBlock_internal(ZSTD_CCtx* zc, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, U32 frame) { /* This the upper bound for the length of an rle block. * This isn't the actual upper bound. Finding the real threshold @@ -3746,12 +3796,6 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc, zc->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, zc->bmi2); - if (zc->seqCollector.collectSequences) { - ZSTD_copyBlockSequences(zc); - return 0; - } - - if (frame && /* We don't want to emit our first block as a RLE even if it qualifies because * doing so will cause the decoder (cli only) to throw a "should consume all input error." @@ -3915,6 +3959,7 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, ZSTD_overflowCorrectIfNeeded( ms, &cctx->workspace, &cctx->appliedParams, ip, ip + blockSize); ZSTD_checkDictValidity(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); + ZSTD_window_enforceMaxDist(&ms->window, ip, maxDist, &ms->loadedDictEnd, &ms->dictMatchState); /* Ensure hash/chain table insertion resumes no sooner than lowlimit */ if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit; @@ -3991,7 +4036,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, if (!singleSegment) op[pos++] = windowLogByte; switch(dictIDSizeCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : break; case 1 : op[pos] = (BYTE)(dictID); pos++; break; case 2 : MEM_writeLE16(op+pos, (U16)dictID); pos+=2; break; @@ -3999,7 +4046,9 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity, } switch(fcsCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : if (singleSegment) op[pos++] = (BYTE)(pledgedSrcSize); break; case 1 : MEM_writeLE16(op+pos, (U16)(pledgedSrcSize-256)); pos+=2; break; case 2 : MEM_writeLE32(op+pos, (U32)(pledgedSrcSize)); pos+=4; break; @@ -4047,7 +4096,7 @@ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSe { RETURN_ERROR_IF(cctx->stage != ZSTDcs_init, stage_wrong, "wrong cctx stage"); - RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm, + RETURN_ERROR_IF(cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable, parameter_unsupported, "incompatible with ldm"); cctx->externSeqStore.seq = seq; @@ -4088,7 +4137,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, ms->forceNonContiguous = 0; ms->nextToUpdate = ms->window.dictLimit; } - if (cctx->appliedParams.ldmParams.enableLdm) { + if (cctx->appliedParams.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_window_update(&cctx->ldmState.window, src, srcSize, /* forceNonContiguous */ 0); } @@ -4157,7 +4206,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, { const BYTE* ip = (const BYTE*) src; const BYTE* const iend = ip + srcSize; - int const loadLdmDict = params->ldmParams.enableLdm && ls != NULL; + int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL; /* Assert that we the ms params match the params we're being given */ ZSTD_assertEqualCParams(params->cParams, ms->cParams); @@ -4214,8 +4263,8 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, assert(ms->chainTable != NULL); ZSTD_dedicatedDictSearch_lazy_loadDictionary(ms, iend-HASH_READ_SIZE); } else { - assert(params->useRowMatchFinder != ZSTD_urm_auto); - if (params->useRowMatchFinder == ZSTD_urm_enableRowMatchFinder) { + assert(params->useRowMatchFinder != ZSTD_ps_auto); + if (params->useRowMatchFinder == ZSTD_ps_enable) { size_t const tagTableSize = ((size_t)1 << params->cParams.hashLog) * sizeof(U16); ZSTD_memset(ms->tagTable, 0, tagTableSize); ZSTD_row_update(ms, iend-HASH_READ_SIZE); @@ -4715,7 +4764,7 @@ size_t ZSTD_estimateCDictSize_advanced( + ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE) /* enableDedicatedDictSearch == 1 ensures that CDict estimation will not be too small * in case we are using DDS with row-hash. */ - + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams), + + ZSTD_sizeof_matchState(&cParams, ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams), /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void *)))); @@ -4792,7 +4841,7 @@ static size_t ZSTD_initCDict_internal( static ZSTD_CDict* ZSTD_createCDict_advanced_internal(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_compressionParameters cParams, - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, U32 enableDedicatedDictSearch, ZSTD_customMem customMem) { @@ -4842,7 +4891,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize, &cctxParams, customMem); } -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2( +ZSTD_CDict* ZSTD_createCDict_advanced2( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, @@ -4947,7 +4996,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict( ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams) { - ZSTD_useRowMatchFinderMode_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_urm_auto, &cParams); + ZSTD_paramSwitch_e const useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(ZSTD_ps_auto, &cParams); /* enableDedicatedDictSearch == 1 ensures matchstate is not too small in case this CDict will be used for DDS + row hash */ size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, useRowMatchFinder, /* enableDedicatedDictSearch */ 1, /* forCCtx */ 0); size_t const neededSize = ZSTD_cwksp_alloc_size(sizeof(ZSTD_CDict)) @@ -5403,7 +5452,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, zcs->outBuffFlushedSize = 0; zcs->streamStage = zcss_flush; /* pass-through to flush stage */ } - /* fall-through */ + ZSTD_FALLTHROUGH; case zcss_flush: DEBUGLOG(5, "flush stage"); assert(zcs->appliedParams.outBufferMode == ZSTD_bm_buffered); @@ -5524,17 +5573,8 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, dictSize, mode); } - if (ZSTD_CParams_shouldEnableLdm(¶ms.cParams)) { - /* Enable LDM by default for optimal parser and window size >= 128MB */ - DEBUGLOG(4, "LDM enabled by default (window size >= 128MB, strategy >= btopt)"); - params.ldmParams.enableLdm = 1; - } - - if (ZSTD_CParams_useBlockSplitter(¶ms.cParams)) { - DEBUGLOG(4, "Block splitter enabled by default (window size >= 128K, strategy >= btopt)"); - params.splitBlocks = 1; - } - + params.useBlockSplitter = ZSTD_resolveBlockSplitterMode(params.useBlockSplitter, ¶ms.cParams); + params.ldmParams.enableLdm = ZSTD_resolveEnableLdm(params.ldmParams.enableLdm, ¶ms.cParams); params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, ¶ms.cParams); #ifdef ZSTD_MULTITHREAD @@ -5715,39 +5755,39 @@ typedef struct { size_t posInSrc; /* Number of bytes given by sequences provided so far */ } ZSTD_sequencePosition; -/* Returns a ZSTD error code if sequence is not valid */ -static size_t ZSTD_validateSequence(U32 offCode, U32 matchLength, - size_t posInSrc, U32 windowLog, size_t dictSize, U32 minMatch) { - size_t offsetBound; - U32 windowSize = 1 << windowLog; +/* ZSTD_validateSequence() : + * @offCode : is presumed to follow format required by ZSTD_storeSeq() + * @returns a ZSTD error code if sequence is not valid + */ +static size_t +ZSTD_validateSequence(U32 offCode, U32 matchLength, + size_t posInSrc, U32 windowLog, size_t dictSize) +{ + U32 const windowSize = 1 << windowLog; /* posInSrc represents the amount of data the the decoder would decode up to this point. * As long as the amount of data decoded is less than or equal to window size, offsets may be * larger than the total length of output decoded in order to reference the dict, even larger than * window size. After output surpasses windowSize, we're limited to windowSize offsets again. */ - offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; - RETURN_ERROR_IF(offCode > offsetBound + ZSTD_REP_MOVE, corruption_detected, "Offset too large!"); - RETURN_ERROR_IF(matchLength < minMatch, corruption_detected, "Matchlength too small"); + size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; + RETURN_ERROR_IF(offCode > STORE_OFFSET(offsetBound), corruption_detected, "Offset too large!"); + RETURN_ERROR_IF(matchLength < MINMATCH, corruption_detected, "Matchlength too small"); return 0; } /* Returns an offset code, given a sequence's raw offset, the ongoing repcode array, and whether litLength == 0 */ -static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) { - U32 offCode = rawOffset + ZSTD_REP_MOVE; - U32 repCode = 0; +static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) +{ + U32 offCode = STORE_OFFSET(rawOffset); if (!ll0 && rawOffset == rep[0]) { - repCode = 1; + offCode = STORE_REPCODE_1; } else if (rawOffset == rep[1]) { - repCode = 2 - ll0; + offCode = STORE_REPCODE(2 - ll0); } else if (rawOffset == rep[2]) { - repCode = 3 - ll0; + offCode = STORE_REPCODE(3 - ll0); } else if (ll0 && rawOffset == rep[0] - 1) { - repCode = 3; - } - if (repCode) { - /* ZSTD_storeSeq expects a number in the range [0, 2] to represent a repcode */ - offCode = repCode - 1; + offCode = STORE_REPCODE_3; } return offCode; } @@ -5755,18 +5795,17 @@ static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 /* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of * ZSTD_Sequence, storing the sequences it finds, until it reaches a block delimiter. */ -static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, - const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) { +static size_t +ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, + ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize) +{ U32 idx = seqPos->idx; BYTE const* ip = (BYTE const*)(src); const BYTE* const iend = ip + blockSize; repcodes_t updatedRepcodes; U32 dictSize; - U32 litLength; - U32 matchLength; - U32 ll0; - U32 offCode; if (cctx->cdict) { dictSize = (U32)cctx->cdict->dictContentSize; @@ -5777,23 +5816,22 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS } ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); for (; (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0) && idx < inSeqsSize; ++idx) { - litLength = inSeqs[idx].litLength; - matchLength = inSeqs[idx].matchLength; - ll0 = litLength == 0; - offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0); - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + U32 const litLength = inSeqs[idx].litLength; + U32 const ll0 = (litLength == 0); + U32 const matchLength = inSeqs[idx].matchLength; + U32 const offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, - cctx->appliedParams.cParams.minMatch), + cctx->appliedParams.cParams.windowLog, dictSize), "Sequence validation failed"); } RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength - MINMATCH); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength); ip += matchLength + litLength; } ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); @@ -5820,9 +5858,11 @@ static size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZS * avoid splitting a match, or to avoid splitting a match such that it would produce a match * smaller than MINMATCH. In this case, we return the number of bytes that we didn't read from this block. */ -static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, - const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) { +static size_t +ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, + const void* src, size_t blockSize) +{ U32 idx = seqPos->idx; U32 startPosInSequence = seqPos->posInSequence; U32 endPosInSequence = seqPos->posInSequence + (U32)blockSize; @@ -5832,10 +5872,6 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq repcodes_t updatedRepcodes; U32 bytesAdjustment = 0; U32 finalMatchSplit = 0; - U32 litLength; - U32 matchLength; - U32 rawOffset; - U32 offCode; if (cctx->cdict) { dictSize = cctx->cdict->dictContentSize; @@ -5849,9 +5885,10 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); while (endPosInSequence && idx < inSeqsSize && !finalMatchSplit) { const ZSTD_Sequence currSeq = inSeqs[idx]; - litLength = currSeq.litLength; - matchLength = currSeq.matchLength; - rawOffset = currSeq.offset; + U32 litLength = currSeq.litLength; + U32 matchLength = currSeq.matchLength; + U32 const rawOffset = currSeq.offset; + U32 offCode; /* Modify the sequence depending on where endPosInSequence lies */ if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) { @@ -5904,22 +5941,21 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq } } /* Check if this offset can be represented with a repcode */ - { U32 ll0 = (litLength == 0); + { U32 const ll0 = (litLength == 0); offCode = ZSTD_finalizeOffCode(rawOffset, updatedRepcodes.rep, ll0); - updatedRepcodes = ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); } if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, - cctx->appliedParams.cParams.minMatch), + cctx->appliedParams.cParams.windowLog, dictSize), "Sequence validation failed"); } DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength - MINMATCH); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength); ip += matchLength + litLength; } DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); @@ -5944,7 +5980,8 @@ static size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_seq typedef size_t (*ZSTD_sequenceCopier) (ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, const void* src, size_t blockSize); -static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) { +static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) +{ ZSTD_sequenceCopier sequenceCopier = NULL; assert(ZSTD_cParam_withinBounds(ZSTD_c_blockDelimiters, mode)); if (mode == ZSTD_sf_explicitBlockDelimiters) { @@ -5958,12 +5995,15 @@ static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) /* Compress, block-by-block, all of the sequences given. * - * Returns the cumulative size of all compressed blocks (including their headers), otherwise a ZSTD error. + * Returns the cumulative size of all compressed blocks (including their headers), + * otherwise a ZSTD error. */ -static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, - void* dst, size_t dstCapacity, - const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize) { +static size_t +ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize) +{ size_t cSize = 0; U32 lastBlock; size_t blockSize; @@ -5973,7 +6013,7 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, BYTE const* ip = (BYTE const*)src; BYTE* op = (BYTE*)dst; - ZSTD_sequenceCopier sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters); + ZSTD_sequenceCopier const sequenceCopier = ZSTD_selectSequenceCopier(cctx->appliedParams.blockDelimiters); DEBUGLOG(4, "ZSTD_compressSequences_internal srcSize: %zu, inSeqsSize: %zu", srcSize, inSeqsSize); /* Special case: empty frame */ @@ -6073,7 +6113,8 @@ static size_t ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapacity, const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize) { + const void* src, size_t srcSize) +{ BYTE* op = (BYTE*)dst; size_t cSize = 0; size_t compressedBlocksSize = 0; @@ -6140,119 +6181,12 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) /*-===== Pre-defined compression levels =====-*/ +#include "clevels.h" -#define ZSTD_MAX_CLEVEL 22 int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; } int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; } int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; } -static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = { -{ /* "default" - for any srcSize > 256 KB */ - /* W, C, H, S, L, TL, strat */ - { 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */ - { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */ - { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */ - { 21, 16, 17, 1, 5, 0, ZSTD_dfast }, /* level 3 */ - { 21, 18, 18, 1, 5, 0, ZSTD_dfast }, /* level 4 */ - { 21, 18, 19, 2, 5, 2, ZSTD_greedy }, /* level 5 */ - { 21, 19, 19, 3, 5, 4, ZSTD_greedy }, /* level 6 */ - { 21, 19, 19, 3, 5, 8, ZSTD_lazy }, /* level 7 */ - { 21, 19, 19, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */ - { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */ - { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */ - { 22, 21, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */ - { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */ - { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 13 */ - { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */ - { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */ - { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */ - { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */ - { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */ - { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */ - { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */ - { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */ - { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */ -}, -{ /* for srcSize <= 256 KB */ - /* W, C, H, S, L, T, strat */ - { 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */ - { 18, 14, 14, 1, 5, 0, ZSTD_dfast }, /* level 2 */ - { 18, 16, 16, 1, 4, 0, ZSTD_dfast }, /* level 3 */ - { 18, 16, 17, 2, 5, 2, ZSTD_greedy }, /* level 4.*/ - { 18, 18, 18, 3, 5, 2, ZSTD_greedy }, /* level 5.*/ - { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/ - { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */ - { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ - { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ - { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ - { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/ - { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/ - { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */ - { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ - { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/ - { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/ - { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/ - { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/ - { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -{ /* for srcSize <= 128 KB */ - /* W, C, H, S, L, T, strat */ - { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */ - { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */ - { 17, 15, 16, 2, 5, 0, ZSTD_dfast }, /* level 3 */ - { 17, 17, 17, 2, 4, 0, ZSTD_dfast }, /* level 4 */ - { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */ - { 17, 17, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */ - { 17, 17, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */ - { 17, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */ - { 17, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */ - { 17, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */ - { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */ - { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */ - { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/ - { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/ - { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/ - { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/ - { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/ - { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/ - { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -{ /* for srcSize <= 16 KB */ - /* W, C, H, S, L, T, strat */ - { 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */ - { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */ - { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */ - { 14, 14, 15, 2, 4, 0, ZSTD_dfast }, /* level 3 */ - { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */ - { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/ - { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */ - { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */ - { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/ - { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/ - { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/ - { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/ - { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/ - { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/ - { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/ - { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/ - { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/ - { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/ - { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/ - { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/ - { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/ - { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/ - { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/ -}, -}; - static ZSTD_compressionParameters ZSTD_dedicatedDictSearch_getCParams(int const compressionLevel, size_t const dictSize) { ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, 0, dictSize, ZSTD_cpm_createCDict); diff --git a/thirdparty/zstd/compress/zstd_compress_internal.h b/thirdparty/zstd/compress/zstd_compress_internal.h index 3b04fd09f6..c406e794bd 100644 --- a/thirdparty/zstd/compress/zstd_compress_internal.h +++ b/thirdparty/zstd/compress/zstd_compress_internal.h @@ -63,7 +63,7 @@ typedef struct { } ZSTD_localDict; typedef struct { - HUF_CElt CTable[HUF_CTABLE_SIZE_U32(255)]; + HUF_CElt CTable[HUF_CTABLE_SIZE_ST(255)]; HUF_repeat repeatMode; } ZSTD_hufCTables_t; @@ -129,7 +129,7 @@ size_t ZSTD_buildBlockEntropyStats(seqStore_t* seqStorePtr, *********************************/ typedef struct { - U32 off; /* Offset code (offset + ZSTD_REP_MOVE) for the match */ + U32 off; /* Offset sumtype code for the match, using ZSTD_storeSeq() format */ U32 len; /* Raw length of match */ } ZSTD_match_t; @@ -179,7 +179,7 @@ typedef struct { U32 offCodeSumBasePrice; /* to compare to log2(offreq) */ ZSTD_OptPrice_e priceType; /* prices can be determined dynamically, or follow a pre-defined cost structure */ const ZSTD_entropyCTables_t* symbolCosts; /* pre-calculated dictionary statistics */ - ZSTD_literalCompressionMode_e literalCompressionMode; + ZSTD_paramSwitch_e literalCompressionMode; } optState_t; typedef struct { @@ -199,6 +199,8 @@ typedef struct { */ } ZSTD_window_t; +#define ZSTD_WINDOW_START_INDEX 2 + typedef struct ZSTD_matchState_t ZSTD_matchState_t; #define ZSTD_ROW_HASH_CACHE_SIZE 8 /* Size of prefetching hash cache for row-based matchfinder */ @@ -264,7 +266,7 @@ typedef struct { } ldmState_t; typedef struct { - U32 enableLdm; /* 1 if enable long distance matching */ + ZSTD_paramSwitch_e enableLdm; /* ZSTD_ps_enable to enable LDM. ZSTD_ps_auto by default */ U32 hashLog; /* Log size of hashTable */ U32 bucketSizeLog; /* Log bucket size for collision resolution, at most 8 */ U32 minMatchLength; /* Minimum match length */ @@ -295,7 +297,7 @@ struct ZSTD_CCtx_params_s { * There is no guarantee that hint is close to actual source size */ ZSTD_dictAttachPref_e attachDictPref; - ZSTD_literalCompressionMode_e literalCompressionMode; + ZSTD_paramSwitch_e literalCompressionMode; /* Multithreading: used to pass parameters to mtctx */ int nbWorkers; @@ -318,10 +320,10 @@ struct ZSTD_CCtx_params_s { int validateSequences; /* Block splitting */ - int splitBlocks; + ZSTD_paramSwitch_e useBlockSplitter; /* Param for deciding whether to use row-based matchfinder */ - ZSTD_useRowMatchFinderMode_e useRowMatchFinder; + ZSTD_paramSwitch_e useRowMatchFinder; /* Always load a dictionary in ext-dict mode (not prefix mode)? */ int deterministicRefPrefix; @@ -343,6 +345,22 @@ typedef enum { ZSTDb_buffered } ZSTD_buffered_policy_e; +/** + * Struct that contains all elements of block splitter that should be allocated + * in a wksp. + */ +#define ZSTD_MAX_NB_BLOCK_SPLITS 196 +typedef struct { + seqStore_t fullSeqStoreChunk; + seqStore_t firstHalfSeqStore; + seqStore_t secondHalfSeqStore; + seqStore_t currSeqStore; + seqStore_t nextSeqStore; + + U32 partitions[ZSTD_MAX_NB_BLOCK_SPLITS]; + ZSTD_entropyCTablesMetadata_t entropyMetadata; +} ZSTD_blockSplitCtx; + struct ZSTD_CCtx_s { ZSTD_compressionStage_e stage; int cParamsChanged; /* == 1 if cParams(except wlog) or compression level are changed in requestedParams. Triggers transmission of new params to ZSTDMT (if available) then reset to 0. */ @@ -374,7 +392,7 @@ struct ZSTD_CCtx_s { ZSTD_blockState_t blockState; U32* entropyWorkspace; /* entropy workspace of ENTROPY_WORKSPACE_SIZE bytes */ - /* Wether we are streaming or not */ + /* Whether we are streaming or not */ ZSTD_buffered_policy_e bufferedPolicy; /* streaming */ @@ -408,6 +426,9 @@ struct ZSTD_CCtx_s { #if ZSTD_TRACE ZSTD_TraceCtx traceCtx; #endif + + /* Workspace for block splitter */ + ZSTD_blockSplitCtx blockSplitCtx; }; typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e; @@ -442,7 +463,7 @@ typedef enum { typedef size_t (*ZSTD_blockCompressor) ( ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); -ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_useRowMatchFinderMode_e rowMatchfinderMode, ZSTD_dictMode_e dictMode); +ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_paramSwitch_e rowMatchfinderMode, ZSTD_dictMode_e dictMode); MEM_STATIC U32 ZSTD_LLcode(U32 litLength) @@ -476,31 +497,6 @@ MEM_STATIC U32 ZSTD_MLcode(U32 mlBase) return (mlBase > 127) ? ZSTD_highbit32(mlBase) + ML_deltaCode : ML_Code[mlBase]; } -typedef struct repcodes_s { - U32 rep[3]; -} repcodes_t; - -MEM_STATIC repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 const ll0) -{ - repcodes_t newReps; - if (offset >= ZSTD_REP_NUM) { /* full offset */ - newReps.rep[2] = rep[1]; - newReps.rep[1] = rep[0]; - newReps.rep[0] = offset - ZSTD_REP_MOVE; - } else { /* repcode */ - U32 const repCode = offset + ll0; - if (repCode > 0) { /* note : if repCode==0, no change */ - U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; - newReps.rep[2] = (repCode >= 2) ? rep[1] : rep[2]; - newReps.rep[1] = rep[0]; - newReps.rep[0] = currentOffset; - } else { /* repCode == 0 */ - ZSTD_memcpy(&newReps, rep, sizeof(newReps)); - } - } - return newReps; -} - /* ZSTD_cParam_withinBounds: * @return 1 if value is within cParam bounds, * 0 otherwise */ @@ -549,17 +545,17 @@ MEM_STATIC size_t ZSTD_minGain(size_t srcSize, ZSTD_strategy strat) return (srcSize >> minlog) + 2; } -MEM_STATIC int ZSTD_disableLiteralsCompression(const ZSTD_CCtx_params* cctxParams) +MEM_STATIC int ZSTD_literalsCompressionIsDisabled(const ZSTD_CCtx_params* cctxParams) { switch (cctxParams->literalCompressionMode) { - case ZSTD_lcm_huffman: + case ZSTD_ps_enable: return 0; - case ZSTD_lcm_uncompressed: + case ZSTD_ps_disable: return 1; default: assert(0 /* impossible: pre-validated */); - /* fall-through */ - case ZSTD_lcm_auto: + ZSTD_FALLTHROUGH; + case ZSTD_ps_auto: return (cctxParams->cParams.strategy == ZSTD_fast) && (cctxParams->cParams.targetLength > 0); } } @@ -569,7 +565,9 @@ MEM_STATIC int ZSTD_disableLiteralsCompression(const ZSTD_CCtx_params* cctxParam * Only called when the sequence ends past ilimit_w, so it only needs to be optimized for single * large copies. */ -static void ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE const* ilimit_w) { +static void +ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE const* ilimit_w) +{ assert(iend > ilimit_w); if (ip <= ilimit_w) { ZSTD_wildcopy(op, ip, ilimit_w - ip, ZSTD_no_overlap); @@ -579,14 +577,30 @@ static void ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const ie while (ip < iend) *op++ = *ip++; } +#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1) +#define STORE_REPCODE_1 STORE_REPCODE(1) +#define STORE_REPCODE_2 STORE_REPCODE(2) +#define STORE_REPCODE_3 STORE_REPCODE(3) +#define STORE_REPCODE(r) (assert((r)>=1), assert((r)<=3), (r)-1) +#define STORE_OFFSET(o) (assert((o)>0), o + ZSTD_REP_MOVE) +#define STORED_IS_OFFSET(o) ((o) > ZSTD_REP_MOVE) +#define STORED_IS_REPCODE(o) ((o) <= ZSTD_REP_MOVE) +#define STORED_OFFSET(o) (assert(STORED_IS_OFFSET(o)), (o)-ZSTD_REP_MOVE) +#define STORED_REPCODE(o) (assert(STORED_IS_REPCODE(o)), (o)+1) /* returns ID 1,2,3 */ +#define STORED_TO_OFFBASE(o) ((o)+1) +#define OFFBASE_TO_STORED(o) ((o)-1) + /*! ZSTD_storeSeq() : - * Store a sequence (litlen, litPtr, offCode and mlBase) into seqStore_t. - * `offCode` : distance to match + ZSTD_REP_MOVE (values <= ZSTD_REP_MOVE are repCodes). - * `mlBase` : matchLength - MINMATCH + * Store a sequence (litlen, litPtr, offCode and matchLength) into seqStore_t. + * @offBase_minus1 : Users should use employ macros STORE_REPCODE_X and STORE_OFFSET(). + * @matchLength : must be >= MINMATCH * Allowed to overread literals up to litLimit. */ -HINT_INLINE UNUSED_ATTR -void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* literals, const BYTE* litLimit, U32 offCode, size_t mlBase) +HINT_INLINE UNUSED_ATTR void +ZSTD_storeSeq(seqStore_t* seqStorePtr, + size_t litLength, const BYTE* literals, const BYTE* litLimit, + U32 offBase_minus1, + size_t matchLength) { BYTE const* const litLimit_w = litLimit - WILDCOPY_OVERLENGTH; BYTE const* const litEnd = literals + litLength; @@ -595,7 +609,7 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */ { U32 const pos = (U32)((const BYTE*)literals - g_start); DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offCode%7u", - pos, (U32)litLength, (U32)mlBase+MINMATCH, (U32)offCode); + pos, (U32)litLength, (U32)matchLength, (U32)offBase_minus1); } #endif assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq); @@ -626,19 +640,59 @@ void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* litera seqStorePtr->sequences[0].litLength = (U16)litLength; /* match offset */ - seqStorePtr->sequences[0].offset = offCode + 1; + seqStorePtr->sequences[0].offBase = STORED_TO_OFFBASE(offBase_minus1); /* match Length */ - if (mlBase>0xFFFF) { - assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ - seqStorePtr->longLengthType = ZSTD_llt_matchLength; - seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + assert(matchLength >= MINMATCH); + { size_t const mlBase = matchLength - MINMATCH; + if (mlBase>0xFFFF) { + assert(seqStorePtr->longLengthType == ZSTD_llt_none); /* there can only be a single long length */ + seqStorePtr->longLengthType = ZSTD_llt_matchLength; + seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart); + } + seqStorePtr->sequences[0].mlBase = (U16)mlBase; } - seqStorePtr->sequences[0].matchLength = (U16)mlBase; seqStorePtr->sequences++; } +/* ZSTD_updateRep() : + * updates in-place @rep (array of repeat offsets) + * @offBase_minus1 : sum-type, with same numeric representation as ZSTD_storeSeq() + */ +MEM_STATIC void +ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase_minus1, U32 const ll0) +{ + if (STORED_IS_OFFSET(offBase_minus1)) { /* full offset */ + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = STORED_OFFSET(offBase_minus1); + } else { /* repcode */ + U32 const repCode = STORED_REPCODE(offBase_minus1) - 1 + ll0; + if (repCode > 0) { /* note : if repCode==0, no change */ + U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; + rep[2] = (repCode >= 2) ? rep[1] : rep[2]; + rep[1] = rep[0]; + rep[0] = currentOffset; + } else { /* repCode == 0 */ + /* nothing to do */ + } + } +} + +typedef struct repcodes_s { + U32 rep[3]; +} repcodes_t; + +MEM_STATIC repcodes_t +ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase_minus1, U32 const ll0) +{ + repcodes_t newReps; + ZSTD_memcpy(&newReps, rep, sizeof(newReps)); + ZSTD_updateRep(newReps.rep, offBase_minus1, ll0); + return newReps; +} + /*-************************************* * Match length counter @@ -651,8 +705,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val) # if STATIC_BMI2 return _tzcnt_u64(val) >> 3; # else - unsigned long r = 0; - return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0; + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, (U64)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (__builtin_ctzll((U64)val) >> 3); @@ -669,8 +729,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val) # endif } else { /* 32 bits */ # if defined(_MSC_VER) - unsigned long r=0; - return _BitScanForward( &r, (U32)val ) ? (unsigned)(r >> 3) : 0; + if (val != 0) { + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } # elif defined(__GNUC__) && (__GNUC__ >= 3) return (__builtin_ctz((U32)val) >> 3); # else @@ -687,8 +753,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val) # if STATIC_BMI2 return _lzcnt_u64(val) >> 3; # else - unsigned long r = 0; - return _BitScanReverse64(&r, (U64)val) ? (unsigned)(r >> 3) : 0; + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, (U64)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (__builtin_clzll(val) >> 3); @@ -702,8 +774,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val) # endif } else { /* 32 bits */ # if defined(_MSC_VER) - unsigned long r = 0; - return _BitScanReverse( &r, (unsigned long)val ) ? (unsigned)(r >> 3) : 0; + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, (unsigned long)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } # elif defined(__GNUC__) && (__GNUC__ >= 3) return (__builtin_clz((U32)val) >> 3); # else @@ -884,9 +962,9 @@ MEM_STATIC void ZSTD_window_clear(ZSTD_window_t* window) MEM_STATIC U32 ZSTD_window_isEmpty(ZSTD_window_t const window) { - return window.dictLimit == 1 && - window.lowLimit == 1 && - (window.nextSrc - window.base) == 1; + return window.dictLimit == ZSTD_WINDOW_START_INDEX && + window.lowLimit == ZSTD_WINDOW_START_INDEX && + (window.nextSrc - window.base) == ZSTD_WINDOW_START_INDEX; } /** @@ -937,7 +1015,9 @@ MEM_STATIC U32 ZSTD_window_canOverflowCorrect(ZSTD_window_t const window, { U32 const cycleSize = 1u << cycleLog; U32 const curr = (U32)((BYTE const*)src - window.base); - U32 const minIndexToOverflowCorrect = cycleSize + MAX(maxDist, cycleSize); + U32 const minIndexToOverflowCorrect = cycleSize + + MAX(maxDist, cycleSize) + + ZSTD_WINDOW_START_INDEX; /* Adjust the min index to backoff the overflow correction frequency, * so we don't waste too much CPU in overflow correction. If this @@ -1012,10 +1092,14 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, U32 const cycleSize = 1u << cycleLog; U32 const cycleMask = cycleSize - 1; U32 const curr = (U32)((BYTE const*)src - window->base); - U32 const currentCycle0 = curr & cycleMask; - /* Exclude zero so that newCurrent - maxDist >= 1. */ - U32 const currentCycle1 = currentCycle0 == 0 ? cycleSize : currentCycle0; - U32 const newCurrent = currentCycle1 + MAX(maxDist, cycleSize); + U32 const currentCycle = curr & cycleMask; + /* Ensure newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX. */ + U32 const currentCycleCorrection = currentCycle < ZSTD_WINDOW_START_INDEX + ? MAX(cycleSize, ZSTD_WINDOW_START_INDEX) + : 0; + U32 const newCurrent = currentCycle + + currentCycleCorrection + + MAX(maxDist, cycleSize); U32 const correction = curr - newCurrent; /* maxDist must be a power of two so that: * (newCurrent & cycleMask) == (curr & cycleMask) @@ -1031,14 +1115,20 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog, window->base += correction; window->dictBase += correction; - if (window->lowLimit <= correction) window->lowLimit = 1; - else window->lowLimit -= correction; - if (window->dictLimit <= correction) window->dictLimit = 1; - else window->dictLimit -= correction; + if (window->lowLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->lowLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->lowLimit -= correction; + } + if (window->dictLimit < correction + ZSTD_WINDOW_START_INDEX) { + window->dictLimit = ZSTD_WINDOW_START_INDEX; + } else { + window->dictLimit -= correction; + } /* Ensure we can still reference the full window. */ assert(newCurrent >= maxDist); - assert(newCurrent - maxDist >= 1); + assert(newCurrent - maxDist >= ZSTD_WINDOW_START_INDEX); /* Ensure that lowLimit and dictLimit didn't underflow. */ assert(window->lowLimit <= newCurrent); assert(window->dictLimit <= newCurrent); @@ -1149,11 +1239,12 @@ ZSTD_checkDictValidity(const ZSTD_window_t* window, MEM_STATIC void ZSTD_window_init(ZSTD_window_t* window) { ZSTD_memset(window, 0, sizeof(*window)); - window->base = (BYTE const*)""; - window->dictBase = (BYTE const*)""; - window->dictLimit = 1; /* start from 1, so that 1st position is valid */ - window->lowLimit = 1; /* it ensures first and later CCtx usages compress the same */ - window->nextSrc = window->base + 1; /* see issue #1241 */ + window->base = (BYTE const*)" "; + window->dictBase = (BYTE const*)" "; + ZSTD_STATIC_ASSERT(ZSTD_DUBT_UNSORTED_MARK < ZSTD_WINDOW_START_INDEX); /* Start above ZSTD_DUBT_UNSORTED_MARK */ + window->dictLimit = ZSTD_WINDOW_START_INDEX; /* start from >0, so that 1st position is valid */ + window->lowLimit = ZSTD_WINDOW_START_INDEX; /* it ensures first and later CCtx usages compress the same */ + window->nextSrc = window->base + ZSTD_WINDOW_START_INDEX; /* see issue #1241 */ window->nbOverflowCorrections = 0; } @@ -1206,15 +1297,15 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window, */ MEM_STATIC U32 ZSTD_getLowestMatchIndex(const ZSTD_matchState_t* ms, U32 curr, unsigned windowLog) { - U32 const maxDistance = 1U << windowLog; - U32 const lowestValid = ms->window.lowLimit; - U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; - U32 const isDictionary = (ms->loadedDictEnd != 0); + U32 const maxDistance = 1U << windowLog; + U32 const lowestValid = ms->window.lowLimit; + U32 const withinWindow = (curr - lowestValid > maxDistance) ? curr - maxDistance : lowestValid; + U32 const isDictionary = (ms->loadedDictEnd != 0); /* When using a dictionary the entire dictionary is valid if a single byte of the dictionary * is within the window. We invalidate the dictionary (and set loadedDictEnd to 0) when it isn't * valid for the entire block. So this check is sufficient to find the lowest valid match index. */ - U32 const matchLowest = isDictionary ? lowestValid : withinWindow; + U32 const matchLowest = isDictionary ? lowestValid : withinWindow; return matchLowest; } diff --git a/thirdparty/zstd/compress/zstd_compress_literals.c b/thirdparty/zstd/compress/zstd_compress_literals.c index 008337bb1b..52b0a8059a 100644 --- a/thirdparty/zstd/compress/zstd_compress_literals.c +++ b/thirdparty/zstd/compress/zstd_compress_literals.c @@ -73,7 +73,8 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, void* dst, size_t dstCapacity, const void* src, size_t srcSize, void* entropyWorkspace, size_t entropyWorkspaceSize, - const int bmi2) + const int bmi2, + unsigned suspectUncompressible) { size_t const minGain = ZSTD_minGain(srcSize, strategy); size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB); @@ -105,11 +106,11 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, HUF_compress1X_repeat( ostart+lhSize, dstCapacity-lhSize, src, srcSize, HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2) : + (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2, suspectUncompressible) : HUF_compress4X_repeat( ostart+lhSize, dstCapacity-lhSize, src, srcSize, HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2); + (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2, suspectUncompressible); if (repeat != HUF_repeat_none) { /* reused the existing table */ DEBUGLOG(5, "Reusing previous huffman table"); diff --git a/thirdparty/zstd/compress/zstd_compress_literals.h b/thirdparty/zstd/compress/zstd_compress_literals.h index 9904c0cd30..9775fb97cb 100644 --- a/thirdparty/zstd/compress/zstd_compress_literals.h +++ b/thirdparty/zstd/compress/zstd_compress_literals.h @@ -18,12 +18,14 @@ size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize); +/* If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, ZSTD_hufCTables_t* nextHuf, ZSTD_strategy strategy, int disableLiteralCompression, void* dst, size_t dstCapacity, const void* src, size_t srcSize, void* entropyWorkspace, size_t entropyWorkspaceSize, - const int bmi2); + const int bmi2, + unsigned suspectUncompressible); #endif /* ZSTD_COMPRESS_LITERALS_H */ diff --git a/thirdparty/zstd/compress/zstd_compress_sequences.c b/thirdparty/zstd/compress/zstd_compress_sequences.c index 611eabdcbb..f1e40af2ea 100644 --- a/thirdparty/zstd/compress/zstd_compress_sequences.c +++ b/thirdparty/zstd/compress/zstd_compress_sequences.c @@ -275,10 +275,11 @@ ZSTD_buildCTable(void* dst, size_t dstCapacity, assert(nbSeq_1 > 1); assert(entropyWorkspaceSize >= sizeof(ZSTD_BuildCTableWksp)); (void)entropyWorkspaceSize; - FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), ""); - { size_t const NCountSize = FSE_writeNCount(op, oend - op, wksp->norm, max, tableLog); /* overflow protected */ + FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), "FSE_normalizeCount failed"); + assert(oend >= op); + { size_t const NCountSize = FSE_writeNCount(op, (size_t)(oend - op), wksp->norm, max, tableLog); /* overflow protected */ FORWARD_IF_ERROR(NCountSize, "FSE_writeNCount failed"); - FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), ""); + FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), "FSE_buildCTable_wksp failed"); return NCountSize; } } @@ -312,19 +313,19 @@ ZSTD_encodeSequences_body( FSE_initCState2(&stateLitLength, CTable_LitLength, llCodeTable[nbSeq-1]); BIT_addBits(&blockStream, sequences[nbSeq-1].litLength, LL_bits[llCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[nbSeq-1].matchLength, ML_bits[mlCodeTable[nbSeq-1]]); + BIT_addBits(&blockStream, sequences[nbSeq-1].mlBase, ML_bits[mlCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); if (longOffsets) { U32 const ofBits = ofCodeTable[nbSeq-1]; unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { - BIT_addBits(&blockStream, sequences[nbSeq-1].offset, extraBits); + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, extraBits); BIT_flushBits(&blockStream); } - BIT_addBits(&blockStream, sequences[nbSeq-1].offset >> extraBits, + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase >> extraBits, ofBits - extraBits); } else { - BIT_addBits(&blockStream, sequences[nbSeq-1].offset, ofCodeTable[nbSeq-1]); + BIT_addBits(&blockStream, sequences[nbSeq-1].offBase, ofCodeTable[nbSeq-1]); } BIT_flushBits(&blockStream); @@ -338,8 +339,8 @@ ZSTD_encodeSequences_body( U32 const mlBits = ML_bits[mlCode]; DEBUGLOG(6, "encoding: litlen:%2u - matchlen:%2u - offCode:%7u", (unsigned)sequences[n].litLength, - (unsigned)sequences[n].matchLength + MINMATCH, - (unsigned)sequences[n].offset); + (unsigned)sequences[n].mlBase + MINMATCH, + (unsigned)sequences[n].offBase); /* 32b*/ /* 64b*/ /* (7)*/ /* (7)*/ FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */ @@ -350,18 +351,18 @@ ZSTD_encodeSequences_body( BIT_flushBits(&blockStream); /* (7)*/ BIT_addBits(&blockStream, sequences[n].litLength, llBits); if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream); - BIT_addBits(&blockStream, sequences[n].matchLength, mlBits); + BIT_addBits(&blockStream, sequences[n].mlBase, mlBits); if (MEM_32bits() || (ofBits+mlBits+llBits > 56)) BIT_flushBits(&blockStream); if (longOffsets) { unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { - BIT_addBits(&blockStream, sequences[n].offset, extraBits); + BIT_addBits(&blockStream, sequences[n].offBase, extraBits); BIT_flushBits(&blockStream); /* (7)*/ } - BIT_addBits(&blockStream, sequences[n].offset >> extraBits, + BIT_addBits(&blockStream, sequences[n].offBase >> extraBits, ofBits - extraBits); /* 31 */ } else { - BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */ + BIT_addBits(&blockStream, sequences[n].offBase, ofBits); /* 31 */ } BIT_flushBits(&blockStream); /* (7)*/ DEBUGLOG(7, "remaining space : %i", (int)(blockStream.endPtr - blockStream.ptr)); @@ -398,7 +399,7 @@ ZSTD_encodeSequences_default( #if DYNAMIC_BMI2 -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t ZSTD_encodeSequences_bmi2( void* dst, size_t dstCapacity, FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable, diff --git a/thirdparty/zstd/compress/zstd_compress_superblock.c b/thirdparty/zstd/compress/zstd_compress_superblock.c index e4e45069bc..10e3378577 100644 --- a/thirdparty/zstd/compress/zstd_compress_superblock.c +++ b/thirdparty/zstd/compress/zstd_compress_superblock.c @@ -132,6 +132,7 @@ static size_t ZSTD_seqDecompressedSize(seqStore_t const* seqStore, const seqDef* const seqDef* sp = sstart; size_t matchLengthSum = 0; size_t litLengthSum = 0; + (void)(litLengthSum); /* suppress unused variable warning on some environments */ while (send-sp > 0) { ZSTD_sequenceLength const seqLen = ZSTD_getSequenceLength(seqStore, sp); litLengthSum += seqLen.litLength; @@ -324,7 +325,7 @@ static size_t ZSTD_estimateSubBlockSize_literal(const BYTE* literals, size_t lit static size_t ZSTD_estimateSubBlockSize_symbolType(symbolEncodingType_e type, const BYTE* codeTable, unsigned maxCode, size_t nbSeq, const FSE_CTable* fseCTable, - const U32* additionalBits, + const U8* additionalBits, short const* defaultNorm, U32 defaultNormLog, U32 defaultMax, void* workspace, size_t wkspSize) { @@ -474,7 +475,7 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, /* I think there is an optimization opportunity here. * Calling ZSTD_estimateSubBlockSize for every sequence can be wasteful * since it recalculates estimate from scratch. - * For example, it would recount literal distribution and symbol codes everytime. + * For example, it would recount literal distribution and symbol codes every time. */ cBlockSizeEstimate = ZSTD_estimateSubBlockSize(lp, litSize, ofCodePtr, llCodePtr, mlCodePtr, seqCount, &nextCBlock->entropy, entropyMetadata, @@ -538,7 +539,7 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, repcodes_t rep; ZSTD_memcpy(&rep, prevCBlock->rep, sizeof(rep)); for (seq = sstart; seq < sp; ++seq) { - rep = ZSTD_updateRep(rep.rep, seq->offset - 1, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); + ZSTD_updateRep(rep.rep, seq->offBase - 1, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); } ZSTD_memcpy(nextCBlock->rep, &rep, sizeof(rep)); } diff --git a/thirdparty/zstd/compress/zstd_cwksp.h b/thirdparty/zstd/compress/zstd_cwksp.h index 2656d26ca2..dc3f40c80c 100644 --- a/thirdparty/zstd/compress/zstd_cwksp.h +++ b/thirdparty/zstd/compress/zstd_cwksp.h @@ -219,7 +219,7 @@ MEM_STATIC size_t ZSTD_cwksp_aligned_alloc_size(size_t size) { MEM_STATIC size_t ZSTD_cwksp_slack_space_required(void) { /* For alignment, the wksp will always allocate an additional n_1=[1, 64] bytes * to align the beginning of tables section, as well as another n_2=[0, 63] bytes - * to align the beginning of the aligned secion. + * to align the beginning of the aligned section. * * n_1 + n_2 == 64 bytes if the cwksp is freshly allocated, due to tables and * aligneds being sized in multiples of 64 bytes. @@ -243,12 +243,14 @@ MEM_STATIC size_t ZSTD_cwksp_bytes_to_align_ptr(void* ptr, const size_t alignByt /** * Internal function. Do not use directly. - * Reserves the given number of bytes within the aligned/buffer segment of the wksp, which - * counts from the end of the wksp. (as opposed to the object/table segment) + * Reserves the given number of bytes within the aligned/buffer segment of the wksp, + * which counts from the end of the wksp (as opposed to the object/table segment). * * Returns a pointer to the beginning of that space. */ -MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) { +MEM_STATIC void* +ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t const bytes) +{ void* const alloc = (BYTE*)ws->allocStart - bytes; void* const bottom = ws->tableEnd; DEBUGLOG(5, "cwksp: reserving %p %zd bytes, %zd bytes remaining", @@ -260,6 +262,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t ws->allocFailed = 1; return NULL; } + /* the area is reserved from the end of wksp. + * If it overlaps with tableValidEnd, it voids guarantees on values' range */ if (alloc < ws->tableValidEnd) { ws->tableValidEnd = alloc; } @@ -269,10 +273,12 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal_buffer_space(ZSTD_cwksp* ws, size_t /** * Moves the cwksp to the next phase, and does any necessary allocations. + * cwksp initialization must necessarily go through each phase in order. * Returns a 0 on success, or zstd error */ -MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( - ZSTD_cwksp* ws, ZSTD_cwksp_alloc_phase_e phase) { +MEM_STATIC size_t +ZSTD_cwksp_internal_advance_phase(ZSTD_cwksp* ws, ZSTD_cwksp_alloc_phase_e phase) +{ assert(phase >= ws->phase); if (phase > ws->phase) { /* Going from allocating objects to allocating buffers */ @@ -295,15 +301,15 @@ MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( { /* Align the start of the tables to 64 bytes. Use [0, 63] bytes */ void* const alloc = ws->objectEnd; size_t const bytesToAlign = ZSTD_cwksp_bytes_to_align_ptr(alloc, ZSTD_CWKSP_ALIGNMENT_BYTES); - void* const end = (BYTE*)alloc + bytesToAlign; + void* const objectEnd = (BYTE*)alloc + bytesToAlign; DEBUGLOG(5, "reserving table alignment addtl space: %zu", bytesToAlign); - RETURN_ERROR_IF(end > ws->workspaceEnd, memory_allocation, + RETURN_ERROR_IF(objectEnd > ws->workspaceEnd, memory_allocation, "table phase - alignment initial allocation failed!"); - ws->objectEnd = end; - ws->tableEnd = end; - ws->tableValidEnd = end; - } - } + ws->objectEnd = objectEnd; + ws->tableEnd = objectEnd; /* table area starts being empty */ + if (ws->tableValidEnd < ws->tableEnd) { + ws->tableValidEnd = ws->tableEnd; + } } } ws->phase = phase; ZSTD_cwksp_assert_internal_consistency(ws); } @@ -313,15 +319,17 @@ MEM_STATIC size_t ZSTD_cwksp_internal_advance_phase( /** * Returns whether this object/buffer/etc was allocated in this workspace. */ -MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp* ws, const void* ptr) { +MEM_STATIC int ZSTD_cwksp_owns_buffer(const ZSTD_cwksp* ws, const void* ptr) +{ return (ptr != NULL) && (ws->workspace <= ptr) && (ptr <= ws->workspaceEnd); } /** * Internal function. Do not use directly. */ -MEM_STATIC void* ZSTD_cwksp_reserve_internal( - ZSTD_cwksp* ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase) { +MEM_STATIC void* +ZSTD_cwksp_reserve_internal(ZSTD_cwksp* ws, size_t bytes, ZSTD_cwksp_alloc_phase_e phase) +{ void* alloc; if (ZSTD_isError(ZSTD_cwksp_internal_advance_phase(ws, phase)) || bytes == 0) { return NULL; @@ -351,14 +359,16 @@ MEM_STATIC void* ZSTD_cwksp_reserve_internal( /** * Reserves and returns unaligned memory. */ -MEM_STATIC BYTE* ZSTD_cwksp_reserve_buffer(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC BYTE* ZSTD_cwksp_reserve_buffer(ZSTD_cwksp* ws, size_t bytes) +{ return (BYTE*)ZSTD_cwksp_reserve_internal(ws, bytes, ZSTD_cwksp_alloc_buffers); } /** * Reserves and returns memory sized on and aligned on ZSTD_CWKSP_ALIGNMENT_BYTES (64 bytes). */ -MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) +{ void* ptr = ZSTD_cwksp_reserve_internal(ws, ZSTD_cwksp_align(bytes, ZSTD_CWKSP_ALIGNMENT_BYTES), ZSTD_cwksp_alloc_aligned); assert(((size_t)ptr & (ZSTD_CWKSP_ALIGNMENT_BYTES-1))== 0); @@ -370,7 +380,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_aligned(ZSTD_cwksp* ws, size_t bytes) { * their values remain constrained, allowing us to re-use them without * memset()-ing them. */ -MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) { +MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) +{ const ZSTD_cwksp_alloc_phase_e phase = ZSTD_cwksp_alloc_aligned; void* alloc; void* end; @@ -408,9 +419,11 @@ MEM_STATIC void* ZSTD_cwksp_reserve_table(ZSTD_cwksp* ws, size_t bytes) { /** * Aligned on sizeof(void*). + * Note : should happen only once, at workspace first initialization */ -MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { - size_t roundedBytes = ZSTD_cwksp_align(bytes, sizeof(void*)); +MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) +{ + size_t const roundedBytes = ZSTD_cwksp_align(bytes, sizeof(void*)); void* alloc = ws->objectEnd; void* end = (BYTE*)alloc + roundedBytes; @@ -419,15 +432,15 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { end = (BYTE *)end + 2 * ZSTD_CWKSP_ASAN_REDZONE_SIZE; #endif - DEBUGLOG(5, + DEBUGLOG(4, "cwksp: reserving %p object %zd bytes (rounded to %zd), %zd bytes remaining", alloc, bytes, roundedBytes, ZSTD_cwksp_available_space(ws) - roundedBytes); - assert(((size_t)alloc & (sizeof(void*)-1)) == 0); - assert((bytes & (sizeof(void*)-1)) == 0); + assert((size_t)alloc % ZSTD_ALIGNOF(void*) == 0); + assert(bytes % ZSTD_ALIGNOF(void*) == 0); ZSTD_cwksp_assert_internal_consistency(ws); /* we must be in the first phase, no advance is possible */ if (ws->phase != ZSTD_cwksp_alloc_objects || end > ws->workspaceEnd) { - DEBUGLOG(4, "cwksp: object alloc failed!"); + DEBUGLOG(3, "cwksp: object alloc failed!"); ws->allocFailed = 1; return NULL; } @@ -438,7 +451,7 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { #if ZSTD_ADDRESS_SANITIZER && !defined (ZSTD_ASAN_DONT_POISON_WORKSPACE) /* Move alloc so there's ZSTD_CWKSP_ASAN_REDZONE_SIZE unused space on * either size. */ - alloc = (BYTE *)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; + alloc = (BYTE*)alloc + ZSTD_CWKSP_ASAN_REDZONE_SIZE; if (ws->isStatic == ZSTD_cwksp_dynamic_alloc) { __asan_unpoison_memory_region(alloc, bytes); } @@ -447,7 +460,8 @@ MEM_STATIC void* ZSTD_cwksp_reserve_object(ZSTD_cwksp* ws, size_t bytes) { return alloc; } -MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws) { +MEM_STATIC void ZSTD_cwksp_mark_tables_dirty(ZSTD_cwksp* ws) +{ DEBUGLOG(4, "cwksp: ZSTD_cwksp_mark_tables_dirty"); #if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE) diff --git a/thirdparty/zstd/compress/zstd_double_fast.c b/thirdparty/zstd/compress/zstd_double_fast.c index d0d3a784dd..76933dea26 100644 --- a/thirdparty/zstd/compress/zstd_double_fast.c +++ b/thirdparty/zstd/compress/zstd_double_fast.c @@ -48,10 +48,216 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, FORCE_INLINE_TEMPLATE -size_t ZSTD_compressBlock_doubleFast_generic( +size_t ZSTD_compressBlock_doubleFast_noDict_generic( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + void const* src, size_t srcSize, U32 const mls /* template */) +{ + ZSTD_compressionParameters const* cParams = &ms->cParams; + U32* const hashLong = ms->hashTable; + const U32 hBitsL = cParams->hashLog; + U32* const hashSmall = ms->chainTable; + const U32 hBitsS = cParams->chainLog; + const BYTE* const base = ms->window.base; + const BYTE* const istart = (const BYTE*)src; + const BYTE* anchor = istart; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + /* presumes that, if there is a dictionary, it must be using Attach mode */ + const U32 prefixLowestIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); + const BYTE* const prefixLowest = base + prefixLowestIndex; + const BYTE* const iend = istart + srcSize; + const BYTE* const ilimit = iend - HASH_READ_SIZE; + U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved = 0; + + size_t mLength; + U32 offset; + U32 curr; + + /* how many positions to search before increasing step size */ + const size_t kStepIncr = 1 << kSearchStrength; + /* the position at which to increment the step size if no match is found */ + const BYTE* nextStep; + size_t step; /* the current step size */ + + size_t hl0; /* the long hash at ip */ + size_t hl1; /* the long hash at ip1 */ + + U32 idxl0; /* the long match index for ip */ + U32 idxl1; /* the long match index for ip1 */ + + const BYTE* matchl0; /* the long match for ip */ + const BYTE* matchs0; /* the short match for ip */ + const BYTE* matchl1; /* the long match for ip1 */ + + const BYTE* ip = istart; /* the current position */ + const BYTE* ip1; /* the next position */ + + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_noDict_generic"); + + /* init */ + ip += ((ip - prefixLowest) == 0); + { + U32 const current = (U32)(ip - base); + U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, current, cParams->windowLog); + U32 const maxRep = current - windowLow; + if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; + } + + /* Outer Loop: one iteration per match found and stored */ + while (1) { + step = 1; + nextStep = ip + kStepIncr; + ip1 = ip + step; + + if (ip1 > ilimit) { + goto _cleanup; + } + + hl0 = ZSTD_hashPtr(ip, hBitsL, 8); + idxl0 = hashLong[hl0]; + matchl0 = base + idxl0; + + /* Inner Loop: one iteration per search / position */ + do { + const size_t hs0 = ZSTD_hashPtr(ip, hBitsS, mls); + const U32 idxs0 = hashSmall[hs0]; + curr = (U32)(ip-base); + matchs0 = base + idxs0; + + hashLong[hl0] = hashSmall[hs0] = curr; /* update hash tables */ + + /* check noDict repcode */ + if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { + mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; + ip++; + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); + goto _match_stored; + } + + hl1 = ZSTD_hashPtr(ip1, hBitsL, 8); + + if (idxl0 > prefixLowestIndex) { + /* check prefix long match */ + if (MEM_read64(matchl0) == MEM_read64(ip)) { + mLength = ZSTD_count(ip+8, matchl0+8, iend) + 8; + offset = (U32)(ip-matchl0); + while (((ip>anchor) & (matchl0>prefixLowest)) && (ip[-1] == matchl0[-1])) { ip--; matchl0--; mLength++; } /* catch up */ + goto _match_found; + } + } + + idxl1 = hashLong[hl1]; + matchl1 = base + idxl1; + + if (idxs0 > prefixLowestIndex) { + /* check prefix short match */ + if (MEM_read32(matchs0) == MEM_read32(ip)) { + goto _search_next_long; + } + } + + if (ip1 >= nextStep) { + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + step++; + nextStep += kStepIncr; + } + ip = ip1; + ip1 += step; + + hl0 = hl1; + idxl0 = idxl1; + matchl0 = matchl1; + #if defined(__aarch64__) + PREFETCH_L1(ip+256); + #endif + } while (ip1 <= ilimit); + +_cleanup: + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved; + rep[1] = offset_2 ? offset_2 : offsetSaved; + + /* Return the last literals size */ + return (size_t)(iend - anchor); + +_search_next_long: + + /* check prefix long +1 match */ + if (idxl1 > prefixLowestIndex) { + if (MEM_read64(matchl1) == MEM_read64(ip1)) { + ip = ip1; + mLength = ZSTD_count(ip+8, matchl1+8, iend) + 8; + offset = (U32)(ip-matchl1); + while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */ + goto _match_found; + } + } + + /* if no long +1 match, explore the short match we found */ + mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4; + offset = (U32)(ip - matchs0); + while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */ + + /* fall-through */ + +_match_found: /* requires ip, offset, mLength */ + offset_2 = offset_1; + offset_1 = offset; + + if (step < 4) { + /* It is unsafe to write this value back to the hashtable when ip1 is + * greater than or equal to the new ip we will have after we're done + * processing this match. Rather than perform that test directly + * (ip1 >= ip + mLength), which costs speed in practice, we do a simpler + * more predictable test. The minmatch even if we take a short match is + * 4 bytes, so as long as step, the distance between ip and ip1 + * (initially) is less than 4, we know ip1 < new ip. */ + hashLong[hl1] = (U32)(ip1 - base); + } + + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + +_match_stored: + /* match found */ + ip += mLength; + anchor = ip; + + if (ip <= ilimit) { + /* Complementary insertion */ + /* done after iLimit test, as candidates could be > iend-8 */ + { U32 const indexToInsert = curr+2; + hashLong[ZSTD_hashPtr(base+indexToInsert, hBitsL, 8)] = indexToInsert; + hashLong[ZSTD_hashPtr(ip-2, hBitsL, 8)] = (U32)(ip-2-base); + hashSmall[ZSTD_hashPtr(base+indexToInsert, hBitsS, mls)] = indexToInsert; + hashSmall[ZSTD_hashPtr(ip-1, hBitsS, mls)] = (U32)(ip-1-base); + } + + /* check immediate repcode */ + while ( (ip <= ilimit) + && ( (offset_2>0) + & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; + U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, rLength); + ip += rLength; + anchor = ip; + continue; /* faster when present ... (?) */ + } + } + } +} + + +FORCE_INLINE_TEMPLATE +size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize, - U32 const mls /* template */, ZSTD_dictMode_e const dictMode) + U32 const mls /* template */) { ZSTD_compressionParameters const* cParams = &ms->cParams; U32* const hashLong = ms->hashTable; @@ -72,54 +278,30 @@ size_t ZSTD_compressBlock_doubleFast_generic( U32 offsetSaved = 0; const ZSTD_matchState_t* const dms = ms->dictMatchState; - const ZSTD_compressionParameters* const dictCParams = - dictMode == ZSTD_dictMatchState ? - &dms->cParams : NULL; - const U32* const dictHashLong = dictMode == ZSTD_dictMatchState ? - dms->hashTable : NULL; - const U32* const dictHashSmall = dictMode == ZSTD_dictMatchState ? - dms->chainTable : NULL; - const U32 dictStartIndex = dictMode == ZSTD_dictMatchState ? - dms->window.dictLimit : 0; - const BYTE* const dictBase = dictMode == ZSTD_dictMatchState ? - dms->window.base : NULL; - const BYTE* const dictStart = dictMode == ZSTD_dictMatchState ? - dictBase + dictStartIndex : NULL; - const BYTE* const dictEnd = dictMode == ZSTD_dictMatchState ? - dms->window.nextSrc : NULL; - const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ? - prefixLowestIndex - (U32)(dictEnd - dictBase) : - 0; - const U32 dictHBitsL = dictMode == ZSTD_dictMatchState ? - dictCParams->hashLog : hBitsL; - const U32 dictHBitsS = dictMode == ZSTD_dictMatchState ? - dictCParams->chainLog : hBitsS; + const ZSTD_compressionParameters* const dictCParams = &dms->cParams; + const U32* const dictHashLong = dms->hashTable; + const U32* const dictHashSmall = dms->chainTable; + const U32 dictStartIndex = dms->window.dictLimit; + const BYTE* const dictBase = dms->window.base; + const BYTE* const dictStart = dictBase + dictStartIndex; + const BYTE* const dictEnd = dms->window.nextSrc; + const U32 dictIndexDelta = prefixLowestIndex - (U32)(dictEnd - dictBase); + const U32 dictHBitsL = dictCParams->hashLog; + const U32 dictHBitsS = dictCParams->chainLog; const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictStart)); - DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_generic"); - - assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState); + DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_dictMatchState_generic"); /* if a dictionary is attached, it must be within window range */ - if (dictMode == ZSTD_dictMatchState) { - assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); - } + assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); /* init */ ip += (dictAndPrefixLength == 0); - if (dictMode == ZSTD_noDict) { - U32 const curr = (U32)(ip - base); - U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); - U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; - if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; - } - if (dictMode == ZSTD_dictMatchState) { - /* dictMatchState repCode checks don't currently handle repCode == 0 - * disabling. */ - assert(offset_1 <= dictAndPrefixLength); - assert(offset_2 <= dictAndPrefixLength); - } + + /* dictMatchState repCode checks don't currently handle repCode == 0 + * disabling. */ + assert(offset_1 <= dictAndPrefixLength); + assert(offset_2 <= dictAndPrefixLength); /* Main Search Loop */ while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ @@ -135,29 +317,18 @@ size_t ZSTD_compressBlock_doubleFast_generic( const BYTE* matchLong = base + matchIndexL; const BYTE* match = base + matchIndexS; const U32 repIndex = curr + 1 - offset_1; - const BYTE* repMatch = (dictMode == ZSTD_dictMatchState - && repIndex < prefixLowestIndex) ? + const BYTE* repMatch = (repIndex < prefixLowestIndex) ? dictBase + (repIndex - dictIndexDelta) : base + repIndex; hashLong[h2] = hashSmall[h] = curr; /* update hash tables */ - /* check dictMatchState repcode */ - if (dictMode == ZSTD_dictMatchState - && ((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) + /* check repcode */ + if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */) && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); - goto _match_stored; - } - - /* check noDict repcode */ - if ( dictMode == ZSTD_noDict - && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) { - mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); goto _match_stored; } @@ -169,7 +340,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ goto _match_found; } - } else if (dictMode == ZSTD_dictMatchState) { + } else { /* check dictMatchState long match */ U32 const dictMatchIndexL = dictHashLong[dictHL]; const BYTE* dictMatchL = dictBase + dictMatchIndexL; @@ -187,7 +358,7 @@ size_t ZSTD_compressBlock_doubleFast_generic( if (MEM_read32(match) == MEM_read32(ip)) { goto _search_next_long; } - } else if (dictMode == ZSTD_dictMatchState) { + } else { /* check dictMatchState short match */ U32 const dictMatchIndexS = dictHashSmall[dictHS]; match = dictBase + dictMatchIndexS; @@ -220,7 +391,7 @@ _search_next_long: while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ goto _match_found; } - } else if (dictMode == ZSTD_dictMatchState) { + } else { /* check dict long +1 match */ U32 const dictMatchIndexL3 = dictHashLong[dictHLNext]; const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; @@ -234,7 +405,7 @@ _search_next_long: } } } /* if no long +1 match, explore the short match we found */ - if (dictMode == ZSTD_dictMatchState && matchIndexS < prefixLowestIndex) { + if (matchIndexS < prefixLowestIndex) { mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4; offset = (U32)(curr - matchIndexS); while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ @@ -244,13 +415,11 @@ _search_next_long: while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ } - /* fall-through */ - _match_found: offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); _match_stored: /* match found */ @@ -268,43 +437,27 @@ _match_stored: } /* check immediate repcode */ - if (dictMode == ZSTD_dictMatchState) { - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); - U32 const repIndex2 = current2 - offset_2; - const BYTE* repMatch2 = dictMode == ZSTD_dictMatchState - && repIndex2 < prefixLowestIndex ? - dictBase + repIndex2 - dictIndexDelta : - base + repIndex2; - if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { - const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; - U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); - hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; - hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; - ip += repLength2; - anchor = ip; - continue; - } - break; - } } - - if (dictMode == ZSTD_noDict) { - while ( (ip <= ilimit) - && ( (offset_2>0) - & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { - /* store sequence */ - size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; - U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ - hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); - hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, rLength-MINMATCH); - ip += rLength; + while (ip <= ilimit) { + U32 const current2 = (U32)(ip-base); + U32 const repIndex2 = current2 - offset_2; + const BYTE* repMatch2 = repIndex2 < prefixLowestIndex ? + dictBase + repIndex2 - dictIndexDelta : + base + repIndex2; + if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) + && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; + U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); + hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; + hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; + ip += repLength2; anchor = ip; - continue; /* faster when present ... (?) */ - } } } + continue; + } + break; + } + } } /* while (ip < ilimit) */ /* save reps for next block */ @@ -315,6 +468,24 @@ _match_stored: return (size_t)(iend - anchor); } +#define ZSTD_GEN_DFAST_FN(dictMode, mls) \ + static size_t ZSTD_compressBlock_doubleFast_##dictMode##_##mls( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_doubleFast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls); \ + } + +ZSTD_GEN_DFAST_FN(noDict, 4) +ZSTD_GEN_DFAST_FN(noDict, 5) +ZSTD_GEN_DFAST_FN(noDict, 6) +ZSTD_GEN_DFAST_FN(noDict, 7) + +ZSTD_GEN_DFAST_FN(dictMatchState, 4) +ZSTD_GEN_DFAST_FN(dictMatchState, 5) +ZSTD_GEN_DFAST_FN(dictMatchState, 6) +ZSTD_GEN_DFAST_FN(dictMatchState, 7) + size_t ZSTD_compressBlock_doubleFast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -325,13 +496,13 @@ size_t ZSTD_compressBlock_doubleFast( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast_noDict_7(ms, seqStore, rep, src, srcSize); } } @@ -345,13 +516,13 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState); + return ZSTD_compressBlock_doubleFast_dictMatchState_7(ms, seqStore, rep, src, srcSize); } } @@ -387,7 +558,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( /* if extDict is invalidated due to maxDistance, switch to "regular" variant */ if (prefixStartIndex == dictStartIndex) - return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, mls, ZSTD_noDict); + return ZSTD_compressBlock_doubleFast(ms, seqStore, rep, src, srcSize); /* Search Loop */ while (ip < ilimit) { /* < instead of <=, because (ip+1) */ @@ -409,12 +580,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( hashSmall[hSmall] = hashLong[hLong] = curr; /* update hash table */ if ((((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex doesn't overlap dict + prefix */ - & (offset_1 < curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */ + & (offset_1 <= curr+1 - dictStartIndex)) /* note: we are searching at curr+1 */ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); } else { if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) { const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend; @@ -425,7 +596,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) { size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8); @@ -450,7 +621,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( } offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); } else { ip += ((ip-anchor) >> kSearchStrength) + 1; @@ -477,12 +648,12 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( U32 const repIndex2 = current2 - offset_2; const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) /* intentional overflow : ensure repIndex2 doesn't overlap dict + prefix */ - & (offset_2 < current2 - dictStartIndex)) + & (offset_2 <= current2 - dictStartIndex)) && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; ip += repLength2; @@ -500,6 +671,10 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( return (size_t)(iend - anchor); } +ZSTD_GEN_DFAST_FN(extDict, 4) +ZSTD_GEN_DFAST_FN(extDict, 5) +ZSTD_GEN_DFAST_FN(extDict, 6) +ZSTD_GEN_DFAST_FN(extDict, 7) size_t ZSTD_compressBlock_doubleFast_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -510,12 +685,12 @@ size_t ZSTD_compressBlock_doubleFast_extDict( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 4); + return ZSTD_compressBlock_doubleFast_extDict_4(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 5); + return ZSTD_compressBlock_doubleFast_extDict_5(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 6); + return ZSTD_compressBlock_doubleFast_extDict_6(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 7); + return ZSTD_compressBlock_doubleFast_extDict_7(ms, seqStore, rep, src, srcSize); } } diff --git a/thirdparty/zstd/compress/zstd_fast.c b/thirdparty/zstd/compress/zstd_fast.c index 4edc04dccd..802fc31579 100644 --- a/thirdparty/zstd/compress/zstd_fast.c +++ b/thirdparty/zstd/compress/zstd_fast.c @@ -43,145 +43,294 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, } +/** + * If you squint hard enough (and ignore repcodes), the search operation at any + * given position is broken into 4 stages: + * + * 1. Hash (map position to hash value via input read) + * 2. Lookup (map hash val to index via hashtable read) + * 3. Load (map index to value at that position via input read) + * 4. Compare + * + * Each of these steps involves a memory read at an address which is computed + * from the previous step. This means these steps must be sequenced and their + * latencies are cumulative. + * + * Rather than do 1->2->3->4 sequentially for a single position before moving + * onto the next, this implementation interleaves these operations across the + * next few positions: + * + * R = Repcode Read & Compare + * H = Hash + * T = Table Lookup + * M = Match Read & Compare + * + * Pos | Time --> + * ----+------------------- + * N | ... M + * N+1 | ... TM + * N+2 | R H T M + * N+3 | H TM + * N+4 | R H T M + * N+5 | H ... + * N+6 | R ... + * + * This is very much analogous to the pipelining of execution in a CPU. And just + * like a CPU, we have to dump the pipeline when we find a match (i.e., take a + * branch). + * + * When this happens, we throw away our current state, and do the following prep + * to re-enter the loop: + * + * Pos | Time --> + * ----+------------------- + * N | H T + * N+1 | H + * + * This is also the work we do at the beginning to enter the loop initially. + */ FORCE_INLINE_TEMPLATE size_t -ZSTD_compressBlock_fast_generic( +ZSTD_compressBlock_fast_noDict_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize, - U32 const mls) + U32 const mls, U32 const hasStep) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - size_t const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; + size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; const BYTE* const base = ms->window.base; const BYTE* const istart = (const BYTE*)src; - /* We check ip0 (ip + 0) and ip1 (ip + 1) each loop */ - const BYTE* ip0 = istart; - const BYTE* ip1; - const BYTE* anchor = istart; const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); const U32 prefixStartIndex = ZSTD_getLowestPrefixIndex(ms, endIndex, cParams->windowLog); const BYTE* const prefixStart = base + prefixStartIndex; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; - U32 offset_1=rep[0], offset_2=rep[1]; + + const BYTE* anchor = istart; + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + U32 rep_offset1 = rep[0]; + U32 rep_offset2 = rep[1]; U32 offsetSaved = 0; - /* init */ + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + U32 mval; /* src value at match idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + + /* ip0 and ip1 are always adjacent. The targetLength skipping and + * uncompressibility acceleration is applied to every other position, + * matching the behavior of #1562. step therefore represents the gap + * between pairs of positions, from ip0 to ip2 or ip1 to ip3. */ + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); + DEBUGLOG(5, "ZSTD_compressBlock_fast_generic"); ip0 += (ip0 == prefixStart); - ip1 = ip0 + 1; { U32 const curr = (U32)(ip0 - base); U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; - if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; + if (rep_offset2 > maxRep) offsetSaved = rep_offset2, rep_offset2 = 0; + if (rep_offset1 > maxRep) offsetSaved = rep_offset1, rep_offset1 = 0; } - /* Main Search Loop */ -#ifdef __INTEL_COMPILER - /* From intel 'The vector pragma indicates that the loop should be - * vectorized if it is legal to do so'. Can be used together with - * #pragma ivdep (but have opted to exclude that because intel - * warns against using it).*/ - #pragma vector always -#endif - while (ip1 < ilimit) { /* < instead of <=, because check at ip0+2 */ - size_t mLength; - BYTE const* ip2 = ip0 + 2; - size_t const h0 = ZSTD_hashPtr(ip0, hlog, mls); - U32 const val0 = MEM_read32(ip0); - size_t const h1 = ZSTD_hashPtr(ip1, hlog, mls); - U32 const val1 = MEM_read32(ip1); - U32 const current0 = (U32)(ip0-base); - U32 const current1 = (U32)(ip1-base); - U32 const matchIndex0 = hashTable[h0]; - U32 const matchIndex1 = hashTable[h1]; - BYTE const* repMatch = ip2 - offset_1; - const BYTE* match0 = base + matchIndex0; - const BYTE* match1 = base + matchIndex1; - U32 offcode; - -#if defined(__aarch64__) - PREFETCH_L1(ip0+256); -#endif - - hashTable[h0] = current0; /* update hash table */ - hashTable[h1] = current1; /* update hash table */ - - assert(ip0 + 1 == ip1); - - if ((offset_1 > 0) & (MEM_read32(repMatch) == MEM_read32(ip2))) { - mLength = (ip2[-1] == repMatch[-1]) ? 1 : 0; - ip0 = ip2 - mLength; - match0 = repMatch - mLength; + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + + do { + /* load repcode match for ip[2]*/ + const U32 rval = MEM_read32(ip2 - rep_offset1); + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if ((MEM_read32(ip2) == rval) & (rep_offset1 > 0)) { + ip0 = ip2; + match0 = ip0 - rep_offset1; + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = STORE_REPCODE_1; mLength += 4; - offcode = 0; goto _match; } - if ((matchIndex0 > prefixStartIndex) && MEM_read32(match0) == val0) { - /* found a regular match */ - goto _offset; + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ } - if ((matchIndex1 > prefixStartIndex) && MEM_read32(match1) == val1) { - /* found a regular match after one literal */ - ip0 = ip1; - match0 = match1; + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ goto _offset; } - { size_t const step = ((size_t)(ip0-anchor) >> (kSearchStrength - 1)) + stepSize; - assert(step >= 2); - ip0 += step; - ip1 += step; - continue; + + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* load match for ip[0] */ + if (idx >= prefixStartIndex) { + mval = MEM_read32(base + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ } -_offset: /* Requires: ip0, match0 */ - /* Compute the offset code */ - offset_2 = offset_1; - offset_1 = (U32)(ip0-match0); - offcode = offset_1 + ZSTD_REP_MOVE; - mLength = 4; - /* Count the backwards match length */ - while (((ip0>anchor) & (match0>prefixStart)) - && (ip0[-1] == match0[-1])) { ip0--; match0--; mLength++; } /* catch up */ -_match: /* Requires: ip0, match0, offcode */ - /* Count the forward length */ - mLength += ZSTD_count(ip0+mLength, match0+mLength, iend); - ZSTD_storeSeq(seqStore, (size_t)(ip0-anchor), anchor, iend, offcode, mLength-MINMATCH); - /* match found */ - ip0 += mLength; - anchor = ip0; + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } - if (ip0 <= ilimit) { - /* Fill Table */ - assert(base+current0+2 > istart); /* check base overflow */ - hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ - hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); - - if (offset_2 > 0) { /* offset_2==0 means offset_2 is invalidated */ - while ( (ip0 <= ilimit) && (MEM_read32(ip0) == MEM_read32(ip0 - offset_2)) ) { - /* store sequence */ - size_t const rLength = ZSTD_count(ip0+4, ip0+4-offset_2, iend) + 4; - { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */ - hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); - ip0 += rLength; - ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, 0 /*offCode*/, rLength-MINMATCH); - anchor = ip0; - continue; /* faster when present (confirmed on gcc-8) ... (?) */ - } } } - ip1 = ip0 + 1; - } + /* lookup ip[1] */ + idx = hashTable[hash1]; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = rep_offset1 ? rep_offset1 : offsetSaved; + rep[1] = rep_offset2 ? rep_offset2 : offsetSaved; /* Return the last literals size */ return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx */ + + /* Compute the offset code. */ + match0 = base + idx; + rep_offset2 = rep_offset1; + rep_offset1 = (U32)(ip0-match0); + offcode = STORE_OFFSET(rep_offset1); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>prefixStart)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } + +_match: /* Requires: ip0, match0, offcode */ + + /* Count the forward length. */ + mLength += ZSTD_count(ip0 + mLength, match0 + mLength, iend); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* write next hash table entry */ + if (ip1 < ip0) { + hashTable[hash1] = (U32)(ip1 - base); + } + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + if (rep_offset2 > 0) { /* rep_offset2==0 means rep_offset2 is invalidated */ + while ( (ip0 <= ilimit) && (MEM_read32(ip0) == MEM_read32(ip0 - rep_offset2)) ) { + /* store sequence */ + size_t const rLength = ZSTD_count(ip0+4, ip0+4-rep_offset2, iend) + 4; + { U32 const tmpOff = rep_offset2; rep_offset2 = rep_offset1; rep_offset1 = tmpOff; } /* swap rep_offset2 <=> rep_offset1 */ + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += rLength; + ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, STORE_REPCODE_1, rLength); + anchor = ip0; + continue; /* faster when present (confirmed on gcc-8) ... (?) */ + } } } + + goto _start; } +#define ZSTD_GEN_FAST_FN(dictMode, mls, step) \ + static size_t ZSTD_compressBlock_fast_##dictMode##_##mls##_##step( \ + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], \ + void const* src, size_t srcSize) \ + { \ + return ZSTD_compressBlock_fast_##dictMode##_generic(ms, seqStore, rep, src, srcSize, mls, step); \ + } + +ZSTD_GEN_FAST_FN(noDict, 4, 1) +ZSTD_GEN_FAST_FN(noDict, 5, 1) +ZSTD_GEN_FAST_FN(noDict, 6, 1) +ZSTD_GEN_FAST_FN(noDict, 7, 1) + +ZSTD_GEN_FAST_FN(noDict, 4, 0) +ZSTD_GEN_FAST_FN(noDict, 5, 0) +ZSTD_GEN_FAST_FN(noDict, 6, 0) +ZSTD_GEN_FAST_FN(noDict, 7, 0) size_t ZSTD_compressBlock_fast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -189,24 +338,40 @@ size_t ZSTD_compressBlock_fast( { U32 const mls = ms->cParams.minMatch; assert(ms->dictMatchState == NULL); - switch(mls) - { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4); - case 5 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5); - case 6 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6); - case 7 : - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7); + if (ms->cParams.targetLength > 1) { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_1(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_1(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_1(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_1(ms, seqStore, rep, src, srcSize); + } + } else { + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_noDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_noDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_noDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_noDict_7_0(ms, seqStore, rep, src, srcSize); + } + } } FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_fast_dictMatchState_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls) + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; @@ -242,6 +407,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( assert(endIndex - prefixStartIndex <= maxDistance); (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ + (void)hasStep; /* not currently specialized on whether it's accelerated */ + /* ensure there will be no underflow * when translating a dict index into a local index */ assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); @@ -272,7 +439,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); } else if ( (matchIndex <= prefixStartIndex) ) { size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls); U32 const dictMatchIndex = dictHashTable[dictHash]; @@ -292,7 +459,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); } } else if (MEM_read32(match) != MEM_read32(ip)) { /* it's not a match, and we're not going to check the dictionary */ @@ -307,7 +474,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); } /* match found */ @@ -332,7 +499,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, repLength2-MINMATCH); + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; ip += repLength2; anchor = ip; @@ -351,6 +518,12 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( return (size_t)(iend - anchor); } + +ZSTD_GEN_FAST_FN(dictMatchState, 4, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 5, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 6, 0) +ZSTD_GEN_FAST_FN(dictMatchState, 7, 0) + size_t ZSTD_compressBlock_fast_dictMatchState( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize) @@ -361,20 +534,20 @@ size_t ZSTD_compressBlock_fast_dictMatchState( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 4); + return ZSTD_compressBlock_fast_dictMatchState_4_0(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 5); + return ZSTD_compressBlock_fast_dictMatchState_5_0(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 6); + return ZSTD_compressBlock_fast_dictMatchState_6_0(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_fast_dictMatchState_generic(ms, seqStore, rep, src, srcSize, 7); + return ZSTD_compressBlock_fast_dictMatchState_7_0(ms, seqStore, rep, src, srcSize); } } static size_t ZSTD_compressBlock_fast_extDict_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls) + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; @@ -398,11 +571,13 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const ilimit = iend - 8; U32 offset_1=rep[0], offset_2=rep[1]; + (void)hasStep; /* not currently specialized on whether it's accelerated */ + DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); /* switch to "regular" variant if extDict is invalidated due to maxDistance */ if (prefixStartIndex == dictStartIndex) - return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, mls); + return ZSTD_compressBlock_fast(ms, seqStore, rep, src, srcSize); /* Search Loop */ while (ip < ilimit) { /* < instead of <=, because (ip+1) */ @@ -418,12 +593,12 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( DEBUGLOG(7, "offset_1 = %u , curr = %u", offset_1, curr); if ( ( ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow */ - & (offset_1 < curr+1 - dictStartIndex) ) /* note: we are searching at curr+1 */ + & (offset_1 <= curr+1 - dictStartIndex) ) /* note: we are searching at curr+1 */ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; size_t const rLength = ZSTD_count_2segments(ip+1 +4, repMatch +4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, 0, rLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, rLength); ip += rLength; anchor = ip; } else { @@ -439,7 +614,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( size_t mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4; while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; /* update offset history */ - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, offset + ZSTD_REP_MOVE, mLength-MINMATCH); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); ip += mLength; anchor = ip; } } @@ -453,12 +628,12 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( U32 const current2 = (U32)(ip-base); U32 const repIndex2 = current2 - offset_2; const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 < curr - dictStartIndex)) /* intentional overflow */ + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 <= curr - dictStartIndex)) /* intentional overflow */ && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, 0 /*offcode*/, repLength2-MINMATCH); + ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, STORE_REPCODE_1, repLength2); hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; ip += repLength2; anchor = ip; @@ -475,6 +650,10 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( return (size_t)(iend - anchor); } +ZSTD_GEN_FAST_FN(extDict, 4, 0) +ZSTD_GEN_FAST_FN(extDict, 5, 0) +ZSTD_GEN_FAST_FN(extDict, 6, 0) +ZSTD_GEN_FAST_FN(extDict, 7, 0) size_t ZSTD_compressBlock_fast_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], @@ -485,12 +664,12 @@ size_t ZSTD_compressBlock_fast_extDict( { default: /* includes case 3 */ case 4 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 4); + return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); case 5 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 5); + return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); case 6 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 6); + return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); case 7 : - return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 7); + return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); } } diff --git a/thirdparty/zstd/compress/zstd_lazy.c b/thirdparty/zstd/compress/zstd_lazy.c index 3d523e8472..2e38dcb46d 100644 --- a/thirdparty/zstd/compress/zstd_lazy.c +++ b/thirdparty/zstd/compress/zstd_lazy.c @@ -61,7 +61,7 @@ ZSTD_updateDUBT(ZSTD_matchState_t* ms, * assumption : curr >= btlow == (curr - btmask) * doesn't fail */ static void -ZSTD_insertDUBT1(ZSTD_matchState_t* ms, +ZSTD_insertDUBT1(const ZSTD_matchState_t* ms, U32 curr, const BYTE* inputEnd, U32 nbCompares, U32 btLow, const ZSTD_dictMode_e dictMode) @@ -93,7 +93,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, assert(curr >= btLow); assert(ip < iend); /* condition for ZSTD_count */ - while (nbCompares-- && (matchIndex > windowLow)) { + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ assert(matchIndex < curr); @@ -151,7 +151,7 @@ ZSTD_insertDUBT1(ZSTD_matchState_t* ms, static size_t ZSTD_DUBT_findBetterDictMatch ( - ZSTD_matchState_t* ms, + const ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, size_t* offsetPtr, size_t bestLength, @@ -185,7 +185,7 @@ ZSTD_DUBT_findBetterDictMatch ( (void)dictMode; assert(dictMode == ZSTD_dictMatchState); - while (nbCompares-- && (dictMatchIndex > dictLowLimit)) { + for (; nbCompares && (dictMatchIndex > dictLowLimit); --nbCompares) { U32* const nextPtr = dictBt + 2*(dictMatchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match = dictBase + dictMatchIndex; @@ -197,8 +197,8 @@ ZSTD_DUBT_findBetterDictMatch ( U32 matchIndex = dictMatchIndex + dictIndexDelta; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) { DEBUGLOG(9, "ZSTD_DUBT_findBetterDictMatch(%u) : found better match length %u -> %u and offsetCode %u -> %u (dictMatchIndex %u, matchIndex %u)", - curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, ZSTD_REP_MOVE + curr - matchIndex, dictMatchIndex, matchIndex); - bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + curr - matchIndex; + curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, STORE_OFFSET(curr - matchIndex), dictMatchIndex, matchIndex); + bestLength = matchLength, *offsetPtr = STORE_OFFSET(curr - matchIndex); } if (ip+matchLength == iend) { /* reached end of input : ip[matchLength] is not valid, no way to know if it's larger or smaller than match */ break; /* drop, to guarantee consistency (miss a little bit of compression) */ @@ -218,7 +218,7 @@ ZSTD_DUBT_findBetterDictMatch ( } if (bestLength >= MINMATCH) { - U32 const mIndex = curr - ((U32)*offsetPtr - ZSTD_REP_MOVE); (void)mIndex; + U32 const mIndex = curr - (U32)STORED_OFFSET(*offsetPtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBetterDictMatch(%u) : found match of length %u and offsetCode %u (pos %u)", curr, (U32)bestLength, (U32)*offsetPtr, mIndex); } @@ -309,7 +309,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, matchIndex = hashTable[h]; hashTable[h] = curr; /* Update Hash Table */ - while (nbCompares-- && (matchIndex > windowLow)) { + for (; nbCompares && (matchIndex > windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match; @@ -328,7 +328,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) - bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + curr - matchIndex; + bestLength = matchLength, *offsetPtr = STORE_OFFSET(curr - matchIndex); if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ if (dictMode == ZSTD_dictMatchState) { nbCompares = 0; /* in addition to avoiding checking any @@ -357,6 +357,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, *smallerPtr = *largerPtr = 0; + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dictMatchState && nbCompares) { bestLength = ZSTD_DUBT_findBetterDictMatch( ms, ip, iend, @@ -367,7 +368,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, assert(matchEndIdx > curr+8); /* ensure nextToUpdate is increased */ ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ if (bestLength >= MINMATCH) { - U32 const mIndex = curr - ((U32)*offsetPtr - ZSTD_REP_MOVE); (void)mIndex; + U32 const mIndex = curr - (U32)STORED_OFFSET(*offsetPtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBestMatch(%u) : found match of length %u and offsetCode %u (pos %u)", curr, (U32)bestLength, (U32)*offsetPtr, mIndex); } @@ -390,54 +391,6 @@ ZSTD_BtFindBestMatch( ZSTD_matchState_t* ms, return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offsetPtr, mls, dictMode); } - -static size_t -ZSTD_BtFindBestMatch_selectMLS ( ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict); - } -} - - -static size_t ZSTD_BtFindBestMatch_dictMatchState_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState); - } -} - - -static size_t ZSTD_BtFindBestMatch_extDict_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict); - case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict); - case 7 : - case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict); - } -} - /*********************************** * Dedicated dict search ***********************************/ @@ -450,7 +403,7 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B U32* const chainTable = ms->chainTable; U32 const chainSize = 1 << ms->cParams.chainLog; U32 idx = ms->nextToUpdate; - U32 const minChain = chainSize < target ? target - chainSize : idx; + U32 const minChain = chainSize < target - idx ? target - chainSize : idx; U32 const bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG; U32 const cacheSize = bucketSize - 1; U32 const chainAttempts = (1 << ms->cParams.searchLog) - cacheSize; @@ -464,7 +417,7 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B U32 const hashLog = ms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; U32* const tmpHashTable = hashTable; U32* const tmpChainTable = hashTable + ((size_t)1 << hashLog); - U32 const tmpChainSize = ((1 << ZSTD_LAZY_DDSS_BUCKET_LOG) - 1) << hashLog; + U32 const tmpChainSize = (U32)((1 << ZSTD_LAZY_DDSS_BUCKET_LOG) - 1) << hashLog; U32 const tmpMinChain = tmpChainSize < target ? target - tmpChainSize : idx; U32 hashIdx; @@ -608,7 +561,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + ddsIndexDelta) + ZSTD_REP_MOVE; + *offsetPtr = STORE_OFFSET(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) { /* best possible, avoids read overflow on next attempt */ return ml; @@ -645,7 +598,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + ddsIndexDelta) + ZSTD_REP_MOVE; + *offsetPtr = STORE_OFFSET(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } @@ -692,7 +645,7 @@ U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip) { /* inlining is important to hardwire a hot branch (template emulation) */ FORCE_INLINE_TEMPLATE -size_t ZSTD_HcFindBestMatch_generic ( +size_t ZSTD_HcFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, @@ -750,7 +703,7 @@ size_t ZSTD_HcFindBestMatch_generic ( /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - matchIndex + ZSTD_REP_MOVE; + *offsetPtr = STORE_OFFSET(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -758,6 +711,7 @@ size_t ZSTD_HcFindBestMatch_generic ( matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask); } + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dedicatedDictSearch) { ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts, dms, ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); @@ -784,7 +738,8 @@ size_t ZSTD_HcFindBestMatch_generic ( /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + dmsIndexDelta) + ZSTD_REP_MOVE; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = STORE_OFFSET(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -797,310 +752,80 @@ size_t ZSTD_HcFindBestMatch_generic ( return ml; } - -FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict); - } -} - - -static size_t ZSTD_HcFindBestMatch_dictMatchState_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState); - } -} - - -static size_t ZSTD_HcFindBestMatch_dedicatedDictSearch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dedicatedDictSearch); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_dedicatedDictSearch); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_dedicatedDictSearch); - } -} - - -FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict); - case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict); - case 7 : - case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict); - } -} - /* ********************************* * (SIMD) Row-based matchfinder ***********************************/ /* Constants for row-based hash */ -#define ZSTD_ROW_HASH_TAG_OFFSET 1 /* byte offset of hashes in the match state's tagTable from the beginning of a row */ -#define ZSTD_ROW_HASH_TAG_BITS 8 /* nb bits to use for the tag */ +#define ZSTD_ROW_HASH_TAG_OFFSET 16 /* byte offset of hashes in the match state's tagTable from the beginning of a row */ +#define ZSTD_ROW_HASH_TAG_BITS 8 /* nb bits to use for the tag */ #define ZSTD_ROW_HASH_TAG_MASK ((1u << ZSTD_ROW_HASH_TAG_BITS) - 1) +#define ZSTD_ROW_HASH_MAX_ENTRIES 64 /* absolute maximum number of entries per row, for all configurations */ #define ZSTD_ROW_HASH_CACHE_MASK (ZSTD_ROW_HASH_CACHE_SIZE - 1) -typedef U32 ZSTD_VecMask; /* Clarifies when we are interacting with a U32 representing a mask of matches */ - -#if !defined(ZSTD_NO_INTRINSICS) && defined(__SSE2__) /* SIMD SSE version */ - -#include <emmintrin.h> -typedef __m128i ZSTD_Vec128; - -/* Returns a 128-bit container with 128-bits from src */ -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - return _mm_loadu_si128((ZSTD_Vec128 const*)src); -} - -/* Returns a ZSTD_Vec128 with the byte "val" packed 16 times */ -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - return _mm_set1_epi8((char)val); -} - -/* Do byte-by-byte comparison result of x and y. Then collapse 128-bit resultant mask - * into a 32-bit mask that is the MSB of each byte. - * */ -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - return (ZSTD_VecMask)_mm_movemask_epi8(_mm_cmpeq_epi8(x, y)); -} - -typedef struct { - __m128i fst; - __m128i snd; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const ptr) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_read(ptr); - v.snd = ZSTD_Vec128_read((ZSTD_Vec128 const*)ptr + 1); - return v; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_set8(val); - v.snd = ZSTD_Vec128_set8(val); - return v; -} - -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask fstMask; - ZSTD_VecMask sndMask; - fstMask = ZSTD_Vec128_cmpMask8(x.fst, y.fst); - sndMask = ZSTD_Vec128_cmpMask8(x.snd, y.snd); - return fstMask | (sndMask << 16); -} - -#elif !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON) /* SIMD ARM NEON Version */ - -#include <arm_neon.h> -typedef uint8x16_t ZSTD_Vec128; - -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - return vld1q_u8((const BYTE* const)src); -} - -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - return vdupq_n_u8(val); -} - -/* Mimics '_mm_movemask_epi8()' from SSE */ -static U32 ZSTD_vmovmaskq_u8(ZSTD_Vec128 val) { - /* Shift out everything but the MSB bits in each byte */ - uint16x8_t highBits = vreinterpretq_u16_u8(vshrq_n_u8(val, 7)); - /* Merge the even lanes together with vsra (right shift and add) */ - uint32x4_t paired16 = vreinterpretq_u32_u16(vsraq_n_u16(highBits, highBits, 7)); - uint64x2_t paired32 = vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14)); - uint8x16_t paired64 = vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28)); - /* Extract the low 8 bits from each lane, merge */ - return vgetq_lane_u8(paired64, 0) | ((U32)vgetq_lane_u8(paired64, 8) << 8); -} - -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - return (ZSTD_VecMask)ZSTD_vmovmaskq_u8(vceqq_u8(x, y)); -} - -typedef struct { - uint8x16_t fst; - uint8x16_t snd; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const ptr) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_read(ptr); - v.snd = ZSTD_Vec128_read((ZSTD_Vec128 const*)ptr + 1); - return v; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 v; - v.fst = ZSTD_Vec128_set8(val); - v.snd = ZSTD_Vec128_set8(val); - return v; -} - -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask fstMask; - ZSTD_VecMask sndMask; - fstMask = ZSTD_Vec128_cmpMask8(x.fst, y.fst); - sndMask = ZSTD_Vec128_cmpMask8(x.snd, y.snd); - return fstMask | (sndMask << 16); -} - -#else /* Scalar fallback version */ - -#define VEC128_NB_SIZE_T (16 / sizeof(size_t)) -typedef struct { - size_t vec[VEC128_NB_SIZE_T]; -} ZSTD_Vec128; - -static ZSTD_Vec128 ZSTD_Vec128_read(const void* const src) { - ZSTD_Vec128 ret; - ZSTD_memcpy(ret.vec, src, VEC128_NB_SIZE_T*sizeof(size_t)); - return ret; -} - -static ZSTD_Vec128 ZSTD_Vec128_set8(BYTE val) { - ZSTD_Vec128 ret = { {0} }; - int startBit = sizeof(size_t) * 8 - 8; - for (;startBit >= 0; startBit -= 8) { - unsigned j = 0; - for (;j < VEC128_NB_SIZE_T; ++j) { - ret.vec[j] |= ((size_t)val << startBit); - } - } - return ret; -} - -/* Compare x to y, byte by byte, generating a "matches" bitfield */ -static ZSTD_VecMask ZSTD_Vec128_cmpMask8(ZSTD_Vec128 x, ZSTD_Vec128 y) { - ZSTD_VecMask res = 0; - unsigned i = 0; - unsigned l = 0; - for (; i < VEC128_NB_SIZE_T; ++i) { - const size_t cmp1 = x.vec[i]; - const size_t cmp2 = y.vec[i]; - unsigned j = 0; - for (; j < sizeof(size_t); ++j, ++l) { - if (((cmp1 >> j*8) & 0xFF) == ((cmp2 >> j*8) & 0xFF)) { - res |= ((U32)1 << (j+i*sizeof(size_t))); - } - } - } - return res; -} - -#define VEC256_NB_SIZE_T 2*VEC128_NB_SIZE_T -typedef struct { - size_t vec[VEC256_NB_SIZE_T]; -} ZSTD_Vec256; - -static ZSTD_Vec256 ZSTD_Vec256_read(const void* const src) { - ZSTD_Vec256 ret; - ZSTD_memcpy(ret.vec, src, VEC256_NB_SIZE_T*sizeof(size_t)); - return ret; -} - -static ZSTD_Vec256 ZSTD_Vec256_set8(BYTE val) { - ZSTD_Vec256 ret = { {0} }; - int startBit = sizeof(size_t) * 8 - 8; - for (;startBit >= 0; startBit -= 8) { - unsigned j = 0; - for (;j < VEC256_NB_SIZE_T; ++j) { - ret.vec[j] |= ((size_t)val << startBit); - } - } - return ret; -} - -/* Compare x to y, byte by byte, generating a "matches" bitfield */ -static ZSTD_VecMask ZSTD_Vec256_cmpMask8(ZSTD_Vec256 x, ZSTD_Vec256 y) { - ZSTD_VecMask res = 0; - unsigned i = 0; - unsigned l = 0; - for (; i < VEC256_NB_SIZE_T; ++i) { - const size_t cmp1 = x.vec[i]; - const size_t cmp2 = y.vec[i]; - unsigned j = 0; - for (; j < sizeof(size_t); ++j, ++l) { - if (((cmp1 >> j*8) & 0xFF) == ((cmp2 >> j*8) & 0xFF)) { - res |= ((U32)1 << (j+i*sizeof(size_t))); - } - } - } - return res; -} - -#endif /* !defined(ZSTD_NO_INTRINSICS) && defined(__SSE2__) */ +typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 representing a mask of matches */ /* ZSTD_VecMask_next(): * Starting from the LSB, returns the idx of the next non-zero bit. * Basically counting the nb of trailing zeroes. */ static U32 ZSTD_VecMask_next(ZSTD_VecMask val) { -# if defined(_MSC_VER) /* Visual */ - unsigned long r=0; - return _BitScanForward(&r, val) ? (U32)r : 0; -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (U32)__builtin_ctz(val); + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (U32)(r); + } else { + /* Should not reach this code path */ + __assume(0); + } +# elif (defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))) + if (sizeof(size_t) == 4) { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (leastSignificantWord == 0) { + return 32 + (U32)__builtin_ctz(mostSignificantWord); + } else { + return (U32)__builtin_ctz(leastSignificantWord); + } + } else { + return (U32)__builtin_ctzll(val); + } # else - /* Software ctz version: http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup */ - static const U32 multiplyDeBruijnBitPosition[32] = - { - 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 - }; - return multiplyDeBruijnBitPosition[((U32)((v & -(int)v) * 0x077CB531U)) >> 27]; + /* Software ctz version: http://aggregate.org/MAGIC/#Trailing%20Zero%20Count + * and: https://stackoverflow.com/questions/2709430/count-number-of-bits-in-a-64-bit-long-big-integer + */ + val = ~val & (val - 1ULL); /* Lowest set bit mask */ + val = val - ((val >> 1) & 0x5555555555555555); + val = (val & 0x3333333333333333ULL) + ((val >> 2) & 0x3333333333333333ULL); + return (U32)((((val + (val >> 4)) & 0xF0F0F0F0F0F0F0FULL) * 0x101010101010101ULL) >> 56); # endif } -/* ZSTD_VecMask_rotateRight(): - * Rotates a bitfield to the right by "rotation" bits. - * If the rotation is greater than totalBits, the returned mask is 0. +/* ZSTD_rotateRight_*(): + * Rotates a bitfield to the right by "count" bits. + * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts */ -FORCE_INLINE_TEMPLATE ZSTD_VecMask -ZSTD_VecMask_rotateRight(ZSTD_VecMask mask, U32 const rotation, U32 const totalBits) { - if (rotation == 0) - return mask; - switch (totalBits) { - default: - assert(0); - case 16: - return (mask >> rotation) | (U16)(mask << (16 - rotation)); - case 32: - return (mask >> rotation) | (U32)(mask << (32 - rotation)); - } +FORCE_INLINE_TEMPLATE +U64 ZSTD_rotateRight_U64(U64 const value, U32 count) { + assert(count < 64); + count &= 0x3F; /* for fickle pattern recognition */ + return (value >> count) | (U64)(value << ((0U - count) & 0x3F)); +} + +FORCE_INLINE_TEMPLATE +U32 ZSTD_rotateRight_U32(U32 const value, U32 count) { + assert(count < 32); + count &= 0x1F; /* for fickle pattern recognition */ + return (value >> count) | (U32)(value << ((0U - count) & 0x1F)); +} + +FORCE_INLINE_TEMPLATE +U16 ZSTD_rotateRight_U16(U16 const value, U32 count) { + assert(count < 16); + count &= 0x0F; /* for fickle pattern recognition */ + return (value >> count) | (U16)(value << ((0U - count) & 0x0F)); } /* ZSTD_row_nextIndex(): @@ -1126,20 +851,24 @@ MEM_STATIC int ZSTD_isAligned(void const* ptr, size_t align) { */ FORCE_INLINE_TEMPLATE void ZSTD_row_prefetch(U32 const* hashTable, U16 const* tagTable, U32 const relRow, U32 const rowLog) { PREFETCH_L1(hashTable + relRow); - if (rowLog == 5) { + if (rowLog >= 5) { PREFETCH_L1(hashTable + relRow + 16); + /* Note: prefetching more of the hash table does not appear to be beneficial for 128-entry rows */ } PREFETCH_L1(tagTable + relRow); - assert(rowLog == 4 || rowLog == 5); + if (rowLog == 6) { + PREFETCH_L1(tagTable + relRow + 32); + } + assert(rowLog == 4 || rowLog == 5 || rowLog == 6); assert(ZSTD_isAligned(hashTable + relRow, 64)); /* prefetched hash row always 64-byte aligned */ - assert(ZSTD_isAligned(tagTable + relRow, (size_t)1 << rowLog)); /* prefetched tagRow sits on a multiple of 32 or 64 bytes */ + assert(ZSTD_isAligned(tagTable + relRow, (size_t)1 << rowLog)); /* prefetched tagRow sits on correct multiple of bytes (32,64,128) */ } /* ZSTD_row_fillHashCache(): * Fill up the hash cache starting at idx, prefetching up to ZSTD_ROW_HASH_CACHE_SIZE entries, * but not beyond iLimit. */ -static void ZSTD_row_fillHashCache(ZSTD_matchState_t* ms, const BYTE* base, +FORCE_INLINE_TEMPLATE void ZSTD_row_fillHashCache(ZSTD_matchState_t* ms, const BYTE* base, U32 const rowLog, U32 const mls, U32 idx, const BYTE* const iLimit) { @@ -1179,35 +908,65 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_row_nextCachedHash(U32* cache, U32 const* hashTab } } -/* ZSTD_row_update_internal(): - * Inserts the byte at ip into the appropriate position in the hash table. - * Determines the relative row, and the position within the {16, 32} entry row to insert at. +/* ZSTD_row_update_internalImpl(): + * Updates the hash table with positions starting from updateStartIdx until updateEndIdx. */ -FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const BYTE* ip, - U32 const mls, U32 const rowLog, - U32 const rowMask, U32 const useCache) +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internalImpl(ZSTD_matchState_t* ms, + U32 updateStartIdx, U32 const updateEndIdx, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) { U32* const hashTable = ms->hashTable; U16* const tagTable = ms->tagTable; U32 const hashLog = ms->rowHashLog; const BYTE* const base = ms->window.base; - const U32 target = (U32)(ip - base); - U32 idx = ms->nextToUpdate; - DEBUGLOG(6, "ZSTD_row_update_internal(): nextToUpdate=%u, current=%u", idx, target); - for (; idx < target; ++idx) { - U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, idx, hashLog, rowLog, mls) - : (U32)ZSTD_hashPtr(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls); + DEBUGLOG(6, "ZSTD_row_update_internalImpl(): updateStartIdx=%u, updateEndIdx=%u", updateStartIdx, updateEndIdx); + for (; updateStartIdx < updateEndIdx; ++updateStartIdx) { + U32 const hash = useCache ? ZSTD_row_nextCachedHash(ms->hashCache, hashTable, tagTable, base, updateStartIdx, hashLog, rowLog, mls) + : (U32)ZSTD_hashPtr(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls); U32 const relRow = (hash >> ZSTD_ROW_HASH_TAG_BITS) << rowLog; U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); /* Though tagTable is laid out as a table of U16, each tag is only 1 byte. Explicit cast allows us to get exact desired position within each row */ U32 const pos = ZSTD_row_nextIndex(tagRow, rowMask); - assert(hash == ZSTD_hashPtr(base + idx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls)); + assert(hash == ZSTD_hashPtr(base + updateStartIdx, hashLog + ZSTD_ROW_HASH_TAG_BITS, mls)); ((BYTE*)tagRow)[pos + ZSTD_ROW_HASH_TAG_OFFSET] = hash & ZSTD_ROW_HASH_TAG_MASK; - row[pos] = idx; + row[pos] = updateStartIdx; } +} + +/* ZSTD_row_update_internal(): + * Inserts the byte at ip into the appropriate position in the hash table, and updates ms->nextToUpdate. + * Skips sections of long matches as is necessary. + */ +FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const BYTE* ip, + U32 const mls, U32 const rowLog, + U32 const rowMask, U32 const useCache) +{ + U32 idx = ms->nextToUpdate; + const BYTE* const base = ms->window.base; + const U32 target = (U32)(ip - base); + const U32 kSkipThreshold = 384; + const U32 kMaxMatchStartPositionsToUpdate = 96; + const U32 kMaxMatchEndPositionsToUpdate = 32; + + if (useCache) { + /* Only skip positions when using hash cache, i.e. + * if we are loading a dict, don't skip anything. + * If we decide to skip, then we only update a set number + * of positions at the beginning and end of the match. + */ + if (UNLIKELY(target - idx > kSkipThreshold)) { + U32 const bound = idx + kMaxMatchStartPositionsToUpdate; + ZSTD_row_update_internalImpl(ms, idx, bound, mls, rowLog, rowMask, useCache); + idx = target - kMaxMatchEndPositionsToUpdate; + ZSTD_row_fillHashCache(ms, base, rowLog, mls, idx, ip+1); + } + } + assert(target >= idx); + ZSTD_row_update_internalImpl(ms, idx, target, mls, rowLog, rowMask, useCache); ms->nextToUpdate = target; } @@ -1216,7 +975,7 @@ FORCE_INLINE_TEMPLATE void ZSTD_row_update_internal(ZSTD_matchState_t* ms, const * processing. */ void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { - const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; + const U32 rowLog = BOUNDED(4, ms->cParams.searchLog, 6); const U32 rowMask = (1u << rowLog) - 1; const U32 mls = MIN(ms->cParams.minMatch, 6 /* mls caps out at 6 */); @@ -1224,26 +983,131 @@ void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* dont use cache */); } +#if defined(ZSTD_ARCH_X86_SSE2) +FORCE_INLINE_TEMPLATE ZSTD_VecMask +ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U32 head) +{ + const __m128i comparisonMask = _mm_set1_epi8((char)tag); + int matches[4] = {0}; + int i; + assert(nbChunks == 1 || nbChunks == 2 || nbChunks == 4); + for (i=0; i<nbChunks; i++) { + const __m128i chunk = _mm_loadu_si128((const __m128i*)(const void*)(src + 16*i)); + const __m128i equalMask = _mm_cmpeq_epi8(chunk, comparisonMask); + matches[i] = _mm_movemask_epi8(equalMask); + } + if (nbChunks == 1) return ZSTD_rotateRight_U16((U16)matches[0], head); + if (nbChunks == 2) return ZSTD_rotateRight_U32((U32)matches[1] << 16 | (U32)matches[0], head); + assert(nbChunks == 4); + return ZSTD_rotateRight_U64((U64)matches[3] << 48 | (U64)matches[2] << 32 | (U64)matches[1] << 16 | (U64)matches[0], head); +} +#endif + /* Returns a ZSTD_VecMask (U32) that has the nth bit set to 1 if the newly-computed "tag" matches * the hash at the nth position in a row of the tagTable. - */ -FORCE_INLINE_TEMPLATE -ZSTD_VecMask ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, const U32 rowEntries) { - ZSTD_VecMask matches = 0; - if (rowEntries == 16) { - ZSTD_Vec128 hashes = ZSTD_Vec128_read(tagRow + ZSTD_ROW_HASH_TAG_OFFSET); - ZSTD_Vec128 expandedTags = ZSTD_Vec128_set8(tag); - matches = ZSTD_Vec128_cmpMask8(hashes, expandedTags); - } else if (rowEntries == 32) { - ZSTD_Vec256 hashes = ZSTD_Vec256_read(tagRow + ZSTD_ROW_HASH_TAG_OFFSET); - ZSTD_Vec256 expandedTags = ZSTD_Vec256_set8(tag); - matches = ZSTD_Vec256_cmpMask8(hashes, expandedTags); - } else { - assert(0); + * Each row is a circular buffer beginning at the value of "head". So we must rotate the "matches" bitfield + * to match up with the actual layout of the entries within the hashTable */ +FORCE_INLINE_TEMPLATE ZSTD_VecMask +ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, const U32 rowEntries) +{ + const BYTE* const src = tagRow + ZSTD_ROW_HASH_TAG_OFFSET; + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + +#if defined(ZSTD_ARCH_X86_SSE2) + + return ZSTD_row_getSSEMask(rowEntries / 16, src, tag, head); + +#else /* SW or NEON-LE */ + +# if defined(ZSTD_ARCH_ARM_NEON) + /* This NEON path only works for little endian - otherwise use SWAR below */ + if (MEM_isLittleEndian()) { + if (rowEntries == 16) { + const uint8x16_t chunk = vld1q_u8(src); + const uint16x8_t equalMask = vreinterpretq_u16_u8(vceqq_u8(chunk, vdupq_n_u8(tag))); + const uint16x8_t t0 = vshlq_n_u16(equalMask, 7); + const uint32x4_t t1 = vreinterpretq_u32_u16(vsriq_n_u16(t0, t0, 14)); + const uint64x2_t t2 = vreinterpretq_u64_u32(vshrq_n_u32(t1, 14)); + const uint8x16_t t3 = vreinterpretq_u8_u64(vsraq_n_u64(t2, t2, 28)); + const U16 hi = (U16)vgetq_lane_u8(t3, 8); + const U16 lo = (U16)vgetq_lane_u8(t3, 0); + return ZSTD_rotateRight_U16((hi << 8) | lo, head); + } else if (rowEntries == 32) { + const uint16x8x2_t chunk = vld2q_u16((const U16*)(const void*)src); + const uint8x16_t chunk0 = vreinterpretq_u8_u16(chunk.val[0]); + const uint8x16_t chunk1 = vreinterpretq_u8_u16(chunk.val[1]); + const uint8x16_t equalMask0 = vceqq_u8(chunk0, vdupq_n_u8(tag)); + const uint8x16_t equalMask1 = vceqq_u8(chunk1, vdupq_n_u8(tag)); + const int8x8_t pack0 = vqmovn_s16(vreinterpretq_s16_u8(equalMask0)); + const int8x8_t pack1 = vqmovn_s16(vreinterpretq_s16_u8(equalMask1)); + const uint8x8_t t0 = vreinterpret_u8_s8(pack0); + const uint8x8_t t1 = vreinterpret_u8_s8(pack1); + const uint8x8_t t2 = vsri_n_u8(t1, t0, 2); + const uint8x8x2_t t3 = vuzp_u8(t2, t0); + const uint8x8_t t4 = vsri_n_u8(t3.val[1], t3.val[0], 4); + const U32 matches = vget_lane_u32(vreinterpret_u32_u8(t4), 0); + return ZSTD_rotateRight_U32(matches, head); + } else { /* rowEntries == 64 */ + const uint8x16x4_t chunk = vld4q_u8(src); + const uint8x16_t dup = vdupq_n_u8(tag); + const uint8x16_t cmp0 = vceqq_u8(chunk.val[0], dup); + const uint8x16_t cmp1 = vceqq_u8(chunk.val[1], dup); + const uint8x16_t cmp2 = vceqq_u8(chunk.val[2], dup); + const uint8x16_t cmp3 = vceqq_u8(chunk.val[3], dup); + + const uint8x16_t t0 = vsriq_n_u8(cmp1, cmp0, 1); + const uint8x16_t t1 = vsriq_n_u8(cmp3, cmp2, 1); + const uint8x16_t t2 = vsriq_n_u8(t1, t0, 2); + const uint8x16_t t3 = vsriq_n_u8(t2, t2, 4); + const uint8x8_t t4 = vshrn_n_u16(vreinterpretq_u16_u8(t3), 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(t4), 0); + return ZSTD_rotateRight_U64(matches, head); + } } - /* Each row is a circular buffer beginning at the value of "head". So we must rotate the "matches" bitfield - to match up with the actual layout of the entries within the hashTable */ - return ZSTD_VecMask_rotateRight(matches, head, rowEntries); +# endif /* ZSTD_ARCH_ARM_NEON */ + /* SWAR */ + { const size_t chunkSize = sizeof(size_t); + const size_t shiftAmount = ((chunkSize * 8) - chunkSize); + const size_t xFF = ~((size_t)0); + const size_t x01 = xFF / 0xFF; + const size_t x80 = x01 << 7; + const size_t splatChar = tag * x01; + ZSTD_VecMask matches = 0; + int i = rowEntries - chunkSize; + assert((sizeof(size_t) == 4) || (sizeof(size_t) == 8)); + if (MEM_isLittleEndian()) { /* runtime check so have two loops */ + const size_t extractMagic = (xFF / 0x7F) >> chunkSize; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= (chunk * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } else { /* big endian: reverse bits during extraction */ + const size_t msb = xFF ^ (xFF >> 1); + const size_t extractMagic = (msb / 0x1FF) | msb; + do { + size_t chunk = MEM_readST(&src[i]); + chunk ^= splatChar; + chunk = (((chunk | x80) - x01) | chunk) & x80; + matches <<= chunkSize; + matches |= ((chunk >> 7) * extractMagic) >> shiftAmount; + i -= chunkSize; + } while (i >= 0); + } + matches = ~matches; + if (rowEntries == 16) { + return ZSTD_rotateRight_U16((U16)matches, head); + } else if (rowEntries == 32) { + return ZSTD_rotateRight_U32((U32)matches, head); + } else { + return ZSTD_rotateRight_U64((U64)matches, head); + } + } +#endif } /* The high-level approach of the SIMD row based match finder is as follows: @@ -1262,7 +1126,7 @@ ZSTD_VecMask ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, con * - Pick the longest match. */ FORCE_INLINE_TEMPLATE -size_t ZSTD_RowFindBestMatch_generic ( +size_t ZSTD_RowFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, @@ -1293,11 +1157,13 @@ size_t ZSTD_RowFindBestMatch_generic ( /* DMS/DDS variables that may be referenced laster */ const ZSTD_matchState_t* const dms = ms->dictMatchState; - size_t ddsIdx; - U32 ddsExtraAttempts; /* cctx hash tables are limited in searches, but allow extra searches into DDS */ - U32 dmsTag; - U32* dmsRow; - BYTE* dmsTagRow; + + /* Initialize the following variables to satisfy static analyzer */ + size_t ddsIdx = 0; + U32 ddsExtraAttempts = 0; /* cctx hash tables are limited in searches, but allow extra searches into DDS */ + U32 dmsTag = 0; + U32* dmsRow = NULL; + BYTE* dmsTagRow = NULL; if (dictMode == ZSTD_dedicatedDictSearch) { const U32 ddsHashLog = dms->cParams.hashLog - ZSTD_LAZY_DDSS_BUCKET_LOG; @@ -1329,7 +1195,7 @@ size_t ZSTD_RowFindBestMatch_generic ( U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); U32 const head = *tagRow & rowMask; - U32 matchBuffer[32 /* maximum nb entries per row */]; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, head, rowEntries); @@ -1379,12 +1245,13 @@ size_t ZSTD_RowFindBestMatch_generic ( /* Save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - matchIndex + ZSTD_REP_MOVE; + *offsetPtr = STORE_OFFSET(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } } + assert(nbAttempts <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dedicatedDictSearch) { ml = ZSTD_dedicatedDictSearch_lazy_search(offsetPtr, ml, nbAttempts + ddsExtraAttempts, dms, ip, iLimit, prefixStart, curr, dictLimit, ddsIdx); @@ -1397,7 +1264,7 @@ size_t ZSTD_RowFindBestMatch_generic ( const U32 dmsIndexDelta = dictLimit - dmsSize; { U32 const head = *dmsTagRow & rowMask; - U32 matchBuffer[32 /* maximum nb row entries */]; + U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, head, rowEntries); @@ -1426,7 +1293,8 @@ size_t ZSTD_RowFindBestMatch_generic ( if (currentMl > ml) { ml = currentMl; - *offsetPtr = curr - (matchIndex + dmsIndexDelta) + ZSTD_REP_MOVE; + assert(curr > matchIndex + dmsIndexDelta); + *offsetPtr = STORE_OFFSET(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; } } @@ -1435,84 +1303,175 @@ size_t ZSTD_RowFindBestMatch_generic ( return ml; } -/* Inlining is important to hardwire a hot branch (template emulation) */ -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_selectMLS ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - const ZSTD_dictMode_e dictMode, size_t* offsetPtr, const U32 rowLog) -{ - switch(ms->cParams.minMatch) - { - default : /* includes case 3 */ - case 4 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, dictMode, rowLog); - case 5 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, dictMode, rowLog); - case 7 : - case 6 : return ZSTD_RowFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, dictMode, rowLog); - } -} -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_selectRowLog ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_noDict, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_noDict, offsetPtr, 5); +typedef size_t (*searchMax_f)( + ZSTD_matchState_t* ms, + const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); + +/** + * This struct contains the functions necessary for lazy to search. + * Currently, that is only searchMax. However, it is still valuable to have the + * VTable because this makes it easier to add more functions to the VTable later. + * + * TODO: The start of the search function involves loading and calculating a + * bunch of constants from the ZSTD_matchState_t. These computations could be + * done in an initialization function, and saved somewhere in the match state. + * Then we could pass a pointer to the saved state instead of the match state, + * and avoid duplicate computations. + * + * TODO: Move the match re-winding into searchMax. This improves compression + * ratio, and unlocks further simplifications with the next TODO. + * + * TODO: Try moving the repcode search into searchMax. After the re-winding + * and repcode search are in searchMax, there is no more logic in the match + * finder loop that requires knowledge about the dictMode. So we should be + * able to avoid force inlining it, and we can join the extDict loop with + * the single segment loop. It should go in searchMax instead of its own + * function to avoid having multiple virtual function calls per search. + */ +typedef struct { + searchMax_f searchMax; +} ZSTD_LazyVTable; + +#define GEN_ZSTD_BT_VTABLE(dictMode, mls) \ + static size_t ZSTD_BtFindBestMatch_##dictMode##_##mls( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode); \ + } \ + static const ZSTD_LazyVTable ZSTD_BtVTable_##dictMode##_##mls = { \ + ZSTD_BtFindBestMatch_##dictMode##_##mls \ + }; + +#define GEN_ZSTD_HC_VTABLE(dictMode, mls) \ + static size_t ZSTD_HcFindBestMatch_##dictMode##_##mls( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + return ZSTD_HcFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode); \ + } \ + static const ZSTD_LazyVTable ZSTD_HcVTable_##dictMode##_##mls = { \ + ZSTD_HcFindBestMatch_##dictMode##_##mls \ + }; + +#define GEN_ZSTD_ROW_VTABLE(dictMode, mls, rowLog) \ + static size_t ZSTD_RowFindBestMatch_##dictMode##_##mls##_##rowLog( \ + ZSTD_matchState_t* ms, \ + const BYTE* ip, const BYTE* const iLimit, \ + size_t* offsetPtr) \ + { \ + assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ + assert(MAX(4, MIN(6, ms->cParams.searchLog)) == rowLog); \ + return ZSTD_RowFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode, rowLog); \ + } \ + static const ZSTD_LazyVTable ZSTD_RowVTable_##dictMode##_##mls##_##rowLog = { \ + ZSTD_RowFindBestMatch_##dictMode##_##mls##_##rowLog \ + }; + +#define ZSTD_FOR_EACH_ROWLOG(X, dictMode, mls) \ + X(dictMode, mls, 4) \ + X(dictMode, mls, 5) \ + X(dictMode, mls, 6) + +#define ZSTD_FOR_EACH_MLS_ROWLOG(X, dictMode) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 4) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 5) \ + ZSTD_FOR_EACH_ROWLOG(X, dictMode, 6) + +#define ZSTD_FOR_EACH_MLS(X, dictMode) \ + X(dictMode, 4) \ + X(dictMode, 5) \ + X(dictMode, 6) + +#define ZSTD_FOR_EACH_DICT_MODE(X, ...) \ + X(__VA_ARGS__, noDict) \ + X(__VA_ARGS__, extDict) \ + X(__VA_ARGS__, dictMatchState) \ + X(__VA_ARGS__, dedicatedDictSearch) + +/* Generate Row VTables for each combination of (dictMode, mls, rowLog) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS_ROWLOG, GEN_ZSTD_ROW_VTABLE) +/* Generate Binary Tree VTables for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_BT_VTABLE) +/* Generate Hash Chain VTables for each combination of (dictMode, mls) */ +ZSTD_FOR_EACH_DICT_MODE(ZSTD_FOR_EACH_MLS, GEN_ZSTD_HC_VTABLE) + +#define GEN_ZSTD_BT_VTABLE_ARRAY(dictMode) \ + { \ + &ZSTD_BtVTable_##dictMode##_4, \ + &ZSTD_BtVTable_##dictMode##_5, \ + &ZSTD_BtVTable_##dictMode##_6 \ } -} -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_dictMatchState_selectRowLog( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dictMatchState, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dictMatchState, offsetPtr, 5); +#define GEN_ZSTD_HC_VTABLE_ARRAY(dictMode) \ + { \ + &ZSTD_HcVTable_##dictMode##_4, \ + &ZSTD_HcVTable_##dictMode##_5, \ + &ZSTD_HcVTable_##dictMode##_6 \ } -} -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_dedicatedDictSearch_selectRowLog( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dedicatedDictSearch, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_dedicatedDictSearch, offsetPtr, 5); +#define GEN_ZSTD_ROW_VTABLE_ARRAY_(dictMode, mls) \ + { \ + &ZSTD_RowVTable_##dictMode##_##mls##_4, \ + &ZSTD_RowVTable_##dictMode##_##mls##_5, \ + &ZSTD_RowVTable_##dictMode##_##mls##_6 \ } -} -FORCE_INLINE_TEMPLATE size_t ZSTD_RowFindBestMatch_extDict_selectRowLog ( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* const iLimit, - size_t* offsetPtr) -{ - const U32 cappedSearchLog = MIN(ms->cParams.searchLog, 5); - switch(cappedSearchLog) - { - default : - case 4 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_extDict, offsetPtr, 4); - case 5 : return ZSTD_RowFindBestMatch_selectMLS(ms, ip, iLimit, ZSTD_extDict, offsetPtr, 5); +#define GEN_ZSTD_ROW_VTABLE_ARRAY(dictMode) \ + { \ + GEN_ZSTD_ROW_VTABLE_ARRAY_(dictMode, 4), \ + GEN_ZSTD_ROW_VTABLE_ARRAY_(dictMode, 5), \ + GEN_ZSTD_ROW_VTABLE_ARRAY_(dictMode, 6) \ } -} +#define GEN_ZSTD_VTABLE_ARRAY(X) \ + { \ + X(noDict), \ + X(extDict), \ + X(dictMatchState), \ + X(dedicatedDictSearch) \ + } /* ******************************* * Common parser - lazy strategy *********************************/ typedef enum { search_hashChain=0, search_binaryTree=1, search_rowHash=2 } searchMethod_e; +/** + * This table is indexed first by the four ZSTD_dictMode_e values, and then + * by the two searchMethod_e values. NULLs are placed for configurations + * that should never occur (extDict modes go to the other implementation + * below and there is no DDSS for binary tree search yet). + */ + +static ZSTD_LazyVTable const* +ZSTD_selectLazyVTable(ZSTD_matchState_t const* ms, searchMethod_e searchMethod, ZSTD_dictMode_e dictMode) +{ + /* Fill the Hc/Bt VTable arrays with the right functions for the (dictMode, mls) combination. */ + ZSTD_LazyVTable const* const hcVTables[4][3] = GEN_ZSTD_VTABLE_ARRAY(GEN_ZSTD_HC_VTABLE_ARRAY); + ZSTD_LazyVTable const* const btVTables[4][3] = GEN_ZSTD_VTABLE_ARRAY(GEN_ZSTD_BT_VTABLE_ARRAY); + /* Fill the Row VTable array with the right functions for the (dictMode, mls, rowLog) combination. */ + ZSTD_LazyVTable const* const rowVTables[4][3][3] = GEN_ZSTD_VTABLE_ARRAY(GEN_ZSTD_ROW_VTABLE_ARRAY); + + U32 const mls = MAX(4, MIN(6, ms->cParams.minMatch)); + U32 const rowLog = MAX(4, MIN(6, ms->cParams.searchLog)); + switch (searchMethod) { + case search_hashChain: + return hcVTables[dictMode][mls - 4]; + case search_binaryTree: + return btVTables[dictMode][mls - 4]; + case search_rowHash: + return rowVTables[dictMode][mls - 4][rowLog - 4]; + default: + return NULL; + } +} + FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_lazy_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, @@ -1525,46 +1484,12 @@ ZSTD_compressBlock_lazy_generic( const BYTE* ip = istart; const BYTE* anchor = istart; const BYTE* const iend = istart + srcSize; - const BYTE* const ilimit = searchMethod == search_rowHash ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; + const BYTE* const ilimit = (searchMethod == search_rowHash) ? iend - 8 - ZSTD_ROW_HASH_CACHE_SIZE : iend - 8; const BYTE* const base = ms->window.base; const U32 prefixLowestIndex = ms->window.dictLimit; const BYTE* const prefixLowest = base + prefixLowestIndex; - const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; - typedef size_t (*searchMax_f)( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); - - /** - * This table is indexed first by the four ZSTD_dictMode_e values, and then - * by the two searchMethod_e values. NULLs are placed for configurations - * that should never occur (extDict modes go to the other implementation - * below and there is no DDSS for binary tree search yet). - */ - const searchMax_f searchFuncs[4][3] = { - { - ZSTD_HcFindBestMatch_selectMLS, - ZSTD_BtFindBestMatch_selectMLS, - ZSTD_RowFindBestMatch_selectRowLog - }, - { - NULL, - NULL, - NULL - }, - { - ZSTD_HcFindBestMatch_dictMatchState_selectMLS, - ZSTD_BtFindBestMatch_dictMatchState_selectMLS, - ZSTD_RowFindBestMatch_dictMatchState_selectRowLog - }, - { - ZSTD_HcFindBestMatch_dedicatedDictSearch_selectMLS, - NULL, - ZSTD_RowFindBestMatch_dedicatedDictSearch_selectRowLog - } - }; - - searchMax_f const searchMax = searchFuncs[dictMode][(int)searchMethod]; + searchMax_f const searchMax = ZSTD_selectLazyVTable(ms, searchMethod, dictMode)->searchMax; U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0; const int isDMS = dictMode == ZSTD_dictMatchState; @@ -1599,6 +1524,7 @@ ZSTD_compressBlock_lazy_generic( } if (searchMethod == search_rowHash) { + const U32 rowLog = MAX(4, MIN(6, ms->cParams.searchLog)); ZSTD_row_fillHashCache(ms, base, rowLog, MIN(ms->cParams.minMatch, 6 /* mls caps out at 6 */), ms->nextToUpdate, ilimit); @@ -1613,8 +1539,9 @@ ZSTD_compressBlock_lazy_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offset=0; + size_t offcode=STORE_REPCODE_1; const BYTE* start=ip+1; + DEBUGLOG(7, "search baseline (depth 0)"); /* check repCode */ if (isDxS) { @@ -1640,7 +1567,7 @@ ZSTD_compressBlock_lazy_generic( { size_t offsetFound = 999999999; size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); if (ml2 > matchLength) - matchLength = ml2, start = ip, offset=offsetFound; + matchLength = ml2, start = ip, offcode=offsetFound; } if (matchLength < 4) { @@ -1651,14 +1578,15 @@ ZSTD_compressBlock_lazy_generic( /* let's try to find a better solution */ if (depth>=1) while (ip<ilimit) { + DEBUGLOG(7, "search depth 1"); ip ++; if ( (dictMode == ZSTD_noDict) - && (offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offcode) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1670,30 +1598,31 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; } } { size_t offset2=999999999; size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offcode = offset2, start = ip; continue; /* search a better one */ } } /* let's find an even better one */ if ((depth==2) && (ip<ilimit)) { + DEBUGLOG(7, "search depth 2"); ip ++; if ( (dictMode == ZSTD_noDict) - && (offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offcode) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1705,46 +1634,45 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offset = 0, start = ip; + matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; } } { size_t offset2=999999999; size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offcode = offset2, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* NOTE: - * start[-offset+ZSTD_REP_MOVE-1] is undefined behavior. - * (-offset+ZSTD_REP_MOVE-1) is unsigned, and is added to start, which - * overflows the pointer, which is undefined behavior. + * Pay attention that `start[-value]` can lead to strange undefined behavior + * notably if `value` is unsigned, resulting in a large positive `-value`. */ /* catch up */ - if (offset) { + if (STORED_IS_OFFSET(offcode)) { if (dictMode == ZSTD_noDict) { - while ( ((start > anchor) & (start - (offset-ZSTD_REP_MOVE) > prefixLowest)) - && (start[-1] == (start-(offset-ZSTD_REP_MOVE))[-1]) ) /* only search for offset within prefix */ + while ( ((start > anchor) & (start - STORED_OFFSET(offcode) > prefixLowest)) + && (start[-1] == (start-STORED_OFFSET(offcode))[-1]) ) /* only search for offset within prefix */ { start--; matchLength++; } } if (isDxS) { - U32 const matchIndex = (U32)((start-base) - (offset - ZSTD_REP_MOVE)); + U32 const matchIndex = (U32)((size_t)(start-base) - STORED_OFFSET(offcode)); const BYTE* match = (matchIndex < prefixLowestIndex) ? dictBase + matchIndex - dictIndexDelta : base + matchIndex; const BYTE* const mStart = (matchIndex < prefixLowestIndex) ? dictLowest : prefixLowest; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ } - offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE); + offset_2 = offset_1; offset_1 = (U32)STORED_OFFSET(offcode); } /* store sequence */ _storeSequence: - { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offset, matchLength-MINMATCH); + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offcode, matchLength); anchor = ip = start + matchLength; } @@ -1760,8 +1688,8 @@ _storeSequence: && (MEM_read32(repMatch) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex < prefixLowestIndex ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd2, prefixLowest) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); ip += matchLength; anchor = ip; continue; @@ -1775,8 +1703,8 @@ _storeSequence: && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) { /* store sequence */ matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap repcodes */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -1955,15 +1883,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const U32 windowLog = ms->cParams.windowLog; const U32 rowLog = ms->cParams.searchLog < 5 ? 4 : 5; - typedef size_t (*searchMax_f)( - ZSTD_matchState_t* ms, - const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); - const searchMax_f searchFuncs[3] = { - ZSTD_HcFindBestMatch_extDict_selectMLS, - ZSTD_BtFindBestMatch_extDict_selectMLS, - ZSTD_RowFindBestMatch_extDict_selectRowLog - }; - searchMax_f searchMax = searchFuncs[(int)searchMethod]; + searchMax_f const searchMax = ZSTD_selectLazyVTable(ms, searchMethod, ZSTD_extDict)->searchMax; U32 offset_1 = rep[0], offset_2 = rep[1]; DEBUGLOG(5, "ZSTD_compressBlock_lazy_extDict_generic (searchFunc=%u)", (U32)searchMethod); @@ -1985,7 +1905,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offset=0; + size_t offcode=STORE_REPCODE_1; const BYTE* start=ip+1; U32 curr = (U32)(ip-base); @@ -1995,7 +1915,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow */ - & (offset_1 < curr+1 - windowLow) ) /* note: we are searching at curr+1 */ + & (offset_1 <= curr+1 - windowLow) ) /* note: we are searching at curr+1 */ if (MEM_read32(ip+1) == MEM_read32(repMatch)) { /* repcode detected we should take it */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; @@ -2007,10 +1927,10 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( { size_t offsetFound = 999999999; size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); if (ml2 > matchLength) - matchLength = ml2, start = ip, offset=offsetFound; + matchLength = ml2, start = ip, offcode=offsetFound; } - if (matchLength < 4) { + if (matchLength < 4) { ip += ((ip-anchor) >> kSearchStrength) + 1; /* jump faster over incompressible sections */ continue; } @@ -2021,30 +1941,30 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offset) { + if (offcode) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_1 < curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offset = 0, start = ip; + matchLength = repLength, offcode = STORE_REPCODE_1, start = ip; } } /* search match, depth 1 */ { size_t offset2=999999999; size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offcode = offset2, start = ip; continue; /* search a better one */ } } @@ -2053,48 +1973,48 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offset) { + if (offcode) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_1 < curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_1 <= curr - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offset = 0, start = ip; + matchLength = repLength, offcode = STORE_REPCODE_1, start = ip; } } /* search match, depth 2 */ { size_t offset2=999999999; size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offset = offset2, start = ip; + matchLength = ml2, offcode = offset2, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* catch up */ - if (offset) { - U32 const matchIndex = (U32)((start-base) - (offset - ZSTD_REP_MOVE)); + if (STORED_IS_OFFSET(offcode)) { + U32 const matchIndex = (U32)((size_t)(start-base) - STORED_OFFSET(offcode)); const BYTE* match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex; const BYTE* const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ - offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE); + offset_2 = offset_1; offset_1 = (U32)STORED_OFFSET(offcode); } /* store sequence */ _storeSequence: - { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offset, matchLength-MINMATCH); + { size_t const litLength = (size_t)(start - anchor); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offcode, matchLength); anchor = ip = start + matchLength; } @@ -2106,13 +2026,13 @@ _storeSequence: const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; const BYTE* const repMatch = repBase + repIndex; if ( ((U32)((dictLimit-1) - repIndex) >= 3) /* intentional overflow : do not test positions overlapping 2 memory segments */ - & (offset_2 < repCurrent - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ + & (offset_2 <= repCurrent - windowLow) ) /* equivalent to `curr > repIndex >= windowLow` */ if (MEM_read32(ip) == MEM_read32(repMatch)) { /* repcode detected we should take it */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; - offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset history */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, 0, matchLength-MINMATCH); + offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap offset history */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ diff --git a/thirdparty/zstd/compress/zstd_ldm.c b/thirdparty/zstd/compress/zstd_ldm.c index fa4ebeabd7..f662b2546e 100644 --- a/thirdparty/zstd/compress/zstd_ldm.c +++ b/thirdparty/zstd/compress/zstd_ldm.c @@ -159,12 +159,12 @@ size_t ZSTD_ldm_getTableSize(ldmParams_t params) size_t const ldmBucketSize = ((size_t)1) << (params.hashLog - ldmBucketSizeLog); size_t const totalSize = ZSTD_cwksp_alloc_size(ldmBucketSize) + ZSTD_cwksp_alloc_size(ldmHSize * sizeof(ldmEntry_t)); - return params.enableLdm ? totalSize : 0; + return params.enableLdm == ZSTD_ps_enable ? totalSize : 0; } size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize) { - return params.enableLdm ? (maxChunkSize / params.minMatchLength) : 0; + return params.enableLdm == ZSTD_ps_enable ? (maxChunkSize / params.minMatchLength) : 0; } /** ZSTD_ldm_getBucket() : @@ -478,7 +478,7 @@ static size_t ZSTD_ldm_generateSequences_internal( */ if (anchor > ip + hashed) { ZSTD_ldm_gear_reset(&hashState, anchor - minMatchLength, minMatchLength); - /* Continue the outter loop at anchor (ip + hashed == anchor). */ + /* Continue the outer loop at anchor (ip + hashed == anchor). */ ip = anchor - hashed; break; } @@ -579,7 +579,9 @@ size_t ZSTD_ldm_generateSequences( return 0; } -void ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) { +void +ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize, U32 const minMatch) +{ while (srcSize > 0 && rawSeqStore->pos < rawSeqStore->size) { rawSeq* seq = rawSeqStore->seq + rawSeqStore->pos; if (srcSize <= seq->litLength) { @@ -657,7 +659,7 @@ void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) { size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, void const* src, size_t srcSize) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -709,8 +711,8 @@ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, rep[0] = sequence.offset; /* Store the sequence */ ZSTD_storeSeq(seqStore, newLitLength, ip - newLitLength, iend, - sequence.offset + ZSTD_REP_MOVE, - sequence.matchLength - MINMATCH); + STORE_OFFSET(sequence.offset), + sequence.matchLength); ip += sequence.matchLength; } } diff --git a/thirdparty/zstd/compress/zstd_ldm.h b/thirdparty/zstd/compress/zstd_ldm.h index 393466fa9f..4e68dbf52e 100644 --- a/thirdparty/zstd/compress/zstd_ldm.h +++ b/thirdparty/zstd/compress/zstd_ldm.h @@ -66,7 +66,7 @@ size_t ZSTD_ldm_generateSequences( */ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - ZSTD_useRowMatchFinderMode_e useRowMatchFinder, + ZSTD_paramSwitch_e useRowMatchFinder, void const* src, size_t srcSize); /** diff --git a/thirdparty/zstd/compress/zstd_ldm_geartab.h b/thirdparty/zstd/compress/zstd_ldm_geartab.h index e5c24d856b..647f865be2 100644 --- a/thirdparty/zstd/compress/zstd_ldm_geartab.h +++ b/thirdparty/zstd/compress/zstd_ldm_geartab.h @@ -11,7 +11,10 @@ #ifndef ZSTD_LDM_GEARTAB_H #define ZSTD_LDM_GEARTAB_H -static U64 ZSTD_ldm_gearTab[256] = { +#include "../common/compiler.h" /* UNUSED_ATTR */ +#include "../common/mem.h" /* U64 */ + +static UNUSED_ATTR const U64 ZSTD_ldm_gearTab[256] = { 0xf5b8f72c5f77775c, 0x84935f266b7ac412, 0xb647ada9ca730ccc, 0xb065bb4b114fb1de, 0x34584e7e8c3a9fd0, 0x4e97e17c6ae26b05, 0x3a03d743bc99a604, 0xcecd042422c4044f, 0x76de76c58524259e, diff --git a/thirdparty/zstd/compress/zstd_opt.c b/thirdparty/zstd/compress/zstd_opt.c index 402a7e5c76..1b1ddad428 100644 --- a/thirdparty/zstd/compress/zstd_opt.c +++ b/thirdparty/zstd/compress/zstd_opt.c @@ -14,7 +14,6 @@ #define ZSTD_LITFREQ_ADD 2 /* scaling factor for litFreq, so that frequencies adapt faster to new stats */ -#define ZSTD_FREQ_DIV 4 /* log factor when using previous stats to init next stats */ #define ZSTD_MAX_PRICE (1<<30) #define ZSTD_PREDEF_THRESHOLD 1024 /* if srcSize < ZSTD_PREDEF_THRESHOLD, symbols' cost is assumed static, directly determined by pre-defined distributions */ @@ -24,11 +23,11 @@ * Price functions for optimal parser ***************************************/ -#if 0 /* approximation at bit level */ +#if 0 /* approximation at bit level (for tests) */ # define BITCOST_ACCURACY 0 # define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) -# define WEIGHT(stat) ((void)opt, ZSTD_bitWeight(stat)) -#elif 0 /* fractional bit accuracy */ +# define WEIGHT(stat, opt) ((void)opt, ZSTD_bitWeight(stat)) +#elif 0 /* fractional bit accuracy (for tests) */ # define BITCOST_ACCURACY 8 # define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY) # define WEIGHT(stat,opt) ((void)opt, ZSTD_fracWeight(stat)) @@ -66,7 +65,7 @@ MEM_STATIC double ZSTD_fCost(U32 price) static int ZSTD_compressedLiterals(optState_t const* const optPtr) { - return optPtr->literalCompressionMode != ZSTD_lcm_uncompressed; + return optPtr->literalCompressionMode != ZSTD_ps_disable; } static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel) @@ -79,25 +78,46 @@ static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel) } -/* ZSTD_downscaleStat() : - * reduce all elements in table by a factor 2^(ZSTD_FREQ_DIV+malus) - * return the resulting sum of elements */ -static U32 ZSTD_downscaleStat(unsigned* table, U32 lastEltIndex, int malus) +static U32 sum_u32(const unsigned table[], size_t nbElts) +{ + size_t n; + U32 total = 0; + for (n=0; n<nbElts; n++) { + total += table[n]; + } + return total; +} + +static U32 ZSTD_downscaleStats(unsigned* table, U32 lastEltIndex, U32 shift) { U32 s, sum=0; - DEBUGLOG(5, "ZSTD_downscaleStat (nbElts=%u)", (unsigned)lastEltIndex+1); - assert(ZSTD_FREQ_DIV+malus > 0 && ZSTD_FREQ_DIV+malus < 31); + DEBUGLOG(5, "ZSTD_downscaleStats (nbElts=%u, shift=%u)", (unsigned)lastEltIndex+1, (unsigned)shift); + assert(shift < 30); for (s=0; s<lastEltIndex+1; s++) { - table[s] = 1 + (table[s] >> (ZSTD_FREQ_DIV+malus)); + table[s] = 1 + (table[s] >> shift); sum += table[s]; } return sum; } +/* ZSTD_scaleStats() : + * reduce all elements in table is sum too large + * return the resulting sum of elements */ +static U32 ZSTD_scaleStats(unsigned* table, U32 lastEltIndex, U32 logTarget) +{ + U32 const prevsum = sum_u32(table, lastEltIndex+1); + U32 const factor = prevsum >> logTarget; + DEBUGLOG(5, "ZSTD_scaleStats (nbElts=%u, target=%u)", (unsigned)lastEltIndex+1, (unsigned)logTarget); + assert(logTarget < 30); + if (factor <= 1) return prevsum; + return ZSTD_downscaleStats(table, lastEltIndex, ZSTD_highbit32(factor)); +} + /* ZSTD_rescaleFreqs() : * if first block (detected by optPtr->litLengthSum == 0) : init statistics * take hints from dictionary if there is one - * or init from zero, using src for literals stats, or flat 1 for match symbols + * and init from zero if there is none, + * using src for literals stats, and baseline stats for sequence symbols * otherwise downscale existing stats, to be used as seed for next block. */ static void @@ -126,7 +146,7 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, optPtr->litSum = 0; for (lit=0; lit<=MaxLit; lit++) { U32 const scaleLog = 11; /* scale to 2K */ - U32 const bitCost = HUF_getNbBits(optPtr->symbolCosts->huf.CTable, lit); + U32 const bitCost = HUF_getNbBitsFromCTable(optPtr->symbolCosts->huf.CTable, lit); assert(bitCost <= scaleLog); optPtr->litFreq[lit] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/; optPtr->litSum += optPtr->litFreq[lit]; @@ -174,14 +194,19 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, if (compressedLiterals) { unsigned lit = MaxLit; HIST_count_simple(optPtr->litFreq, &lit, src, srcSize); /* use raw first block to init statistics */ - optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1); + optPtr->litSum = ZSTD_downscaleStats(optPtr->litFreq, MaxLit, 8); } - { unsigned ll; - for (ll=0; ll<=MaxLL; ll++) - optPtr->litLengthFreq[ll] = 1; + { unsigned const baseLLfreqs[MaxLL+1] = { + 4, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->litLengthFreq, baseLLfreqs, sizeof(baseLLfreqs)); + optPtr->litLengthSum = sum_u32(baseLLfreqs, MaxLL+1); } - optPtr->litLengthSum = MaxLL+1; { unsigned ml; for (ml=0; ml<=MaxML; ml++) @@ -189,21 +214,26 @@ ZSTD_rescaleFreqs(optState_t* const optPtr, } optPtr->matchLengthSum = MaxML+1; - { unsigned of; - for (of=0; of<=MaxOff; of++) - optPtr->offCodeFreq[of] = 1; + { unsigned const baseOFCfreqs[MaxOff+1] = { + 6, 2, 1, 1, 2, 3, 4, 4, + 4, 3, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1 + }; + ZSTD_memcpy(optPtr->offCodeFreq, baseOFCfreqs, sizeof(baseOFCfreqs)); + optPtr->offCodeSum = sum_u32(baseOFCfreqs, MaxOff+1); } - optPtr->offCodeSum = MaxOff+1; + } } else { /* new block : re-use previous statistics, scaled down */ if (compressedLiterals) - optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1); - optPtr->litLengthSum = ZSTD_downscaleStat(optPtr->litLengthFreq, MaxLL, 0); - optPtr->matchLengthSum = ZSTD_downscaleStat(optPtr->matchLengthFreq, MaxML, 0); - optPtr->offCodeSum = ZSTD_downscaleStat(optPtr->offCodeFreq, MaxOff, 0); + optPtr->litSum = ZSTD_scaleStats(optPtr->litFreq, MaxLit, 12); + optPtr->litLengthSum = ZSTD_scaleStats(optPtr->litLengthFreq, MaxLL, 11); + optPtr->matchLengthSum = ZSTD_scaleStats(optPtr->matchLengthFreq, MaxML, 11); + optPtr->offCodeSum = ZSTD_scaleStats(optPtr->offCodeFreq, MaxOff, 11); } ZSTD_setBasePrices(optPtr, optLevel); @@ -239,7 +269,16 @@ static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, * cost of literalLength symbol */ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optPtr, int optLevel) { - if (optPtr->priceType == zop_predef) return WEIGHT(litLength, optLevel); + assert(litLength <= ZSTD_BLOCKSIZE_MAX); + if (optPtr->priceType == zop_predef) + return WEIGHT(litLength, optLevel); + /* We can't compute the litLength price for sizes >= ZSTD_BLOCKSIZE_MAX + * because it isn't representable in the zstd format. So instead just + * call it 1 bit more than ZSTD_BLOCKSIZE_MAX - 1. In this case the block + * would be all literals. + */ + if (litLength == ZSTD_BLOCKSIZE_MAX) + return BITCOST_MULTIPLIER + ZSTD_litLengthPrice(ZSTD_BLOCKSIZE_MAX - 1, optPtr, optLevel); /* dynamic statistics */ { U32 const llCode = ZSTD_LLcode(litLength); @@ -252,15 +291,17 @@ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optP /* ZSTD_getMatchPrice() : * Provides the cost of the match part (offset + matchLength) of a sequence * Must be combined with ZSTD_fullLiteralsCost() to get the full cost of a sequence. - * optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) */ + * @offcode : expects a scale where 0,1,2 are repcodes 1-3, and 3+ are real_offsets+2 + * @optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) + */ FORCE_INLINE_TEMPLATE U32 -ZSTD_getMatchPrice(U32 const offset, +ZSTD_getMatchPrice(U32 const offcode, U32 const matchLength, const optState_t* const optPtr, int const optLevel) { U32 price; - U32 const offCode = ZSTD_highbit32(offset+1); + U32 const offCode = ZSTD_highbit32(STORED_TO_OFFBASE(offcode)); U32 const mlBase = matchLength - MINMATCH; assert(matchLength >= MINMATCH); @@ -303,8 +344,8 @@ static void ZSTD_updateStats(optState_t* const optPtr, optPtr->litLengthSum++; } - /* match offset code (0-2=>repCode; 3+=>offset+2) */ - { U32 const offCode = ZSTD_highbit32(offsetCode+1); + /* offset code : expected to follow storeSeq() numeric representation */ + { U32 const offCode = ZSTD_highbit32(STORED_TO_OFFBASE(offsetCode)); assert(offCode <= MaxOff); optPtr->offCodeFreq[offCode]++; optPtr->offCodeSum++; @@ -338,7 +379,7 @@ MEM_STATIC U32 ZSTD_readMINMATCH(const void* memPtr, U32 length) /* Update hashTable3 up to ip (excluded) Assumption : always within prefix (i.e. not within extDict) */ -static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, +static U32 ZSTD_insertAndFindFirstIndexHash3 (const ZSTD_matchState_t* ms, U32* nextToUpdate3, const BYTE* const ip) { @@ -364,11 +405,13 @@ static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, * Binary Tree search ***************************************/ /** ZSTD_insertBt1() : add one or multiple positions to tree. - * ip : assumed <= iend-8 . + * @param ip assumed <= iend-8 . + * @param target The target of ZSTD_updateTree_internal() - we are filling to this position * @return : nb of positions added */ static U32 ZSTD_insertBt1( - ZSTD_matchState_t* ms, + const ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, + U32 const target, U32 const mls, const int extDict) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -391,7 +434,10 @@ static U32 ZSTD_insertBt1( U32* smallerPtr = bt + 2*(curr&btMask); U32* largerPtr = smallerPtr + 1; U32 dummy32; /* to be nullified at the end */ - U32 const windowLow = ms->window.lowLimit; + /* windowLow is based on target because + * we only need positions that will be in the window at the end of the tree update. + */ + U32 const windowLow = ZSTD_getLowestMatchIndex(ms, target, cParams->windowLog); U32 matchEndIdx = curr+8+1; size_t bestLength = 8; U32 nbCompares = 1U << cParams->searchLog; @@ -404,11 +450,12 @@ static U32 ZSTD_insertBt1( DEBUGLOG(8, "ZSTD_insertBt1 (%u)", curr); + assert(curr <= target); assert(ip <= iend-8); /* required for h calculation */ hashTable[h] = curr; /* Update Hash Table */ assert(windowLow > 0); - while (nbCompares-- && (matchIndex >= windowLow)) { + for (; nbCompares && (matchIndex >= windowLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ assert(matchIndex < curr); @@ -492,7 +539,7 @@ void ZSTD_updateTree_internal( idx, target, dictMode); while(idx < target) { - U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, mls, dictMode == ZSTD_extDict); + U32 const forward = ZSTD_insertBt1(ms, base+idx, iend, target, mls, dictMode == ZSTD_extDict); assert(idx < (U32)(idx + forward)); idx += forward; } @@ -597,7 +644,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( DEBUGLOG(8, "found repCode %u (ll0:%u, offset:%u) of length %u", repCode, ll0, repOffset, repLen); bestLength = repLen; - matches[mnum].off = repCode - ll0; + matches[mnum].off = STORE_REPCODE(repCode - ll0 + 1); /* expect value between 1 and 3 */ matches[mnum].len = (U32)repLen; mnum++; if ( (repLen > sufficient_len) @@ -626,7 +673,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( bestLength = mlen; assert(curr > matchIndex3); assert(mnum==0); /* no prior solution */ - matches[0].off = (curr - matchIndex3) + ZSTD_REP_MOVE; + matches[0].off = STORE_OFFSET(curr - matchIndex3); matches[0].len = (U32)mlen; mnum = 1; if ( (mlen > sufficient_len) | @@ -635,11 +682,11 @@ U32 ZSTD_insertBtAndGetAllMatches ( return 1; } } } /* no dictMatchState lookup: dicts don't have a populated HC3 table */ - } + } /* if (mls == 3) */ hashTable[h] = curr; /* Update Hash Table */ - while (nbCompares-- && (matchIndex >= matchLow)) { + for (; nbCompares && (matchIndex >= matchLow); --nbCompares) { U32* const nextPtr = bt + 2*(matchIndex & btMask); const BYTE* match; size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ @@ -660,20 +707,19 @@ U32 ZSTD_insertBtAndGetAllMatches ( if (matchLength > bestLength) { DEBUGLOG(8, "found match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, curr - matchIndex + ZSTD_REP_MOVE); + (U32)matchLength, curr - matchIndex, STORE_OFFSET(curr - matchIndex)); assert(matchEndIdx > matchIndex); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = (curr - matchIndex) + ZSTD_REP_MOVE; + matches[mnum].off = STORE_OFFSET(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { if (dictMode == ZSTD_dictMatchState) nbCompares = 0; /* break should also skip searching dms */ break; /* drop, to preserve bt consistency (miss a little bit of compression) */ - } - } + } } if (match[matchLength] < ip[matchLength]) { /* match smaller than current */ @@ -692,12 +738,13 @@ U32 ZSTD_insertBtAndGetAllMatches ( *smallerPtr = *largerPtr = 0; + assert(nbCompares <= (1U << ZSTD_SEARCHLOG_MAX)); /* Check we haven't underflowed. */ if (dictMode == ZSTD_dictMatchState && nbCompares) { size_t const dmsH = ZSTD_hashPtr(ip, dmsHashLog, mls); U32 dictMatchIndex = dms->hashTable[dmsH]; const U32* const dmsBt = dms->chainTable; commonLengthSmaller = commonLengthLarger = 0; - while (nbCompares-- && (dictMatchIndex > dmsLowLimit)) { + for (; nbCompares && (dictMatchIndex > dmsLowLimit); --nbCompares) { const U32* const nextPtr = dmsBt + 2*(dictMatchIndex & dmsBtMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match = dmsBase + dictMatchIndex; @@ -708,18 +755,17 @@ U32 ZSTD_insertBtAndGetAllMatches ( if (matchLength > bestLength) { matchIndex = dictMatchIndex + dmsIndexDelta; DEBUGLOG(8, "found dms match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, curr - matchIndex + ZSTD_REP_MOVE); + (U32)matchLength, curr - matchIndex, STORE_OFFSET(curr - matchIndex)); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = (curr - matchIndex) + ZSTD_REP_MOVE; + matches[mnum].off = STORE_OFFSET(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) { break; /* drop, to guarantee consistency (miss a little bit of compression) */ - } - } + } } if (dictMatchIndex <= dmsBtLow) { break; } /* beyond tree size, stop the search */ if (match[matchLength] < ip[matchLength]) { @@ -729,39 +775,91 @@ U32 ZSTD_insertBtAndGetAllMatches ( /* match is larger than current */ commonLengthLarger = matchLength; dictMatchIndex = nextPtr[0]; - } - } - } + } } } /* if (dictMode == ZSTD_dictMatchState) */ assert(matchEndIdx > curr+8); ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ return mnum; } - -FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( - ZSTD_match_t* matches, /* store result (match found, increasing size) in this table */ - ZSTD_matchState_t* ms, - U32* nextToUpdate3, - const BYTE* ip, const BYTE* const iHighLimit, const ZSTD_dictMode_e dictMode, - const U32 rep[ZSTD_REP_NUM], - U32 const ll0, - U32 const lengthToBeat) +typedef U32 (*ZSTD_getAllMatchesFn)( + ZSTD_match_t*, + ZSTD_matchState_t*, + U32*, + const BYTE*, + const BYTE*, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat); + +FORCE_INLINE_TEMPLATE U32 ZSTD_btGetAllMatches_internal( + ZSTD_match_t* matches, + ZSTD_matchState_t* ms, + U32* nextToUpdate3, + const BYTE* ip, + const BYTE* const iHighLimit, + const U32 rep[ZSTD_REP_NUM], + U32 const ll0, + U32 const lengthToBeat, + const ZSTD_dictMode_e dictMode, + const U32 mls) { - const ZSTD_compressionParameters* const cParams = &ms->cParams; - U32 const matchLengthSearch = cParams->minMatch; - DEBUGLOG(8, "ZSTD_BtGetAllMatches"); - if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */ - ZSTD_updateTree_internal(ms, ip, iHighLimit, matchLengthSearch, dictMode); - switch(matchLengthSearch) - { - case 3 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 3); - default : - case 4 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 4); - case 5 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 5); - case 7 : - case 6 : return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, 6); + assert(BOUNDED(3, ms->cParams.minMatch, 6) == mls); + DEBUGLOG(8, "ZSTD_BtGetAllMatches(dictMode=%d, mls=%u)", (int)dictMode, mls); + if (ip < ms->window.base + ms->nextToUpdate) + return 0; /* skipped area */ + ZSTD_updateTree_internal(ms, ip, iHighLimit, mls, dictMode); + return ZSTD_insertBtAndGetAllMatches(matches, ms, nextToUpdate3, ip, iHighLimit, dictMode, rep, ll0, lengthToBeat, mls); +} + +#define ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls) ZSTD_btGetAllMatches_##dictMode##_##mls + +#define GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, mls) \ + static U32 ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, mls)( \ + ZSTD_match_t* matches, \ + ZSTD_matchState_t* ms, \ + U32* nextToUpdate3, \ + const BYTE* ip, \ + const BYTE* const iHighLimit, \ + const U32 rep[ZSTD_REP_NUM], \ + U32 const ll0, \ + U32 const lengthToBeat) \ + { \ + return ZSTD_btGetAllMatches_internal( \ + matches, ms, nextToUpdate3, ip, iHighLimit, \ + rep, ll0, lengthToBeat, ZSTD_##dictMode, mls); \ + } + +#define GEN_ZSTD_BT_GET_ALL_MATCHES(dictMode) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 3) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 4) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 5) \ + GEN_ZSTD_BT_GET_ALL_MATCHES_(dictMode, 6) + +GEN_ZSTD_BT_GET_ALL_MATCHES(noDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(extDict) +GEN_ZSTD_BT_GET_ALL_MATCHES(dictMatchState) + +#define ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMode) \ + { \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 3), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 4), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 5), \ + ZSTD_BT_GET_ALL_MATCHES_FN(dictMode, 6) \ } + +static ZSTD_getAllMatchesFn +ZSTD_selectBtGetAllMatches(ZSTD_matchState_t const* ms, ZSTD_dictMode_e const dictMode) +{ + ZSTD_getAllMatchesFn const getAllMatchesFns[3][4] = { + ZSTD_BT_GET_ALL_MATCHES_ARRAY(noDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(extDict), + ZSTD_BT_GET_ALL_MATCHES_ARRAY(dictMatchState) + }; + U32 const mls = BOUNDED(3, ms->cParams.minMatch, 6); + assert((U32)dictMode < 3); + assert(mls - 3 < 4); + return getAllMatchesFns[(int)dictMode][mls - 3]; } /************************* @@ -770,16 +868,18 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches ( /* Struct containing info needed to make decision about ldm inclusion */ typedef struct { - rawSeqStore_t seqStore; /* External match candidates store for this block */ - U32 startPosInBlock; /* Start position of the current match candidate */ - U32 endPosInBlock; /* End position of the current match candidate */ - U32 offset; /* Offset of the match candidate */ + rawSeqStore_t seqStore; /* External match candidates store for this block */ + U32 startPosInBlock; /* Start position of the current match candidate */ + U32 endPosInBlock; /* End position of the current match candidate */ + U32 offset; /* Offset of the match candidate */ } ZSTD_optLdm_t; /* ZSTD_optLdm_skipRawSeqStoreBytes(): - * Moves forward in rawSeqStore by nbBytes, which will update the fields 'pos' and 'posInSequence'. + * Moves forward in @rawSeqStore by @nbBytes, + * which will update the fields 'pos' and 'posInSequence'. */ -static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) { +static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes) +{ U32 currPos = (U32)(rawSeqStore->posInSequence + nbBytes); while (currPos && rawSeqStore->pos < rawSeqStore->size) { rawSeq currSeq = rawSeqStore->seq[rawSeqStore->pos]; @@ -800,8 +900,10 @@ static void ZSTD_optLdm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t * Calculates the beginning and end of the next match in the current block. * Updates 'pos' and 'posInSequence' of the ldmSeqStore. */ -static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 currPosInBlock, - U32 blockBytesRemaining) { +static void +ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 currPosInBlock, + U32 blockBytesRemaining) +{ rawSeq currSeq; U32 currBlockEndPos; U32 literalsBytesRemaining; @@ -813,8 +915,8 @@ static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 cu optLdm->endPosInBlock = UINT_MAX; return; } - /* Calculate appropriate bytes left in matchLength and litLength after adjusting - based on ldmSeqStore->posInSequence */ + /* Calculate appropriate bytes left in matchLength and litLength + * after adjusting based on ldmSeqStore->posInSequence */ currSeq = optLdm->seqStore.seq[optLdm->seqStore.pos]; assert(optLdm->seqStore.posInSequence <= currSeq.litLength + currSeq.matchLength); currBlockEndPos = currPosInBlock + blockBytesRemaining; @@ -850,15 +952,16 @@ static void ZSTD_opt_getNextMatchAndUpdateSeqStore(ZSTD_optLdm_t* optLdm, U32 cu } /* ZSTD_optLdm_maybeAddMatch(): - * Adds a match if it's long enough, based on it's 'matchStartPosInBlock' - * and 'matchEndPosInBlock', into 'matches'. Maintains the correct ordering of 'matches' + * Adds a match if it's long enough, + * based on it's 'matchStartPosInBlock' and 'matchEndPosInBlock', + * into 'matches'. Maintains the correct ordering of 'matches'. */ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, - ZSTD_optLdm_t* optLdm, U32 currPosInBlock) { - U32 posDiff = currPosInBlock - optLdm->startPosInBlock; + const ZSTD_optLdm_t* optLdm, U32 currPosInBlock) +{ + U32 const posDiff = currPosInBlock - optLdm->startPosInBlock; /* Note: ZSTD_match_t actually contains offCode and matchLength (before subtracting MINMATCH) */ - U32 candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; - U32 candidateOffCode = optLdm->offset + ZSTD_REP_MOVE; + U32 const candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; /* Ensure that current block position is not outside of the match */ if (currPosInBlock < optLdm->startPosInBlock @@ -868,6 +971,7 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, } if (*nbMatches == 0 || ((candidateMatchLength > matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM)) { + U32 const candidateOffCode = STORE_OFFSET(optLdm->offset); DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offCode: %u matchLength %u) at block position=%u", candidateOffCode, candidateMatchLength, currPosInBlock); matches[*nbMatches].len = candidateMatchLength; @@ -879,8 +983,11 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, /* ZSTD_optLdm_processMatchCandidate(): * Wrapper function to update ldm seq store and call ldm functions as necessary. */ -static void ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, ZSTD_match_t* matches, U32* nbMatches, - U32 currPosInBlock, U32 remainingBytes) { +static void +ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, + ZSTD_match_t* matches, U32* nbMatches, + U32 currPosInBlock, U32 remainingBytes) +{ if (optLdm->seqStore.size == 0 || optLdm->seqStore.pos >= optLdm->seqStore.size) { return; } @@ -891,19 +998,19 @@ static void ZSTD_optLdm_processMatchCandidate(ZSTD_optLdm_t* optLdm, ZSTD_match_ * at the end of a match from the ldm seq store, and will often be some bytes * over beyond matchEndPosInBlock. As such, we need to correct for these "overshoots" */ - U32 posOvershoot = currPosInBlock - optLdm->endPosInBlock; + U32 const posOvershoot = currPosInBlock - optLdm->endPosInBlock; ZSTD_optLdm_skipRawSeqStoreBytes(&optLdm->seqStore, posOvershoot); - } + } ZSTD_opt_getNextMatchAndUpdateSeqStore(optLdm, currPosInBlock, remainingBytes); } ZSTD_optLdm_maybeAddMatch(matches, nbMatches, optLdm, currPosInBlock); } + /*-******************************* * Optimal parser *********************************/ - static U32 ZSTD_totalLen(ZSTD_optimal_t sol) { return sol.litlen + sol.mlen; @@ -944,6 +1051,8 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, const BYTE* const prefixStart = base + ms->window.dictLimit; const ZSTD_compressionParameters* const cParams = &ms->cParams; + ZSTD_getAllMatchesFn getAllMatches = ZSTD_selectBtGetAllMatches(ms, dictMode); + U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1); U32 const minMatch = (cParams->minMatch == 3) ? 3 : 4; U32 nextToUpdate3 = ms->nextToUpdate; @@ -971,7 +1080,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* find first match */ { U32 const litlen = (U32)(ip - anchor); U32 const ll0 = !litlen; - U32 nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, ip, iend, dictMode, rep, ll0, minMatch); + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, ip, iend, rep, ll0, minMatch); ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, (U32)(ip-istart), (U32)(iend - ip)); if (!nbMatches) { ip++; continue; } @@ -985,18 +1094,18 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, * in every price. We include the literal length to avoid negative * prices when we subtract the previous literal length. */ - opt[0].price = ZSTD_litLengthPrice(litlen, optStatePtr, optLevel); + opt[0].price = (int)ZSTD_litLengthPrice(litlen, optStatePtr, optLevel); /* large match -> immediate encoding */ { U32 const maxML = matches[nbMatches-1].len; - U32 const maxOffset = matches[nbMatches-1].off; + U32 const maxOffcode = matches[nbMatches-1].off; DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffCode=%u at cPos=%u => start new series", - nbMatches, maxML, maxOffset, (U32)(ip-prefixStart)); + nbMatches, maxML, maxOffcode, (U32)(ip-prefixStart)); if (maxML > sufficient_len) { lastSequence.litlen = litlen; lastSequence.mlen = maxML; - lastSequence.off = maxOffset; + lastSequence.off = maxOffcode; DEBUGLOG(6, "large match (%u>%u), immediate encoding", maxML, sufficient_len); cur = 0; @@ -1005,24 +1114,25 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, } } /* set prices for first matches starting position == 0 */ - { U32 const literalsPrice = opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel); + assert(opt[0].price >= 0); + { U32 const literalsPrice = (U32)opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel); U32 pos; U32 matchNb; for (pos = 1; pos < minMatch; pos++) { opt[pos].price = ZSTD_MAX_PRICE; /* mlen, litlen and price will be fixed during forward scanning */ } for (matchNb = 0; matchNb < nbMatches; matchNb++) { - U32 const offset = matches[matchNb].off; + U32 const offcode = matches[matchNb].off; U32 const end = matches[matchNb].len; for ( ; pos <= end ; pos++ ) { - U32 const matchPrice = ZSTD_getMatchPrice(offset, pos, optStatePtr, optLevel); + U32 const matchPrice = ZSTD_getMatchPrice(offcode, pos, optStatePtr, optLevel); U32 const sequencePrice = literalsPrice + matchPrice; DEBUGLOG(7, "rPos:%u => set initial price : %.2f", pos, ZSTD_fCost(sequencePrice)); opt[pos].mlen = pos; - opt[pos].off = offset; + opt[pos].off = offcode; opt[pos].litlen = litlen; - opt[pos].price = sequencePrice; + opt[pos].price = (int)sequencePrice; } } last_pos = pos-1; } @@ -1037,9 +1147,9 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* Fix current position with one literal if cheaper */ { U32 const litlen = (opt[cur-1].mlen == 0) ? opt[cur-1].litlen + 1 : 1; int const price = opt[cur-1].price - + ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel) - + ZSTD_litLengthPrice(litlen, optStatePtr, optLevel) - - ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel); + + (int)ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel) + + (int)ZSTD_litLengthPrice(litlen, optStatePtr, optLevel) + - (int)ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel); assert(price < 1000000000); /* overflow check */ if (price <= opt[cur].price) { DEBUGLOG(7, "cPos:%zi==rPos:%u : better price (%.2f<=%.2f) using literal (ll==%u) (hist:%u,%u,%u)", @@ -1065,7 +1175,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, assert(cur >= opt[cur].mlen); if (opt[cur].mlen != 0) { U32 const prev = cur - opt[cur].mlen; - repcodes_t newReps = ZSTD_updateRep(opt[prev].rep, opt[cur].off, opt[cur].litlen==0); + repcodes_t const newReps = ZSTD_newRep(opt[prev].rep, opt[cur].off, opt[cur].litlen==0); ZSTD_memcpy(opt[cur].rep, &newReps, sizeof(repcodes_t)); } else { ZSTD_memcpy(opt[cur].rep, opt[cur - 1].rep, sizeof(repcodes_t)); @@ -1082,11 +1192,12 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, continue; /* skip unpromising positions; about ~+6% speed, -0.01 ratio */ } + assert(opt[cur].price >= 0); { U32 const ll0 = (opt[cur].mlen != 0); U32 const litlen = (opt[cur].mlen == 0) ? opt[cur].litlen : 0; - U32 const previousPrice = opt[cur].price; + U32 const previousPrice = (U32)opt[cur].price; U32 const basePrice = previousPrice + ZSTD_litLengthPrice(0, optStatePtr, optLevel); - U32 nbMatches = ZSTD_BtGetAllMatches(matches, ms, &nextToUpdate3, inr, iend, dictMode, opt[cur].rep, ll0, minMatch); + U32 nbMatches = getAllMatches(matches, ms, &nextToUpdate3, inr, iend, opt[cur].rep, ll0, minMatch); U32 matchNb; ZSTD_optLdm_processMatchCandidate(&optLdm, matches, &nbMatches, @@ -1124,7 +1235,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, for (mlen = lastML; mlen >= startML; mlen--) { /* scan downward */ U32 const pos = cur + mlen; - int const price = basePrice + ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel); + int const price = (int)basePrice + (int)ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel); if ((pos > last_pos) || (price < opt[pos].price)) { DEBUGLOG(7, "rPos:%u (ml=%2u) => new better price (%.2f<%.2f)", @@ -1154,7 +1265,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ * update them while traversing the sequences. */ if (lastSequence.mlen != 0) { - repcodes_t reps = ZSTD_updateRep(opt[cur].rep, lastSequence.off, lastSequence.litlen==0); + repcodes_t const reps = ZSTD_newRep(opt[cur].rep, lastSequence.off, lastSequence.litlen==0); ZSTD_memcpy(rep, &reps, sizeof(reps)); } else { ZSTD_memcpy(rep, opt[cur].rep, sizeof(repcodes_t)); @@ -1198,7 +1309,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ assert(anchor + llen <= iend); ZSTD_updateStats(optStatePtr, llen, anchor, offCode, mlen); - ZSTD_storeSeq(seqStore, llen, anchor, iend, offCode, mlen-MINMATCH); + ZSTD_storeSeq(seqStore, llen, anchor, iend, offCode, mlen); anchor += advance; ip = anchor; } } @@ -1210,38 +1321,30 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ return (size_t)(iend - anchor); } +static size_t ZSTD_compressBlock_opt0( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /* optLevel */, dictMode); +} + +static size_t ZSTD_compressBlock_opt2( + ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], + const void* src, size_t srcSize, const ZSTD_dictMode_e dictMode) +{ + return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /* optLevel */, dictMode); +} size_t ZSTD_compressBlock_btopt( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { DEBUGLOG(5, "ZSTD_compressBlock_btopt"); - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } -/* used in 2-pass strategy */ -static U32 ZSTD_upscaleStat(unsigned* table, U32 lastEltIndex, int bonus) -{ - U32 s, sum=0; - assert(ZSTD_FREQ_DIV+bonus >= 0); - for (s=0; s<lastEltIndex+1; s++) { - table[s] <<= ZSTD_FREQ_DIV+bonus; - table[s]--; - sum += table[s]; - } - return sum; -} -/* used in 2-pass strategy */ -MEM_STATIC void ZSTD_upscaleStats(optState_t* optPtr) -{ - if (ZSTD_compressedLiterals(optPtr)) - optPtr->litSum = ZSTD_upscaleStat(optPtr->litFreq, MaxLit, 0); - optPtr->litLengthSum = ZSTD_upscaleStat(optPtr->litLengthFreq, MaxLL, 0); - optPtr->matchLengthSum = ZSTD_upscaleStat(optPtr->matchLengthFreq, MaxML, 0); - optPtr->offCodeSum = ZSTD_upscaleStat(optPtr->offCodeFreq, MaxOff, 0); -} /* ZSTD_initStats_ultra(): * make a first compression pass, just to seed stats with more accurate starting values. @@ -1263,7 +1366,7 @@ ZSTD_initStats_ultra(ZSTD_matchState_t* ms, assert(ms->window.dictLimit == ms->window.lowLimit); /* no dictionary */ assert(ms->window.dictLimit - ms->nextToUpdate <= 1); /* no prefix (note: intentional overflow, defined as 2-complement) */ - ZSTD_compressBlock_opt_generic(ms, seqStore, tmpRep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); /* generate stats into ms->opt*/ + ZSTD_compressBlock_opt2(ms, seqStore, tmpRep, src, srcSize, ZSTD_noDict); /* generate stats into ms->opt*/ /* invalidate first scan from history */ ZSTD_resetSeqStore(seqStore); @@ -1272,8 +1375,6 @@ ZSTD_initStats_ultra(ZSTD_matchState_t* ms, ms->window.lowLimit = ms->window.dictLimit; ms->nextToUpdate = ms->window.dictLimit; - /* re-inforce weight of collected statistics */ - ZSTD_upscaleStats(&ms->opt); } size_t ZSTD_compressBlock_btultra( @@ -1281,7 +1382,7 @@ size_t ZSTD_compressBlock_btultra( const void* src, size_t srcSize) { DEBUGLOG(5, "ZSTD_compressBlock_btultra (srcSize=%zu)", srcSize); - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } size_t ZSTD_compressBlock_btultra2( @@ -1309,35 +1410,35 @@ size_t ZSTD_compressBlock_btultra2( ZSTD_initStats_ultra(ms, seqStore, rep, src, srcSize); } - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_noDict); } size_t ZSTD_compressBlock_btopt_dictMatchState( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_dictMatchState); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); } size_t ZSTD_compressBlock_btultra_dictMatchState( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_dictMatchState); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_dictMatchState); } size_t ZSTD_compressBlock_btopt_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_extDict); + return ZSTD_compressBlock_opt0(ms, seqStore, rep, src, srcSize, ZSTD_extDict); } size_t ZSTD_compressBlock_btultra_extDict( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], const void* src, size_t srcSize) { - return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_extDict); + return ZSTD_compressBlock_opt2(ms, seqStore, rep, src, srcSize, ZSTD_extDict); } /* note : no btultra2 variant for extDict nor dictMatchState, diff --git a/thirdparty/zstd/compress/zstdmt_compress.c b/thirdparty/zstd/compress/zstdmt_compress.c index 22aa3e1245..6bc14b035e 100644 --- a/thirdparty/zstd/compress/zstdmt_compress.c +++ b/thirdparty/zstd/compress/zstdmt_compress.c @@ -102,9 +102,8 @@ typedef struct ZSTDMT_bufferPool_s { buffer_t bTable[1]; /* variable size */ } ZSTDMT_bufferPool; -static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned nbWorkers, ZSTD_customMem cMem) +static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem) { - unsigned const maxNbBuffers = 2*nbWorkers + 3; ZSTDMT_bufferPool* const bufPool = (ZSTDMT_bufferPool*)ZSTD_customCalloc( sizeof(ZSTDMT_bufferPool) + (maxNbBuffers-1) * sizeof(buffer_t), cMem); if (bufPool==NULL) return NULL; @@ -160,9 +159,8 @@ static void ZSTDMT_setBufferSize(ZSTDMT_bufferPool* const bufPool, size_t const } -static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, U32 nbWorkers) +static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, unsigned maxNbBuffers) { - unsigned const maxNbBuffers = 2*nbWorkers + 3; if (srcBufPool==NULL) return NULL; if (srcBufPool->totalBuffers >= maxNbBuffers) /* good enough */ return srcBufPool; @@ -171,7 +169,7 @@ static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, size_t const bSize = srcBufPool->bufferSize; /* forward parameters */ ZSTDMT_bufferPool* newBufPool; ZSTDMT_freeBufferPool(srcBufPool); - newBufPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + newBufPool = ZSTDMT_createBufferPool(maxNbBuffers, cMem); if (newBufPool==NULL) return newBufPool; ZSTDMT_setBufferSize(newBufPool, bSize); return newBufPool; @@ -263,6 +261,16 @@ static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf) ZSTD_customFree(buf.start, bufPool->cMem); } +/* We need 2 output buffers per worker since each dstBuff must be flushed after it is released. + * The 3 additional buffers are as follows: + * 1 buffer for input loading + * 1 buffer for "next input" when submitting current one + * 1 buffer stuck in queue */ +#define BUF_POOL_MAX_NB_BUFFERS(nbWorkers) 2*nbWorkers + 3 + +/* After a worker releases its rawSeqStore, it is immediately ready for reuse. + * So we only need one seq buffer per worker. */ +#define SEQ_POOL_MAX_NB_BUFFERS(nbWorkers) nbWorkers /* ===== Seq Pool Wrapper ====== */ @@ -316,7 +324,7 @@ static void ZSTDMT_setNbSeq(ZSTDMT_seqPool* const seqPool, size_t const nbSeq) static ZSTDMT_seqPool* ZSTDMT_createSeqPool(unsigned nbWorkers, ZSTD_customMem cMem) { - ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(SEQ_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); if (seqPool == NULL) return NULL; ZSTDMT_setNbSeq(seqPool, 0); return seqPool; @@ -329,7 +337,7 @@ static void ZSTDMT_freeSeqPool(ZSTDMT_seqPool* seqPool) static ZSTDMT_seqPool* ZSTDMT_expandSeqPool(ZSTDMT_seqPool* pool, U32 nbWorkers) { - return ZSTDMT_expandBufferPool(pool, nbWorkers); + return ZSTDMT_expandBufferPool(pool, SEQ_POOL_MAX_NB_BUFFERS(nbWorkers)); } @@ -467,7 +475,7 @@ ZSTDMT_serialState_reset(serialState_t* serialState, ZSTD_dictContentType_e dictContentType) { /* Adjust parameters */ - if (params.ldmParams.enableLdm) { + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { DEBUGLOG(4, "LDM window size = %u KB", (1U << params.cParams.windowLog) >> 10); ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.cParams); assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog); @@ -478,7 +486,7 @@ ZSTDMT_serialState_reset(serialState_t* serialState, serialState->nextJobID = 0; if (params.fParams.checksumFlag) XXH64_reset(&serialState->xxhState, 0); - if (params.ldmParams.enableLdm) { + if (params.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_customMem cMem = params.customMem; unsigned const hashLog = params.ldmParams.hashLog; size_t const hashSize = ((size_t)1 << hashLog) * sizeof(ldmEntry_t); @@ -564,7 +572,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState, /* A future job may error and skip our job */ if (serialState->nextJobID == jobID) { /* It is now our turn, do any processing necessary */ - if (serialState->params.ldmParams.enableLdm) { + if (serialState->params.ldmParams.enableLdm == ZSTD_ps_enable) { size_t error; assert(seqStore.seq != NULL && seqStore.pos == 0 && seqStore.size == 0 && seqStore.capacity > 0); @@ -594,7 +602,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState, if (seqStore.size > 0) { size_t const err = ZSTD_referenceExternalSequences( jobCCtx, seqStore.seq, seqStore.size); - assert(serialState->params.ldmParams.enableLdm); + assert(serialState->params.ldmParams.enableLdm == ZSTD_ps_enable); assert(!ZSTD_isError(err)); (void)err; } @@ -672,7 +680,7 @@ static void ZSTDMT_compressionJob(void* jobDescription) if (dstBuff.start==NULL) JOB_ERROR(ERROR(memory_allocation)); job->dstBuff = dstBuff; /* this value can be read in ZSTDMT_flush, when it copies the whole job */ } - if (jobParams.ldmParams.enableLdm && rawSeqStore.seq == NULL) + if (jobParams.ldmParams.enableLdm == ZSTD_ps_enable && rawSeqStore.seq == NULL) JOB_ERROR(ERROR(memory_allocation)); /* Don't compute the checksum for chunks, since we compute it externally, @@ -680,7 +688,7 @@ static void ZSTDMT_compressionJob(void* jobDescription) */ if (job->jobID != 0) jobParams.fParams.checksumFlag = 0; /* Don't run LDM for the chunks, since we handle it externally */ - jobParams.ldmParams.enableLdm = 0; + jobParams.ldmParams.enableLdm = ZSTD_ps_disable; /* Correct nbWorkers to 0. */ jobParams.nbWorkers = 0; @@ -807,6 +815,15 @@ typedef struct { static const roundBuff_t kNullRoundBuff = {NULL, 0, 0}; #define RSYNC_LENGTH 32 +/* Don't create chunks smaller than the zstd block size. + * This stops us from regressing compression ratio too much, + * and ensures our output fits in ZSTD_compressBound(). + * + * If this is shrunk < ZSTD_BLOCKSIZELOG_MIN then + * ZSTD_COMPRESSBOUND() will need to be updated. + */ +#define RSYNC_MIN_BLOCK_LOG ZSTD_BLOCKSIZELOG_MAX +#define RSYNC_MIN_BLOCK_SIZE (1<<RSYNC_MIN_BLOCK_LOG) typedef struct { U64 hash; @@ -927,7 +944,7 @@ MEM_STATIC ZSTDMT_CCtx* ZSTDMT_createCCtx_advanced_internal(unsigned nbWorkers, mtctx->jobs = ZSTDMT_createJobsTable(&nbJobs, cMem); assert(nbJobs > 0); assert((nbJobs & (nbJobs - 1)) == 0); /* ensure nbJobs is a power of 2 */ mtctx->jobIDMask = nbJobs - 1; - mtctx->bufPool = ZSTDMT_createBufferPool(nbWorkers, cMem); + mtctx->bufPool = ZSTDMT_createBufferPool(BUF_POOL_MAX_NB_BUFFERS(nbWorkers), cMem); mtctx->cctxPool = ZSTDMT_createCCtxPool(nbWorkers, cMem); mtctx->seqPool = ZSTDMT_createSeqPool(nbWorkers, cMem); initError = ZSTDMT_serialState_init(&mtctx->serial); @@ -1030,7 +1047,7 @@ static size_t ZSTDMT_resize(ZSTDMT_CCtx* mtctx, unsigned nbWorkers) { if (POOL_resize(mtctx->factory, nbWorkers)) return ERROR(memory_allocation); FORWARD_IF_ERROR( ZSTDMT_expandJobsTable(mtctx, nbWorkers) , ""); - mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, nbWorkers); + mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, BUF_POOL_MAX_NB_BUFFERS(nbWorkers)); if (mtctx->bufPool == NULL) return ERROR(memory_allocation); mtctx->cctxPool = ZSTDMT_expandCCtxPool(mtctx->cctxPool, nbWorkers); if (mtctx->cctxPool == NULL) return ERROR(memory_allocation); @@ -1135,7 +1152,7 @@ size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx) static unsigned ZSTDMT_computeTargetJobLog(const ZSTD_CCtx_params* params) { unsigned jobLog; - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* In Long Range Mode, the windowLog is typically oversized. * In which case, it's preferable to determine the jobSize * based on cycleLog instead. */ @@ -1179,7 +1196,7 @@ static size_t ZSTDMT_computeOverlapSize(const ZSTD_CCtx_params* params) int const overlapRLog = 9 - ZSTDMT_overlapLog(params->overlapLog, params->cParams.strategy); int ovLog = (overlapRLog >= 8) ? 0 : (params->cParams.windowLog - overlapRLog); assert(0 <= overlapRLog && overlapRLog <= 8); - if (params->ldmParams.enableLdm) { + if (params->ldmParams.enableLdm == ZSTD_ps_enable) { /* In Long Range Mode, the windowLog is typically oversized. * In which case, it's preferable to determine the jobSize * based on chainLog instead. @@ -1252,6 +1269,9 @@ size_t ZSTDMT_initCStream_internal( /* Aim for the targetsectionSize as the average job size. */ U32 const jobSizeKB = (U32)(mtctx->targetSectionSize >> 10); U32 const rsyncBits = (assert(jobSizeKB >= 1), ZSTD_highbit32(jobSizeKB) + 10); + /* We refuse to create jobs < RSYNC_MIN_BLOCK_SIZE bytes, so make sure our + * expected job size is at least 4x larger. */ + assert(rsyncBits >= RSYNC_MIN_BLOCK_LOG + 2); DEBUGLOG(4, "rsyncLog = %u", rsyncBits); mtctx->rsync.hash = 0; mtctx->rsync.hitMask = (1ULL << rsyncBits) - 1; @@ -1263,7 +1283,7 @@ size_t ZSTDMT_initCStream_internal( ZSTDMT_setBufferSize(mtctx->bufPool, ZSTD_compressBound(mtctx->targetSectionSize)); { /* If ldm is enabled we need windowSize space. */ - size_t const windowSize = mtctx->params.ldmParams.enableLdm ? (1U << mtctx->params.cParams.windowLog) : 0; + size_t const windowSize = mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable ? (1U << mtctx->params.cParams.windowLog) : 0; /* Two buffers of slack, plus extra space for the overlap * This is the minimum slack that LDM works with. One extra because * flush might waste up to targetSectionSize-1 bytes. Another extra @@ -1538,17 +1558,21 @@ static range_t ZSTDMT_getInputDataInUse(ZSTDMT_CCtx* mtctx) static int ZSTDMT_isOverlapped(buffer_t buffer, range_t range) { BYTE const* const bufferStart = (BYTE const*)buffer.start; - BYTE const* const bufferEnd = bufferStart + buffer.capacity; BYTE const* const rangeStart = (BYTE const*)range.start; - BYTE const* const rangeEnd = range.size != 0 ? rangeStart + range.size : rangeStart; if (rangeStart == NULL || bufferStart == NULL) return 0; - /* Empty ranges cannot overlap */ - if (bufferStart == bufferEnd || rangeStart == rangeEnd) - return 0; - return bufferStart < rangeEnd && rangeStart < bufferEnd; + { + BYTE const* const bufferEnd = bufferStart + buffer.capacity; + BYTE const* const rangeEnd = rangeStart + range.size; + + /* Empty ranges cannot overlap */ + if (bufferStart == bufferEnd || rangeStart == rangeEnd) + return 0; + + return bufferStart < rangeEnd && rangeStart < bufferEnd; + } } static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window) @@ -1575,7 +1599,7 @@ static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window) static void ZSTDMT_waitForLdmComplete(ZSTDMT_CCtx* mtctx, buffer_t buffer) { - if (mtctx->params.ldmParams.enableLdm) { + if (mtctx->params.ldmParams.enableLdm == ZSTD_ps_enable) { ZSTD_pthread_mutex_t* mutex = &mtctx->serial.ldmWindowMutex; DEBUGLOG(5, "ZSTDMT_waitForLdmComplete"); DEBUGLOG(5, "source [0x%zx, 0x%zx)", @@ -1678,6 +1702,11 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) if (!mtctx->params.rsyncable) /* Rsync is disabled. */ return syncPoint; + if (mtctx->inBuff.filled + input.size - input.pos < RSYNC_MIN_BLOCK_SIZE) + /* We don't emit synchronization points if it would produce too small blocks. + * We don't have enough input to find a synchronization point, so don't look. + */ + return syncPoint; if (mtctx->inBuff.filled + syncPoint.toLoad < RSYNC_LENGTH) /* Not enough to compute the hash. * We will miss any synchronization points in this RSYNC_LENGTH byte @@ -1688,10 +1717,28 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) */ return syncPoint; /* Initialize the loop variables. */ - if (mtctx->inBuff.filled >= RSYNC_LENGTH) { - /* We have enough bytes buffered to initialize the hash. + if (mtctx->inBuff.filled < RSYNC_MIN_BLOCK_SIZE) { + /* We don't need to scan the first RSYNC_MIN_BLOCK_SIZE positions + * because they can't possibly be a sync point. So we can start + * part way through the input buffer. + */ + pos = RSYNC_MIN_BLOCK_SIZE - mtctx->inBuff.filled; + if (pos >= RSYNC_LENGTH) { + prev = istart + pos - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); + } else { + assert(mtctx->inBuff.filled >= RSYNC_LENGTH); + prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; + hash = ZSTD_rollingHash_compute(prev + pos, (RSYNC_LENGTH - pos)); + hash = ZSTD_rollingHash_append(hash, istart, pos); + } + } else { + /* We have enough bytes buffered to initialize the hash, + * and are have processed enough bytes to find a sync point. * Start scanning at the beginning of the input. */ + assert(mtctx->inBuff.filled >= RSYNC_MIN_BLOCK_SIZE); + assert(RSYNC_MIN_BLOCK_SIZE >= RSYNC_LENGTH); pos = 0; prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH; hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH); @@ -1705,16 +1752,6 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) syncPoint.flush = 1; return syncPoint; } - } else { - /* We don't have enough bytes buffered to initialize the hash, but - * we know we have at least RSYNC_LENGTH bytes total. - * Start scanning after the first RSYNC_LENGTH bytes less the bytes - * already buffered. - */ - pos = RSYNC_LENGTH - mtctx->inBuff.filled; - prev = (BYTE const*)mtctx->inBuff.buffer.start - pos; - hash = ZSTD_rollingHash_compute(mtctx->inBuff.buffer.start, mtctx->inBuff.filled); - hash = ZSTD_rollingHash_append(hash, istart, pos); } /* Starting with the hash of the previous RSYNC_LENGTH bytes, roll * through the input. If we hit a synchronization point, then cut the @@ -1726,8 +1763,9 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) */ for (; pos < syncPoint.toLoad; ++pos) { BYTE const toRemove = pos < RSYNC_LENGTH ? prev[pos] : istart[pos - RSYNC_LENGTH]; - /* if (pos >= RSYNC_LENGTH) assert(ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); */ + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); hash = ZSTD_rollingHash_rotate(hash, toRemove, istart[pos], primePower); + assert(mtctx->inBuff.filled + pos >= RSYNC_MIN_BLOCK_SIZE); if ((hash & hitMask) == hitMask) { syncPoint.toLoad = pos + 1; syncPoint.flush = 1; diff --git a/thirdparty/zstd/compress/zstdmt_compress.h b/thirdparty/zstd/compress/zstdmt_compress.h index 2fee2ec745..271eb1ac71 100644 --- a/thirdparty/zstd/compress/zstdmt_compress.h +++ b/thirdparty/zstd/compress/zstdmt_compress.h @@ -65,8 +65,11 @@ size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx); * Private use only. Init streaming operation. * expects params to be valid. * must receive dict, or cdict, or none, but not both. + * mtctx can be freshly constructed or reused from a prior compression. + * If mtctx is reused, memory allocations from the prior compression may not be freed, + * even if they are not needed for the current compression. * @return : 0, or an error code */ -size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* zcs, +size_t ZSTDMT_initCStream_internal(ZSTDMT_CCtx* mtctx, const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, const ZSTD_CDict* cdict, ZSTD_CCtx_params params, unsigned long long pledgedSrcSize); diff --git a/thirdparty/zstd/decompress/huf_decompress.c b/thirdparty/zstd/decompress/huf_decompress.c index b93c9a003b..2027188255 100644 --- a/thirdparty/zstd/decompress/huf_decompress.c +++ b/thirdparty/zstd/decompress/huf_decompress.c @@ -22,6 +22,13 @@ #define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "../common/error_private.h" +#include "../common/zstd_internal.h" + +/* ************************************************************** +* Constants +****************************************************************/ + +#define HUF_DECODER_FAST_TABLELOG 11 /* ************************************************************** * Macros @@ -36,6 +43,30 @@ #error "Cannot force the use of the X1 and X2 decoders at the same time!" #endif +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && DYNAMIC_BMI2 +# define HUF_ASM_X86_64_BMI2_ATTRS BMI2_TARGET_ATTRIBUTE +#else +# define HUF_ASM_X86_64_BMI2_ATTRS +#endif + +#ifdef __cplusplus +# define HUF_EXTERN_C extern "C" +#else +# define HUF_EXTERN_C +#endif +#define HUF_ASM_DECL HUF_EXTERN_C + +#if DYNAMIC_BMI2 || (ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)) +# define HUF_NEED_BMI2_FUNCTION 1 +#else +# define HUF_NEED_BMI2_FUNCTION 0 +#endif + +#if !(ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)) +# define HUF_NEED_DEFAULT_FUNCTION 1 +#else +# define HUF_NEED_DEFAULT_FUNCTION 0 +#endif /* ************************************************************** * Error Management @@ -65,7 +96,7 @@ return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \ } \ \ - static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \ + static BMI2_TARGET_ATTRIBUTE size_t fn##_bmi2( \ void* dst, size_t dstSize, \ const void* cSrc, size_t cSrcSize, \ const HUF_DTable* DTable) \ @@ -107,13 +138,147 @@ static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) return dtd; } +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +static size_t HUF_initDStream(BYTE const* ip) { + BYTE const lastByte = ip[7]; + size_t const bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; + size_t const value = MEM_readLEST(ip) | 1; + assert(bitsConsumed <= 8); + return value << bitsConsumed; +} +typedef struct { + BYTE const* ip[4]; + BYTE* op[4]; + U64 bits[4]; + void const* dt; + BYTE const* ilimit; + BYTE* oend; + BYTE const* iend[4]; +} HUF_DecompressAsmArgs; + +/** + * Initializes args for the asm decoding loop. + * @returns 0 on success + * 1 if the fallback implementation should be used. + * Or an error code on failure. + */ +static size_t HUF_DecompressAsmArgs_init(HUF_DecompressAsmArgs* args, void* dst, size_t dstSize, void const* src, size_t srcSize, const HUF_DTable* DTable) +{ + void const* dt = DTable + 1; + U32 const dtLog = HUF_getDTableDesc(DTable).tableLog; + + const BYTE* const ilimit = (const BYTE*)src + 6 + 8; + + BYTE* const oend = (BYTE*)dst + dstSize; + + /* The following condition is false on x32 platform, + * but HUF_asm is not compatible with this ABI */ + if (!(MEM_isLittleEndian() && !MEM_32bits())) return 1; + + /* strict minimum : jump table + 1 byte per stream */ + if (srcSize < 10) + return ERROR(corruption_detected); + + /* Must have at least 8 bytes per stream because we don't handle initializing smaller bit containers. + * If table log is not correct at this point, fallback to the old decoder. + * On small inputs we don't have enough data to trigger the fast loop, so use the old decoder. + */ + if (dtLog != HUF_DECODER_FAST_TABLELOG) + return 1; + + /* Read the jump table. */ + { + const BYTE* const istart = (const BYTE*)src; + size_t const length1 = MEM_readLE16(istart); + size_t const length2 = MEM_readLE16(istart+2); + size_t const length3 = MEM_readLE16(istart+4); + size_t const length4 = srcSize - (length1 + length2 + length3 + 6); + args->iend[0] = istart + 6; /* jumpTable */ + args->iend[1] = args->iend[0] + length1; + args->iend[2] = args->iend[1] + length2; + args->iend[3] = args->iend[2] + length3; + + /* HUF_initDStream() requires this, and this small of an input + * won't benefit from the ASM loop anyways. + * length1 must be >= 16 so that ip[0] >= ilimit before the loop + * starts. + */ + if (length1 < 16 || length2 < 8 || length3 < 8 || length4 < 8) + return 1; + if (length4 > srcSize) return ERROR(corruption_detected); /* overflow */ + } + /* ip[] contains the position that is currently loaded into bits[]. */ + args->ip[0] = args->iend[1] - sizeof(U64); + args->ip[1] = args->iend[2] - sizeof(U64); + args->ip[2] = args->iend[3] - sizeof(U64); + args->ip[3] = (BYTE const*)src + srcSize - sizeof(U64); + + /* op[] contains the output pointers. */ + args->op[0] = (BYTE*)dst; + args->op[1] = args->op[0] + (dstSize+3)/4; + args->op[2] = args->op[1] + (dstSize+3)/4; + args->op[3] = args->op[2] + (dstSize+3)/4; + + /* No point to call the ASM loop for tiny outputs. */ + if (args->op[3] >= oend) + return 1; + + /* bits[] is the bit container. + * It is read from the MSB down to the LSB. + * It is shifted left as it is read, and zeros are + * shifted in. After the lowest valid bit a 1 is + * set, so that CountTrailingZeros(bits[]) can be used + * to count how many bits we've consumed. + */ + args->bits[0] = HUF_initDStream(args->ip[0]); + args->bits[1] = HUF_initDStream(args->ip[1]); + args->bits[2] = HUF_initDStream(args->ip[2]); + args->bits[3] = HUF_initDStream(args->ip[3]); + + /* If ip[] >= ilimit, it is guaranteed to be safe to + * reload bits[]. It may be beyond its section, but is + * guaranteed to be valid (>= istart). + */ + args->ilimit = ilimit; + + args->oend = oend; + args->dt = dt; + + return 0; +} + +static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressAsmArgs const* args, int stream, BYTE* segmentEnd) +{ + /* Validate that we haven't overwritten. */ + if (args->op[stream] > segmentEnd) + return ERROR(corruption_detected); + /* Validate that we haven't read beyond iend[]. + * Note that ip[] may be < iend[] because the MSB is + * the next bit to read, and we may have consumed 100% + * of the stream, so down to iend[i] - 8 is valid. + */ + if (args->ip[stream] < args->iend[stream] - 8) + return ERROR(corruption_detected); + + /* Construct the BIT_DStream_t. */ + bit->bitContainer = MEM_readLE64(args->ip[stream]); + bit->bitsConsumed = ZSTD_countTrailingZeros((size_t)args->bits[stream]); + bit->start = (const char*)args->iend[0]; + bit->limitPtr = bit->start + sizeof(size_t); + bit->ptr = (const char*)args->ip[stream]; + + return 0; +} +#endif + #ifndef HUF_FORCE_DECOMPRESS_X2 /*-***************************/ /* single-symbol decoding */ /*-***************************/ -typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX1; /* single-symbol decoding */ +typedef struct { BYTE nbBits; BYTE byte; } HUF_DEltX1; /* single-symbol decoding */ /** * Packs 4 HUF_DEltX1 structs into a U64. This is used to lay down 4 entries at @@ -122,14 +287,44 @@ typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX1; /* single-symbol decodi static U64 HUF_DEltX1_set4(BYTE symbol, BYTE nbBits) { U64 D4; if (MEM_isLittleEndian()) { - D4 = symbol + (nbBits << 8); - } else { D4 = (symbol << 8) + nbBits; + } else { + D4 = symbol + (nbBits << 8); } D4 *= 0x0001000100010001ULL; return D4; } +/** + * Increase the tableLog to targetTableLog and rescales the stats. + * If tableLog > targetTableLog this is a no-op. + * @returns New tableLog + */ +static U32 HUF_rescaleStats(BYTE* huffWeight, U32* rankVal, U32 nbSymbols, U32 tableLog, U32 targetTableLog) +{ + if (tableLog > targetTableLog) + return tableLog; + if (tableLog < targetTableLog) { + U32 const scale = targetTableLog - tableLog; + U32 s; + /* Increase the weight for all non-zero probability symbols by scale. */ + for (s = 0; s < nbSymbols; ++s) { + huffWeight[s] += (BYTE)((huffWeight[s] == 0) ? 0 : scale); + } + /* Update rankVal to reflect the new weights. + * All weights except 0 get moved to weight + scale. + * Weights [1, scale] are empty. + */ + for (s = targetTableLog; s > scale; --s) { + rankVal[s] = rankVal[s - scale]; + } + for (s = scale; s > 0; --s) { + rankVal[s] = 0; + } + } + return targetTableLog; +} + typedef struct { U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; U32 rankStart[HUF_TABLELOG_ABSOLUTEMAX + 1]; @@ -162,8 +357,12 @@ size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t sr iSize = HUF_readStats_wksp(wksp->huffWeight, HUF_SYMBOLVALUE_MAX + 1, wksp->rankVal, &nbSymbols, &tableLog, src, srcSize, wksp->statsWksp, sizeof(wksp->statsWksp), bmi2); if (HUF_isError(iSize)) return iSize; + /* Table header */ { DTableDesc dtd = HUF_getDTableDesc(DTable); + U32 const maxTableLog = dtd.maxTableLog + 1; + U32 const targetTableLog = MIN(maxTableLog, HUF_DECODER_FAST_TABLELOG); + tableLog = HUF_rescaleStats(wksp->huffWeight, wksp->rankVal, nbSymbols, tableLog, targetTableLog); if (tableLog > (U32)(dtd.maxTableLog+1)) return ERROR(tableLog_tooLarge); /* DTable too small, Huffman tree cannot fit in */ dtd.tableType = 0; dtd.tableLog = (BYTE)tableLog; @@ -207,7 +406,7 @@ size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t sr /* fill DTable * We fill all entries of each weight in order. - * That way length is a constant for each iteration of the outter loop. + * That way length is a constant for each iteration of the outer loop. * We can switch based on the length to a different inner loop which is * optimized for that particular case. */ @@ -304,11 +503,15 @@ HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, cons BYTE* const pStart = p; /* up to 4 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { - HUF_DECODE_SYMBOLX1_2(p, bitDPtr); - HUF_DECODE_SYMBOLX1_1(p, bitDPtr); - HUF_DECODE_SYMBOLX1_2(p, bitDPtr); - HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + if ((pEnd - p) > 3) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) { + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_1(p, bitDPtr); + HUF_DECODE_SYMBOLX1_2(p, bitDPtr); + HUF_DECODE_SYMBOLX1_0(p, bitDPtr); + } + } else { + BIT_reloadDStream(bitDPtr); } /* [0-3] symbols remaining */ @@ -388,33 +591,36 @@ HUF_decompress4X1_usingDTable_internal_body( U32 endSignal = 1; if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); /* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */ - for ( ; (endSignal) & (op4 < olimit) ; ) { - HUF_DECODE_SYMBOLX1_2(op1, &bitD1); - HUF_DECODE_SYMBOLX1_2(op2, &bitD2); - HUF_DECODE_SYMBOLX1_2(op3, &bitD3); - HUF_DECODE_SYMBOLX1_2(op4, &bitD4); - HUF_DECODE_SYMBOLX1_1(op1, &bitD1); - HUF_DECODE_SYMBOLX1_1(op2, &bitD2); - HUF_DECODE_SYMBOLX1_1(op3, &bitD3); - HUF_DECODE_SYMBOLX1_1(op4, &bitD4); - HUF_DECODE_SYMBOLX1_2(op1, &bitD1); - HUF_DECODE_SYMBOLX1_2(op2, &bitD2); - HUF_DECODE_SYMBOLX1_2(op3, &bitD3); - HUF_DECODE_SYMBOLX1_2(op4, &bitD4); - HUF_DECODE_SYMBOLX1_0(op1, &bitD1); - HUF_DECODE_SYMBOLX1_0(op2, &bitD2); - HUF_DECODE_SYMBOLX1_0(op3, &bitD3); - HUF_DECODE_SYMBOLX1_0(op4, &bitD4); - endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit) ; ) { + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_1(op1, &bitD1); + HUF_DECODE_SYMBOLX1_1(op2, &bitD2); + HUF_DECODE_SYMBOLX1_1(op3, &bitD3); + HUF_DECODE_SYMBOLX1_1(op4, &bitD4); + HUF_DECODE_SYMBOLX1_2(op1, &bitD1); + HUF_DECODE_SYMBOLX1_2(op2, &bitD2); + HUF_DECODE_SYMBOLX1_2(op3, &bitD3); + HUF_DECODE_SYMBOLX1_2(op4, &bitD4); + HUF_DECODE_SYMBOLX1_0(op1, &bitD1); + HUF_DECODE_SYMBOLX1_0(op2, &bitD2); + HUF_DECODE_SYMBOLX1_0(op3, &bitD3); + HUF_DECODE_SYMBOLX1_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + } } /* check corruption */ @@ -440,6 +646,79 @@ HUF_decompress4X1_usingDTable_internal_body( } } +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X1_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +#if HUF_NEED_DEFAULT_FUNCTION +static +size_t HUF_decompress4X1_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X1_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop(HUF_DecompressAsmArgs* args) ZSTDLIB_HIDDEN; + +static HUF_ASM_X86_64_BMI2_ATTRS +size_t +HUF_decompress4X1_usingDTable_internal_bmi2_asm( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) +{ + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressAsmArgs args; + { + size_t const ret = HUF_DecompressAsmArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init asm args"); + if (ret != 0) + return HUF_decompress4X1_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); + } + + assert(args.ip[0] >= args.ilimit); + HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop(&args); + + /* Our loop guarantees that ip[] >= ilimit and that we haven't + * overwritten any op[]. + */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bit streams one by one. */ + { + size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + /* Decompress and validate that we've produced exactly the expected length. */ + args.op[i] += HUF_decodeStreamX1(args.op[i], &bit, segmentEnd, (HUF_DEltX1 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) return ERROR(corruption_detected); + } + } + + /* decoded size */ + return dstSize; +} +#endif /* ZSTD_ENABLE_ASM_X86_64_BMI2 */ typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize, const void *cSrc, @@ -447,8 +726,28 @@ typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize, const HUF_DTable *DTable); HUF_DGEN(HUF_decompress1X1_usingDTable_internal) -HUF_DGEN(HUF_decompress4X1_usingDTable_internal) +static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + return HUF_decompress4X1_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable); +# else + return HUF_decompress4X1_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); +# endif + } +#else + (void)bmi2; +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + return HUF_decompress4X1_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable); +#else + return HUF_decompress4X1_usingDTable_internal_default(dst, dstSize, cSrc, cSrcSize, DTable); +#endif +} size_t HUF_decompress1X1_usingDTable( @@ -518,106 +817,226 @@ size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, /* *************************/ typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */ -typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t; +typedef struct { BYTE symbol; } sortedSymbol_t; typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1]; typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX]; +/** + * Constructs a HUF_DEltX2 in a U32. + */ +static U32 HUF_buildDEltX2U32(U32 symbol, U32 nbBits, U32 baseSeq, int level) +{ + U32 seq; + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, sequence) == 0); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, nbBits) == 2); + DEBUG_STATIC_ASSERT(offsetof(HUF_DEltX2, length) == 3); + DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U32)); + if (MEM_isLittleEndian()) { + seq = level == 1 ? symbol : (baseSeq + (symbol << 8)); + return seq + (nbBits << 16) + ((U32)level << 24); + } else { + seq = level == 1 ? (symbol << 8) : ((baseSeq << 8) + symbol); + return (seq << 16) + (nbBits << 8) + (U32)level; + } +} -/* HUF_fillDTableX2Level2() : - * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ -static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 sizeLog, const U32 consumed, - const U32* rankValOrigin, const int minWeight, - const sortedSymbol_t* sortedSymbols, const U32 sortedListSize, - U32 nbBitsBaseline, U16 baseSeq, U32* wksp, size_t wkspSize) +/** + * Constructs a HUF_DEltX2. + */ +static HUF_DEltX2 HUF_buildDEltX2(U32 symbol, U32 nbBits, U32 baseSeq, int level) { HUF_DEltX2 DElt; - U32* rankVal = wksp; + U32 const val = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + DEBUG_STATIC_ASSERT(sizeof(DElt) == sizeof(val)); + ZSTD_memcpy(&DElt, &val, sizeof(val)); + return DElt; +} - assert(wkspSize >= HUF_TABLELOG_MAX + 1); - (void)wkspSize; - /* get pre-calculated rankVal */ - ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1)); +/** + * Constructs 2 HUF_DEltX2s and packs them into a U64. + */ +static U64 HUF_buildDEltX2U64(U32 symbol, U32 nbBits, U16 baseSeq, int level) +{ + U32 DElt = HUF_buildDEltX2U32(symbol, nbBits, baseSeq, level); + return (U64)DElt + ((U64)DElt << 32); +} - /* fill skipped values */ - if (minWeight>1) { - U32 i, skipSize = rankVal[minWeight]; - MEM_writeLE16(&(DElt.sequence), baseSeq); - DElt.nbBits = (BYTE)(consumed); - DElt.length = 1; - for (i = 0; i < skipSize; i++) - DTable[i] = DElt; +/** + * Fills the DTable rank with all the symbols from [begin, end) that are each + * nbBits long. + * + * @param DTableRank The start of the rank in the DTable. + * @param begin The first symbol to fill (inclusive). + * @param end The last symbol to fill (exclusive). + * @param nbBits Each symbol is nbBits long. + * @param tableLog The table log. + * @param baseSeq If level == 1 { 0 } else { the first level symbol } + * @param level The level in the table. Must be 1 or 2. + */ +static void HUF_fillDTableX2ForWeight( + HUF_DEltX2* DTableRank, + sortedSymbol_t const* begin, sortedSymbol_t const* end, + U32 nbBits, U32 tableLog, + U16 baseSeq, int const level) +{ + U32 const length = 1U << ((tableLog - nbBits) & 0x1F /* quiet static-analyzer */); + const sortedSymbol_t* ptr; + assert(level >= 1 && level <= 2); + switch (length) { + case 1: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + *DTableRank++ = DElt; + } + break; + case 2: + for (ptr = begin; ptr != end; ++ptr) { + HUF_DEltX2 const DElt = HUF_buildDEltX2(ptr->symbol, nbBits, baseSeq, level); + DTableRank[0] = DElt; + DTableRank[1] = DElt; + DTableRank += 2; + } + break; + case 4: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + DTableRank += 4; + } + break; + case 8: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + DTableRank += 8; + } + break; + default: + for (ptr = begin; ptr != end; ++ptr) { + U64 const DEltX2 = HUF_buildDEltX2U64(ptr->symbol, nbBits, baseSeq, level); + HUF_DEltX2* const DTableRankEnd = DTableRank + length; + for (; DTableRank != DTableRankEnd; DTableRank += 8) { + ZSTD_memcpy(DTableRank + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTableRank + 6, &DEltX2, sizeof(DEltX2)); + } + } + break; } +} - /* fill DTable */ - { U32 s; for (s=0; s<sortedListSize; s++) { /* note : sortedSymbols already skipped */ - const U32 symbol = sortedSymbols[s].symbol; - const U32 weight = sortedSymbols[s].weight; - const U32 nbBits = nbBitsBaseline - weight; - const U32 length = 1 << (sizeLog-nbBits); - const U32 start = rankVal[weight]; - U32 i = start; - const U32 end = start + length; - - MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8))); - DElt.nbBits = (BYTE)(nbBits + consumed); - DElt.length = 2; - do { DTable[i++] = DElt; } while (i<end); /* since length >= 1 */ +/* HUF_fillDTableX2Level2() : + * `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */ +static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 targetLog, const U32 consumedBits, + const U32* rankVal, const int minWeight, const int maxWeight1, + const sortedSymbol_t* sortedSymbols, U32 const* rankStart, + U32 nbBitsBaseline, U16 baseSeq) +{ + /* Fill skipped values (all positions up to rankVal[minWeight]). + * These are positions only get a single symbol because the combined weight + * is too large. + */ + if (minWeight>1) { + U32 const length = 1U << ((targetLog - consumedBits) & 0x1F /* quiet static-analyzer */); + U64 const DEltX2 = HUF_buildDEltX2U64(baseSeq, consumedBits, /* baseSeq */ 0, /* level */ 1); + int const skipSize = rankVal[minWeight]; + assert(length > 1); + assert((U32)skipSize < length); + switch (length) { + case 2: + assert(skipSize == 1); + ZSTD_memcpy(DTable, &DEltX2, sizeof(DEltX2)); + break; + case 4: + assert(skipSize <= 4); + ZSTD_memcpy(DTable + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + 2, &DEltX2, sizeof(DEltX2)); + break; + default: + { + int i; + for (i = 0; i < skipSize; i += 8) { + ZSTD_memcpy(DTable + i + 0, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 2, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 4, &DEltX2, sizeof(DEltX2)); + ZSTD_memcpy(DTable + i + 6, &DEltX2, sizeof(DEltX2)); + } + } + } + } - rankVal[weight] += length; - } } + /* Fill each of the second level symbols by weight. */ + { + int w; + for (w = minWeight; w < maxWeight1; ++w) { + int const begin = rankStart[w]; + int const end = rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + U32 const totalBits = nbBits + consumedBits; + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedSymbols + begin, sortedSymbols + end, + totalBits, targetLog, + baseSeq, /* level */ 2); + } + } } - static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog, - const sortedSymbol_t* sortedList, const U32 sortedListSize, + const sortedSymbol_t* sortedList, const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight, - const U32 nbBitsBaseline, U32* wksp, size_t wkspSize) + const U32 nbBitsBaseline) { - U32* rankVal = wksp; + U32* const rankVal = rankValOrigin[0]; const int scaleLog = nbBitsBaseline - targetLog; /* note : targetLog >= srcLog, hence scaleLog <= 1 */ const U32 minBits = nbBitsBaseline - maxWeight; - U32 s; - - assert(wkspSize >= HUF_TABLELOG_MAX + 1); - wksp += HUF_TABLELOG_MAX + 1; - wkspSize -= HUF_TABLELOG_MAX + 1; - - ZSTD_memcpy(rankVal, rankValOrigin, sizeof(U32) * (HUF_TABLELOG_MAX + 1)); - - /* fill DTable */ - for (s=0; s<sortedListSize; s++) { - const U16 symbol = sortedList[s].symbol; - const U32 weight = sortedList[s].weight; - const U32 nbBits = nbBitsBaseline - weight; - const U32 start = rankVal[weight]; - const U32 length = 1 << (targetLog-nbBits); - - if (targetLog-nbBits >= minBits) { /* enough room for a second symbol */ - U32 sortedRank; + int w; + int const wEnd = (int)maxWeight + 1; + + /* Fill DTable in order of weight. */ + for (w = 1; w < wEnd; ++w) { + int const begin = (int)rankStart[w]; + int const end = (int)rankStart[w+1]; + U32 const nbBits = nbBitsBaseline - w; + + if (targetLog-nbBits >= minBits) { + /* Enough room for a second symbol. */ + int start = rankVal[w]; + U32 const length = 1U << ((targetLog - nbBits) & 0x1F /* quiet static-analyzer */); int minWeight = nbBits + scaleLog; + int s; if (minWeight < 1) minWeight = 1; - sortedRank = rankStart[minWeight]; - HUF_fillDTableX2Level2(DTable+start, targetLog-nbBits, nbBits, - rankValOrigin[nbBits], minWeight, - sortedList+sortedRank, sortedListSize-sortedRank, - nbBitsBaseline, symbol, wksp, wkspSize); + /* Fill the DTable for every symbol of weight w. + * These symbols get at least 1 second symbol. + */ + for (s = begin; s != end; ++s) { + HUF_fillDTableX2Level2( + DTable + start, targetLog, nbBits, + rankValOrigin[nbBits], minWeight, wEnd, + sortedList, rankStart, + nbBitsBaseline, sortedList[s].symbol); + start += length; + } } else { - HUF_DEltX2 DElt; - MEM_writeLE16(&(DElt.sequence), symbol); - DElt.nbBits = (BYTE)(nbBits); - DElt.length = 1; - { U32 const end = start + length; - U32 u; - for (u = start; u < end; u++) DTable[u] = DElt; - } } - rankVal[weight] += length; + /* Only a single symbol. */ + HUF_fillDTableX2ForWeight( + DTable + rankVal[w], + sortedList + begin, sortedList + end, + nbBits, targetLog, + /* baseSeq */ 0, /* level */ 1); + } } } typedef struct { rankValCol_t rankVal[HUF_TABLELOG_MAX]; U32 rankStats[HUF_TABLELOG_MAX + 1]; - U32 rankStart0[HUF_TABLELOG_MAX + 2]; + U32 rankStart0[HUF_TABLELOG_MAX + 3]; sortedSymbol_t sortedSymbol[HUF_SYMBOLVALUE_MAX + 1]; BYTE weightList[HUF_SYMBOLVALUE_MAX + 1]; U32 calleeWksp[HUF_READ_STATS_WORKSPACE_SIZE_U32]; @@ -627,9 +1046,16 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize) { - U32 tableLog, maxW, sizeOfSort, nbSymbols; + return HUF_readDTableX2_wksp_bmi2(DTable, src, srcSize, workSpace, wkspSize, /* bmi2 */ 0); +} + +size_t HUF_readDTableX2_wksp_bmi2(HUF_DTable* DTable, + const void* src, size_t srcSize, + void* workSpace, size_t wkspSize, int bmi2) +{ + U32 tableLog, maxW, nbSymbols; DTableDesc dtd = HUF_getDTableDesc(DTable); - U32 const maxTableLog = dtd.maxTableLog; + U32 maxTableLog = dtd.maxTableLog; size_t iSize; void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */ HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr; @@ -647,11 +1073,12 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge); /* ZSTD_memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */ - iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), /* bmi2 */ 0); + iSize = HUF_readStats_wksp(wksp->weightList, HUF_SYMBOLVALUE_MAX + 1, wksp->rankStats, &nbSymbols, &tableLog, src, srcSize, wksp->calleeWksp, sizeof(wksp->calleeWksp), bmi2); if (HUF_isError(iSize)) return iSize; /* check result */ if (tableLog > maxTableLog) return ERROR(tableLog_tooLarge); /* DTable can't fit code depth */ + if (tableLog <= HUF_DECODER_FAST_TABLELOG && maxTableLog > HUF_DECODER_FAST_TABLELOG) maxTableLog = HUF_DECODER_FAST_TABLELOG; /* find maxWeight */ for (maxW = tableLog; wksp->rankStats[maxW]==0; maxW--) {} /* necessarily finds a solution before 0 */ @@ -664,7 +1091,7 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, rankStart[w] = curr; } rankStart[0] = nextRankStart; /* put all 0w symbols at the end of sorted list*/ - sizeOfSort = nextRankStart; + rankStart[maxW+1] = nextRankStart; } /* sort symbols by weight */ @@ -673,7 +1100,6 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, U32 const w = wksp->weightList[s]; U32 const r = rankStart[w]++; wksp->sortedSymbol[r].symbol = (BYTE)s; - wksp->sortedSymbol[r].weight = (BYTE)w; } rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */ } @@ -698,10 +1124,9 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, } } } } HUF_fillDTableX2(dt, maxTableLog, - wksp->sortedSymbol, sizeOfSort, + wksp->sortedSymbol, wksp->rankStart0, wksp->rankVal, maxW, - tableLog+1, - wksp->calleeWksp, sizeof(wksp->calleeWksp) / sizeof(U32)); + tableLog+1); dtd.tableLog = (BYTE)maxTableLog; dtd.tableType = 1; @@ -714,7 +1139,7 @@ FORCE_INLINE_TEMPLATE U32 HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) { size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ - ZSTD_memcpy(op, dt+val, 2); + ZSTD_memcpy(op, &dt[val].sequence, 2); BIT_skipBits(DStream, dt[val].nbBits); return dt[val].length; } @@ -723,15 +1148,17 @@ FORCE_INLINE_TEMPLATE U32 HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog) { size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */ - ZSTD_memcpy(op, dt+val, 1); - if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits); - else { + ZSTD_memcpy(op, &dt[val].sequence, 1); + if (dt[val].length==1) { + BIT_skipBits(DStream, dt[val].nbBits); + } else { if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) { BIT_skipBits(DStream, dt[val].nbBits); if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8)) /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */ DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8); - } } + } + } return 1; } @@ -753,19 +1180,37 @@ HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, BYTE* const pStart = p; /* up to 8 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { - HUF_DECODE_SYMBOLX2_2(p, bitDPtr); - HUF_DECODE_SYMBOLX2_1(p, bitDPtr); - HUF_DECODE_SYMBOLX2_2(p, bitDPtr); - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + if ((size_t)(pEnd - p) >= sizeof(bitDPtr->bitContainer)) { + if (dtLog <= 11 && MEM_64bits()) { + /* up to 10 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-9)) { + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } else { + /* up to 8 symbols at a time */ + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) { + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_1(p, bitDPtr); + HUF_DECODE_SYMBOLX2_2(p, bitDPtr); + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + } + } + } else { + BIT_reloadDStream(bitDPtr); } /* closer to end : up to 2 symbols at a time */ - while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); + if ((size_t)(pEnd - p) >= 2) { + while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2)) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); - while (p <= pEnd-2) - HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ + while (p <= pEnd-2) + HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */ + } if (p < pEnd) p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog); @@ -799,7 +1244,6 @@ HUF_decompress1X2_usingDTable_internal_body( /* decoded size */ return dstSize; } - FORCE_INLINE_TEMPLATE size_t HUF_decompress4X2_usingDTable_internal_body( void* dst, size_t dstSize, @@ -841,57 +1285,60 @@ HUF_decompress4X2_usingDTable_internal_body( U32 const dtLog = dtd.tableLog; if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */ + if (opStart4 > oend) return ERROR(corruption_detected); /* overflow */ CHECK_F( BIT_initDStream(&bitD1, istart1, length1) ); CHECK_F( BIT_initDStream(&bitD2, istart2, length2) ); CHECK_F( BIT_initDStream(&bitD3, istart3, length3) ); CHECK_F( BIT_initDStream(&bitD4, istart4, length4) ); /* 16-32 symbols per loop (4-8 symbols per stream) */ - for ( ; (endSignal) & (op4 < olimit); ) { + if ((size_t)(oend - op4) >= sizeof(size_t)) { + for ( ; (endSignal) & (op4 < olimit); ) { #if defined(__clang__) && (defined(__x86_64__) || defined(__i386__)) - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_1(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_0(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_1(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_0(op2, &bitD2); - endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_1(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_0(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_1(op4, &bitD4); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_0(op4, &bitD4); - endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; - endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; #else - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_1(op1, &bitD1); - HUF_DECODE_SYMBOLX2_1(op2, &bitD2); - HUF_DECODE_SYMBOLX2_1(op3, &bitD3); - HUF_DECODE_SYMBOLX2_1(op4, &bitD4); - HUF_DECODE_SYMBOLX2_2(op1, &bitD1); - HUF_DECODE_SYMBOLX2_2(op2, &bitD2); - HUF_DECODE_SYMBOLX2_2(op3, &bitD3); - HUF_DECODE_SYMBOLX2_2(op4, &bitD4); - HUF_DECODE_SYMBOLX2_0(op1, &bitD1); - HUF_DECODE_SYMBOLX2_0(op2, &bitD2); - HUF_DECODE_SYMBOLX2_0(op3, &bitD3); - HUF_DECODE_SYMBOLX2_0(op4, &bitD4); - endSignal = (U32)LIKELY( - (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) - & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_1(op1, &bitD1); + HUF_DECODE_SYMBOLX2_1(op2, &bitD2); + HUF_DECODE_SYMBOLX2_1(op3, &bitD3); + HUF_DECODE_SYMBOLX2_1(op4, &bitD4); + HUF_DECODE_SYMBOLX2_2(op1, &bitD1); + HUF_DECODE_SYMBOLX2_2(op2, &bitD2); + HUF_DECODE_SYMBOLX2_2(op3, &bitD3); + HUF_DECODE_SYMBOLX2_2(op4, &bitD4); + HUF_DECODE_SYMBOLX2_0(op1, &bitD1); + HUF_DECODE_SYMBOLX2_0(op2, &bitD2); + HUF_DECODE_SYMBOLX2_0(op3, &bitD3); + HUF_DECODE_SYMBOLX2_0(op4, &bitD4); + endSignal = (U32)LIKELY((U32) + (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); #endif + } } /* check corruption */ @@ -915,8 +1362,99 @@ HUF_decompress4X2_usingDTable_internal_body( } } +#if HUF_NEED_BMI2_FUNCTION +static BMI2_TARGET_ATTRIBUTE +size_t HUF_decompress4X2_usingDTable_internal_bmi2(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +#if HUF_NEED_DEFAULT_FUNCTION +static +size_t HUF_decompress4X2_usingDTable_internal_default(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable) { + return HUF_decompress4X2_usingDTable_internal_body(dst, dstSize, cSrc, cSrcSize, DTable); +} +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +HUF_ASM_DECL void HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop(HUF_DecompressAsmArgs* args) ZSTDLIB_HIDDEN; + +static HUF_ASM_X86_64_BMI2_ATTRS size_t +HUF_decompress4X2_usingDTable_internal_bmi2_asm( + void* dst, size_t dstSize, + const void* cSrc, size_t cSrcSize, + const HUF_DTable* DTable) { + void const* dt = DTable + 1; + const BYTE* const iend = (const BYTE*)cSrc + 6; + BYTE* const oend = (BYTE*)dst + dstSize; + HUF_DecompressAsmArgs args; + { + size_t const ret = HUF_DecompressAsmArgs_init(&args, dst, dstSize, cSrc, cSrcSize, DTable); + FORWARD_IF_ERROR(ret, "Failed to init asm args"); + if (ret != 0) + return HUF_decompress4X2_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); + } + + assert(args.ip[0] >= args.ilimit); + HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop(&args); + + /* note : op4 already verified within main loop */ + assert(args.ip[0] >= iend); + assert(args.ip[1] >= iend); + assert(args.ip[2] >= iend); + assert(args.ip[3] >= iend); + assert(args.op[3] <= oend); + (void)iend; + + /* finish bitStreams one by one */ + { + size_t const segmentSize = (dstSize+3) / 4; + BYTE* segmentEnd = (BYTE*)dst; + int i; + for (i = 0; i < 4; ++i) { + BIT_DStream_t bit; + if (segmentSize <= (size_t)(oend - segmentEnd)) + segmentEnd += segmentSize; + else + segmentEnd = oend; + FORWARD_IF_ERROR(HUF_initRemainingDStream(&bit, &args, i, segmentEnd), "corruption"); + args.op[i] += HUF_decodeStreamX2(args.op[i], &bit, segmentEnd, (HUF_DEltX2 const*)dt, HUF_DECODER_FAST_TABLELOG); + if (args.op[i] != segmentEnd) + return ERROR(corruption_detected); + } + } + + /* decoded size */ + return dstSize; +} +#endif /* ZSTD_ENABLE_ASM_X86_64_BMI2 */ + +static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc, + size_t cSrcSize, HUF_DTable const* DTable, int bmi2) +{ +#if DYNAMIC_BMI2 + if (bmi2) { +# if ZSTD_ENABLE_ASM_X86_64_BMI2 + return HUF_decompress4X2_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable); +# else + return HUF_decompress4X2_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); +# endif + } +#else + (void)bmi2; +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__) + return HUF_decompress4X2_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable); +#else + return HUF_decompress4X2_usingDTable_internal_default(dst, dstSize, cSrc, cSrcSize, DTable); +#endif +} + HUF_DGEN(HUF_decompress1X2_usingDTable_internal) -HUF_DGEN(HUF_decompress4X2_usingDTable_internal) size_t HUF_decompress1X2_usingDTable( void* dst, size_t dstSize, @@ -1025,25 +1563,25 @@ size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, #if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2) typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t; -static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] = +static const algo_time_t algoTime[16 /* Quantization */][2 /* single, double */] = { /* single, double, quad */ - {{0,0}, {1,1}, {2,2}}, /* Q==0 : impossible */ - {{0,0}, {1,1}, {2,2}}, /* Q==1 : impossible */ - {{ 38,130}, {1313, 74}, {2151, 38}}, /* Q == 2 : 12-18% */ - {{ 448,128}, {1353, 74}, {2238, 41}}, /* Q == 3 : 18-25% */ - {{ 556,128}, {1353, 74}, {2238, 47}}, /* Q == 4 : 25-32% */ - {{ 714,128}, {1418, 74}, {2436, 53}}, /* Q == 5 : 32-38% */ - {{ 883,128}, {1437, 74}, {2464, 61}}, /* Q == 6 : 38-44% */ - {{ 897,128}, {1515, 75}, {2622, 68}}, /* Q == 7 : 44-50% */ - {{ 926,128}, {1613, 75}, {2730, 75}}, /* Q == 8 : 50-56% */ - {{ 947,128}, {1729, 77}, {3359, 77}}, /* Q == 9 : 56-62% */ - {{1107,128}, {2083, 81}, {4006, 84}}, /* Q ==10 : 62-69% */ - {{1177,128}, {2379, 87}, {4785, 88}}, /* Q ==11 : 69-75% */ - {{1242,128}, {2415, 93}, {5155, 84}}, /* Q ==12 : 75-81% */ - {{1349,128}, {2644,106}, {5260,106}}, /* Q ==13 : 81-87% */ - {{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */ - {{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */ + {{0,0}, {1,1}}, /* Q==0 : impossible */ + {{0,0}, {1,1}}, /* Q==1 : impossible */ + {{ 150,216}, { 381,119}}, /* Q == 2 : 12-18% */ + {{ 170,205}, { 514,112}}, /* Q == 3 : 18-25% */ + {{ 177,199}, { 539,110}}, /* Q == 4 : 25-32% */ + {{ 197,194}, { 644,107}}, /* Q == 5 : 32-38% */ + {{ 221,192}, { 735,107}}, /* Q == 6 : 38-44% */ + {{ 256,189}, { 881,106}}, /* Q == 7 : 44-50% */ + {{ 359,188}, {1167,109}}, /* Q == 8 : 50-56% */ + {{ 582,187}, {1570,114}}, /* Q == 9 : 56-62% */ + {{ 688,187}, {1712,122}}, /* Q ==10 : 62-69% */ + {{ 825,186}, {1965,136}}, /* Q ==11 : 69-75% */ + {{ 976,185}, {2131,150}}, /* Q ==12 : 75-81% */ + {{1180,186}, {2070,175}}, /* Q ==13 : 81-87% */ + {{1377,185}, {1731,202}}, /* Q ==14 : 87-93% */ + {{1412,185}, {1695,202}}, /* Q ==15 : 93-99% */ }; #endif @@ -1070,7 +1608,7 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize) U32 const D256 = (U32)(dstSize >> 8); U32 const DTime0 = algoTime[Q][0].tableTime + (algoTime[Q][0].decode256Time * D256); U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256); - DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, to reduce cache eviction */ + DTime1 += DTime1 >> 5; /* small advantage to algorithm using less memory, to reduce cache eviction */ return DTime1 < DTime0; } #endif diff --git a/thirdparty/zstd/decompress/huf_decompress_amd64.S b/thirdparty/zstd/decompress/huf_decompress_amd64.S new file mode 100644 index 0000000000..49589cb611 --- /dev/null +++ b/thirdparty/zstd/decompress/huf_decompress_amd64.S @@ -0,0 +1,585 @@ +/* + * Copyright (c) Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "../common/portability_macros.h" + +/* Stack marking + * ref: https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart + */ +#if defined(__ELF__) && defined(__GNUC__) +.section .note.GNU-stack,"",%progbits +#endif + +#if ZSTD_ENABLE_ASM_X86_64_BMI2 + +/* Calling convention: + * + * %rdi contains the first argument: HUF_DecompressAsmArgs*. + * %rbp isn't maintained (no frame pointer). + * %rsp contains the stack pointer that grows down. + * No red-zone is assumed, only addresses >= %rsp are used. + * All register contents are preserved. + * + * TODO: Support Windows calling convention. + */ + +ZSTD_HIDE_ASM_FUNCTION(HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(_HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop) +ZSTD_HIDE_ASM_FUNCTION(_HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop) +.global HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop +.global HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop +.global _HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop +.global _HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop +.text + +/* Sets up register mappings for clarity. + * op[], bits[], dtable & ip[0] each get their own register. + * ip[1,2,3] & olimit alias var[]. + * %rax is a scratch register. + */ + +#define op0 rsi +#define op1 rbx +#define op2 rcx +#define op3 rdi + +#define ip0 r8 +#define ip1 r9 +#define ip2 r10 +#define ip3 r11 + +#define bits0 rbp +#define bits1 rdx +#define bits2 r12 +#define bits3 r13 +#define dtable r14 +#define olimit r15 + +/* var[] aliases ip[1,2,3] & olimit + * ip[1,2,3] are saved every iteration. + * olimit is only used in compute_olimit. + */ +#define var0 r15 +#define var1 r9 +#define var2 r10 +#define var3 r11 + +/* 32-bit var registers */ +#define vard0 r15d +#define vard1 r9d +#define vard2 r10d +#define vard3 r11d + +/* Calls X(N) for each stream 0, 1, 2, 3. */ +#define FOR_EACH_STREAM(X) \ + X(0); \ + X(1); \ + X(2); \ + X(3) + +/* Calls X(N, idx) for each stream 0, 1, 2, 3. */ +#define FOR_EACH_STREAM_WITH_INDEX(X, idx) \ + X(0, idx); \ + X(1, idx); \ + X(2, idx); \ + X(3, idx) + +/* Define both _HUF_* & HUF_* symbols because MacOS + * C symbols are prefixed with '_' & Linux symbols aren't. + */ +_HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop: +HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop: + /* Save all registers - even if they are callee saved for simplicity. */ + push %rax + push %rbx + push %rcx + push %rdx + push %rbp + push %rsi + push %rdi + push %r8 + push %r9 + push %r10 + push %r11 + push %r12 + push %r13 + push %r14 + push %r15 + + /* Read HUF_DecompressAsmArgs* args from %rax */ + movq %rdi, %rax + movq 0(%rax), %ip0 + movq 8(%rax), %ip1 + movq 16(%rax), %ip2 + movq 24(%rax), %ip3 + movq 32(%rax), %op0 + movq 40(%rax), %op1 + movq 48(%rax), %op2 + movq 56(%rax), %op3 + movq 64(%rax), %bits0 + movq 72(%rax), %bits1 + movq 80(%rax), %bits2 + movq 88(%rax), %bits3 + movq 96(%rax), %dtable + push %rax /* argument */ + push 104(%rax) /* ilimit */ + push 112(%rax) /* oend */ + push %olimit /* olimit space */ + + subq $24, %rsp + +.L_4X1_compute_olimit: + /* Computes how many iterations we can do safely + * %r15, %rax may be clobbered + * rbx, rdx must be saved + * op3 & ip0 mustn't be clobbered + */ + movq %rbx, 0(%rsp) + movq %rdx, 8(%rsp) + + movq 32(%rsp), %rax /* rax = oend */ + subq %op3, %rax /* rax = oend - op3 */ + + /* r15 = (oend - op3) / 5 */ + movabsq $-3689348814741910323, %rdx + mulq %rdx + movq %rdx, %r15 + shrq $2, %r15 + + movq %ip0, %rax /* rax = ip0 */ + movq 40(%rsp), %rdx /* rdx = ilimit */ + subq %rdx, %rax /* rax = ip0 - ilimit */ + movq %rax, %rbx /* rbx = ip0 - ilimit */ + + /* rdx = (ip0 - ilimit) / 7 */ + movabsq $2635249153387078803, %rdx + mulq %rdx + subq %rdx, %rbx + shrq %rbx + addq %rbx, %rdx + shrq $2, %rdx + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + /* r15 = r15 * 5 */ + leaq (%r15, %r15, 4), %r15 + + /* olimit = op3 + r15 */ + addq %op3, %olimit + + movq 8(%rsp), %rdx + movq 0(%rsp), %rbx + + /* If (op3 + 20 > olimit) */ + movq %op3, %rax /* rax = op3 */ + addq $20, %rax /* rax = op3 + 20 */ + cmpq %rax, %olimit /* op3 + 20 > olimit */ + jb .L_4X1_exit + + /* If (ip1 < ip0) go to exit */ + cmpq %ip0, %ip1 + jb .L_4X1_exit + + /* If (ip2 < ip1) go to exit */ + cmpq %ip1, %ip2 + jb .L_4X1_exit + + /* If (ip3 < ip2) go to exit */ + cmpq %ip2, %ip3 + jb .L_4X1_exit + +/* Reads top 11 bits from bits[n] + * Loads dt[bits[n]] into var[n] + */ +#define GET_NEXT_DELT(n) \ + movq $53, %var##n; \ + shrxq %var##n, %bits##n, %var##n; \ + movzwl (%dtable,%var##n,2),%vard##n + +/* var[n] must contain the DTable entry computed with GET_NEXT_DELT + * Moves var[n] to %rax + * bits[n] <<= var[n] & 63 + * op[n][idx] = %rax >> 8 + * %ah is a way to access bits [8, 16) of %rax + */ +#define DECODE_FROM_DELT(n, idx) \ + movq %var##n, %rax; \ + shlxq %var##n, %bits##n, %bits##n; \ + movb %ah, idx(%op##n) + +/* Assumes GET_NEXT_DELT has been called. + * Calls DECODE_FROM_DELT then GET_NEXT_DELT + */ +#define DECODE_AND_GET_NEXT(n, idx) \ + DECODE_FROM_DELT(n, idx); \ + GET_NEXT_DELT(n) \ + +/* // ctz & nbBytes is stored in bits[n] + * // nbBits is stored in %rax + * ctz = CTZ[bits[n]] + * nbBits = ctz & 7 + * nbBytes = ctz >> 3 + * op[n] += 5 + * ip[n] -= nbBytes + * // Note: x86-64 is little-endian ==> no bswap + * bits[n] = MEM_readST(ip[n]) | 1 + * bits[n] <<= nbBits + */ +#define RELOAD_BITS(n) \ + bsfq %bits##n, %bits##n; \ + movq %bits##n, %rax; \ + andq $7, %rax; \ + shrq $3, %bits##n; \ + leaq 5(%op##n), %op##n; \ + subq %bits##n, %ip##n; \ + movq (%ip##n), %bits##n; \ + orq $1, %bits##n; \ + shlx %rax, %bits##n, %bits##n + + /* Store clobbered variables on the stack */ + movq %olimit, 24(%rsp) + movq %ip1, 0(%rsp) + movq %ip2, 8(%rsp) + movq %ip3, 16(%rsp) + + /* Call GET_NEXT_DELT for each stream */ + FOR_EACH_STREAM(GET_NEXT_DELT) + + .p2align 6 + +.L_4X1_loop_body: + /* Decode 5 symbols in each of the 4 streams (20 total) + * Must have called GET_NEXT_DELT for each stream + */ + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 0) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 1) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 2) + FOR_EACH_STREAM_WITH_INDEX(DECODE_AND_GET_NEXT, 3) + FOR_EACH_STREAM_WITH_INDEX(DECODE_FROM_DELT, 4) + + /* Load ip[1,2,3] from stack (var[] aliases them) + * ip[] is needed for RELOAD_BITS + * Each will be stored back to the stack after RELOAD + */ + movq 0(%rsp), %ip1 + movq 8(%rsp), %ip2 + movq 16(%rsp), %ip3 + + /* Reload each stream & fetch the next table entry + * to prepare for the next iteration + */ + RELOAD_BITS(0) + GET_NEXT_DELT(0) + + RELOAD_BITS(1) + movq %ip1, 0(%rsp) + GET_NEXT_DELT(1) + + RELOAD_BITS(2) + movq %ip2, 8(%rsp) + GET_NEXT_DELT(2) + + RELOAD_BITS(3) + movq %ip3, 16(%rsp) + GET_NEXT_DELT(3) + + /* If op3 < olimit: continue the loop */ + cmp %op3, 24(%rsp) + ja .L_4X1_loop_body + + /* Reload ip[1,2,3] from stack */ + movq 0(%rsp), %ip1 + movq 8(%rsp), %ip2 + movq 16(%rsp), %ip3 + + /* Re-compute olimit */ + jmp .L_4X1_compute_olimit + +#undef GET_NEXT_DELT +#undef DECODE_FROM_DELT +#undef DECODE +#undef RELOAD_BITS +.L_4X1_exit: + addq $24, %rsp + + /* Restore stack (oend & olimit) */ + pop %rax /* olimit */ + pop %rax /* oend */ + pop %rax /* ilimit */ + pop %rax /* arg */ + + /* Save ip / op / bits */ + movq %ip0, 0(%rax) + movq %ip1, 8(%rax) + movq %ip2, 16(%rax) + movq %ip3, 24(%rax) + movq %op0, 32(%rax) + movq %op1, 40(%rax) + movq %op2, 48(%rax) + movq %op3, 56(%rax) + movq %bits0, 64(%rax) + movq %bits1, 72(%rax) + movq %bits2, 80(%rax) + movq %bits3, 88(%rax) + + /* Restore registers */ + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rdi + pop %rsi + pop %rbp + pop %rdx + pop %rcx + pop %rbx + pop %rax + ret + +_HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop: +HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop: + /* Save all registers - even if they are callee saved for simplicity. */ + push %rax + push %rbx + push %rcx + push %rdx + push %rbp + push %rsi + push %rdi + push %r8 + push %r9 + push %r10 + push %r11 + push %r12 + push %r13 + push %r14 + push %r15 + + movq %rdi, %rax + movq 0(%rax), %ip0 + movq 8(%rax), %ip1 + movq 16(%rax), %ip2 + movq 24(%rax), %ip3 + movq 32(%rax), %op0 + movq 40(%rax), %op1 + movq 48(%rax), %op2 + movq 56(%rax), %op3 + movq 64(%rax), %bits0 + movq 72(%rax), %bits1 + movq 80(%rax), %bits2 + movq 88(%rax), %bits3 + movq 96(%rax), %dtable + push %rax /* argument */ + push %rax /* olimit */ + push 104(%rax) /* ilimit */ + + movq 112(%rax), %rax + push %rax /* oend3 */ + + movq %op3, %rax + push %rax /* oend2 */ + + movq %op2, %rax + push %rax /* oend1 */ + + movq %op1, %rax + push %rax /* oend0 */ + + /* Scratch space */ + subq $8, %rsp + +.L_4X2_compute_olimit: + /* Computes how many iterations we can do safely + * %r15, %rax may be clobbered + * rdx must be saved + * op[1,2,3,4] & ip0 mustn't be clobbered + */ + movq %rdx, 0(%rsp) + + /* We can consume up to 7 input bytes each iteration. */ + movq %ip0, %rax /* rax = ip0 */ + movq 40(%rsp), %rdx /* rdx = ilimit */ + subq %rdx, %rax /* rax = ip0 - ilimit */ + movq %rax, %r15 /* r15 = ip0 - ilimit */ + + /* rdx = rax / 7 */ + movabsq $2635249153387078803, %rdx + mulq %rdx + subq %rdx, %r15 + shrq %r15 + addq %r15, %rdx + shrq $2, %rdx + + /* r15 = (ip0 - ilimit) / 7 */ + movq %rdx, %r15 + + movabsq $-3689348814741910323, %rdx + movq 8(%rsp), %rax /* rax = oend0 */ + subq %op0, %rax /* rax = oend0 - op0 */ + mulq %rdx + shrq $3, %rdx /* rdx = rax / 10 */ + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + movabsq $-3689348814741910323, %rdx + movq 16(%rsp), %rax /* rax = oend1 */ + subq %op1, %rax /* rax = oend1 - op1 */ + mulq %rdx + shrq $3, %rdx /* rdx = rax / 10 */ + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + movabsq $-3689348814741910323, %rdx + movq 24(%rsp), %rax /* rax = oend2 */ + subq %op2, %rax /* rax = oend2 - op2 */ + mulq %rdx + shrq $3, %rdx /* rdx = rax / 10 */ + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + movabsq $-3689348814741910323, %rdx + movq 32(%rsp), %rax /* rax = oend3 */ + subq %op3, %rax /* rax = oend3 - op3 */ + mulq %rdx + shrq $3, %rdx /* rdx = rax / 10 */ + + /* r15 = min(%rdx, %r15) */ + cmpq %rdx, %r15 + cmova %rdx, %r15 + + /* olimit = op3 + 5 * r15 */ + movq %r15, %rax + leaq (%op3, %rax, 4), %olimit + addq %rax, %olimit + + movq 0(%rsp), %rdx + + /* If (op3 + 10 > olimit) */ + movq %op3, %rax /* rax = op3 */ + addq $10, %rax /* rax = op3 + 10 */ + cmpq %rax, %olimit /* op3 + 10 > olimit */ + jb .L_4X2_exit + + /* If (ip1 < ip0) go to exit */ + cmpq %ip0, %ip1 + jb .L_4X2_exit + + /* If (ip2 < ip1) go to exit */ + cmpq %ip1, %ip2 + jb .L_4X2_exit + + /* If (ip3 < ip2) go to exit */ + cmpq %ip2, %ip3 + jb .L_4X2_exit + +#define DECODE(n, idx) \ + movq %bits##n, %rax; \ + shrq $53, %rax; \ + movzwl 0(%dtable,%rax,4),%r8d; \ + movzbl 2(%dtable,%rax,4),%r15d; \ + movzbl 3(%dtable,%rax,4),%eax; \ + movw %r8w, (%op##n); \ + shlxq %r15, %bits##n, %bits##n; \ + addq %rax, %op##n + +#define RELOAD_BITS(n) \ + bsfq %bits##n, %bits##n; \ + movq %bits##n, %rax; \ + shrq $3, %bits##n; \ + andq $7, %rax; \ + subq %bits##n, %ip##n; \ + movq (%ip##n), %bits##n; \ + orq $1, %bits##n; \ + shlxq %rax, %bits##n, %bits##n + + + movq %olimit, 48(%rsp) + + .p2align 6 + +.L_4X2_loop_body: + /* We clobber r8, so store it on the stack */ + movq %r8, 0(%rsp) + + /* Decode 5 symbols from each of the 4 streams (20 symbols total). */ + FOR_EACH_STREAM_WITH_INDEX(DECODE, 0) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 1) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 2) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 3) + FOR_EACH_STREAM_WITH_INDEX(DECODE, 4) + + /* Reload r8 */ + movq 0(%rsp), %r8 + + FOR_EACH_STREAM(RELOAD_BITS) + + cmp %op3, 48(%rsp) + ja .L_4X2_loop_body + jmp .L_4X2_compute_olimit + +#undef DECODE +#undef RELOAD_BITS +.L_4X2_exit: + addq $8, %rsp + /* Restore stack (oend & olimit) */ + pop %rax /* oend0 */ + pop %rax /* oend1 */ + pop %rax /* oend2 */ + pop %rax /* oend3 */ + pop %rax /* ilimit */ + pop %rax /* olimit */ + pop %rax /* arg */ + + /* Save ip / op / bits */ + movq %ip0, 0(%rax) + movq %ip1, 8(%rax) + movq %ip2, 16(%rax) + movq %ip3, 24(%rax) + movq %op0, 32(%rax) + movq %op1, 40(%rax) + movq %op2, 48(%rax) + movq %op3, 56(%rax) + movq %bits0, 64(%rax) + movq %bits1, 72(%rax) + movq %bits2, 80(%rax) + movq %bits3, 88(%rax) + + /* Restore registers */ + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rdi + pop %rsi + pop %rbp + pop %rdx + pop %rcx + pop %rbx + pop %rax + ret + +#endif diff --git a/thirdparty/zstd/decompress/zstd_decompress.c b/thirdparty/zstd/decompress/zstd_decompress.c index 910bc034c0..0031e98cfb 100644 --- a/thirdparty/zstd/decompress/zstd_decompress.c +++ b/thirdparty/zstd/decompress/zstd_decompress.c @@ -56,7 +56,6 @@ * Dependencies *********************************************************/ #include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */ -#include "../common/cpu.h" /* bmi2 */ #include "../common/mem.h" /* low level memory routines */ #define FSE_STATIC_LINKING_ONLY #include "../common/fse.h" @@ -177,12 +176,15 @@ static const ZSTD_DDict* ZSTD_DDictHashSet_getDDict(ZSTD_DDictHashSet* hashSet, static ZSTD_DDictHashSet* ZSTD_createDDictHashSet(ZSTD_customMem customMem) { ZSTD_DDictHashSet* ret = (ZSTD_DDictHashSet*)ZSTD_customMalloc(sizeof(ZSTD_DDictHashSet), customMem); DEBUGLOG(4, "Allocating new hash set"); + if (!ret) + return NULL; ret->ddictPtrTable = (const ZSTD_DDict**)ZSTD_customCalloc(DDICT_HASHSET_TABLE_BASE_SIZE * sizeof(ZSTD_DDict*), customMem); - ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; - ret->ddictPtrCount = 0; - if (!ret || !ret->ddictPtrTable) { + if (!ret->ddictPtrTable) { + ZSTD_customFree(ret, customMem); return NULL; } + ret->ddictPtrTableSize = DDICT_HASHSET_TABLE_BASE_SIZE; + ret->ddictPtrCount = 0; return ret; } @@ -255,11 +257,15 @@ static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx) dctx->inBuffSize = 0; dctx->outBuffSize = 0; dctx->streamStage = zdss_init; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) dctx->legacyContext = NULL; dctx->previousLegacyVersion = 0; +#endif dctx->noForwardProgress = 0; dctx->oversizedDuration = 0; - dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()); +#if DYNAMIC_BMI2 + dctx->bmi2 = ZSTD_cpuSupportsBmi2(); +#endif dctx->ddictSet = NULL; ZSTD_DCtx_resetParameters(dctx); #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION @@ -280,8 +286,7 @@ ZSTD_DCtx* ZSTD_initStaticDCtx(void *workspace, size_t workspaceSize) return dctx; } -ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) -{ +static ZSTD_DCtx* ZSTD_createDCtx_internal(ZSTD_customMem customMem) { if ((!customMem.customAlloc) ^ (!customMem.customFree)) return NULL; { ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_customMalloc(sizeof(*dctx), customMem); @@ -292,10 +297,15 @@ ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) } } +ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem) +{ + return ZSTD_createDCtx_internal(customMem); +} + ZSTD_DCtx* ZSTD_createDCtx(void) { DEBUGLOG(3, "ZSTD_createDCtx"); - return ZSTD_createDCtx_advanced(ZSTD_defaultCMem); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); } static void ZSTD_clearDict(ZSTD_DCtx* dctx) @@ -380,6 +390,19 @@ unsigned ZSTD_isFrame(const void* buffer, size_t size) return 0; } +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. + */ +unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size) +{ + if (size < ZSTD_FRAMEIDSIZE) return 0; + { U32 const magic = MEM_readLE32(buffer); + if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1; + } + return 0; +} + /** ZSTD_frameHeaderSize_internal() : * srcSize must be large enough to reach header size fields. * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless. @@ -466,7 +489,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s } switch(dictIDSizeCode) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : break; case 1 : dictID = ip[pos]; pos++; break; case 2 : dictID = MEM_readLE16(ip+pos); pos+=2; break; @@ -474,7 +499,9 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s } switch(fcsID) { - default: assert(0); /* impossible */ + default: + assert(0); /* impossible */ + ZSTD_FALLTHROUGH; case 0 : if (singleSegment) frameContentSize = ip[pos]; break; case 1 : frameContentSize = MEM_readLE16(ip+pos)+256; break; case 2 : frameContentSize = MEM_readLE32(ip+pos); break; @@ -503,7 +530,6 @@ size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t src return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1); } - /** ZSTD_getFrameContentSize() : * compatible with legacy mode * @return : decompressed size of the single frame pointed to be `src` if known, otherwise @@ -544,6 +570,37 @@ static size_t readSkippableFrameSize(void const* src, size_t srcSize) } } +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize) +{ + U32 const magicNumber = MEM_readLE32(src); + size_t skippableFrameSize = readSkippableFrameSize(src, srcSize); + size_t skippableContentSize = skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE; + + /* check input validity */ + RETURN_ERROR_IF(!ZSTD_isSkippableFrame(src, srcSize), frameParameter_unsupported, ""); + RETURN_ERROR_IF(skippableFrameSize < ZSTD_SKIPPABLEHEADERSIZE || skippableFrameSize > srcSize, srcSize_wrong, ""); + RETURN_ERROR_IF(skippableContentSize > dstCapacity, dstSize_tooSmall, ""); + + /* deliver payload */ + if (skippableContentSize > 0 && dst != NULL) + ZSTD_memcpy(dst, (const BYTE *)src + ZSTD_SKIPPABLEHEADERSIZE, skippableContentSize); + if (magicVariant != NULL) + *magicVariant = magicNumber - ZSTD_MAGIC_SKIPPABLE_START; + return skippableContentSize; +} + /** ZSTD_findDecompressedSize() : * compatible with legacy mode * `srcSize` must be the exact length of some number of ZSTD compressed and/or @@ -858,7 +915,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx, switch(blockProperties.blockType) { case bt_compressed: - decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1); + decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1, not_streaming); break; case bt_raw : decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize); @@ -1009,7 +1066,7 @@ static ZSTD_DDict const* ZSTD_getDDict(ZSTD_DCtx* dctx) switch (dctx->dictUses) { default: assert(0 /* Impossible */); - /* fall-through */ + ZSTD_FALLTHROUGH; case ZSTD_dont_use: ZSTD_clearDict(dctx); return NULL; @@ -1031,7 +1088,7 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr { #if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE>=1) size_t regenSize; - ZSTD_DCtx* const dctx = ZSTD_createDCtx(); + ZSTD_DCtx* const dctx = ZSTD_createDCtx_internal(ZSTD_defaultCMem); RETURN_ERROR_IF(dctx==NULL, memory_allocation, "NULL pointer!"); regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize); ZSTD_freeDCtx(dctx); @@ -1065,7 +1122,7 @@ static size_t ZSTD_nextSrcSizeToDecompressWithInputSize(ZSTD_DCtx* dctx, size_t return dctx->expected; if (dctx->bType != bt_raw) return dctx->expected; - return MIN(MAX(inputSize, 1), dctx->expected); + return BOUNDED(1, inputSize, dctx->expected); } ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { @@ -1073,7 +1130,9 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { { default: /* should not happen */ assert(0); + ZSTD_FALLTHROUGH; case ZSTDds_getFrameHeaderSize: + ZSTD_FALLTHROUGH; case ZSTDds_decodeFrameHeader: return ZSTDnit_frameHeader; case ZSTDds_decodeBlockHeader: @@ -1085,6 +1144,7 @@ ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx) { case ZSTDds_checkChecksum: return ZSTDnit_checksum; case ZSTDds_decodeSkippableHeader: + ZSTD_FALLTHROUGH; case ZSTDds_skipFrame: return ZSTDnit_skippableFrame; } @@ -1168,7 +1228,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c { case bt_compressed: DEBUGLOG(5, "ZSTD_decompressContinue: case bt_compressed"); - rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1); + rSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 1, is_streaming); dctx->expected = 0; /* Streaming not supported */ break; case bt_raw : @@ -1493,7 +1553,7 @@ size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx, ZSTD_DStream* ZSTD_createDStream(void) { DEBUGLOG(3, "ZSTD_createDStream"); - return ZSTD_createDStream_advanced(ZSTD_defaultCMem); + return ZSTD_createDCtx_internal(ZSTD_defaultCMem); } ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) @@ -1503,7 +1563,7 @@ ZSTD_DStream* ZSTD_initStaticDStream(void *workspace, size_t workspaceSize) ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem) { - return ZSTD_createDCtx_advanced(customMem); + return ZSTD_createDCtx_internal(customMem); } size_t ZSTD_freeDStream(ZSTD_DStream* zds) @@ -1763,7 +1823,8 @@ size_t ZSTD_sizeof_DStream(const ZSTD_DStream* dctx) size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize) { size_t const blockSize = (size_t) MIN(windowSize, ZSTD_BLOCKSIZE_MAX); - unsigned long long const neededRBSize = windowSize + blockSize + (WILDCOPY_OVERLENGTH * 2); + /* space is needed to store the litbuffer after the output of a given block without stomping the extDict of a previous run, as well as to cover both windows against wildcopy*/ + unsigned long long const neededRBSize = windowSize + blockSize + ZSTD_BLOCKSIZE_MAX + (WILDCOPY_OVERLENGTH * 2); unsigned long long const neededSize = MIN(frameContentSize, neededRBSize); size_t const minRBSize = (size_t) neededSize; RETURN_ERROR_IF((unsigned long long)minRBSize != neededSize, @@ -1897,10 +1958,12 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB DEBUGLOG(5, "stage zdss_init => transparent reset "); zds->streamStage = zdss_loadHeader; zds->lhSize = zds->inPos = zds->outStart = zds->outEnd = 0; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) zds->legacyVersion = 0; +#endif zds->hostageByte = 0; zds->expectedOutBuffer = *output; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_loadHeader : DEBUGLOG(5, "stage zdss_loadHeader (srcSize : %u)", (U32)(iend - ip)); @@ -2038,7 +2101,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB zds->outBuffSize = neededOutBuffSize; } } } zds->streamStage = zdss_read; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_read: DEBUGLOG(5, "stage zdss_read"); @@ -2057,7 +2120,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB } } if (ip==iend) { someMoreWork = 0; break; } /* no more input */ zds->streamStage = zdss_load; - /* fall-through */ + ZSTD_FALLTHROUGH; case zdss_load: { size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds); diff --git a/thirdparty/zstd/decompress/zstd_decompress_block.c b/thirdparty/zstd/decompress/zstd_decompress_block.c index 349dcdc333..2e44d30d2f 100644 --- a/thirdparty/zstd/decompress/zstd_decompress_block.c +++ b/thirdparty/zstd/decompress/zstd_decompress_block.c @@ -69,15 +69,56 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, } } +/* Allocate buffer for literals, either overlapping current dst, or split between dst and litExtraBuffer, or stored entirely within litExtraBuffer */ +static void ZSTD_allocateLiteralsBuffer(ZSTD_DCtx* dctx, void* const dst, const size_t dstCapacity, const size_t litSize, + const streaming_operation streaming, const size_t expectedWriteSize, const unsigned splitImmediately) +{ + if (streaming == not_streaming && dstCapacity > ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH + litSize + WILDCOPY_OVERLENGTH) + { + /* room for litbuffer to fit without read faulting */ + dctx->litBuffer = (BYTE*)dst + ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_in_dst; + } + else if (litSize > ZSTD_LITBUFFEREXTRASIZE) + { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + if (splitImmediately) { + /* won't fit in litExtraBuffer, so it will be split between end of dst and extra buffer */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd = dctx->litBuffer + litSize - ZSTD_LITBUFFEREXTRASIZE; + } + else { + /* initially this will be stored entirely in dst during huffman decoding, it will partially shifted to litExtraBuffer after */ + dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize; + dctx->litBufferEnd = (BYTE*)dst + expectedWriteSize; + } + dctx->litBufferLocation = ZSTD_split; + } + else + { + /* fits entirely within litExtraBuffer, so no split is necessary */ + dctx->litBuffer = dctx->litExtraBuffer; + dctx->litBufferEnd = dctx->litBuffer + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; + } +} /* Hidden declaration for fullbench */ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, - const void* src, size_t srcSize); + const void* src, size_t srcSize, + void* dst, size_t dstCapacity, const streaming_operation streaming); /*! ZSTD_decodeLiteralsBlock() : + * Where it is possible to do so without being stomped by the output during decompression, the literals block will be stored + * in the dstBuffer. If there is room to do so, it will be stored in full in the excess dst space after where the current + * block will be output. Otherwise it will be stored at the end of the current dst blockspace, with a small portion being + * stored in dctx->litExtraBuffer to help keep it "ahead" of the current output write. + * * @return : nb of bytes read from src (< srcSize ) * note : symbol not declared but exposed for fullbench */ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, - const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */ + const void* src, size_t srcSize, /* note : srcSize < BLOCKSIZE */ + void* dst, size_t dstCapacity, const streaming_operation streaming) { DEBUGLOG(5, "ZSTD_decodeLiteralsBlock"); RETURN_ERROR_IF(srcSize < MIN_CBLOCK_SIZE, corruption_detected, ""); @@ -90,7 +131,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, case set_repeat: DEBUGLOG(5, "set_repeat flag : re-using stats from previous compressed literals block"); RETURN_ERROR_IF(dctx->litEntropy==0, dictionary_corrupted, ""); - /* fall-through */ + ZSTD_FALLTHROUGH; case set_compressed: RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3"); @@ -99,6 +140,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, U32 const lhlCode = (istart[0] >> 2) & 3; U32 const lhc = MEM_readLE32(istart); size_t hufSuccess; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); switch(lhlCode) { case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -121,8 +163,11 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, litCSize = (lhc >> 22) + ((size_t)istart[4] << 10); break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); RETURN_ERROR_IF(litCSize + lhSize > srcSize, corruption_detected, ""); + RETURN_ERROR_IF(expectedWriteSize < litSize , dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 0); /* prefetch huffman table if cold */ if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) { @@ -133,11 +178,11 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, if (singleStream) { hufSuccess = HUF_decompress1X_usingDTable_bmi2( dctx->litBuffer, litSize, istart+lhSize, litCSize, - dctx->HUFptr, dctx->bmi2); + dctx->HUFptr, ZSTD_DCtx_get_bmi2(dctx)); } else { hufSuccess = HUF_decompress4X_usingDTable_bmi2( dctx->litBuffer, litSize, istart+lhSize, litCSize, - dctx->HUFptr, dctx->bmi2); + dctx->HUFptr, ZSTD_DCtx_get_bmi2(dctx)); } } else { if (singleStream) { @@ -150,15 +195,22 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, hufSuccess = HUF_decompress1X1_DCtx_wksp_bmi2( dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->workspace, - sizeof(dctx->workspace), dctx->bmi2); + sizeof(dctx->workspace), ZSTD_DCtx_get_bmi2(dctx)); #endif } else { hufSuccess = HUF_decompress4X_hufOnly_wksp_bmi2( dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->workspace, - sizeof(dctx->workspace), dctx->bmi2); + sizeof(dctx->workspace), ZSTD_DCtx_get_bmi2(dctx)); } } + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litExtraBuffer, dctx->litBufferEnd - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memmove(dctx->litBuffer + ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH, dctx->litBuffer, litSize - ZSTD_LITBUFFEREXTRASIZE); + dctx->litBuffer += ZSTD_LITBUFFEREXTRASIZE - WILDCOPY_OVERLENGTH; + dctx->litBufferEnd -= WILDCOPY_OVERLENGTH; + } RETURN_ERROR_IF(HUF_isError(hufSuccess), corruption_detected, ""); @@ -166,13 +218,13 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, dctx->litSize = litSize; dctx->litEntropy = 1; if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable; - ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); return litCSize + lhSize; } case set_basic: { size_t litSize, lhSize; U32 const lhlCode = ((istart[0]) >> 2) & 3; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); switch(lhlCode) { case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -189,23 +241,36 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */ RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, ""); - ZSTD_memcpy(dctx->litBuffer, istart+lhSize, litSize); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memcpy(dctx->litExtraBuffer, istart + lhSize + litSize - ZSTD_LITBUFFEREXTRASIZE, ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memcpy(dctx->litBuffer, istart + lhSize, litSize); + } dctx->litPtr = dctx->litBuffer; dctx->litSize = litSize; - ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH); return lhSize+litSize; } /* direct reference into compressed stream */ dctx->litPtr = istart+lhSize; dctx->litSize = litSize; + dctx->litBufferEnd = dctx->litPtr + litSize; + dctx->litBufferLocation = ZSTD_not_in_dst; return lhSize+litSize; } case set_rle: { U32 const lhlCode = ((istart[0]) >> 2) & 3; size_t litSize, lhSize; + size_t expectedWriteSize = MIN(ZSTD_BLOCKSIZE_MAX, dstCapacity); switch(lhlCode) { case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */ @@ -222,8 +287,19 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4"); break; } + RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, ""); - ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH); + RETURN_ERROR_IF(expectedWriteSize < litSize, dstSize_tooSmall, ""); + ZSTD_allocateLiteralsBuffer(dctx, dst, dstCapacity, litSize, streaming, expectedWriteSize, 1); + if (dctx->litBufferLocation == ZSTD_split) + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize - ZSTD_LITBUFFEREXTRASIZE); + ZSTD_memset(dctx->litExtraBuffer, istart[lhSize], ZSTD_LITBUFFEREXTRASIZE); + } + else + { + ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize); + } dctx->litPtr = dctx->litBuffer; dctx->litSize = litSize; return lhSize+1; @@ -343,7 +419,7 @@ static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = { }; /* ML_defaultDTable */ -static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits) +static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U8 nbAddBits) { void* ptr = dt; ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr; @@ -355,7 +431,7 @@ static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddB cell->nbBits = 0; cell->nextState = 0; assert(nbAddBits < 255); - cell->nbAdditionalBits = (BYTE)nbAddBits; + cell->nbAdditionalBits = nbAddBits; cell->baseValue = baseValue; } @@ -367,7 +443,7 @@ static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddB FORCE_INLINE_TEMPLATE void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize) { ZSTD_seqSymbol* const tableDecode = dt+1; @@ -478,7 +554,7 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) ); tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize); assert(nbAdditionalBits[symbol] < 255); - tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol]; + tableDecode[u].nbAdditionalBits = nbAdditionalBits[symbol]; tableDecode[u].baseValue = baseValue[symbol]; } } @@ -487,7 +563,7 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, /* Avoids the FORCE_INLINE of the _body() function. */ static void ZSTD_buildFSETable_body_default(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize) { ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue, @@ -495,9 +571,9 @@ static void ZSTD_buildFSETable_body_default(ZSTD_seqSymbol* dt, } #if DYNAMIC_BMI2 -TARGET_ATTRIBUTE("bmi2") static void ZSTD_buildFSETable_body_bmi2(ZSTD_seqSymbol* dt, +BMI2_TARGET_ATTRIBUTE static void ZSTD_buildFSETable_body_bmi2(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize) { ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue, @@ -507,7 +583,7 @@ TARGET_ATTRIBUTE("bmi2") static void ZSTD_buildFSETable_body_bmi2(ZSTD_seqSymbol void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize, int bmi2) { #if DYNAMIC_BMI2 @@ -529,7 +605,7 @@ void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr, symbolEncodingType_e type, unsigned max, U32 maxLog, const void* src, size_t srcSize, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable, int ddictIsCold, int nbSeq, U32* wksp, size_t wkspSize, int bmi2) @@ -541,7 +617,7 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb RETURN_ERROR_IF((*(const BYTE*)src) > max, corruption_detected, ""); { U32 const symbol = *(const BYTE*)src; U32 const baseline = baseValue[symbol]; - U32 const nbBits = nbAdditionalBits[symbol]; + U8 const nbBits = nbAdditionalBits[symbol]; ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits); } *DTablePtr = DTableSpace; @@ -620,7 +696,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, LL_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += llhSize; } @@ -632,7 +708,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, OF_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += ofhSize; } @@ -644,7 +720,7 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, ML_defaultDTable, dctx->fseEntropy, dctx->ddictIsCold, nbSeq, dctx->workspace, sizeof(dctx->workspace), - dctx->bmi2); + ZSTD_DCtx_get_bmi2(dctx)); RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed"); ip += mlhSize; } @@ -713,7 +789,7 @@ HINT_INLINE void ZSTD_overlapCopy8(BYTE** op, BYTE const** ip, size_t offset) { * - ZSTD_overlap_src_before_dst: The src and dst may overlap and may be any distance apart. * The src buffer must be before the dst buffer. */ -static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { +static void ZSTD_safecopy(BYTE* op, const BYTE* const oend_w, BYTE const* ip, ptrdiff_t length, ZSTD_overlap_e ovtype) { ptrdiff_t const diff = op - ip; BYTE* const oend = op + length; @@ -729,6 +805,7 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ /* Copy 8 bytes and ensure the offset >= 8 when there can be overlap. */ assert(length >= 8); ZSTD_overlapCopy8(&op, &ip, diff); + length -= 8; assert(op - ip >= 8); assert(op <= oend); } @@ -743,12 +820,35 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ assert(oend > oend_w); ZSTD_wildcopy(op, ip, oend_w - op, ovtype); ip += oend_w - op; - op = oend_w; + op += oend_w - op; } /* Handle the leftovers. */ while (op < oend) *op++ = *ip++; } +/* ZSTD_safecopyDstBeforeSrc(): + * This version allows overlap with dst before src, or handles the non-overlap case with dst after src + * Kept separate from more common ZSTD_safecopy case to avoid performance impact to the safecopy common case */ +static void ZSTD_safecopyDstBeforeSrc(BYTE* op, BYTE const* ip, ptrdiff_t length) { + ptrdiff_t const diff = op - ip; + BYTE* const oend = op + length; + + if (length < 8 || diff > -8) { + /* Handle short lengths, close overlaps, and dst not before src. */ + while (op < oend) *op++ = *ip++; + return; + } + + if (op <= oend - WILDCOPY_OVERLENGTH && diff < -WILDCOPY_VECLEN) { + ZSTD_wildcopy(op, ip, oend - WILDCOPY_OVERLENGTH - op, ZSTD_no_overlap); + ip += oend - WILDCOPY_OVERLENGTH - op; + op += oend - WILDCOPY_OVERLENGTH - op; + } + + /* Handle the leftovers. */ + while (op < oend) *op++ = *ip++; +} + /* ZSTD_execSequenceEnd(): * This version handles cases that are near the end of the output buffer. It requires * more careful checks to make sure there is no overflow. By separating out these hard @@ -759,9 +859,9 @@ static void ZSTD_safecopy(BYTE* op, BYTE* const oend_w, BYTE const* ip, ptrdiff_ */ FORCE_NOINLINE size_t ZSTD_execSequenceEnd(BYTE* op, - BYTE* const oend, seq_t sequence, - const BYTE** litPtr, const BYTE* const litLimit, - const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) { BYTE* const oLitEnd = op + sequence.litLength; size_t const sequenceLength = sequence.litLength + sequence.matchLength; @@ -784,27 +884,76 @@ size_t ZSTD_execSequenceEnd(BYTE* op, if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { /* offset beyond prefix */ RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); - match = dictEnd - (prefixStart-match); + match = dictEnd - (prefixStart - match); if (match + sequence.matchLength <= dictEnd) { ZSTD_memmove(oLitEnd, match, sequence.matchLength); return sequenceLength; } /* span extDict & currentPrefixSegment */ { size_t const length1 = dictEnd - match; - ZSTD_memmove(oLitEnd, match, length1); - op = oLitEnd + length1; - sequence.matchLength -= length1; - match = prefixStart; - } } + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); + return sequenceLength; +} + +/* ZSTD_execSequenceEndSplitLitBuffer(): + * This version is intended to be used during instances where the litBuffer is still split. It is kept separate to avoid performance impact for the good case. + */ +FORCE_NOINLINE +size_t ZSTD_execSequenceEndSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + + /* bounds checks : careful of address space overflow in 32-bit mode */ + RETURN_ERROR_IF(sequenceLength > (size_t)(oend - op), dstSize_tooSmall, "last match must fit within dstBuffer"); + RETURN_ERROR_IF(sequence.litLength > (size_t)(litLimit - *litPtr), corruption_detected, "try to read beyond literal buffer"); + assert(op < op + sequenceLength); + assert(oLitEnd < op + sequenceLength); + + /* copy literals */ + RETURN_ERROR_IF(op > *litPtr && op < *litPtr + sequence.litLength, dstSize_tooSmall, "output should not catch up to and overwrite literal buffer"); + ZSTD_safecopyDstBeforeSrc(op, *litPtr, sequence.litLength); + op = oLitEnd; + *litPtr = iLitEnd; + + /* copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix */ + RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, ""); + match = dictEnd - (prefixStart - match); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); return sequenceLength; } HINT_INLINE size_t ZSTD_execSequence(BYTE* op, - BYTE* const oend, seq_t sequence, - const BYTE** litPtr, const BYTE* const litLimit, - const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) + BYTE* const oend, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) { BYTE* const oLitEnd = op + sequence.litLength; size_t const sequenceLength = sequence.litLength + sequence.matchLength; @@ -821,10 +970,102 @@ size_t ZSTD_execSequence(BYTE* op, * - 32-bit mode and the match length overflows */ if (UNLIKELY( + iLitEnd > litLimit || + oMatchEnd > oend_w || + (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) + return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + + /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ + assert(op <= oLitEnd /* No overflow */); + assert(oLitEnd < oMatchEnd /* Non-zero match & no overflow */); + assert(oMatchEnd <= oend /* No underflow */); + assert(iLitEnd <= litLimit /* Literal length is in bounds */); + assert(oLitEnd <= oend_w /* Can wildcopy literals */); + assert(oMatchEnd <= oend_w /* Can wildcopy matches */); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + assert(WILDCOPY_OVERLENGTH >= 16); + ZSTD_copy16(op, (*litPtr)); + if (UNLIKELY(sequence.litLength > 16)) { + ZSTD_wildcopy(op + 16, (*litPtr) + 16, sequence.litLength - 16, ZSTD_no_overlap); + } + op = oLitEnd; + *litPtr = iLitEnd; /* update for next sequence */ + + /* Copy Match */ + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { + /* offset beyond prefix -> go into extDict */ + RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, ""); + match = dictEnd + (match - prefixStart); + if (match + sequence.matchLength <= dictEnd) { + ZSTD_memmove(oLitEnd, match, sequence.matchLength); + return sequenceLength; + } + /* span extDict & currentPrefixSegment */ + { size_t const length1 = dictEnd - match; + ZSTD_memmove(oLitEnd, match, length1); + op = oLitEnd + length1; + sequence.matchLength -= length1; + match = prefixStart; + } + } + /* Match within prefix of 1 or more bytes */ + assert(op <= oMatchEnd); + assert(oMatchEnd <= oend_w); + assert(match >= prefixStart); + assert(sequence.matchLength >= 1); + + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (LIKELY(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; + } + assert(sequence.offset < WILDCOPY_VECLEN); + + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + assert(op < oMatchEnd); + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8, ZSTD_overlap_src_before_dst); + } + return sequenceLength; +} + +HINT_INLINE +size_t ZSTD_execSequenceSplitLitBuffer(BYTE* op, + BYTE* const oend, const BYTE* const oend_w, seq_t sequence, + const BYTE** litPtr, const BYTE* const litLimit, + const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd) +{ + BYTE* const oLitEnd = op + sequence.litLength; + size_t const sequenceLength = sequence.litLength + sequence.matchLength; + BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ + const BYTE* const iLitEnd = *litPtr + sequence.litLength; + const BYTE* match = oLitEnd - sequence.offset; + + assert(op != NULL /* Precondition */); + assert(oend_w < oend /* No underflow */); + /* Handle edge cases in a slow path: + * - Read beyond end of literals + * - Match end is within WILDCOPY_OVERLIMIT of oend + * - 32-bit mode and the match length overflows + */ + if (UNLIKELY( iLitEnd > litLimit || oMatchEnd > oend_w || (MEM_32bits() && (size_t)(oend - op) < sequenceLength + WILDCOPY_OVERLENGTH))) - return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); + return ZSTD_execSequenceEndSplitLitBuffer(op, oend, oend_w, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd); /* Assumptions (everything else goes into ZSTD_execSequenceEnd()) */ assert(op <= oLitEnd /* No overflow */); @@ -892,6 +1133,7 @@ size_t ZSTD_execSequence(BYTE* op, return sequenceLength; } + static void ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt) { @@ -905,20 +1147,10 @@ ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqS } FORCE_INLINE_TEMPLATE void -ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD) -{ - ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state]; - U32 const nbBits = DInfo.nbBits; - size_t const lowBits = BIT_readBits(bitD, nbBits); - DStatePtr->state = DInfo.nextState + lowBits; -} - -FORCE_INLINE_TEMPLATE void -ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, ZSTD_seqSymbol const DInfo) +ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, U16 nextState, U32 nbBits) { - U32 const nbBits = DInfo.nbBits; size_t const lowBits = BIT_readBits(bitD, nbBits); - DStatePtr->state = DInfo.nextState + lowBits; + DStatePtr->state = nextState + lowBits; } /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum @@ -937,102 +1169,100 @@ FORCE_INLINE_TEMPLATE seq_t ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) { seq_t seq; - ZSTD_seqSymbol const llDInfo = seqState->stateLL.table[seqState->stateLL.state]; - ZSTD_seqSymbol const mlDInfo = seqState->stateML.table[seqState->stateML.state]; - ZSTD_seqSymbol const ofDInfo = seqState->stateOffb.table[seqState->stateOffb.state]; - U32 const llBase = llDInfo.baseValue; - U32 const mlBase = mlDInfo.baseValue; - U32 const ofBase = ofDInfo.baseValue; - BYTE const llBits = llDInfo.nbAdditionalBits; - BYTE const mlBits = mlDInfo.nbAdditionalBits; - BYTE const ofBits = ofDInfo.nbAdditionalBits; - BYTE const totalBits = llBits+mlBits+ofBits; - - /* sequence */ - { size_t offset; - if (ofBits > 1) { - ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); - ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); - assert(ofBits <= MaxOff); - if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { - U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed); - offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); - BIT_reloadDStream(&seqState->DStream); - if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits); - assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */ - } else { - offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); - } - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; - } else { - U32 const ll0 = (llBase == 0); - if (LIKELY((ofBits == 0))) { - if (LIKELY(!ll0)) - offset = seqState->prevOffset[0]; - else { - offset = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; + const ZSTD_seqSymbol* const llDInfo = seqState->stateLL.table + seqState->stateLL.state; + const ZSTD_seqSymbol* const mlDInfo = seqState->stateML.table + seqState->stateML.state; + const ZSTD_seqSymbol* const ofDInfo = seqState->stateOffb.table + seqState->stateOffb.state; + seq.matchLength = mlDInfo->baseValue; + seq.litLength = llDInfo->baseValue; + { U32 const ofBase = ofDInfo->baseValue; + BYTE const llBits = llDInfo->nbAdditionalBits; + BYTE const mlBits = mlDInfo->nbAdditionalBits; + BYTE const ofBits = ofDInfo->nbAdditionalBits; + BYTE const totalBits = llBits+mlBits+ofBits; + + U16 const llNext = llDInfo->nextState; + U16 const mlNext = mlDInfo->nextState; + U16 const ofNext = ofDInfo->nextState; + U32 const llnbBits = llDInfo->nbBits; + U32 const mlnbBits = mlDInfo->nbBits; + U32 const ofnbBits = ofDInfo->nbBits; + /* + * As gcc has better branch and block analyzers, sometimes it is only + * valuable to mark likelyness for clang, it gives around 3-4% of + * performance. + */ + + /* sequence */ + { size_t offset; + #if defined(__clang__) + if (LIKELY(ofBits > 1)) { + #else + if (ofBits > 1) { + #endif + ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1); + ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5); + assert(ofBits <= MaxOff); + if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) { + U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed); + offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); + BIT_reloadDStream(&seqState->DStream); + if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits); + assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */ + } else { + offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); } + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; } else { - offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); - { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; - temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ - if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset = temp; - } } } - seq.offset = offset; - } - - seq.matchLength = mlBase; - if (mlBits > 0) - seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); - - if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) - BIT_reloadDStream(&seqState->DStream); - if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) - BIT_reloadDStream(&seqState->DStream); - /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ - ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); - - seq.litLength = llBase; - if (llBits > 0) - seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); - - if (MEM_32bits()) - BIT_reloadDStream(&seqState->DStream); - - DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", - (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); - - /* ANS state update - * gcc-9.0.0 does 2.5% worse with ZSTD_updateFseStateWithDInfo(). - * clang-9.2.0 does 7% worse with ZSTD_updateFseState(). - * Naturally it seems like ZSTD_updateFseStateWithDInfo() should be the - * better option, so it is the default for other compilers. But, if you - * measure that it is worse, please put up a pull request. - */ - { -#if defined(__GNUC__) && !defined(__clang__) - const int kUseUpdateFseState = 1; -#else - const int kUseUpdateFseState = 0; -#endif - if (kUseUpdateFseState) { - ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ - ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ - ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ - } else { - ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llDInfo); /* <= 9 bits */ - ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlDInfo); /* <= 9 bits */ - if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ - ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofDInfo); /* <= 8 bits */ + U32 const ll0 = (llDInfo->baseValue == 0); + if (LIKELY((ofBits == 0))) { + offset = seqState->prevOffset[ll0]; + seqState->prevOffset[1] = seqState->prevOffset[!ll0]; + seqState->prevOffset[0] = offset; + } else { + offset = ofBase + ll0 + BIT_readBitsFast(&seqState->DStream, 1); + { size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; + temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ + if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + } } } + seq.offset = offset; } + + #if defined(__clang__) + if (UNLIKELY(mlBits > 0)) + #else + if (mlBits > 0) + #endif + seq.matchLength += BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/); + + if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32)) + BIT_reloadDStream(&seqState->DStream); + if (MEM_64bits() && UNLIKELY(totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog))) + BIT_reloadDStream(&seqState->DStream); + /* Ensure there are enough bits to read the rest of data in 64-bit mode. */ + ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64); + + #if defined(__clang__) + if (UNLIKELY(llBits > 0)) + #else + if (llBits > 0) + #endif + seq.litLength += BIT_readBitsFast(&seqState->DStream, llBits/*>0*/); + + if (MEM_32bits()) + BIT_reloadDStream(&seqState->DStream); + + DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u", + (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset); + + ZSTD_updateFseStateWithDInfo(&seqState->stateLL, &seqState->DStream, llNext, llnbBits); /* <= 9 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateML, &seqState->DStream, mlNext, mlnbBits); /* <= 9 bits */ + if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ + ZSTD_updateFseStateWithDInfo(&seqState->stateOffb, &seqState->DStream, ofNext, ofnbBits); /* <= 8 bits */ } return seq; @@ -1085,9 +1315,11 @@ MEM_STATIC void ZSTD_assertValidSequence( #endif #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG + + FORCE_INLINE_TEMPLATE size_t DONT_VECTORIZE -ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, +ZSTD_decompressSequences_bodySplitLitBuffer( ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, const ZSTD_longOffset_e isLongOffset, @@ -1099,11 +1331,11 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, BYTE* const oend = ostart + maxDstSize; BYTE* op = ostart; const BYTE* litPtr = dctx->litPtr; - const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* litBufferEnd = dctx->litBufferEnd; const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); const BYTE* const vBase = (const BYTE*) (dctx->virtualStart); const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); - DEBUGLOG(5, "ZSTD_decompressSequences_body"); + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer"); (void)frame; /* Regen sequences */ @@ -1124,55 +1356,237 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, BIT_DStream_endOfBuffer < BIT_DStream_completed && BIT_DStream_completed < BIT_DStream_overflow); + /* decompress without overrunning litPtr begins */ + { + seq_t sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + /* Align the decompression loop to 32 + 16 bytes. + * + * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression + * speed swings based on the alignment of the decompression loop. This + * performance swing is caused by parts of the decompression loop falling + * out of the DSB. The entire decompression loop should fit in the DSB, + * when it can't we get much worse performance. You can measure if you've + * hit the good case or the bad case with this perf command for some + * compressed file test.zst: + * + * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ + * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst + * + * If you see most cycles served out of the MITE you've hit the bad case. + * If you see most cycles served out of the DSB you've hit the good case. + * If it is pretty even then you may be in an okay case. + * + * This issue has been reproduced on the following CPUs: + * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 + * Use Instruments->Counters to get DSB/MITE cycles. + * I never got performance swings, but I was able to + * go from the good case of mostly DSB to half of the + * cycles served from MITE. + * - Coffeelake: Intel i9-9900k + * - Coffeelake: Intel i7-9700k + * + * I haven't been able to reproduce the instability or DSB misses on any + * of the following CPUS: + * - Haswell + * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH + * - Skylake + * + * Alignment is done for each of the three major decompression loops: + * - ZSTD_decompressSequences_bodySplitLitBuffer - presplit section of the literal buffer + * - ZSTD_decompressSequences_bodySplitLitBuffer - postsplit section of the literal buffer + * - ZSTD_decompressSequences_body + * Alignment choices are made to minimize large swings on bad cases and influence on performance + * from changes external to this code, rather than to overoptimize on the current commit. + * + * If you are seeing performance stability this script can help test. + * It tests on 4 commits in zstd where I saw performance change. + * + * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 + */ #if defined(__GNUC__) && defined(__x86_64__) - /* Align the decompression loop to 32 + 16 bytes. - * - * zstd compiled with gcc-9 on an Intel i9-9900k shows 10% decompression - * speed swings based on the alignment of the decompression loop. This - * performance swing is caused by parts of the decompression loop falling - * out of the DSB. The entire decompression loop should fit in the DSB, - * when it can't we get much worse performance. You can measure if you've - * hit the good case or the bad case with this perf command for some - * compressed file test.zst: - * - * perf stat -e cycles -e instructions -e idq.all_dsb_cycles_any_uops \ - * -e idq.all_mite_cycles_any_uops -- ./zstd -tq test.zst - * - * If you see most cycles served out of the MITE you've hit the bad case. - * If you see most cycles served out of the DSB you've hit the good case. - * If it is pretty even then you may be in an okay case. - * - * This issue has been reproduced on the following CPUs: - * - Kabylake: Macbook Pro (15-inch, 2019) 2.4 GHz Intel Core i9 - * Use Instruments->Counters to get DSB/MITE cycles. - * I never got performance swings, but I was able to - * go from the good case of mostly DSB to half of the - * cycles served from MITE. - * - Coffeelake: Intel i9-9900k - * - Coffeelake: Intel i7-9700k - * - * I haven't been able to reproduce the instability or DSB misses on any - * of the following CPUS: - * - Haswell - * - Broadwell: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GH - * - Skylake - * - * If you are seeing performance stability this script can help test. - * It tests on 4 commits in zstd where I saw performance change. - * - * https://gist.github.com/terrelln/9889fc06a423fd5ca6e99351564473f4 - */ - __asm__(".p2align 6"); - __asm__("nop"); - __asm__(".p2align 5"); - __asm__("nop"); -# if __GNUC__ >= 9 - /* better for gcc-9 and gcc-10, worse for clang and gcc-8 */ - __asm__(".p2align 3"); + __asm__(".p2align 6"); +# if __GNUC__ >= 7 + /* good for gcc-7, gcc-9, and gcc-11 */ + __asm__("nop"); + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 4"); +# if __GNUC__ == 8 || __GNUC__ == 10 + /* good for gcc-8 and gcc-10 */ + __asm__("nop"); + __asm__(".p2align 3"); +# endif +# endif +#endif + + /* Handle the initial state where litBuffer is currently split between dst and litExtraBuffer */ + for (; litPtr + sequence.litLength <= dctx->litBufferEnd; ) { + size_t const oneSeqSize = ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence.litLength - WILDCOPY_OVERLENGTH, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + } + + /* If there are more sequences, they will need to read literals from litExtraBuffer; copy over the remainder from dst and update litPtr and litEnd */ + if (nbSeq > 0) { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence.litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (--nbSeq) + BIT_reloadDStream(&(seqState.DStream)); + } + } + } + + if (nbSeq > 0) /* there is remaining lit from extra buffer */ + { + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ != 7 + /* worse for gcc-7 better for gcc-8, gcc-9, and gcc-10 and clang */ + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); +# elif __GNUC__ >= 11 + __asm__(".p2align 3"); +# else + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); +# endif +#endif + + for (; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litBufferEnd, prefixStart, vBase, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequence, prefixStart, vBase); +#endif + if (UNLIKELY(ZSTD_isError(oneSeqSize))) + return oneSeqSize; + DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize); + op += oneSeqSize; + if (UNLIKELY(!--nbSeq)) + break; + BIT_reloadDStream(&(seqState.DStream)); + } + } + + /* check if reached exact end */ + DEBUGLOG(5, "ZSTD_decompressSequences_bodySplitLitBuffer: after decode loop, remaining nbSeq : %i", nbSeq); + RETURN_ERROR_IF(nbSeq, corruption_detected, ""); + RETURN_ERROR_IF(BIT_reloadDStream(&seqState.DStream) < BIT_DStream_completed, corruption_detected, ""); + /* save reps for next block */ + { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); } + } + + /* last literal segment */ + if (dctx->litBufferLocation == ZSTD_split) /* split hasn't been reached yet, first get dst then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + } + { size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memcpy(op, litPtr, lastLLSize); + op += lastLLSize; + } + } + + return op-ostart; +} + +FORCE_INLINE_TEMPLATE size_t +DONT_VECTORIZE +ZSTD_decompressSequences_body(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + const BYTE* ip = (const BYTE*)seqStart; + const BYTE* const iend = ip + seqSize; + BYTE* const ostart = (BYTE*)dst; + BYTE* const oend = dctx->litBufferLocation == ZSTD_not_in_dst ? ostart + maxDstSize : dctx->litBuffer; + BYTE* op = ostart; + const BYTE* litPtr = dctx->litPtr; + const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* const prefixStart = (const BYTE*)(dctx->prefixStart); + const BYTE* const vBase = (const BYTE*)(dctx->virtualStart); + const BYTE* const dictEnd = (const BYTE*)(dctx->dictEnd); + DEBUGLOG(5, "ZSTD_decompressSequences_body"); + (void)frame; + + /* Regen sequences */ + if (nbSeq) { + seqState_t seqState; + dctx->fseEntropy = 1; + { U32 i; for (i = 0; i < ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; } + RETURN_ERROR_IF( + ERR_isError(BIT_initDStream(&seqState.DStream, ip, iend - ip)), + corruption_detected, ""); + ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr); + ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); + ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); + assert(dst != NULL); + + ZSTD_STATIC_ASSERT( + BIT_DStream_unfinished < BIT_DStream_completed && + BIT_DStream_endOfBuffer < BIT_DStream_completed && + BIT_DStream_completed < BIT_DStream_overflow); + +#if defined(__GNUC__) && defined(__x86_64__) + __asm__(".p2align 6"); + __asm__("nop"); +# if __GNUC__ >= 7 + __asm__(".p2align 5"); + __asm__("nop"); + __asm__(".p2align 3"); # else - __asm__(".p2align 4"); + __asm__(".p2align 4"); + __asm__("nop"); + __asm__(".p2align 3"); # endif #endif + for ( ; ; ) { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd); @@ -1218,6 +1632,16 @@ ZSTD_decompressSequences_default(ZSTD_DCtx* dctx, { return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } + +static size_t +ZSTD_decompressSequencesSplitLitBuffer_default(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT @@ -1250,10 +1674,10 @@ ZSTD_decompressSequencesLong_body( const BYTE* ip = (const BYTE*)seqStart; const BYTE* const iend = ip + seqSize; BYTE* const ostart = (BYTE*)dst; - BYTE* const oend = ostart + maxDstSize; + BYTE* const oend = dctx->litBufferLocation == ZSTD_in_dst ? dctx->litBuffer : ostart + maxDstSize; BYTE* op = ostart; const BYTE* litPtr = dctx->litPtr; - const BYTE* const litEnd = litPtr + dctx->litSize; + const BYTE* litBufferEnd = dctx->litBufferEnd; const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart); const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart); const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd); @@ -1289,32 +1713,94 @@ ZSTD_decompressSequencesLong_body( } RETURN_ERROR_IF(seqNb<seqAdvance, corruption_detected, ""); - /* decode and decompress */ - for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) { - seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset); - size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd); + /* decompress without stomping litBuffer */ + for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb < nbSeq); seqNb++) { + seq_t sequence = ZSTD_decodeSequence(&seqState, isLongOffset); + size_t oneSeqSize; + + if (dctx->litBufferLocation == ZSTD_split && litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength > dctx->litBufferEnd) + { + /* lit buffer is reaching split point, empty out the first buffer and transition to litExtraBuffer */ + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + oneSeqSize = ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); #if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) - assert(!ZSTD_isError(oneSeqSize)); - if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); #endif - if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; - prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); - sequences[seqNb & STORED_SEQS_MASK] = sequence; - op += oneSeqSize; + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } + else + { + /* lit buffer is either wholly contained in first or second split, or not split at all*/ + oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK].litLength - WILDCOPY_OVERLENGTH, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[(seqNb - ADVANCED_SEQS) & STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + + prefetchPos = ZSTD_prefetchMatch(prefetchPos, sequence, prefixStart, dictEnd); + sequences[seqNb & STORED_SEQS_MASK] = sequence; + op += oneSeqSize; + } } RETURN_ERROR_IF(seqNb<nbSeq, corruption_detected, ""); /* finish queue */ seqNb -= seqAdvance; for ( ; seqNb<nbSeq ; seqNb++) { - size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[seqNb&STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd); + seq_t *sequence = &(sequences[seqNb&STORED_SEQS_MASK]); + if (dctx->litBufferLocation == ZSTD_split && litPtr + sequence->litLength > dctx->litBufferEnd) + { + const size_t leftoverLit = dctx->litBufferEnd - litPtr; + if (leftoverLit) + { + RETURN_ERROR_IF(leftoverLit > (size_t)(oend - op), dstSize_tooSmall, "remaining lit must fit within dstBuffer"); + ZSTD_safecopyDstBeforeSrc(op, litPtr, leftoverLit); + sequence->litLength -= leftoverLit; + op += leftoverLit; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + dctx->litBufferLocation = ZSTD_not_in_dst; + { + size_t const oneSeqSize = ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); #if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) - assert(!ZSTD_isError(oneSeqSize)); - if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); #endif - if (ZSTD_isError(oneSeqSize)) return oneSeqSize; - op += oneSeqSize; + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } + } + else + { + size_t const oneSeqSize = dctx->litBufferLocation == ZSTD_split ? + ZSTD_execSequenceSplitLitBuffer(op, oend, litPtr + sequence->litLength - WILDCOPY_OVERLENGTH, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd) : + ZSTD_execSequence(op, oend, *sequence, &litPtr, litBufferEnd, prefixStart, dictStart, dictEnd); +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) && defined(FUZZING_ASSERT_VALID_SEQUENCE) + assert(!ZSTD_isError(oneSeqSize)); + if (frame) ZSTD_assertValidSequence(dctx, op, oend, sequences[seqNb&STORED_SEQS_MASK], prefixStart, dictStart); +#endif + if (ZSTD_isError(oneSeqSize)) return oneSeqSize; + op += oneSeqSize; + } } /* save reps for next block */ @@ -1322,10 +1808,21 @@ ZSTD_decompressSequencesLong_body( } /* last literal segment */ - { size_t const lastLLSize = litEnd - litPtr; + if (dctx->litBufferLocation == ZSTD_split) /* first deplete literal buffer in dst, then copy litExtraBuffer */ + { + size_t const lastLLSize = litBufferEnd - litPtr; + RETURN_ERROR_IF(lastLLSize > (size_t)(oend - op), dstSize_tooSmall, ""); + if (op != NULL) { + ZSTD_memmove(op, litPtr, lastLLSize); + op += lastLLSize; + } + litPtr = dctx->litExtraBuffer; + litBufferEnd = dctx->litExtraBuffer + ZSTD_LITBUFFEREXTRASIZE; + } + { size_t const lastLLSize = litBufferEnd - litPtr; RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, ""); if (op != NULL) { - ZSTD_memcpy(op, litPtr, lastLLSize); + ZSTD_memmove(op, litPtr, lastLLSize); op += lastLLSize; } } @@ -1349,7 +1846,7 @@ ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx, #if DYNAMIC_BMI2 #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t DONT_VECTORIZE ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, @@ -1359,10 +1856,20 @@ ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx, { return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } +static BMI2_TARGET_ATTRIBUTE size_t +DONT_VECTORIZE +ZSTD_decompressSequencesSplitLitBuffer_bmi2(ZSTD_DCtx* dctx, + void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + return ZSTD_decompressSequences_bodySplitLitBuffer(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT -static TARGET_ATTRIBUTE("bmi2") size_t +static BMI2_TARGET_ATTRIBUTE size_t ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* seqStart, size_t seqSize, int nbSeq, @@ -1391,11 +1898,25 @@ ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, { DEBUGLOG(5, "ZSTD_decompressSequences"); #if DYNAMIC_BMI2 - if (dctx->bmi2) { + if (ZSTD_DCtx_get_bmi2(dctx)) { return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif - return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); +} +static size_t +ZSTD_decompressSequencesSplitLitBuffer(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, + const void* seqStart, size_t seqSize, int nbSeq, + const ZSTD_longOffset_e isLongOffset, + const int frame) +{ + DEBUGLOG(5, "ZSTD_decompressSequencesSplitLitBuffer"); +#if DYNAMIC_BMI2 + if (ZSTD_DCtx_get_bmi2(dctx)) { + return ZSTD_decompressSequencesSplitLitBuffer_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); + } +#endif + return ZSTD_decompressSequencesSplitLitBuffer_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */ @@ -1415,7 +1936,7 @@ ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, { DEBUGLOG(5, "ZSTD_decompressSequencesLong"); #if DYNAMIC_BMI2 - if (dctx->bmi2) { + if (ZSTD_DCtx_get_bmi2(dctx)) { return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset, frame); } #endif @@ -1456,7 +1977,7 @@ ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable) size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, - const void* src, size_t srcSize, const int frame) + const void* src, size_t srcSize, const int frame, const streaming_operation streaming) { /* blockType == blockCompressed */ const BYTE* ip = (const BYTE*)src; /* isLongOffset must be true if there are long offsets. @@ -1471,7 +1992,7 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, RETURN_ERROR_IF(srcSize >= ZSTD_BLOCKSIZE_MAX, srcSize_wrong, ""); /* Decode literals section */ - { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize); + { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize, dst, dstCapacity, streaming); DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize); if (ZSTD_isError(litCSize)) return litCSize; ip += litCSize; @@ -1519,7 +2040,10 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG /* else */ - return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + if (dctx->litBufferLocation == ZSTD_split) + return ZSTD_decompressSequencesSplitLitBuffer(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); + else + return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); #endif } } @@ -1542,7 +2066,7 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, { size_t dSize; ZSTD_checkContinuity(dctx, dst, dstCapacity); - dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0); + dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0, not_streaming); dctx->previousDstEnd = (char*)dst + dSize; return dSize; } diff --git a/thirdparty/zstd/decompress/zstd_decompress_block.h b/thirdparty/zstd/decompress/zstd_decompress_block.h index 049a0cd84c..c61a9d0c4b 100644 --- a/thirdparty/zstd/decompress/zstd_decompress_block.h +++ b/thirdparty/zstd/decompress/zstd_decompress_block.h @@ -33,6 +33,12 @@ */ + /* Streaming state is used to inform allocation of the literal buffer */ +typedef enum { + not_streaming = 0, + is_streaming = 1 +} streaming_operation; + /* ZSTD_decompressBlock_internal() : * decompress block, starting at `src`, * into destination buffer `dst`. @@ -41,7 +47,7 @@ */ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, - const void* src, size_t srcSize, const int frame); + const void* src, size_t srcSize, const int frame, const streaming_operation streaming); /* ZSTD_buildFSETable() : * generate FSE decoding table for one symbol (ll, ml or off) @@ -54,7 +60,7 @@ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, */ void ZSTD_buildFSETable(ZSTD_seqSymbol* dt, const short* normalizedCounter, unsigned maxSymbolValue, - const U32* baseValue, const U32* nbAdditionalBits, + const U32* baseValue, const U8* nbAdditionalBits, unsigned tableLog, void* wksp, size_t wkspSize, int bmi2); diff --git a/thirdparty/zstd/decompress/zstd_decompress_internal.h b/thirdparty/zstd/decompress/zstd_decompress_internal.h index ebda0c9031..2b5a53850a 100644 --- a/thirdparty/zstd/decompress/zstd_decompress_internal.h +++ b/thirdparty/zstd/decompress/zstd_decompress_internal.h @@ -20,7 +20,7 @@ * Dependencies *********************************************************/ #include "../common/mem.h" /* BYTE, U16, U32 */ -#include "../common/zstd_internal.h" /* ZSTD_seqSymbol */ +#include "../common/zstd_internal.h" /* constants : MaxLL, MaxML, MaxOff, LLFSELog, etc. */ @@ -40,7 +40,7 @@ static UNUSED_ATTR const U32 OF_base[MaxOff+1] = { 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD }; -static UNUSED_ATTR const U32 OF_bits[MaxOff+1] = { +static UNUSED_ATTR const U8 OF_bits[MaxOff+1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -106,6 +106,22 @@ typedef struct { size_t ddictPtrCount; } ZSTD_DDictHashSet; +#ifndef ZSTD_DECODER_INTERNAL_BUFFER +# define ZSTD_DECODER_INTERNAL_BUFFER (1 << 16) +#endif + +#define ZSTD_LBMIN 64 +#define ZSTD_LBMAX (128 << 10) + +/* extra buffer, compensates when dst is not large enough to store litBuffer */ +#define ZSTD_LITBUFFEREXTRASIZE BOUNDED(ZSTD_LBMIN, ZSTD_DECODER_INTERNAL_BUFFER, ZSTD_LBMAX) + +typedef enum { + ZSTD_not_in_dst = 0, /* Stored entirely within litExtraBuffer */ + ZSTD_in_dst = 1, /* Stored entirely within dst (in memory after current output write) */ + ZSTD_split = 2 /* Split between litExtraBuffer and dst */ +} ZSTD_litLocation_e; + struct ZSTD_DCtx_s { const ZSTD_seqSymbol* LLTptr; @@ -136,7 +152,9 @@ struct ZSTD_DCtx_s size_t litSize; size_t rleSize; size_t staticSize; +#if DYNAMIC_BMI2 != 0 int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */ +#endif /* dictionary */ ZSTD_DDict* ddictLocal; @@ -158,16 +176,21 @@ struct ZSTD_DCtx_s size_t outStart; size_t outEnd; size_t lhSize; +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) void* legacyContext; U32 previousLegacyVersion; U32 legacyVersion; +#endif U32 hostageByte; int noForwardProgress; ZSTD_bufferMode_e outBufferMode; ZSTD_outBuffer expectedOutBuffer; /* workspace */ - BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH]; + BYTE* litBuffer; + const BYTE* litBufferEnd; + ZSTD_litLocation_e litBufferLocation; + BYTE litExtraBuffer[ZSTD_LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH]; /* literal buffer can be split between storage within dst and within this scratch buffer */ BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX]; size_t oversizedDuration; @@ -183,6 +206,14 @@ struct ZSTD_DCtx_s #endif }; /* typedef'd to ZSTD_DCtx within "zstd.h" */ +MEM_STATIC int ZSTD_DCtx_get_bmi2(const struct ZSTD_DCtx_s *dctx) { +#if DYNAMIC_BMI2 != 0 + return dctx->bmi2; +#else + (void)dctx; + return 0; +#endif +} /*-******************************************************* * Shared internal functions diff --git a/thirdparty/zstd/zstd.h b/thirdparty/zstd/zstd.h index 4651e6c4dc..a88ae7bf8e 100644 --- a/thirdparty/zstd/zstd.h +++ b/thirdparty/zstd/zstd.h @@ -20,19 +20,21 @@ extern "C" { /* ===== ZSTDLIB_API : control library symbols visibility ===== */ -#ifndef ZSTDLIB_VISIBILITY -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default"))) +#ifndef ZSTDLIB_VISIBLE +# if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) +# define ZSTDLIB_VISIBLE __attribute__ ((visibility ("default"))) +# define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden"))) # else -# define ZSTDLIB_VISIBILITY +# define ZSTDLIB_VISIBLE +# define ZSTDLIB_HIDDEN # endif #endif #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) -# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY +# define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBLE #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) -# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +# define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBLE /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ #else -# define ZSTDLIB_API ZSTDLIB_VISIBILITY +# define ZSTDLIB_API ZSTDLIB_VISIBLE #endif @@ -72,7 +74,7 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 #define ZSTD_VERSION_MINOR 5 -#define ZSTD_VERSION_RELEASE 0 +#define ZSTD_VERSION_RELEASE 2 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) /*! ZSTD_versionNumber() : @@ -247,7 +249,7 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, * * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset(). * - * This API supercedes all other "advanced" API entry points in the experimental section. + * This API supersedes all other "advanced" API entry points in the experimental section. * In the future, we expect to remove from experimental API entry points which are redundant with this API. */ @@ -417,7 +419,7 @@ typedef enum { * ZSTD_c_stableOutBuffer * ZSTD_c_blockDelimiters * ZSTD_c_validateSequences - * ZSTD_c_splitBlocks + * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; @@ -932,7 +934,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize); * Advanced dictionary and prefix API (Requires v1.4.0+) * * This API allows dictionaries to be used with ZSTD_compress2(), - * ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and + * ZSTD_compressStream2(), and ZSTD_decompressDCtx(). Dictionaries are sticky, and * only reset with the context is reset with ZSTD_reset_parameters or * ZSTD_reset_session_and_parameters. Prefixes are single-use. ******************************************************************************/ @@ -1073,25 +1075,36 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY) #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY +/* This can be overridden externally to hide static symbols. */ +#ifndef ZSTDLIB_STATIC_API +# if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllexport) ZSTDLIB_VISIBLE +# elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1) +# define ZSTDLIB_STATIC_API __declspec(dllimport) ZSTDLIB_VISIBLE +# else +# define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE +# endif +#endif + /* Deprecation warnings : * Should these warnings be a problem, it is generally possible to disable them, * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. */ #ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS -# define ZSTD_DEPRECATED(message) ZSTDLIB_API /* disable deprecation warnings */ +# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API /* disable deprecation warnings */ #else # if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define ZSTD_DEPRECATED(message) [[deprecated(message)]] ZSTDLIB_API +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] ZSTDLIB_STATIC_API # elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated(message))) +# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __attribute__((deprecated(message))) # elif defined(__GNUC__) && (__GNUC__ >= 3) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated)) +# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __attribute__((deprecated)) # elif defined(_MSC_VER) -# define ZSTD_DEPRECATED(message) ZSTDLIB_API __declspec(deprecated(message)) +# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __declspec(deprecated(message)) # else # pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") -# define ZSTD_DEPRECATED(message) ZSTDLIB_API +# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API # endif #endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ @@ -1157,9 +1170,6 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #define ZSTD_SRCSIZEHINT_MIN 0 #define ZSTD_SRCSIZEHINT_MAX INT_MAX -/* internal */ -#define ZSTD_HASHLOG3_MAX 17 - /* --- Advanced types --- */ @@ -1302,10 +1312,14 @@ typedef enum { } ZSTD_literalCompressionMode_e; typedef enum { - ZSTD_urm_auto = 0, /* Automatically determine whether or not we use row matchfinder */ - ZSTD_urm_disableRowMatchFinder = 1, /* Never use row matchfinder */ - ZSTD_urm_enableRowMatchFinder = 2 /* Always use row matchfinder when applicable */ -} ZSTD_useRowMatchFinderMode_e; + /* Note: This enum controls features which are conditionally beneficial. Zstd typically will make a final + * decision on whether or not to enable the feature (ZSTD_ps_auto), but setting the switch to ZSTD_ps_enable + * or ZSTD_ps_disable allow for a force enable/disable the feature. + */ + ZSTD_ps_auto = 0, /* Let the library automatically determine whether the feature shall be enabled */ + ZSTD_ps_enable = 1, /* Force-enable the feature */ + ZSTD_ps_disable = 2 /* Do not use the feature */ +} ZSTD_paramSwitch_e; /*************************************** * Frame size functions @@ -1332,7 +1346,7 @@ typedef enum { * note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to * read each contained frame header. This is fast as most of the data is skipped, * however it does mean that all frame data must be present and valid. */ -ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); /*! ZSTD_decompressBound() : * `src` should point to the start of a series of ZSTD encoded and/or skippable frames @@ -1347,13 +1361,13 @@ ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t * note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: * upper-bound = # blocks * min(128 KB, Window_Size) */ -ZSTDLIB_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); /*! ZSTD_frameHeaderSize() : * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. * @return : size of the Frame Header, * or an error code (if srcSize is too small) */ -ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize); typedef enum { ZSTD_sf_noBlockDelimiters = 0, /* Representation of ZSTD_Sequence has no block delimiters, sequences only */ @@ -1376,7 +1390,7 @@ typedef enum { * @return : number of sequences generated */ -ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, +ZSTDLIB_STATIC_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, size_t outSeqsSize, const void* src, size_t srcSize); /*! ZSTD_mergeBlockDelimiters() : @@ -1390,7 +1404,7 @@ ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters * @return : number of sequences left after merging */ -ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); +ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); /*! ZSTD_compressSequences() : * Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. @@ -1420,7 +1434,7 @@ ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t se * and cannot emit an RLE block that disagrees with the repcode history * @return : final compressed size or a ZSTD error. */ -ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize, +ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize, const ZSTD_Sequence* inSeqs, size_t inSeqsSize, const void* src, size_t srcSize); @@ -1438,9 +1452,29 @@ ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size * * @return : number of bytes written or a ZSTD error. */ -ZSTDLIB_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, +ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned magicVariant); +/*! ZSTD_readSkippableFrame() : + * Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer. + * + * The parameter magicVariant will receive the magicVariant that was supplied when the frame was written, + * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested + * in the magicVariant. + * + * Returns an error if destination buffer is not large enough, or if the frame is not skippable. + * + * @return : number of bytes written or a ZSTD error. + */ +ZSTDLIB_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity, unsigned* magicVariant, + const void* src, size_t srcSize); + +/*! ZSTD_isSkippableFrame() : + * Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame. + */ +ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); + + /*************************************** * Memory management @@ -1469,10 +1503,10 @@ ZSTDLIB_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity, * Note 2 : only single-threaded compression is supported. * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. */ -ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); /*! ZSTD_estimateCStreamSize() : * ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one. @@ -1487,20 +1521,20 @@ ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void); * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), * an internal ?Dict will be created, which additional size is not estimated here. * In this case, get total size by adding ZSTD_estimate?DictSize */ -ZSTDLIB_API size_t ZSTD_estimateCStreamSize(int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); -ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize(size_t windowSize); -ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t windowSize); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize); /*! ZSTD_estimate?DictSize() : * ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict(). * ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced(). * Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller. */ -ZSTDLIB_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); -ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod); +ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod); /*! ZSTD_initStatic*() : * Initialize an object using a pre-allocated fixed-size buffer. @@ -1523,20 +1557,20 @@ ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e * Limitation 2 : static cctx currently not compatible with multi-threading. * Limitation 3 : static dctx is incompatible with legacy support. */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticCCtx() */ -ZSTDLIB_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); -ZSTDLIB_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize); /**< same as ZSTD_initStaticDCtx() */ -ZSTDLIB_API const ZSTD_CDict* ZSTD_initStaticCDict( +ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams); -ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict( +ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict( void* workspace, size_t workspaceSize, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, @@ -1557,44 +1591,44 @@ __attribute__((__unused__)) #endif ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ -ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem); +ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, ZSTD_compressionParameters cParams, ZSTD_customMem customMem); -/* ! Thread pool : - * These prototypes make it possible to share a thread pool among multiple compression contexts. - * This can limit resources for applications with multiple threads where each one uses - * a threaded compression mode (via ZSTD_c_nbWorkers parameter). - * ZSTD_createThreadPool creates a new thread pool with a given number of threads. - * Note that the lifetime of such pool must exist while being used. - * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value - * to use an internal thread pool). - * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. +/*! Thread pool : + * These prototypes make it possible to share a thread pool among multiple compression contexts. + * This can limit resources for applications with multiple threads where each one uses + * a threaded compression mode (via ZSTD_c_nbWorkers parameter). + * ZSTD_createThreadPool creates a new thread pool with a given number of threads. + * Note that the lifetime of such pool must exist while being used. + * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value + * to use an internal thread pool). + * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer. */ typedef struct POOL_ctx_s ZSTD_threadPool; -ZSTDLIB_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); -ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ -ZSTDLIB_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); +ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads); +ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */ +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool); /* * This API is temporary and is expected to change or disappear in the future! */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2( +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, const ZSTD_CCtx_params* cctxParams, ZSTD_customMem customMem); -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced( +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced( const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType, @@ -1611,22 +1645,22 @@ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced( * As a consequence, `dictBuffer` **must** outlive CDict, * and its content must remain unmodified throughout the lifetime of CDict. * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */ -ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel); /*! ZSTD_getCParams() : * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize. * `estimatedSrcSize` value is optional, select 0 if not known */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_getParams() : * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`. * All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */ -ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize); /*! ZSTD_checkCParams() : * Ensure param values remain within authorized range. * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */ -ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); +ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); /*! ZSTD_adjustCParams() : * optimize params for a given `srcSize` and `dictSize`. @@ -1634,7 +1668,7 @@ ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params); * `dictSize` must be `0` when there is no dictionary. * cPar can be invalid : all parameters will be clamped within valid range in the @return struct. * This function never fails (wide contract) */ -ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize); /*! ZSTD_compress_advanced() : * Note : this function is now DEPRECATED. @@ -1662,18 +1696,18 @@ size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, /*! ZSTD_CCtx_loadDictionary_byReference() : * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx. * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize); /*! ZSTD_CCtx_loadDictionary_advanced() : * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_CCtx_refPrefix_advanced() : * Same as ZSTD_CCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /* === experimental parameters === */ /* these parameters can be used with ZSTD_setParameter() @@ -1712,9 +1746,15 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * See the comments on that enum for an explanation of the feature. */ #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4 -/* Controls how the literals are compressed (default is auto). - * The value must be of type ZSTD_literalCompressionMode_e. - * See ZSTD_literalCompressionMode_e enum definition for details. +/* Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never compress literals. + * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals + * may still be emitted if huffman is not beneficial to use.) + * + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * literals compression based on the compression parameters - specifically, + * negative compression levels do not use literal compression. */ #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5 @@ -1777,7 +1817,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * * Note that this means that the CDict tables can no longer be copied into the * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be - * useable. The dictionary can only be attached or reloaded. + * usable. The dictionary can only be attached or reloaded. * * In general, you should expect compression to be faster--sometimes very much * so--and CDict creation to be slightly slower. Eventually, we will probably @@ -1866,23 +1906,26 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre */ #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12 -/* ZSTD_c_splitBlocks - * Default is 0 == disabled. Set to 1 to enable block splitting. +/* ZSTD_c_useBlockSplitter + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use block splitter. + * Set to ZSTD_ps_enable to always use block splitter. * - * Will attempt to split blocks in order to improve compression ratio at the cost of speed. + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * block splitting based on the compression parameters. */ -#define ZSTD_c_splitBlocks ZSTD_c_experimentalParam13 +#define ZSTD_c_useBlockSplitter ZSTD_c_experimentalParam13 /* ZSTD_c_useRowMatchFinder - * Default is ZSTD_urm_auto. - * Controlled with ZSTD_useRowMatchFinderMode_e enum. + * Controlled with ZSTD_paramSwitch_e enum. + * Default is ZSTD_ps_auto. + * Set to ZSTD_ps_disable to never use row-based matchfinder. + * Set to ZSTD_ps_enable to force usage of row-based matchfinder. * - * By default, in ZSTD_urm_auto, when finalizing the compression parameters, the library - * will decide at runtime whether to use the row-based matchfinder based on support for SIMD - * instructions as well as the windowLog. - * - * Set to ZSTD_urm_disableRowMatchFinder to never use row-based matchfinder. - * Set to ZSTD_urm_enableRowMatchFinder to force usage of row-based matchfinder. + * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use + * the row-based matchfinder based on support for SIMD instructions and the window log. + * Note that this only pertains to compression strategies: greedy, lazy, and lazy2 */ #define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14 @@ -1911,7 +1954,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre * and store it into int* value. * @return : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_params : @@ -1931,25 +1974,25 @@ ZSTDLIB_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams() * for static allocation of CCtx for single-threaded compression. */ -ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); -ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ +ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void); +ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */ /*! ZSTD_CCtxParams_reset() : * Reset params to default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params); /*! ZSTD_CCtxParams_init() : * Initializes the compression parameters of cctxParams according to * compression level. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel); /*! ZSTD_CCtxParams_init_advanced() : * Initializes the compression and frame parameters of cctxParams according to * params. All other parameters are reset to their default values. */ -ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params); /*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+ * Similar to ZSTD_CCtx_setParameter. @@ -1959,14 +2002,14 @@ ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, Z * @result : a code representing success or failure (which can be tested with * ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value); /*! ZSTD_CCtxParams_getParameter() : * Similar to ZSTD_CCtx_getParameter. * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter. * @result : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value); /*! ZSTD_CCtx_setParametersUsingCCtxParams() : * Apply a set of ZSTD_CCtx_params to the compression context. @@ -1975,7 +2018,7 @@ ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, * if nbWorkers>=1, new parameters will be picked up at next job, * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated). */ -ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( +ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params); /*! ZSTD_compressStream2_simpleArgs() : @@ -1984,7 +2027,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams( * This variant might be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs ( ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos, @@ -2000,33 +2043,33 @@ ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs ( * Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0. * Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled. * Note 3 : Skippable Frame Identifiers are considered valid. */ -ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size); +ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size); /*! ZSTD_createDDict_byReference() : * Create a digested dictionary, ready to start decompression operation without startup delay. * Dictionary content is referenced, and therefore stays in dictBuffer. * It is important that dictBuffer outlives DDict, * it must remain read accessible throughout the lifetime of DDict */ -ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); +ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_byReference() : * Same as ZSTD_DCtx_loadDictionary(), * but references `dict` content instead of copying it into `dctx`. * This saves memory if `dict` remains around., * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); /*! ZSTD_DCtx_loadDictionary_advanced() : * Same as ZSTD_DCtx_loadDictionary(), * but gives direct control over * how to load the dictionary (by copy ? by reference ?) * and how to interpret it (automatic ? force raw mode ? full mode only ?). */ -ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_refPrefix_advanced() : * Same as ZSTD_DCtx_refPrefix(), but gives finer control over * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */ -ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType); /*! ZSTD_DCtx_setMaxWindowSize() : * Refuses allocating internal buffers for frames requiring a window size larger than provided limit. @@ -2035,14 +2078,14 @@ ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* pre * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize); /*! ZSTD_DCtx_getParameter() : * Get the requested decompression parameter value, selected by enum ZSTD_dParameter, * and store it into int* value. * @return : 0, or an error code (which can be tested with ZSTD_isError()). */ -ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); +ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value); /* ZSTD_d_format * experimental parameter, @@ -2131,7 +2174,7 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); * This can be helpful for binders from dynamic languages * which have troubles handling structures containing memory pointers. */ -ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs ( +ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, size_t* dstPos, const void* src, size_t srcSize, size_t* srcPos); @@ -2205,7 +2248,7 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, * This function is DEPRECATED, and equivalent to: * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); * ZSTD_CCtx_refCDict(zcs, cdict); - * + * * note : cdict will just be referenced, and must outlive compression session * This prototype will generate compilation warnings. */ @@ -2270,7 +2313,7 @@ typedef struct { * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed. * Aggregates progression inside active worker threads. */ -ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx); /*! ZSTD_toFlushNow() : * Tell how many bytes are ready to be flushed immediately. @@ -2285,7 +2328,7 @@ ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx * therefore flush speed is limited by production speed of oldest job * irrespective of the speed of concurrent (and newer) jobs. */ -ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); /*===== Advanced Streaming decompression functions =====*/ @@ -2299,7 +2342,7 @@ ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx); * note: no dictionary will be used if dict == NULL or dictSize < 8 * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /*! * This function is deprecated, and is equivalent to: @@ -2310,7 +2353,7 @@ ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dic * note : ddict is referenced, it must outlive decompression session * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); +ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); /*! * This function is deprecated, and is equivalent to: @@ -2320,7 +2363,7 @@ ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDi * re-use decompression parameters from previous init; saves dictionary loading * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x */ -ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); +ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /********************************************************************* @@ -2362,13 +2405,13 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); */ /*===== Buffer-less streaming compression functions =====*/ -ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); -ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ -ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); +ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ +ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ ZSTD_DEPRECATED("use advanced API to access custom parameters") @@ -2465,24 +2508,24 @@ typedef struct { * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, * or an error code, which can be tested using ZSTD_isError() */ -ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ /*! ZSTD_getFrameHeader_advanced() : * same as ZSTD_getFrameHeader(), * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ -ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); -ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); +ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ -ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); -ZSTDLIB_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict); -ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); -ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ -ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; -ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); +ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); @@ -2519,10 +2562,10 @@ ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); */ /*===== Raw zstd block functions =====*/ -ZSTDLIB_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); -ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); -ZSTDLIB_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ +ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx); +ZSTDLIB_STATIC_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ |