From 30dcd41d91f7f8de944d90f139b14b509ae466cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Tue, 30 Jul 2024 21:24:59 +0200 Subject: [PATCH 01/59] Mainmenu: Restore ability to enable flags in settings (#14896) Fixes flags starting with "no" being hidden --- builtin/mainmenu/settings/components.lua | 63 +++++++++++++++--------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/builtin/mainmenu/settings/components.lua b/builtin/mainmenu/settings/components.lua index 51cc0c95b..bfe64285c 100644 --- a/builtin/mainmenu/settings/components.lua +++ b/builtin/mainmenu/settings/components.lua @@ -306,17 +306,36 @@ function make.flags(setting) "label[0,0.1;" .. get_label(setting) .. "]", } - local value = core.settings:get(setting.name) or setting.default self.resettable = core.settings:has(setting.name) checkboxes = {} - for _, name in ipairs(value:split(",")) do - name = name:trim() - if name:sub(1, 2) == "no" then - checkboxes[name:sub(3)] = false - elseif name ~= "" then - checkboxes[name] = true + for _, name in ipairs(setting.possible) do + checkboxes[name] = false + end + local function apply_flags(flag_string, what) + local prefixed_flags = {} + for _, name in ipairs(flag_string:split(",")) do + prefixed_flags[name:trim()] = true end + for _, name in ipairs(setting.possible) do + local enabled = prefixed_flags[name] + local disabled = prefixed_flags["no" .. name] + if enabled and disabled then + core.log("warning", "Flag " .. name .. " in " .. what .. " " .. + setting.name .. " both enabled and disabled, ignoring") + elseif enabled then + checkboxes[name] = true + elseif disabled then + checkboxes[name] = false + end + end + end + -- First apply the default, which is necessary since flags + -- which are not overridden may be missing from the value. + apply_flags(setting.default, "default for setting") + local value = core.settings:get(setting.name) + if value then + apply_flags(value, "setting") end local columns = math.max(math.floor(avail_w / 2.5), 1) @@ -325,18 +344,16 @@ function make.flags(setting) local y = 0.55 for _, possible in ipairs(setting.possible) do - if possible:sub(1, 2) ~= "no" then - if x >= avail_w then - x = 0 - y = y + 0.5 - end - - local is_checked = checkboxes[possible] - fs[#fs + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format( - x, y, setting.name .. "_" .. possible, - core.formspec_escape(possible), tostring(is_checked)) - x = x + column_width + if x >= avail_w then + x = 0 + y = y + 0.5 end + + local is_checked = checkboxes[possible] + fs[#fs + 1] = ("checkbox[%f,%f;%s;%s;%s]"):format( + x, y, setting.name .. "_" .. possible, + core.formspec_escape(possible), tostring(is_checked)) + x = x + column_width end return table.concat(fs, ""), y + 0.25 @@ -355,12 +372,10 @@ function make.flags(setting) if changed then local values = {} for _, name in ipairs(setting.possible) do - if name:sub(1, 2) ~= "no" then - if checkboxes[name] then - table.insert(values, name) - else - table.insert(values, "no" .. name) - end + if checkboxes[name] then + table.insert(values, name) + else + table.insert(values, "no" .. name) end end From 2ba1d60ba5a81a97eadc2ff27c26aec13037f3e6 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 30 Jul 2024 21:25:23 +0200 Subject: [PATCH 02/59] Hide enable_touch setting on Android (#14891) until #14749 is merged --- builtin/settingtypes.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index a2fa98398..87c7444da 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -153,6 +153,8 @@ invert_hotbar_mouse_wheel (Hotbar: Invert mouse wheel direction) bool false [*Touchscreen] # Enables touchscreen mode, allowing you to play the game with a touchscreen. +# +# Requires: !android enable_touch (Enable touchscreen) bool true # Touchscreen sensitivity multiplier. From 26deb26f173ca2e7011ff5af294d2f677518b9eb Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 30 Jul 2024 21:25:50 +0200 Subject: [PATCH 03/59] Sounds: Partial revert of #14436 and #14341 (#14889) This reverts functional changes of: * commit bf52d1e6 (#14436) * commit 63a98538 (#14341) --- doc/lua_api.md | 16 ---------- src/network/clientpackethandler.cpp | 2 ++ src/server.cpp | 46 +++-------------------------- src/server.h | 3 -- 4 files changed, 6 insertions(+), 61 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index c1322ed5f..e0413bb76 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -1103,7 +1103,6 @@ Table used to specify how a sound is played: -- its end in `-start_time` seconds. -- It is unspecified what happens if `loop` is false and `start_time` is -- smaller than minus the sound's length. - -- Available since feature `sound_params_start_time`. loop = false, @@ -1117,21 +1116,6 @@ Table used to specify how a sound is played: -- Attach the sound to an object. -- Can't be used together with `pos`. - -- For backward compatibility, sounds continue playing at the last location - -- of the object if an object is removed (for example if an entity dies). - -- It is not recommended to rely on this. - -- For death sounds, prefer playing a positional sound instead. - - -- If you want to stop a sound when an entity dies or is deactivated, - -- store the handle and call `minetest.sound_stop` in `on_die` / `on_deactivate`. - - -- Ephemeral sounds are entirely unaffected by the object being removed - -- or leaving the active object range. - - -- Non-ephemeral sounds stop playing on clients if objects leave - -- the active object range; they should start playing again if objects - --- come back into range (but due to a known bug, they don't yet). - to_player = name, -- Only play for this player. -- Can't be used together with `exclude_player`. diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 90f2bed5b..e2bcb51b5 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -471,6 +471,8 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) for (u16 i = 0; i < removed_count; i++) { *pkt >> id; m_env.removeActiveObject(id); + // Object-attached sounds MUST NOT be removed here because they might + // have started to play immediately before the entity was removed. } // Read added objects diff --git a/src/server.cpp b/src/server.cpp index 937cbe90a..6e42b22a0 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2054,19 +2054,10 @@ void Server::SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersa // Removed objects pkt << static_cast(removed_objects.size()); - std::vector sounds_to_stop; - for (auto &it : removed_objects) { const auto [gone, id] = it; ServerActiveObject *obj = m_env->getActiveObject(id); - // Stop sounds if objects go out of range. - // This fixes https://github.com/minetest/minetest/issues/8094. - // We may not remove sounds if an entity was removed on the server. - // See https://github.com/minetest/minetest/issues/14422. - if (!gone) // just out of range for client, not gone on server? - sounds_to_stop.push_back(id); - pkt << id; // Remove from known objects @@ -2075,8 +2066,10 @@ void Server::SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersa obj->m_known_by_count--; } - if (!sounds_to_stop.empty()) - stopAttachedSounds(client->peer_id, sounds_to_stop); + // Note: Do yet NOT stop or remove object-attached sounds where the object goes out + // of range (client side). Such sounds would need to be re-sent when coming into range. + // Currently, the client will initiate m_playing_sounds clean ups indirectly by + // "Server::handleCommand_RemovedSounds". // Added objects pkt << static_cast(added_objects.size()); @@ -2260,37 +2253,6 @@ void Server::fadeSound(s32 handle, float step, float gain) m_playing_sounds.erase(it); } -void Server::stopAttachedSounds(session_t peer_id, - const std::vector &object_ids) -{ - assert(peer_id != PEER_ID_INEXISTENT); - assert(!object_ids.empty()); - - auto cb = [&] (const s32 id, ServerPlayingSound &sound) -> bool { - if (!CONTAINS(object_ids, sound.object)) - return false; - - auto clients_it = sound.clients.find(peer_id); - if (clients_it == sound.clients.end()) - return false; - - NetworkPacket pkt(TOCLIENT_STOP_SOUND, 4); - pkt << id; - Send(peer_id, &pkt); - - sound.clients.erase(clients_it); - // delete if client list empty - return sound.clients.empty(); - }; - - for (auto it = m_playing_sounds.begin(); it != m_playing_sounds.end(); ) { - if (cb(it->first, it->second)) - it = m_playing_sounds.erase(it); - else - ++it; - } -} - void Server::sendRemoveNode(v3s16 p, std::unordered_set *far_players, float far_d_nodes) { diff --git a/src/server.h b/src/server.h index 16c1ea4cc..6d439cc67 100644 --- a/src/server.h +++ b/src/server.h @@ -239,9 +239,6 @@ public: s32 playSound(ServerPlayingSound ¶ms, bool ephemeral=false); void stopSound(s32 handle); void fadeSound(s32 handle, float step, float gain); - // Stop all sounds attached to given objects, for a certain client - void stopAttachedSounds(session_t peer_id, - const std::vector &object_ids); // Envlock std::set getPlayerEffectivePrivs(const std::string &name); From d566b0e2809093819daf50bbd421b6c98f085c5b Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Thu, 1 Aug 2024 23:13:13 +0100 Subject: [PATCH 04/59] Android SDK 34 (#14892) --- .github/workflows/android.yml | 7 ++++++- android/app/build.gradle | 10 +++++++--- android/app/src/main/AndroidManifest.xml | 3 +-- .../main/java/net/minetest/minetest/MainActivity.java | 8 +++++++- .../main/java/net/minetest/minetest/UnzipService.java | 1 + android/build.gradle | 2 +- android/gradle.properties | 2 ++ android/gradle/wrapper/gradle-wrapper.properties | 2 +- android/native/build.gradle | 6 +++--- android/native/src/main/AndroidManifest.xml | 2 +- 10 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 0896d9abc..34db1a662 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -35,7 +35,12 @@ jobs: - name: Install deps run: | sudo apt-get update - sudo apt-get install -y --no-install-recommends gettext openjdk-17-jdk-headless + sudo apt-get install -y --no-install-recommends gettext + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' - name: Build AAB with Gradle # We build an AAB as well for uploading to the the Play Store. run: cd android; ./gradlew bundlerelease diff --git a/android/app/build.gradle b/android/app/build.gradle index 30ee19c95..fe6c4ab0d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,17 +1,20 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 33 - buildToolsVersion '33.0.2' ndkVersion "$ndk_version" defaultConfig { applicationId 'net.minetest.minetest' minSdkVersion 21 - targetSdkVersion 33 + compileSdk 34 + targetSdkVersion 34 versionName "${versionMajor}.${versionMinor}.${versionPatch}" versionCode project.versionCode } + buildFeatures { + buildConfig true + } + // load properties Properties props = new Properties() def propfile = file('../local.properties') @@ -49,6 +52,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + namespace 'net.minetest.minetest' } task prepareAssets() { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b629610d8..9197b9131 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,7 @@ + android:installLocation="auto"> diff --git a/android/app/src/main/java/net/minetest/minetest/MainActivity.java b/android/app/src/main/java/net/minetest/minetest/MainActivity.java index 9eaa7316d..7735e8b3d 100644 --- a/android/app/src/main/java/net/minetest/minetest/MainActivity.java +++ b/android/app/src/main/java/net/minetest/minetest/MainActivity.java @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., package net.minetest.minetest; +import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -83,13 +84,18 @@ public class MainActivity extends AppCompatActivity { } }; + @SuppressLint("UnspecifiedRegisterReceiverFlag") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter filter = new IntentFilter(ACTION_UPDATE); - registerReceiver(myReceiver, filter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(myReceiver, filter, RECEIVER_NOT_EXPORTED); + } else { + registerReceiver(myReceiver, filter); + } mProgressBar = findViewById(R.id.progressBar); mTextView = findViewById(R.id.textView); diff --git a/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/android/app/src/main/java/net/minetest/minetest/UnzipService.java index 5dccc4563..261eebb8e 100644 --- a/android/app/src/main/java/net/minetest/minetest/UnzipService.java +++ b/android/app/src/main/java/net/minetest/minetest/UnzipService.java @@ -186,6 +186,7 @@ public class UnzipService extends IntentService { private void publishProgress(@Nullable Notification.Builder notificationBuilder, @StringRes int message, int progress) { Intent intentUpdate = new Intent(ACTION_UPDATE); + intentUpdate.setPackage(getPackageName()); intentUpdate.putExtra(ACTION_PROGRESS, progress); intentUpdate.putExtra(ACTION_PROGRESS_MESSAGE, message); if (!isSuccess) diff --git a/android/build.gradle b/android/build.gradle index 1805ba856..34f78732a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -16,7 +16,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.4.1' + classpath 'com.android.tools.build:gradle:8.5.1' classpath 'de.undercouch:gradle-download-task:4.1.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/gradle.properties b/android/gradle.properties index 333d3ad95..238ccd7a7 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -9,3 +9,5 @@ org.gradle.parallel.threads=8 org.gradle.configureondemand=true android.enableJetifier=false android.useAndroidX=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1af9e0930..b82aa23a4 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/native/build.gradle b/android/native/build.gradle index 96a7739c0..0be7c1d99 100644 --- a/android/native/build.gradle +++ b/android/native/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.library' apply plugin: 'de.undercouch.download' android { - compileSdkVersion 33 - buildToolsVersion '33.0.2' ndkVersion "$ndk_version" defaultConfig { minSdkVersion 21 - targetSdkVersion 33 + compileSdk 34 + targetSdkVersion 34 externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared", @@ -40,6 +39,7 @@ android { } } } + namespace 'net.minetest' } // get precompiled deps diff --git a/android/native/src/main/AndroidManifest.xml b/android/native/src/main/AndroidManifest.xml index 19451c7fd..cc947c567 100644 --- a/android/native/src/main/AndroidManifest.xml +++ b/android/native/src/main/AndroidManifest.xml @@ -1 +1 @@ - + From 8bff2f23c6d0276764305f165f1882c30c85f5b5 Mon Sep 17 00:00:00 2001 From: y5nw <37980625+y5nw@users.noreply.github.com> Date: Fri, 2 Aug 2024 00:13:25 +0200 Subject: [PATCH 05/59] Rename `minetest.register_async_metatable` to `minetest.register_portable_metatable` (#14895) --- builtin/common/metatable.lua | 10 ++++++++-- doc/lua_api.md | 4 ++-- games/devtest/mods/unittests/async_env.lua | 14 +++++++------- games/devtest/mods/unittests/inside_async_env.lua | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/builtin/common/metatable.lua b/builtin/common/metatable.lua index b402dd63a..40003d293 100644 --- a/builtin/common/metatable.lua +++ b/builtin/common/metatable.lua @@ -1,6 +1,6 @@ -- Registered metatables, used by the C++ packer local known_metatables = {} -function core.register_async_metatable(name, mt) +function core.register_portable_metatable(name, mt) assert(type(name) == "string", ("attempt to use %s value as metatable name"):format(type(name))) assert(type(mt) == "table", ("attempt to register a %s value as metatable"):format(type(mt))) assert(known_metatables[name] == nil or known_metatables[name] == mt, @@ -10,4 +10,10 @@ function core.register_async_metatable(name, mt) end core.known_metatables = known_metatables -core.register_async_metatable("__builtin:vector", vector.metatable) +function core.register_async_metatable(...) + core.log("deprecated", "minetest.register_async_metatable is deprecated. " .. + "Use minetest.register_portable_metatable instead.") + return core.register_portable_metatable(...) +end + +core.register_portable_metatable("__builtin:vector", vector.metatable) diff --git a/doc/lua_api.md b/doc/lua_api.md index e0413bb76..0fa1d8999 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -6715,7 +6715,7 @@ This allows you easy interoperability for delegating work to jobs. * Register a path to a Lua file to be imported when an async environment is initialized. You can use this to preload code which you can then call later using `minetest.handle_async()`. -* `minetest.register_async_metatable(name, mt)`: +* `minetest.register_portable_metatable(name, mt)`: * Register a metatable that should be preserved when data is transferred between the main thread and the async environment. * `name` is a string that identifies the metatable. It is recommended to @@ -6755,7 +6755,7 @@ Functions: * Standalone helpers such as logging, filesystem, encoding, hashing or compression APIs -* `minetest.register_async_metatable` (see above) +* `minetest.register_portable_metatable` (see above) Variables: diff --git a/games/devtest/mods/unittests/async_env.lua b/games/devtest/mods/unittests/async_env.lua index d7a714941..b00deb3b6 100644 --- a/games/devtest/mods/unittests/async_env.lua +++ b/games/devtest/mods/unittests/async_env.lua @@ -167,18 +167,18 @@ local function test_userdata_passing2(cb, _, pos) end unittests.register("test_userdata_passing2", test_userdata_passing2, {map=true, async=true}) -local function test_async_metatable_override() - assert(pcall(core.register_async_metatable, "__builtin:vector", vector.metatable), +local function test_portable_metatable_override() + assert(pcall(core.register_portable_metatable, "__builtin:vector", vector.metatable), "Metatable name aliasing throws an error when it should be allowed") - assert(not pcall(core.register_async_metatable, "__builtin:vector", {}), + assert(not pcall(core.register_portable_metatable, "__builtin:vector", {}), "Illegal metatable overriding allowed") end -unittests.register("test_async_metatable_override", test_async_metatable_override) +unittests.register("test_portable_metatable_override", test_portable_metatable_override) -local function test_async_metatable_registration(cb) +local function test_portable_metatable_registration(cb) local custom_metatable = {} - core.register_async_metatable("unittests:custom_metatable", custom_metatable) + core.register_portable_metatable("unittests:custom_metatable", custom_metatable) core.handle_async(function(x) -- unittests.custom_metatable is registered in inside_async_env.lua @@ -193,7 +193,7 @@ local function test_async_metatable_registration(cb) cb() end, setmetatable({}, custom_metatable)) end -unittests.register("test_async_metatable_registration", test_async_metatable_registration, {async=true}) +unittests.register("test_portable_metatable_registration", test_portable_metatable_registration, {async=true}) local function test_vector_preserve(cb) local vec = vector.new(1, 2, 3) diff --git a/games/devtest/mods/unittests/inside_async_env.lua b/games/devtest/mods/unittests/inside_async_env.lua index 5f97ec15d..fb610604d 100644 --- a/games/devtest/mods/unittests/inside_async_env.lua +++ b/games/devtest/mods/unittests/inside_async_env.lua @@ -3,7 +3,7 @@ unittests = {} core.log("info", "Hello World") unittests.custom_metatable = {} -core.register_async_metatable("unittests:custom_metatable", unittests.custom_metatable) +core.register_portable_metatable("unittests:custom_metatable", unittests.custom_metatable) local function do_tests() assert(core == minetest) From c489cef875d1f7f42c6c75036825ba4be71b682d Mon Sep 17 00:00:00 2001 From: cx384 Date: Fri, 2 Aug 2024 20:05:50 +0200 Subject: [PATCH 06/59] Add version to `override_item_remove_fields` feature flag doc (#14917) --- doc/lua_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index 0fa1d8999..9c769e890 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -5442,7 +5442,7 @@ Utilities node_interaction_actor = true, -- "new_pos" field in entity moveresult (5.9.0) moveresult_new_pos = true, - -- Allow removing definition fields in `minetest.override_item` + -- Allow removing definition fields in `minetest.override_item` (5.9.0) override_item_remove_fields = true, } ``` From 95a0cc8f9a69aee5f281606cc63b034fa7c02e54 Mon Sep 17 00:00:00 2001 From: grorp Date: Sat, 3 Aug 2024 18:48:25 +0200 Subject: [PATCH 07/59] Avoid infinite recursion with unhandled second touch (#14915) --- src/gui/modalMenu.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/gui/modalMenu.cpp b/src/gui/modalMenu.cpp index bd8358b62..83d5036f9 100644 --- a/src/gui/modalMenu.cpp +++ b/src/gui/modalMenu.cpp @@ -319,6 +319,11 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event) } #endif + // If the second touch arrives here again, that means nobody handled it. + // Abort to avoid infinite recursion. + if (m_second_touch) + return true; + // Convert touch events into mouse events. if (event.EventType == EET_TOUCH_INPUT_EVENT) { irr_ptr holder; From 10fd41b4a81131d82d55e3add42aec574808e046 Mon Sep 17 00:00:00 2001 From: Francesco Gazzetta Date: Sun, 4 Aug 2024 16:40:21 +0000 Subject: [PATCH 08/59] Take screenshot from back buffer when using double buffering (#14904) Fixes #14901 (black screenshots on Wayland) --- irr/src/COpenGLDriver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/irr/src/COpenGLDriver.cpp b/irr/src/COpenGLDriver.cpp index 0d3f18e2b..1ad66aef9 100644 --- a/irr/src/COpenGLDriver.cpp +++ b/irr/src/COpenGLDriver.cpp @@ -3018,7 +3018,7 @@ IImage *COpenGLDriver::createScreenShot(video::ECOLOR_FORMAT format, video::E_RE if (newImage) pixels = static_cast(newImage->getData()); if (pixels) { - glReadBuffer(GL_FRONT); + glReadBuffer(Params.Doublebuffer ? GL_BACK : GL_FRONT); glReadPixels(0, 0, ScreenSize.Width, ScreenSize.Height, fmt, type, pixels); testGLError(__LINE__); glReadBuffer(GL_BACK); From 8ef2c42150123c4a626925f554dd74700c8b6dfe Mon Sep 17 00:00:00 2001 From: Luke aka SwissalpS <161979+SwissalpS@users.noreply.github.com> Date: Sun, 4 Aug 2024 23:51:45 +0200 Subject: [PATCH 09/59] Fix some typos in docs (#14921) --------- Co-authored-by: Lars Mueller --- doc/client_lua_api.md | 2 +- doc/lua_api.md | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md index a7b26c7c3..cbf243616 100644 --- a/doc/client_lua_api.md +++ b/doc/client_lua_api.md @@ -898,7 +898,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or "node1", "node2" }, - post_effect_color = Color, -- Color overlayed on the screen when the player is in the node + post_effect_color = Color, -- Color overlaid on the screen when the player is in the node leveled = number, -- Max level for node sunlight_propogates = bool, -- Whether light passes through the block light_source = number, -- Light emitted by the block diff --git a/doc/lua_api.md b/doc/lua_api.md index 9c769e890..271022bd8 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -1488,7 +1488,7 @@ Look for examples in `games/devtest` or `games/minetest_game`. * For supported model formats see Irrlicht engine documentation. * `plantlike_rooted` * Enables underwater `plantlike` without air bubbles around the nodes. - * Consists of a base cube at the co-ordinates of the node plus a + * Consists of a base cube at the coordinates of the node plus a `plantlike` extension above * If `paramtype2="leveled", the `plantlike` extension has a height of `param2 / 16` nodes, otherwise it's the height of 1 node @@ -3062,7 +3062,7 @@ Elements ### `textlist[,;,;;,,...,]` * Scrollable item list showing arbitrary text elements -* `name` fieldname sent to server on doubleclick value is current selected +* `name` fieldname sent to server on double-click value is current selected element. * `listelements` can be prepended by #color in hexadecimal format RRGGBB (only). @@ -3071,7 +3071,7 @@ Elements ### `textlist[,;,;;,,...,;;]` * Scrollable itemlist showing arbitrary text elements -* `name` fieldname sent to server on doubleclick value is current selected +* `name` fieldname sent to server on double-click value is current selected element. * `listelements` can be prepended by #RRGGBB (only) in hexadecimal format * if you want a listelement to start with "#" write "##" @@ -3208,7 +3208,7 @@ Elements * Show scrollable table using options defined by the previous `tableoptions[]` * Displays cells as defined by the previous `tablecolumns[]` -* `name`: fieldname sent to server on row select or doubleclick +* `name`: fieldname sent to server on row select or double-click * `cell 1`...`cell n`: cell contents given in row-major order * `selected idx`: index of row to be selected within table (first row = `1`) * See also `minetest.explode_table_event` @@ -4239,7 +4239,7 @@ Perlin noise ============ Perlin noise creates a continuously-varying value depending on the input values. -Usually in Minetest the input values are either 2D or 3D co-ordinates in nodes. +Usually in Minetest the input values are either 2D or 3D coordinates in nodes. The result is used during map generation to create the terrain shape, vary heat and humidity to distribute biomes, vary the density of decorations or vary the structure of ores. @@ -4502,7 +4502,7 @@ computationally expensive than any other ore. Creates a single undulating ore stratum that is continuous across mapchunk borders and horizontally spans the world. -The 2D perlin noise described by `noise_params` defines the Y co-ordinate of +The 2D perlin noise described by `noise_params` defines the Y coordinate of the stratum midpoint. The 2D perlin noise described by `np_stratum_thickness` defines the stratum's vertical thickness (in units of nodes). Due to being continuous across mapchunk borders the stratum's vertical thickness is @@ -5435,7 +5435,7 @@ Utilities dynamic_add_media_filepath = true, -- L-system decoration type (5.9.0) lsystem_decoration_type = true, - -- Overrideable pointing range using the itemstack meta key `"range"` (5.9.0) + -- Overridable pointing range using the itemstack meta key `"range"` (5.9.0) item_meta_range = true, -- Allow passing an optional "actor" ObjectRef to the following functions: -- minetest.place_node, minetest.dig_node, minetest.punch_node (5.9.0) @@ -5737,7 +5737,7 @@ Call these functions only at load time! * `minetest.register_on_generated(function(minp, maxp, blockseed))` * Called after generating a piece of world between `minp` and `maxp`. * **Avoid using this** whenever possible. As with other callbacks this blocks - the main thread and introduces noticable latency. + the main thread and introduces noticeable latency. Consider [Mapgen environment] for an alternative. * `minetest.register_on_newplayer(function(ObjectRef))` * Called when a new player enters the world for the first time @@ -6401,11 +6401,11 @@ Environment access * spread these updates to neighbors and can cause a cascade of nodes to fall. * `minetest.get_spawn_level(x, z)` - * Returns a player spawn y co-ordinate for the provided (x, z) - co-ordinates, or `nil` for an unsuitable spawn point. + * Returns a player spawn y coordinate for the provided (x, z) + coordinates, or `nil` for an unsuitable spawn point. * For most mapgens a 'suitable spawn point' is one with y between `water_level` and `water_level + 16`, and in mgv7 well away from rivers, - so `nil` will be returned for many (x, z) co-ordinates. + so `nil` will be returned for many (x, z) coordinates. * The spawn level returned is for a player spawn in unmodified terrain. * The spawn level is intentionally above terrain level to cope with full-node biome 'dust' nodes. @@ -6885,7 +6885,7 @@ Server all players (optional) * `ephemeral`: boolean that marks the media as ephemeral, it will not be cached on the client (optional, default false) - * Exactly one of the paramters marked [*] must be specified. + * Exactly one of the parameters marked [*] must be specified. * `callback`: function with arguments `name`, which is a player name * Pushes the specified media file to client(s). (details below) The file must be a supported image, sound or model format. @@ -7716,7 +7716,7 @@ metadata_table = { -- metadata fields (key/value store) fields = { infotext = "Container", - anoter_key = "Another Value", + another_key = "Another Value", }, -- inventory data (for nodes) @@ -8016,7 +8016,7 @@ child will follow movement and rotation of that bone. * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading) and Z is roll (bank). * Does not reset rotation incurred through `automatic_rotate`. - Remove & readd your objects to force a certain rotation. + Remove & re-add your objects to force a certain rotation. * `get_rotation()`: returns the rotation, a vector (radians) * `set_yaw(yaw)`: sets the yaw in radians (heading). * `get_yaw()`: returns number in radians @@ -10345,7 +10345,7 @@ See [Decoration types]. Used by `minetest.register_decoration`. y_min = -31000, y_max = 31000, -- Lower and upper limits for decoration (inclusive). - -- These parameters refer to the Y co-ordinate of the 'place_on' node. + -- These parameters refer to the Y coordinate of the 'place_on' node. spawn_by = "default:water", -- Node (or list of nodes) that the decoration only spawns next to. From f5a53647f91318ea3b2742b36f6aa5001b1b5fdb Mon Sep 17 00:00:00 2001 From: sfan5 Date: Fri, 9 Aug 2024 11:18:56 +0200 Subject: [PATCH 10/59] Revert macOS workflow to run on x86 (#14937) --- .github/workflows/macos.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index ad9982f66..34556ce8c 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -10,6 +10,7 @@ on: - 'src/**.cpp' - 'irr/**.[ch]' - 'irr/**.cpp' + - 'irr/**.mm' # Objective-C(++) - '**/CMakeLists.txt' - 'cmake/Modules/**' - '.github/workflows/macos.yml' @@ -28,7 +29,8 @@ on: jobs: build: - runs-on: macos-latest + # use macOS 13 since it's the last one that still runs on x86 + runs-on: macos-13 steps: - uses: actions/checkout@v4 - name: Install deps @@ -58,6 +60,7 @@ jobs: - name: CPack run: | cd build + rm -rf macos cmake .. -DINSTALL_DEVTEST=FALSE cpack -G ZIP -B macos From 62a8c5ca3245a08a4d7156f847df2b9a6d863121 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 5 Aug 2024 21:01:45 +0200 Subject: [PATCH 11/59] Update credits for 5.9.0 --- builtin/mainmenu/tab_about.lua | 32 +++++++++++++++++++------------- util/gather_git_credits.py | 5 +++-- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/builtin/mainmenu/tab_about.lua b/builtin/mainmenu/tab_about.lua index 1805acc81..d798b5b09 100644 --- a/builtin/mainmenu/tab_about.lua +++ b/builtin/mainmenu/tab_about.lua @@ -30,6 +30,7 @@ local core_developers = { "Desour/DS", "srifqi", "Gregor Parzefall (grorp)", + "Lars Müller (luatic)", } -- currently only https://github.com/orgs/minetest/teams/triagers/members @@ -43,19 +44,24 @@ local core_team = { -- For updating active/previous contributors, see the script in ./util/gather_git_credits.py local active_contributors = { - "Wuzzy [Features, translations, documentation]", - "numzero [Optimizations, work on OpenGL driver]", - "ROllerozxa [Bugfixes, Mainmenu]", - "Lars Müller [Bugfixes]", - "AFCMS [Documentation]", - "savilli [Bugfixes]", - "fluxionary [Bugfixes]", - "Bradley Pierce (Thresher) [Documentation]", - "Stvk imension [Android]", - "JosiahWI [Code cleanups]", - "OgelGames [UI, Bugfixes]", - "ndren [Bugfixes]", - "Abdou-31 [Documentation]", + "cx384", + "numzero", + "AFCMS", + "sfence", + "Wuzzy", + "ROllerozxa", + "JosiahWI", + "OgelGames", + "David Heidelberg", + "1F616EMO", + "HybridDog", + "Bradley Pierce (Thresher)", + "savilli", + "Stvk imension", + "y5nw", + "chmodsayshello", + "jordan4ibanez", + "superfloh247", } local previous_core_developers = { diff --git a/util/gather_git_credits.py b/util/gather_git_credits.py index 7bbcf402d..cb0f42dde 100755 --- a/util/gather_git_credits.py +++ b/util/gather_git_credits.py @@ -6,7 +6,7 @@ from collections import defaultdict codefiles = r"(\.[ch](pp)?|\.lua|\.md|\.cmake|\.java|\.gradle|Makefile|CMakeLists\.txt)$" # two minor versions back, for "Active Contributors" -REVS_ACTIVE = "5.6.0..HEAD" +REVS_ACTIVE = "5.7.0..HEAD" # all time, for "Previous Contributors" REVS_PREVIOUS = "HEAD" @@ -46,7 +46,8 @@ def load(revs): p.wait() # Some authors duplicate? Don't add manual workarounds here, edit the .mailmap! - for author in ("updatepo.sh ", "Weblate <42@minetest.ru>"): + for author in ("updatepo.sh ", "Weblate <42@minetest.ru>", + "import ", "minetest "): points.pop(author, None) return points From ebaf3c8d77e5240b505b7e7b0c05a769e44d8e0e Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 11 Aug 2024 13:27:41 +0100 Subject: [PATCH 12/59] Disable SDL2 for 5.9.0 (#14944) See #14545 and https://forum.minetest.net/viewtopic.php?t=30864 --- .github/workflows/windows.yml | 2 +- android/native/build.gradle | 2 +- doc/compiling/linux.md | 12 ++++++------ doc/compiling/windows.md | 3 ++- irr/README.md | 2 +- irr/src/CMakeLists.txt | 2 +- util/buildbot/buildwin32.sh | 1 - util/buildbot/buildwin64.sh | 1 - util/buildbot/common.sh | 4 ---- util/buildbot/sha256sums.txt | 2 -- util/ci/common.sh | 2 +- 11 files changed, 13 insertions(+), 20 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 367933148..4b937e80e 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -71,7 +71,7 @@ jobs: env: VCPKG_VERSION: 01f602195983451bc83e72f4214af2cbc495aa94 # 2024.05.24 - vcpkg_packages: zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp sdl2 + vcpkg_packages: zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp opengl-registry strategy: fail-fast: false matrix: diff --git a/android/native/build.gradle b/android/native/build.gradle index 0be7c1d99..806dda2f0 100644 --- a/android/native/build.gradle +++ b/android/native/build.gradle @@ -8,7 +8,7 @@ android { compileSdk 34 targetSdkVersion 34 externalNativeBuild { - cmake { + cmake { arguments "-DANDROID_STL=c++_shared", "-DENABLE_CURL=1", "-DENABLE_SOUND=1", "-DENABLE_GETTEXT=1", diff --git a/doc/compiling/linux.md b/doc/compiling/linux.md index 573c6908e..3b31250e8 100644 --- a/doc/compiling/linux.md +++ b/doc/compiling/linux.md @@ -21,27 +21,27 @@ For Debian/Ubuntu users: - sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev gettext libsdl2-dev + sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libxi-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev gettext For Fedora users: - sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libpng-devel libjpeg-devel libvorbis-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel gettext SDL2-devel + sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libpng-devel libjpeg-devel libvorbis-devel libXi-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel gettext For openSUSE users: - sudo zypper install gcc gcc-c++ cmake libjpeg8-devel libpng16-devel openal-soft-devel libcurl-devel sqlite3-devel luajit-devel libzstd-devel Mesa-libGL-devel libvorbis-devel freetype2-devel SDL2-devel + sudo zypper install gcc gcc-c++ cmake libjpeg8-devel libpng16-devel openal-soft-devel libcurl-devel sqlite3-devel luajit-devel libzstd-devel Mesa-libGL-devel libXi-devel libvorbis-devel freetype2-devel For Arch users: - sudo pacman -S --needed base-devel libcurl-gnutls cmake libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd gettext sdl2 + sudo pacman -S --needed base-devel libcurl-gnutls cmake libxi libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd gettext For Alpine users: - sudo apk add build-base cmake libpng-dev jpeg-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev zstd-dev gettext sdl2-dev + sudo apk add build-base cmake libpng-dev jpeg-dev libxi-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev zstd-dev gettext For Void users: - sudo xbps-install cmake libpng-devel jpeg-devel mesa sqlite-devel libogg-devel libvorbis-devel libopenal-devel libcurl-devel freetype-devel zlib-devel gmp-devel jsoncpp-devel LuaJIT-devel zstd libzstd-devel gettext SDL2-devel + sudo xbps-install cmake libpng-devel jpeg-devel libXi-devel mesa sqlite-devel libogg-devel libvorbis-devel libopenal-devel libcurl-devel freetype-devel zlib-devel gmp-devel jsoncpp-devel LuaJIT-devel zstd libzstd-devel gettext ## Download diff --git a/doc/compiling/windows.md b/doc/compiling/windows.md index c63a7b319..7c20cd81c 100644 --- a/doc/compiling/windows.md +++ b/doc/compiling/windows.md @@ -13,8 +13,9 @@ It is highly recommended to use vcpkg as package manager. After you successfully built vcpkg you can easily install the required libraries: + ```powershell -vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp gettext sdl2 --triplet x64-windows +vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp gettext opengl-registry --triplet x64-windows ``` - `curl` is optional, but required to read the serverlist, `curl[winssl]` is required to use the content store. diff --git a/irr/README.md b/irr/README.md index 96d3b0d97..f07bb6d63 100644 --- a/irr/README.md +++ b/irr/README.md @@ -22,7 +22,7 @@ Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the * `ENABLE_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver * `ENABLE_GLES1` - Enable OpenGL ES driver, legacy * `ENABLE_GLES2` - Enable OpenGL ES 2+ driver -* `USE_SDL2` (default: platform-dependent, usually `ON`) - Use SDL2 instead of older native device code +* `USE_SDL2` (default: ON for Android, OFF for other platforms) - Use SDL2 instead of older native device code However, IrrlichtMt cannot be built or installed separately. diff --git a/irr/src/CMakeLists.txt b/irr/src/CMakeLists.txt index d5e9d47e7..15a752c38 100644 --- a/irr/src/CMakeLists.txt +++ b/irr/src/CMakeLists.txt @@ -1,6 +1,6 @@ # When enabling SDL2 by default on macOS, don't forget to change # "NSHighResolutionCapable" to true in "Info.plist". -if(NOT APPLE) +if(ANDROID) set(DEFAULT_SDL2 ON) endif() diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh index 34767f707..b070a4343 100755 --- a/util/buildbot/buildwin32.sh +++ b/util/buildbot/buildwin32.sh @@ -42,7 +42,6 @@ download "$libhost/llvm/libleveldb-$leveldb_version-win32.zip" download "$libhost/llvm/openal-soft-$openal_version-win32.zip" download "$libhost/llvm/libjpeg-$libjpeg_version-win32.zip" download "$libhost/llvm/libpng-$libpng_version-win32.zip" -download "$libhost/llvm/sdl2-$sdl2_version-win32.zip" # Set source dir, downloading Minetest as needed get_sources diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh index c63a18901..541045a02 100755 --- a/util/buildbot/buildwin64.sh +++ b/util/buildbot/buildwin64.sh @@ -42,7 +42,6 @@ download "$libhost/llvm/libleveldb-$leveldb_version-win64.zip" download "$libhost/llvm/openal-soft-$openal_version-win64.zip" download "$libhost/llvm/libjpeg-$libjpeg_version-win64.zip" download "$libhost/llvm/libpng-$libpng_version-win64.zip" -download "$libhost/llvm/sdl2-$sdl2_version-win64.zip" # Set source dir, downloading Minetest as needed get_sources diff --git a/util/buildbot/common.sh b/util/buildbot/common.sh index a7fa3b5d3..5359d3517 100644 --- a/util/buildbot/common.sh +++ b/util/buildbot/common.sh @@ -15,7 +15,6 @@ zlib_version=1.3.1 zstd_version=1.5.5 libjpeg_version=3.0.1 libpng_version=1.6.40 -sdl2_version=2.30.3 download () { local url=$1 @@ -88,9 +87,6 @@ add_cmake_libs () { -DJPEG_INCLUDE_DIR=$libdir/libjpeg/include -DJPEG_DLL="$(_dlls $libdir/libjpeg/bin/libjpeg*)" - -DCMAKE_PREFIX_PATH=$libdir/sdl2/lib/cmake - -DSDL2_DLL="$(_dlls $libdir/sdl2/bin/*)" - -DZLIB_INCLUDE_DIR=$libdir/zlib/include -DZLIB_LIBRARY=$libdir/zlib/lib/libz.dll.a -DZLIB_DLL=$libdir/zlib/bin/zlib1.dll diff --git a/util/buildbot/sha256sums.txt b/util/buildbot/sha256sums.txt index 0587e6ea1..4c6c13fcc 100644 --- a/util/buildbot/sha256sums.txt +++ b/util/buildbot/sha256sums.txt @@ -19,8 +19,6 @@ da6ad10632cf172992158e9ea0977a87914b5d5de93a972c3430b6a412237556 luajit-2024012 2b1dabe83d478b398cf9226d96de7fa62c973365c4aea70d27ba5782fb49d2d0 luajit-20240125-win64.zip e2443451fe5c2066eb564c64b8a1762738a88b7fd749c8b5907fed45c785497b openal-soft-1.23.1-win32.zip cb041445a118469caefbad2647470cb8571c8337bce2adc07634011ab5625417 openal-soft-1.23.1-win64.zip -574e0847e622ff09ab23e2b22b77685a2ab6ee43de3e2932f3e8a14a4d7b9338 sdl2-2.30.3-win32.zip -6127afdfc7b6a4ade8caf9a7267748ffea974f729866dd5be96c7a69d2f0fee7 sdl2-2.30.3-win64.zip 326701086a0ed66e09a9f3ec4d971654c13b6bd79cfdd079c947ecdcd6409525 sqlite3-3.44.2-win32.zip b2d474e3625f8f426b6cc5c0ecac831a1de46f7d1027bf4a9f6267b0b0411d42 sqlite3-3.44.2-win64.zip 8af10515d57dbfee5d2106cd66cafa2adeb4270d4c6047ccbf7e8b5d2d50681c zlib-1.3.1-win32.zip diff --git a/util/ci/common.sh b/util/ci/common.sh index 201b182f2..bd0220db5 100644 --- a/util/ci/common.sh +++ b/util/ci/common.sh @@ -4,7 +4,7 @@ install_linux_deps() { local pkgs=( cmake gettext postgresql - libpng-dev libjpeg-dev libgl1-mesa-dev libsdl2-dev libfreetype-dev + libpng-dev libjpeg-dev libgl1-mesa-dev libxi-dev libfreetype-dev libsqlite3-dev libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev libpq-dev libleveldb-dev libcurl4-openssl-dev libzstd-dev ) From b66aa9a954f50dafb28c6360b0485f13ed42a3bc Mon Sep 17 00:00:00 2001 From: Athozus Date: Sun, 11 Aug 2024 14:36:50 +0200 Subject: [PATCH 13/59] Add builtin French localization (#14920) --- builtin/locale/__builtin.fr.tr | 246 +++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 builtin/locale/__builtin.fr.tr diff --git a/builtin/locale/__builtin.fr.tr b/builtin/locale/__builtin.fr.tr new file mode 100644 index 000000000..6c3a244dc --- /dev/null +++ b/builtin/locale/__builtin.fr.tr @@ -0,0 +1,246 @@ +# textdomain: __builtin +Invalid parameters (see /help @1).=Paramètres invalides (voir /help @1). +Too many arguments, try using just /help =Trop de paramètres, essayez /help +Available commands: @1=Commandes disponibles : @1 +Use '/help ' to get more information, or '/help all' to list everything.=Essayez '/help ' pour obtenir plus d'informations, ou '/help all' pour tout lister. +Available commands:=Commandes disponibles : +Command not available: @1=Commande non disponible : @1 +[all | privs | ] [-t]=[all | privs | ] [-t] +Get help for commands or list privileges (-t: output in chat)=Obtenir de l'aide pour les commandes ou pour lister les privilèges (-t : affichage dans le tchat) +Available privileges:=Privilèges disponibles : +Command=Commande +Parameters=Paramètres +For more information, click on any entry in the list.=Pour plus d'informations, cliquez sur une entrée dans la liste. +Double-click to copy the entry to the chat history.=Double-cliquez pour copier une entrée dans l'historique du tchat. +Command: @1 @2=Commande : @1 @2 +Available commands: (see also: /help )=Commandes disponibles : (voir aussi : /help ) +Close=Fermer +Privilege=Privilège +Description=Description +Empty command.=Commande vide. +Invalid command: @1=Commande invalide : @1 +Invalid command usage.=Usage invalide de la commande. + (@1 s)= (@1 s) +Command execution took @1 s=L'exécution de la commande a pris @1 s. +You don't have permission to run this command (missing privileges: @1).=Vous n'avez pas la permission d'exécuter cette commande (privilèges manquants : @1) +Unable to get position of player @1.=Impossible d'obtenir la position du joueur @1. +Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Format incorrect de la zone. Demandé : (x1, y1, z1) (x2, y2, z2) += +Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')=Affiche une action de tchat (ex : '/me commande une pizza' affichage ' commande une pizza') +Show the name of the server owner=Affiche le nom du propriétaire du serveur +The administrator of this server is @1.=L'administrateur de ce serveur est @1. +There's no administrator named in the config file.=Il n'y a pas d'administrateur indiqué dans le fichier de configuration. +@1 does not have any privileges.=@1 ne possède aucun privilège. +Privileges of @1: @2=Privilège(s) de @1 : @2 +[]=[] +Show privileges of yourself or another player=Affiche vos privilèges ou ceux d'un autre joueur. +Player @1 does not exist.=Le joueur @1 n'existe pas. += +Return list of all online players with privilege=Renvoie la liste de tous les joueurs en ligne avec un privilège. +Invalid parameters (see /help haspriv).=Paramètres invalides (voir /help haspriv) +Unknown privilege!=Privilège inconnu ! +No online player has the "@1" privilege.=Aucun joueur en ligne avant le privilège « @1 » +Players online with the "@1" privilege: @2=Joueurs en ligne avec le privilège « @1 » : @2 +Your privileges are insufficient.=Vos privilèges sont insuffisants. +Your privileges are insufficient. '@1' only allows you to grant: @2=Vos privilèges sont insuffisants. '@1' vous autorise seulement d'accorder : @2 +Unknown privilege: @1=Privilège inconnu : @1 +@1 granted you privileges: @2=@1 vous a accordé les privilèges : @2 + ( [, [<...>]] | all)= ( [, [<...>]] | all) +Give privileges to player=Accorder le privilège au joueur +Invalid parameters (see /help grant).=Paramètres invalides (voir /help grant) + [, [<...>]] | all= [, [<...>]] | all +Grant privileges to yourself=Accorder des privilèges à vous-même +Invalid parameters (see /help grantme).=Paramètres invalides (voir /help grantme) +Your privileges are insufficient. '@1' only allows you to revoke: @2=Vos privilèges sont insuffisants. '@1' vous autorise seulement à révoquer : @2 +Note: Cannot revoke in singleplayer: @1=Note : Impossible de révoquer en solo : @1 +Note: Cannot revoke from admin: @1=Note : Impossible de révoquer à l'administrateur : @1 +No privileges were revoked.=Aucun privilège n'a été révoqué. +@1 revoked privileges from you: @2=@1 vous a révoqué le privilège : @2 +Remove privileges from player=Révoquer les privilèges au joueur +Invalid parameters (see /help revoke).=Paramètres invalides (voir /help revoke). +Revoke privileges from yourself=Révoquer des privilèges à vous-même +Invalid parameters (see /help revokeme).=Paramètres invalides (voir /help revokeme). + = +Set player's password (sent unencrypted, thus insecure)=Voir le mot de passe d'un joueur (envoyé non crypté, soit non sécurisé) +Name field required.=Le champ « nom » est requis. +Your password was cleared by @1.=Votre mot de passe a été effacé par @1. +Password of player "@1" cleared.=Mot de passe du joueur « @1 » effacé. +Your password was set by @1.=Votre mot de passe a été défini par @1. +Password of player "@1" set.=Mot de passe « @1 » défini. += +Set empty password for a player=Définir un mot de passe pour un joueur +Reload authentication data=Recharger les données d'authentification +Done.=Fait. +Failed.=Échoué. +Remove a player's data=Supprimer les données d'un joueur +Player "@1" removed.=Joueur « @1 » supprimé. +No such player "@1" to remove.=Aucun joueur « @1 » à supprimer. +Player "@1" is connected, cannot remove.=Le joueur « @1 » est connecté, impossible de supprimer. +Unhandled remove_player return code @1.=La commande remove_player non gérée a retourné le code @1. +Cannot teleport out of map bounds!=Impossible de téléporter en dehors des limites de la carte ! +Cannot get player with name @1.=Impossible d'obtenir le joueur @1. +Cannot teleport, @1 is attached to an object!=Impossible de téléporter, @1 est lié à un objet ! +Teleporting @1 to @2.=Téléportation de @1 vers @2. +One does not teleport to oneself.=Impossible de se téléporter vers soi-même. +Cannot get teleportee with name @1.=Impossible d'obtenir le téléporté @1. +Cannot get target player with name @1.=Impossible d'obtenir le joueur cible @1. +Teleporting @1 to @2 at @3.=Téléportation de @1 vers @2 à @3. +,, | | ,, | =, , | | , , | +Teleport to position or player=Se téléporter vers une position ou un joueur. +You don't have permission to teleport other players (missing privilege: @1).=Vous n'avez pas la permission de téléporter des joueurs (privilège manquant : @1). +([-n] ) | =([-n] ) | +Set or read server configuration setting=Définir ou lire un paramètre de configuration du serveur. +Failed. Cannot modify secure settings. Edit the settings file manually.=Échoué. Impossible de modifier les paramètres sécurisés. Éditez le fichier manuellement. +Failed. Use '/set -n ' to create a new setting.=Échoué. Utilisez '/set -n ' pour créer un nouveau paramètre. +@1 @= @2=@1 @= @2 += +Invalid parameters (see /help set).=Paramètres invalides (voir /help set). +Finished emerging @1 blocks in @2ms.=Fini de générer @1 blocks en @2 ms. +emergeblocks update: @1/@2 blocks emerged (@3%)=Mise à jour de emergeblocks : @1/@2 de blocs générés (@3%) +(here []) | ( )=(here []) | ( ) +Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Charger (ou, si inexistant, générer), des blocs contenus dans la zone de pos1 à pos2 ( et doivent être entre parenthèses) +Started emerge of area ranging from @1 to @2.=Début de la génération de la zone de @1 à @2. +Delete map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Supprimer les blocs contenus dans la zone de pos1 à pos2 ( et doivent être entre parenthèses) +Successfully cleared area ranging from @1 to @2.=La zone de @1 à @2 a été nettoyée avec succès. +Failed to clear one or more blocks in area.=Le nettoyage d'un ou plusieurs blocs dans la zone a echoué. +Resets lighting in the area between pos1 and pos2 ( and must be in parentheses)=Réinitialiser l'éclairage dans la zone de pos1 à pos2 ( et doivent être entre parenthèses) +Successfully reset light in the area ranging from @1 to @2.=L'éclairage dans la zone de @1 à @2 a été réinitialisé avec succès. +Failed to load one or more blocks in area.=Le chargement d'un ou plusieurs blocs dans la zone a échoué. +List mods installed on the server=Liste les modules installés sur le serveur. +No mods installed.=Aucun module installé. +Cannot give an empty item.=Impossible de donner un objet vide. +Cannot give an unknown item.=Impossible de donner un objet inconnu. +Giving 'ignore' is not allowed.=Donner 'ignore' n'est pas autorisé. +@1 is not a known player.=Le joueur @1 est inconnu. +@1 partially added to inventory.=@1 été partiellement rajouté à l'inventaire. +@1 could not be added to inventory.=@1 n'a pas pu être rajouté à l'inventaire. +@1 added to inventory.=@1 a été rajouté à l'inventaire. +@1 partially added to inventory of @2.=@1 a été partiellement rajouté à l'inventaire de @2. +@1 could not be added to inventory of @2.=@1 n'a pas pu être rajouté à l'inventaire de @2. +@1 added to inventory of @2.=@1 a été rajouté à l'inventaire de @2. + [ []]= [ []] +Give item to player=Donner un objet à un joueur +Name and ItemString required.=Le nom et le code de l'objet sont requis + [ []]= [ []] +Give item to yourself=Donner un objet à vous-même +ItemString required.=Code objet requis. + [,,]= [, , ] +Spawn entity at given (or your) position=Faire apparaître une entité à une position donnée (ou la vôtre) +EntityName required.=Nom de l'entité requis. +Unable to spawn entity, player is nil.=Impossible de faire apparaître l'entité, le joueur est inexistant. +Cannot spawn an unknown entity.=Impossible de faire apparaître une entité inconnue. +Invalid parameters (@1).=Paramètres invalides (@1). +@1 spawned.=@1 a apparu. +@1 failed to spawn.=@1 a échoué à apparaître. +Destroy item in hand=Détruire l'objet dans la main +Unable to pulverize, no player.=Impossible de détruire, pas de joueur. +Unable to pulverize, no item in hand.=Impossible de détruire, pas d'objet dans la main. +An item was pulverized.=Un objet a été détruit. +[] [] []=[] [] [] +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Vérifier qui a le dernier touché un nœud ou un autre aux environs dans le temps spécifié par . Par défaut : rayon @= 0, secondes @= 86400 @= 24h, limite @= 5. Définissez à inf pour aucune limite de temps. +Rollback functions are disabled.=Les fonctions retour sont désactivées. +That limit is too high!=Cette limite est trop grande ! +Checking @1 ...=Vérification de @1 ... +Nobody has touched the specified location in @1 seconds.=Personne n'as touché la position spécificée dans les dernières @1 secondes. +@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 il y a @5 secondes. +Punch a node (range@=@1, seconds@=@2, limit@=@3).=Taper un nœud (rayon @= @1, secondes @= @2, limite @= @3). +( []) | (: [])=( []) | (: []) +Revert actions of a player. Default for is 60. Set to inf for no time limit=Annuler les actions d'un joueur. La valeur par défaut de est 60. Définissez à inf pour aucune limite de temps. +Invalid parameters. See /help rollback and /help rollback_check.=Paramètres invalides. Voir /help rollback et /help rollback_check. +Reverting actions of player '@1' since @2 seconds.=Annuler les actions du joueur '@1' depuis @2 secondes. +Reverting actions of @1 since @2 seconds.=Annuler les actions de @1 depuis @2 secondes. +(log is too long to show)=(le journal est trop long à afficher) +Reverting actions succeeded.=Les actions ont été annulées avec succès. +Reverting actions FAILED.=L'annulation des actions a échoué. +Show server status=Afficher le statut du serveur. +This command was disabled by a mod or game.=Cette commande a été désactivée par un module ou un jeu. +[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0.24000>] +Show or set time of day=Afficher ou définir l'heure du jour. +Current time is @1:@2.=L'heure actuelle est @1:@2. +You don't have permission to run this command (missing privilege: @1).=Vous n'avez pas la permission d'exécuter cette commande (privilège manquant : @1) +Invalid time (must be between 0 and 24000).=Heure invalide (doit être comprise entre 0 et 24000). +Time of day changed.=L'heure du jour a changé. +Invalid hour (must be between 0 and 23 inclusive).=Heure invalide (doit être comprise entre 0 et 23 inclus). +Invalid minute (must be between 0 and 59 inclusive).=Minute invalide (doit être comprise entre 0 et 59 inclus). +Show day count since world creation=Afficher le nombre de jours écoulés depuis la création du monde. +Current day is @1.=Le jour actuel est @1. +[ | -1] [-r] []=[ | -1] [-r] [] +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Éteindre le serveur (-1 annule une extinction programmée, -r autorise les joueurs à se reconnecter) +Server shutting down (operator request).=Extinction du serveur (requête de l'opérateur). +Ban the IP of a player or show the ban list=Bannir l'IP d'un joueur ou affiche la liste des bans. +The ban list is empty.=La liste des bans est vide. +Ban list: @1=Liste de bans : @1 +You cannot ban players in singleplayer!=Vous ne pouvez pas bannir des joueurs en solo ! +Player is not online.=Le joueur n'est pas en ligne. +Failed to ban player.=Le bannissement du joueur a échoué. +Banned @1.=@1 a été banni. + | = | +Remove IP ban belonging to a player/IP=Rétablir un IP appartenant à un joueur ou une adresse IP. +Failed to unban player/IP.=Le rétablissement du joueur ou de l'adresse IP a échoué. +Unbanned @1.=@1 a été rétabli. + []= [] +Kick a player=Expulser un joueur +Failed to kick player @1.=L'expulsion du joueur @1 a échoué. +Kicked @1.=@1 a été expulsé. +[full | quick]=[full | quick] +Clear all objects in world=Nettoyer tous les objets dans le monde +Invalid usage, see /help clearobjects.=Usage invalide, voir /help clearobjects. +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Nettoyage de tous les objects. Cela peut prendre du temps. Une inactivité peut surveni (par @1). +Cleared all objects.=Tous les objets ont été nettoyés. + = +Send a direct message to a player=Envoyer un message privé à un joueur. +Invalid usage, see /help msg.=Usage invalide, voir /help msg. +The player @1 is not online.=Le joueur @1 n'est pas en ligne. +DM from @1: @2=Message privé de @1 : @2 +Message sent.=Message privé envoyé. +Get the last login time of a player or yourself=Obtenir l'horodatage de la dernière connexion d'un joueur ou de vous-même. +@1's last login time was @2.=@1 s'est connecté pour la dernière fois au @2. +@1's last login time is unknown.=L'horodatage de la dernière connexion de @1 est inconnu. +Clear the inventory of yourself or another player=Vider votre inventaire ou celui d'un autre joueur. +You don't have permission to clear another player's inventory (missing privilege: @1).=Vous n'avez pas la permission de vider l'inventaire d'un autre joueur (privilège manquant : @1). +@1 cleared your inventory.=@1 a vidé votre inventaire. +Cleared @1's inventory.=L'inventaire de @1 a été vidé. +Player must be online to clear inventory!=Le joueur doit être en ligne pour pouvoir vider son inventaire. +Players can't be killed, damage has been disabled.=Les joueurs ne peuvent pas être tués, les dommages ont été désactivés. +Player @1 is not online.=Le joueur @1 n'est pas en ligne. +You are already dead.=Vous êtes déjà mort. +@1 is already dead.=@1 est déjà mort. +@1 has been killed.=@1 a été tué. +Kill player or yourself=Tuer un joueur ou vous-même. +@1 joined the game.=@1 a rejoint la partie. +@1 left the game.=@1 a quitté la partie. +@1 left the game (timed out).=@1 a quitté la partie (inactivité). +(no description)=(sans description) +Can interact with things and modify the world=Peut interagir avec des éléments ou modifier le monde. +Can speak in chat=Peut écrire dans le tchat. +Can modify basic privileges (@1)=Peut modifier les privilèges basiques (@1) +Can modify privileges=Peut modifier les privilèges +Can teleport self=Peut se téléporter +Can teleport other players=Peut téléporter d'autres joueurs +Can set the time of day using /time=Peut définir l'heure du jour avec /time +Can do server maintenance stuff=Peut effectuer des tâches de maintenance du serveur +Can bypass node protection in the world=Peut outrepasser la protection des nœuds dans le monde. +Can ban and unban players=Peut bannir et rétablir des joueurs. +Can kick players=Peut expulser des joueurs. +Can use /give and /giveme=Peut utiliser /give et /giveme +Can use /setpassword and /clearpassword=Peut utiliser /setpassword et /clearpassword +Can use fly mode=Peut utiliser le mode vol +Can use fast mode=Peut utiliser le mode rapide +Can fly through solid nodes using noclip mode=Peut voler à travers des nœuds solides en utilisant le mode de collisions désactivées. +Can use the rollback functionality=Peut utiliser la fonctionnalité de retour +Can enable wireframe=Peut activer la vue fil de fer +Unknown Item=Objet inconnu +Air=Air +Ignore=Ignorer +You can't place 'ignore' nodes!=Vous ne pouvez pas placé de nœuds 'ignorés' ! +print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] | reset +Handle the profiler and profiling data=Traiter le profileur et les données de profilage +Statistics written to action log.=Les statistiques sont écrites dans les journaux d'actions. +Statistics were reset.=Les statistiques ont été réinitialisées. +Usage: @1=Usage : @1 +Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=Le format peut être txt, csv, lua, json ou json_pretty (les structures sont sujettes au changement). +Values below show absolute/relative times spend per server step by the instrumented function.=Les valeurs inférieures affichent les temps absolu et relatif dépensés par étape du serveur par la fonction utilisée. +A total of @1 sample(s) were taken.=@1 échantillons ont été collectés. +The output is limited to '@1'.=La sortie est limitée à '@1'. +Saving of profile failed: @1=La sauvegarde du profil a échoué : @1 +Profile saved to @1=Le profil a été sauvegardé dans @1 From 16c4ba599ea3e943653ebf654c1f2c516e2d52be Mon Sep 17 00:00:00 2001 From: Yuna <73343507+YunaSatoy@users.noreply.github.com> Date: Sun, 11 Aug 2024 09:38:26 -0300 Subject: [PATCH 14/59] Add builtin pt_BR localization (#14902) --- builtin/locale/__builtin.pt_BR.tr | 246 ++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 builtin/locale/__builtin.pt_BR.tr diff --git a/builtin/locale/__builtin.pt_BR.tr b/builtin/locale/__builtin.pt_BR.tr new file mode 100644 index 000000000..e12e9fae8 --- /dev/null +++ b/builtin/locale/__builtin.pt_BR.tr @@ -0,0 +1,246 @@ +# textdomain: __builtin +Invalid parameters (see /help @1).=Parâmetros inválidos (veja /help @1). +Too many arguments, try using just /help =Muitos argumentos, tente usar apenas /help +Available commands: @1=Comandos disponíveis: @1 +Use '/help ' to get more information, or '/help all' to list everything.=Use '/help ' para obter mais informações, ou '/help all' para listar tudo. +Available commands:=Comandos disponíveis: +Command not available: @1=Comando não disponível: @1 +[all | privs | ] [-t]=[all | privs | ] [-t] +Get help for commands or list privileges (-t: output in chat)=Obtenha ajuda para comandos ou liste privilégios (-t: saída no chat) +Available privileges:=Privilégios disponíveis: +Command=Comando +Parameters=Parâmetros +For more information, click on any entry in the list.=Para mais informações, clique em qualquer entrada na lista. +Double-click to copy the entry to the chat history.=Clique duas vezes para copiar a entrada para o histórico do chat. +Command: @1 @2=Comando: @1 @2 +Available commands: (see also: /help )=Comandos disponíveis: (veja também: /help ) +Close=Fechar +Privilege=Privilégio +Description=Descrição +Empty command.=Comando vazio. +Invalid command: @1=Comando inválido: @1 +Invalid command usage.=Uso de comando inválido. + (@1 s)= (@1 s) +Command execution took @1 s=A execução do comando levou @1 s +You don't have permission to run this command (missing privileges: @1).=Você não tem permissão para executar este comando (privilégios faltando: @1). +Unable to get position of player @1.=Incapaz de obter a posição do jogador @1. +Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Formato de área incorreto. Esperado: (x1,y1,z1) (x2,y2,z2) += +Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')=Mostra a ação do chat (por exemplo, '/me orders a pizza' exibe ' pede uma pizza') +Show the name of the server owner=Mostra o nome do dono do servidor +The administrator of this server is @1.=O administrador deste servidor é @1. +There's no administrator named in the config file.=Não há administrador nomeado no arquivo de configuração. +@1 does not have any privileges.=@1 não tem nenhum privilégio. +Privileges of @1: @2=Privilégios de @1: @2 +[]=[] +Show privileges of yourself or another player=Mostrar privilégios seus ou de outro jogador +Player @1 does not exist.=O jogador @1 não existe. += +Return list of all online players with privilege=Retornar lista de todos os jogadores online com privilégio +Invalid parameters (see /help haspriv).=Parâmetros inválidos (veja /help haspriv). +Unknown privilege!=Privilégio desconhecido! +No online player has the "@1" privilege.=Nenhum jogador online tem o privilégio "@1". +Players online with the "@1" privilege: @2=Jogadores online com o privilégio "@1": @2 +Your privileges are insufficient.=Seus privilégios são insuficientes. +Your privileges are insufficient. '@1' only allows you to grant: @2=Seus privilégios são insuficientes. '@1' só permite que você conceda: @2 +Unknown privilege: @1=Privilégio desconhecido: @1 +@1 granted you privileges: @2=@1 concedeu-lhe privilégios: @2 + ( [, [<...>]] | all)= ( [, [<...>]] | all) +Give privileges to player=Conceder privilégios ao jogador +Invalid parameters (see /help grant).=Parâmetros inválidos (veja /help grant). + [, [<...>]] | all= [, [<...>]] | all +Grant privileges to yourself=Concede privilégios a você mesmo +Invalid parameters (see /help grantme).=Parâmetros inválidos (veja /help grantme). +Your privileges are insufficient. '@1' only allows you to revoke: @2=Seus privilégios são insuficientes. '@1' só permite que você revogue: @2 +Note: Cannot revoke in singleplayer: @1=Nota: Não é possível revogar em singleplayer: @1 +Note: Cannot revoke from admin: @1=Nota: Não é possível revogar do administrador: @1 +No privileges were revoked.=Nenhum privilégio foi revogado. +@1 revoked privileges from you: @2=@1 revogou seus privilégios: @2 +Remove privileges from player=Remover privilégios do jogador +Invalid parameters (see /help revoke).=Parâmetros inválidos (veja /help revoke). +Revoke privileges from yourself=Revogar privilégios de si mesmo +Invalid parameters (see /help revokeme).=Parâmetros inválidos (veja /help revokeme). + = +Set player's password (sent unencrypted, thus insecure)=Definir a senha do jogador (enviada sem criptografia, portanto insegura) +Name field required.=Campo de nome obrigatório. +Your password was cleared by @1.=Sua senha foi limpa por @1. +Password of player "@1" cleared.=Senha do jogador "@1" limpa. +Your password was set by @1.=Sua senha foi definida por @1. +Password of player "@1" set.=Senha do jogador "@1" definida. += +Set empty password for a player=Definir senha vazia para um jogador +Reload authentication data=Recarregar dados de autenticação +Done.=Pronto. +Failed.=Erro. +Remove a player's data=Remover dados de um jogador +Player "@1" removed.=Jogador "@1" removido. +No such player "@1" to remove.=Não existe tal jogador "@1" para remover. +Player "@1" is connected, cannot remove.=Jogador "@1" está conectado, não pode ser removido. +Unhandled remove_player return code @1.=Código de retorno remove_player não tratado @1. +Cannot teleport out of map bounds!=Não é possível teleportar para fora dos limites do mapa! +Cannot get player with name @1.=Não é possível obter jogador com o nome @1. +Cannot teleport, @1 is attached to an object!=Não é possível teleportar, @1 está anexado a um objeto! +Teleporting @1 to @2.=Teleportando @1 para @2. +One does not teleport to oneself.=Não tem como se teletransportar para você mesmo. +Cannot get teleportee with name @1.=Não é possível teletransportar com o nome @1. +Cannot get target player with name @1.=Não é possível obter jogador alvo com o nome @1. +Teleporting @1 to @2 at @3.=Teleportando @1 para @2 em @3. +,, | | ,, | =,, | | ,, | +Teleport to position or player=Teleportar para posição ou um jogador +You don't have permission to teleport other players (missing privilege: @1).=Você não tem permissão para teleportar outros jogadores (privilégio faltando: @1). +([-n] ) | =([-n] ) | +Set or read server configuration setting=Definir ou ler configuração do servidor +Failed. Cannot modify secure settings. Edit the settings file manually.=Falha. Não é possível modificar configurações seguras. Edite o arquivo de configurações manualmente. +Failed. Use '/set -n ' to create a new setting.=Falhou. Use '/set -n ' para criar uma nova configuração. +@1 @= @2=@1 @= @2 += +Invalid parameters (see /help set).=Parâmetros inválidos (veja /help set). +Finished emerging @1 blocks in @2ms.=Finalizada a emergência de @1 blocos em @2ms. +emergeblocks update: @1/@2 blocks emerged (@3%)=atualização de emergeblocks: @1/@2 blocos emergidos (@3%) +(here []) | ( )=(aqui []) | ( ) +Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Carregar (ou, se inexistente, gerar) blocos de mapa contidos na área pos1 a pos2 ( e devem estar entre parênteses) +Started emerge of area ranging from @1 to @2.=Iniciada o surgimento de áreas que vão de @1 a @2. +Delete map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Excluir blocos de mapa contidos na área pos1 a pos2 ( e devem estar entre parênteses) +Successfully cleared area ranging from @1 to @2.=Área limpa com sucesso variando de @1 a @2. +Failed to clear one or more blocks in area.=Falha ao limpar um ou mais blocos na área. +Resets lighting in the area between pos1 and pos2 ( and must be in parentheses)=Redefine a iluminação na área entre pos1 e pos2 ( e devem estar entre parênteses) +Successfully reset light in the area ranging from @1 to @2.=Iluminação redefinida com sucesso na área variando de @1 a @2. +Failed to load one or more blocks in area.=Falha ao carregar um ou mais blocos na área. +List mods installed on the server=Listar mods instalados no servidor +No mods installed.=Sem mods instalados. +Cannot give an empty item.=Não é possível dar um item vazio. +Cannot give an unknown item.=Não é possível dar um item desconhecido. +Giving 'ignore' is not allowed.=Não é permitido dar 'ignore'. +@1 is not a known player.=@1 não é um jogador conhecido. +@1 partially added to inventory.=@1 parcialmente adicionado ao inventário. +@1 could not be added to inventory.=@1 não pôde ser adicionado ao inventário. +@1 added to inventory.=@1 adicionado ao inventário. +@1 partially added to inventory of @2.=@1 parcialmente adicionado ao inventário de @2. +@1 could not be added to inventory of @2.=@1 não pôde ser adicionado ao inventário de @2. +@1 added to inventory of @2.=@1 adicionado ao inventário de @2. + [ []]= [ []] +Give item to player=Dar item ao jogador +Name and ItemString required.=Nome e ItemString são obrigatórios. + [ []]= [ []] +Give item to yourself=Dar item a si mesmo +ItemString required.=ItemString é obrigatório. + [,,]= [,,] +Spawn entity at given (or your) position=Gerar entidade na posição fornecida (ou na sua) +EntityName required.=NomeDaEntidade é obrigatório. +Unable to spawn entity, player is nil.=Não é possível gerar a entidade, jogador é nulo. +Cannot spawn an unknown entity.=Não é possível gerar uma entidade desconhecida. +Invalid parameters (@1).=Parâmetros inválidos (@1). +@1 spawned.=@1 gerado. +@1 failed to spawn.=Falha ao gerar @1. +Destroy item in hand=Destruir item na mão +Unable to pulverize, no player.=Incapaz de pulverizar, sem jogador. +Unable to pulverize, no item in hand.=Incapaz de pulverizar, sem item na mão. +An item was pulverized.=Um item foi pulverizado. +[] [] []=[] [] [] +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Verificar quem tocou pela última vez um nó ou um nó próximo dentro do tempo especificado por . Padrão: alcance @= 0, segundos @= 86400 @= 24h, limite @= 5. Defina como inf para sem limite de tempo +Rollback functions are disabled.=Funções de rollback estão desativadas. +That limit is too high!=Esse limite é muito alto! +Checking @1 ...=Verificando @1 ... +Nobody has touched the specified location in @1 seconds.=Ninguém tocou a localização especificada em @1 segundos. +@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 @5 segundos atrás. +Punch a node (range@=@1, seconds@=@2, limit@=@3).=Golpeie um nó (alcance@=@1, segundos@=@2, limite@=@3). +( []) | (: [])=( []) | (: []) +Revert actions of a player. Default for is 60. Set to inf for no time limit=Reverter ações de um jogador. O padrão para é 60. Defina como inf para sem limite de tempo +Invalid parameters. See /help rollback and /help rollback_check.=Parâmetros inválidos. Veja /help rollback e /help rollback_check. +Reverting actions of player '@1' since @2 seconds.=Revertendo ações do jogador '@1' desde @2 segundos. +Reverting actions of @1 since @2 seconds.=Revertendo ações de @1 desde @2 segundos. +(log is too long to show)=O log é muito longo para mostrar +Reverting actions succeeded.=Ações revertidas com sucesso. +Reverting actions FAILED.=Reversão de ações FALHOU. +Show server status=Mostrar status do servidor +This command was disabled by a mod or game.=Este comando foi desativado por um mod ou jogo. +[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>] +Show or set time of day=Mostrar ou definir hora do dia +Current time is @1:@2.=A hora atual é @1:@2. +You don't have permission to run this command (missing privilege: @1).=Você não tem permissão para executar este comando (privilégio faltando: @1). +Invalid time (must be between 0 and 24000).=Hora inválida (deve estar entre 0 e 24000). +Time of day changed.=Hora do dia alterada. +Invalid hour (must be between 0 and 23 inclusive).=Hora inválida (deve estar entre 0 e 23 inclusivo). +Invalid minute (must be between 0 and 59 inclusive).=Minuto inválido (deve estar entre 0 e 59 inclusivo). +Show day count since world creation=Mostrar contagem de dias desde a criação do mundo +Current day is @1.=O dia atual é @1. +[ | -1] [-r] []=[ | -1] [-r] [] +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Desligar servidor (-1 cancela o desligamento adiado, -r permite que os jogadores se reconectem) +Server shutting down (operator request).=Servidor desligando (solicitação do operador). +Ban the IP of a player or show the ban list=Banir o IP de um jogador ou mostrar a lista de banimentos +The ban list is empty.=A lista de banimentos está vazia. +Ban list: @1=Lista de banimentos: @1 +You cannot ban players in singleplayer!=Você não pode banir jogadores em singleplayer! +Player is not online.=Jogador não está online. +Failed to ban player.=Falha ao banir jogador. +Banned @1.=Banido @1. + | = | +Remove IP ban belonging to a player/IP=Remover banimento de IP pertencente a um jogador/IP +Failed to unban player/IP.=Falha ao desbanir jogador/IP. +Unbanned @1.=Desbanido @1. + []= [] +Kick a player=Expulsar um jogador +Failed to kick player @1.=Falha ao expulsar jogador @1. +Kicked @1.=Expulso @1. +[full | quick]=[full | quick] +Clear all objects in world=Limpar todos os objetos no mundo +Invalid usage, see /help clearobjects.=Uso inválido, veja /help clearobjects. +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Limpeza de todos os objetos. Isso pode levar muito tempo. Você pode experimentar um tempo limite. (por @1) +Cleared all objects.=Todos os objetos foram limpos. + = +Send a direct message to a player=Enviar uma mensagem direta a um jogador +Invalid usage, see /help msg.=Uso inválido, veja /help msg. +The player @1 is not online.=O jogador @1 não está online. +DM from @1: @2=DM de @1: @2 +Message sent.=Mensagem enviada. +Get the last login time of a player or yourself=Pegue o último horário de login de um jogador ou de você mesmo +@1's last login time was @2.=O último login de @1 foi às @2. +@1's last login time is unknown.=O último login de @1 é desconhecido. +Clear the inventory of yourself or another player=Limpar o inventário de você mesmo ou de outro jogador +You don't have permission to clear another player's inventory (missing privilege: @1).=Você não tem permissão para limpar o inventário de outro jogador (privilégio faltando: @1). +@1 cleared your inventory.=@1 limpou seu inventário. +Cleared @1's inventory.=Inventário de @1 limpo. +Player must be online to clear inventory!=O jogador deve estar online para limpar o inventário! +Players can't be killed, damage has been disabled.=Jogadores não podem ser mortos, o dano foi desativado. +Player @1 is not online.=Jogador @1 não está online. +You are already dead.=Você já está morto. +@1 is already dead.=@1 já está morto. +@1 has been killed.=@1 foi morto. +Kill player or yourself=Matar jogador ou a si mesmo +@1 joined the game.=@1 entrou no jogo. +@1 left the game.=@1 saiu do jogo. +@1 left the game (timed out).=@1 saiu do jogo (tempo esgotado) +(no description)=(sem descrição) +Can interact with things and modify the world=Pode interagir com as coisas e modificar o mundo +Can speak in chat=Pode falar no chat +Can modify basic privileges (@1)=Pode modificar privilégios básicos (@1) +Can modify privileges=Pode modificar privilégios +Can teleport self=Pode se teletransportar +Can teleport other players=Pode teletransportar outros jogadores +Can set the time of day using /time=Pode definir a hora do dia usando /time +Can do server maintenance stuff=Pode realizar tarefas de manutenção do servidor +Can bypass node protection in the world=Pode ignorar a proteção de nós no mundo +Can ban and unban players=Pode banir e desbanir jogadores +Can kick players=Pode chutar jogadores +Can use /give and /giveme=Pode usar /give e /giveme +Can use /setpassword and /clearpassword=Pode usar /setpassword e /clearpassword +Can use fly mode=Pode usar o modo voar +Can use fast mode=Pode usar o modo rápido +Can fly through solid nodes using noclip mode=Pode voar através de nós sólidos usando o modo noclip +Can use the rollback functionality=Pode usar a funcionalidade de reversão +Can enable wireframe=Pode ativar wireframe +Unknown Item=Item desconhecido +Air=Ar +Ignore=Ignorar +You can't place 'ignore' nodes!=Você não pode colocar nós 'ignorar'! +print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] | reset +Handle the profiler and profiling data=Lidar com o criador de perfil e os dados de criação de perfil +Statistics written to action log.=Estatísticas salvas no log de ações. +Statistics were reset.=As estatísticas foram redefinidas. +Usage: @1=Uso: @1 +Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=O formato pode ser txt, csv, lua, json, json_pretty (as estruturas podem estar sujeitas a alterações). +Values below show absolute/relative times spend per server step by the instrumented function.=Os valores abaixo mostram os tempos absolutos/relativos gastos por etapa do servidor pela função instrumentada. +A total of @1 sample(s) were taken.=Um total de @1 amostra(s) foi coletada. +The output is limited to '@1'.=A saída é limitada a '@1'. +Saving of profile failed: @1=Falha ao salvar o perfil: @1 +Profile saved to @1=Perfil salvo em @1 From 4a4730be9ba5b7c6e3d1c1f64b1d75c67a9896c4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 11 Jul 2024 14:07:56 +0000 Subject: [PATCH 15/59] Translated using Weblate (German) Currently translated at 100.0% (1335 of 1335 strings) --- po/de/minetest.po | 218 ++++++++++++++++++++++++---------------------- 1 file changed, 112 insertions(+), 106 deletions(-) diff --git a/po/de/minetest.po b/po/de/minetest.po index 437084069..74380e328 100644 --- a/po/de/minetest.po +++ b/po/de/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: German (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-02-21 17:02+0000\n" -"Last-Translator: sfan5 \n" +"PO-Revision-Date: 2024-07-12 14:09+0000\n" +"Last-Translator: Wuzzy \n" "Language-Team: German \n" "Language: de\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "Befehl nicht verfügbar: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Hilfe für Befehle erhalten" +msgstr "Hilfe für Befehle erhalten (-t: Ausgabe im Chat)" #: builtin/common/chatcommands.lua msgid "" @@ -83,9 +82,8 @@ msgstr "" "all“ benutzen, um alles aufzulisten." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | ]" +msgstr "[all | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -148,13 +146,12 @@ msgid "Failed to download $1" msgstr "Fehler beim Download von $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Fehler beim Extrahieren von „$1“ (nicht unterstützter Dateityp oder kaputtes " -"Archiv)" +"Fehler beim Extrahieren von „$1“ (unzureichender Speicherplatz, nicht " +"unterstützter Dateityp oder kaputtes Archiv)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -187,7 +184,7 @@ msgstr "Herunterladen …" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Fehler beim Holen der Abhängigkeiten für Paket" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -467,7 +464,7 @@ msgstr "Dekorationen" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Wüstentempel" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -478,6 +475,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Andere Verliesvariante, die in Wüstenbiomen generiert wird (nur, wenn " +"Verliese aktiviert sind)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -1075,15 +1074,16 @@ msgid "Install games from ContentDB" msgstr "Spiele aus ContentDB installieren" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game ist nicht länger standardmäßig installiert" +msgstr "Minetest wird standardmäßig nicht mehr mit einem Spiel ausgeliefert." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest ist eine Spielerschaffungsplattform, welche es Ihnen ermöglicht, " +"viele verschiedene Spiele zu spielen." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1118,10 +1118,9 @@ msgid "Start Game" msgstr "Spiel starten" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." msgstr "" -"Sie müssen ein Spiel installieren, bevor Sie eine Mod installieren können" +"Sie müssen ein Spiel installieren, bevor Sie eine Welt erstellen können." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1336,7 +1335,6 @@ msgid "Continue" msgstr "Weiter" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1354,8 +1352,8 @@ msgstr "" "Steuerung:\n" "Kein Menü sichtbar:\n" "- Finger wischen: Umsehen\n" -"- Antippen: Platzieren/benutzen\n" -"- Langes antippen: Graben/schlagen/benutzen\n" +"- Antippen: Platzieren/schlagen/benutzen (Standard)\n" +"- Langes antippen: Graben/benutzen (Standard)\n" "Menü/Inventar offen:\n" "- Doppelt antippen (außerhalb):\n" " --> schließen\n" @@ -1435,9 +1433,8 @@ msgid "Fog enabled" msgstr "Nebel aktiviert" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Zoom ist momentan von Spiel oder Mod deaktiviert" +msgstr "Nebel von Spiel oder Mod aktiviert" #: src/client/game.cpp msgid "Game info:" @@ -1940,13 +1937,13 @@ msgid "Minimap in texture mode" msgstr "Übersichtskarte im Texturmodus" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Fehler beim Öffnen der Webseite" +msgstr "Fehler beim Kompilieren des „%s“-Shaders." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Shader sind aktiviert, aber GLSL wird vom Treiber nicht unterstützt." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2143,16 +2140,15 @@ msgstr "Taste drücken" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Öffnen" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "URL öffnen?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Fehler beim Öffnen der Webseite" +msgstr "URL konnte nicht geöffnet werden" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2458,7 +2454,7 @@ msgstr "Erweitert" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Erlaubt Flüssigkeiten, transluzent zu sein." #: src/settings_translation_file.cpp msgid "" @@ -2530,6 +2526,14 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Dithering anwenden, um Artefakte beim Color-Banding zu reduzieren.\n" +"Dithering erhöht die Größe der verlustfrei komprimierten Bildschirmfotos\n" +"signifikant und es funktioniert nicht richtig, falls die Anzeige oder das\n" +"Betriebssystem zusätzliches Dithering anwendet oder, falls die Farbkanäle\n" +"nicht auf 8 Bits quantisiert sind.\n" +"Mit OpenGL ES funktioniert Dithering nur, falls der Shader eine hohe\n" +"Fließkommazahlenpräzision unterstützt, und das könnte zu höheren\n" +"Einbußen bei der Performanz führen." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2548,7 +2552,6 @@ msgid "Ask to reconnect after crash" msgstr "Abfrage zum Neuverbinden nach Absturz" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2564,15 +2567,14 @@ msgstr "" "aggressiv\n" "optimieren.\n" "Kleine Werte werden die Performanz möglicherweise stark erhöhen, auf\n" -"Kosten von sichtbaren Renderfehlern (einige Blöcke werden nicht unter dem " -"Wasser\n" -"und in Höhlen gerendert, sowie manchmal auf dem Land).\n" +"Kosten von sichtbaren Renderfehlern (einige Blöcke können eventuell in " +"Höhlen\n" +"nicht korrekt gerendert werden).\n" "Wird dieser Wert auf eine Zahl größer als max_block_send_distance gesetzt,\n" "wird diese Optimierung deaktiviert.\n" "In Kartenblöcken (16 Blöcke) angegeben." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2582,15 +2584,11 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"In dieser Distanz wird der Server die zu den Clients gesendeten Blöcke " -"aggressiv\n" -"optimieren.\n" +"In dieser Distanz wird der Server einen einfacheren und günstigeren\n" +"Occlusion-Check machen.\n" "Kleine Werte werden die Performanz möglicherweise stark erhöhen, auf\n" -"Kosten von sichtbaren Renderfehlern (einige Blöcke werden nicht unter dem " -"Wasser\n" -"und in Höhlen gerendert, sowie manchmal auf dem Land).\n" -"Wird dieser Wert auf eine Zahl größer als max_block_send_distance gesetzt,\n" -"wird diese Optimierung deaktiviert.\n" +"Kosten von sichtbaren Renderfehlern (fehlende Blöcke).\n" +"Dies ist besonders nützlich für eine hohe Sichtweite (über 500).\n" "In Kartenblöcken (16 Blöcke) angegeben." #: src/settings_translation_file.cpp @@ -2654,9 +2652,8 @@ msgid "Biome noise" msgstr "Biomrauschen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Distanz für Sendeoptimierungen von Kartenblöcken" +msgstr "Block-Cull-Optimierungsdistanz" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2879,6 +2876,9 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Kommagetrennte Liste von AL- und ALC-Erweiterungen, welche nicht\n" +"benutzt werden sollen. Nützlich zum Testen. Siehe al_extensions.[h,cpp]\n" +"für Details." #: src/settings_translation_file.cpp msgid "" @@ -3106,7 +3106,6 @@ msgstr "" "aber dies verbraucht auch mehr Ressourcen." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3118,12 +3117,18 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Aktivieren, um alten Clients die Verbindung zu verwehren.\n" +"Hier festlegen, welches die ältesten Clients sind, die sich verbinden dürfen." +"\n" "Ältere Clients sind kompatibel in der Hinsicht, dass sie beim Verbinden zu " "neuen\n" "Servern nicht abstürzen, aber sie könnten nicht alle neuen Funktionen, die " "Sie\n" -"erwarten, unterstützen." +"erwarten, unterstützen.\n" +"Das ermöglicht eine genauere Kontrolle als strict_protocol_version_checking." +"\n" +"Minetest wird immer noch ein internes Minimum erzwingen, und die " +"Aktivierung\n" +"von strict_protocol_version_checking wird dies überschreiben." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3335,9 +3340,8 @@ msgid "Enable Bloom Debug" msgstr "Bloom-Debug aktivieren" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Schaden einschalten" +msgstr "Debanding aktivieren" #: src/settings_translation_file.cpp msgid "" @@ -3366,9 +3370,8 @@ msgstr "" "erzeugen. Ansonsten wird die PCF-Filterung benutzt." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Nachbearbeitung" +msgstr "Nachbearbeitung aktivieren" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3421,9 +3424,8 @@ msgstr "" "Mausradscrollen für die Gegenstandsauswahl in der Schnellleiste aktivieren." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "Schaltet zufällige Steuerung ein (nur zum Testen verwendet)." +msgstr "Schaltet zufälliges Modladen ein (nur zum Testen verwendet)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3457,9 +3459,8 @@ msgstr "" "erwarten, unterstützen." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Touchscreen" +msgstr "Touchscreen aktivieren" #: src/settings_translation_file.cpp msgid "" @@ -3518,16 +3519,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Aktiviert Debug und Fehlerprüfungen im OpenGL-Treiber." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Aktiviert die Nachbearbeitungspipeline." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Aktiviert den Touchscreenmodus. Damit können Sie das Spiel mit einem " +"Touchscreen spielen." #: src/settings_translation_file.cpp msgid "" @@ -4498,16 +4501,16 @@ msgstr "" "- Opaque: Transparenz deaktivieren" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Länge eines Servertakts und dem Zeitintervall, in dem Objekte über das " -"Netzwerk\n" -"üblicherweise aktualisiert werden; in Sekunden angegeben." +"Länge eines Servertakts (dem Intervall, wo grundsätzlich alles aktualisiert " +"wird),\n" +"in Sekunden.\n" +"Wirkt sich nicht auf Sitzungen aus, die vom Clientmenü gestartet wurden." #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -4738,7 +4741,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Kartengenerierungsattribute speziell für den Kartengenerator v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4750,7 +4752,11 @@ msgstr "" "Kartengenerierungsattribute speziell für den Kartengenerator v6.\n" "Das Flag „snowbiomes“ aktiviert das neue 5-Biom-System.\n" "Falls das „snowbiomes“-Flag aktiviert ist, werden Dschungel automatisch " -"aktiviert und das „jungles“-Flag wird ignoriert." +"aktiviert und\n" +"das „jungles“-Flag wird ignoriert.\n" +"Das „temples“-Flag deaktiviert die Erzeugung von Wüstentempeln. Stattdessen " +"werden\n" +"normale Verliese auftauchen." #: src/settings_translation_file.cpp msgid "" @@ -5070,9 +5076,8 @@ msgid "Minimap scan height" msgstr "Abtasthöhe der Übersichtskarte" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Bauen-Wiederholungsrate" +msgstr "Minimale Grabungswiederholungsrate" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -5143,9 +5148,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Faktor für die Mausempfindlichkeit." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Hohlraumschwellwert" +msgstr "Bewegungsschwellwert" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5307,9 +5311,8 @@ msgstr "" "Wird nicht pausieren, wenn ein Formspec geöffnet ist." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Kartengenerator-Debugging" +msgstr "OpenGL-Debug" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5447,13 +5450,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Anteil der großen Höhlen, die eine Flüssigkeit enthalten." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "Protokollversion stimmt nicht überein. " +msgstr "Protokollversionsminimum" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Schlaggeste" #: src/settings_translation_file.cpp msgid "" @@ -5475,7 +5477,7 @@ msgstr "Zufällige Steuerung" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Zufällige Modladereihenfolge" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5689,7 +5691,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Siehe https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Select the antialiasing method to apply.\n" "\n" @@ -5715,9 +5716,10 @@ msgstr "" "* None – Keine Kantenglättung (Standard)\n" "\n" "* FSAA – Von der Hardware bereitgestellte Vollbildkantenglättung (nicht\n" -"kompatibel mit Shadern), auch bekannt als Multi-Sample Antialiasing (MSAA).\n" -"Glättet Blockkanten aus, beeinträchtigt aber nicht die Innenseiten der " -"Texturen.\n" +"kompatibel mit Nachbearbeitung und Unterabtastung), auch bekannt\n" +"als Multi-Sample Antialiasing (MSAA). Glättet Blockkanten aus, " +"beeinträchtigt\n" +"aber nicht die Innenseiten der Texturen.\n" "Um diese Option zu ändern, ist ein Neustart erforderlich.\n" "\n" "* FXAA – Schnelle annähende Kantenglättung (benötigt Shader).\n" @@ -5727,7 +5729,7 @@ msgstr "" "Bildqualität.\n" "\n" "* SSAA – Super-Sampling-Kantenglättung (benötigt Shader).\n" -"Rendert ein hochauflösendes Bild der Szene, dann skaliert es nach unten, um\n" +"Rendert ein hochauflösendes Bild der Szene, dann skaliert es herunter, um\n" "die Aliasing-Effekte zu reduzieren. Dies ist die langsamste und genaueste " "Methode." @@ -5858,12 +5860,11 @@ msgstr "" "Wertebereich: von -1 zu 1.0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"Setzt die Sprache. Leer lassen, um Systemsprache zu verwenden.\n" +"Setzt die Sprache. Standardmäßig wird die Systemsprache zu verwendet.\n" "Nach Änderung ist ein Neustart erforderlich." #: src/settings_translation_file.cpp @@ -5910,6 +5911,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." msgstr "" +"Auf wahr setzen, um volumetrische Lichteffekte zu aktivieren (auch bekannt " +"als „Gottesstrahlen“/„Godrays“)." #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5955,7 +5958,6 @@ msgid "Shaders" msgstr "Shader" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" @@ -5963,8 +5965,7 @@ msgid "" msgstr "" "Shader ermöglichen fortgeschrittene visuelle Effekte und können die " "Performanz auf\n" -"einigen Grafikkarten erhöhen.\n" -"Das funktioniert nur mit dem OpenGL-Grafik-Backend." +"einigen Grafikkarten erhöhen." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -6085,13 +6086,12 @@ msgid "Smooth lighting" msgstr "Weiches Licht" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." msgstr "" -"Glättet die Rotation der Kamera im Filmmodus. 0 zum Ausschalten.\n" -"Der Filmmodus kann aktiviert werden, indem die entsprechende Taste in der " +"Glättet die Rotation der Kamera im Filmmodus. 0 zum Ausschalten. Der " +"Filmmodus kann aktiviert werden, indem die entsprechende Taste in der " "Tastenbelegung benutzt wird." #: src/settings_translation_file.cpp @@ -6119,9 +6119,8 @@ msgid "Sound" msgstr "Ton" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "ContentDB: Schwarze Liste" +msgstr "Schwarze Liste der Sounderweiterungen" #: src/settings_translation_file.cpp msgid "" @@ -6336,6 +6335,8 @@ msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"Die Verzögerung in Millisekunden, nachdem eine Berührungsinteraktion als " +"langes Antippen zählt." #: src/settings_translation_file.cpp msgid "" @@ -6355,18 +6356,27 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"Die Geste für für das Schlagen von Spielern/Entitys.\n" +"Dies kann von Spielen und Mods überschrieben werden.\n" +"\n" +"* short_tap\n" +"Leicht zu benutzen und bekannt von anderen Spielen, die nicht genannt werden " +"sollen.\n" +"\n" +"* long_tap\n" +"Bekannt aus der klassischen Mineteststeuerung für mobile Endgeräte.\n" +"Der Kampf ist mehr oder weniger unmöglich." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" msgstr "Die Kennung des zu verwendeten Joysticks" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." msgstr "" -"Die Länge in Pixeln, die benötigt wird, damit die Touchscreen-Interaktion " -"beginnt." +"Die Länge in Pixeln, die benötigt wird, damit die Touch-Interaktion als " +"Bewegung zählt." #: src/settings_translation_file.cpp msgid "" @@ -6381,13 +6391,13 @@ msgstr "" "Standard ist 1.0 (1/2 Block)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." msgstr "" -"Die Zeit in Sekunden, in dem die Blockplatzierung wiederholt wird, wenn\n" -"die Bautaste gedrückt gehalten wird." +"Die minimale Zeit in Sekunden, die zwischen dem Graben von Blöcken benötigt " +"wird,\n" +"wenn die Grabetaste gedrückt gehalten wird." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6421,7 +6431,6 @@ msgstr "" "konfiguriert werden." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" @@ -6432,7 +6441,7 @@ msgstr "" "Anmerkung: Ein Neustart ist nach einer Änderung notwendig!\n" "Auf Desktopsystemen ist OpenGL die Standardeinstellung. Bei Android ist " "OGLES2 die Standardeinstellung.\n" -"Shader werden unter OpenGL und OGLES2 (experimentell) unterstützt." +"Shader werden von allem außer OGLES1 unterstützt." #: src/settings_translation_file.cpp msgid "" @@ -6515,7 +6524,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Schwelle für langes Antippen" #: src/settings_translation_file.cpp msgid "" @@ -6578,9 +6587,8 @@ msgid "Tradeoffs for performance" msgstr "Kompromisse für Performanz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Undurchsichtige Flüssigkeiten" +msgstr "Transluzente Flüssigkeiten" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6629,14 +6637,14 @@ msgstr "" "haben." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "URL to JSON file which provides information about the newest Minetest " "release\n" "If this is empty the engine will never check for updates." msgstr "" "URL zu einer JSON-Datei, welche Informationen über das neueste Minetest-" -"Release enthält" +"Release enthält\n" +"Wenn dies leer ist, wird die Engine nie nach Updates suchen." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6856,7 +6864,7 @@ msgstr "Tonlautstärke" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Lautstärkenfaktor, wenn das Fenster nicht im Fokus steht." #: src/settings_translation_file.cpp msgid "" @@ -6867,14 +6875,12 @@ msgstr "" "Dafür muss das Tonsystem aktiviert sein." #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "Bildwiederholrate wenn Fenster im Hintergrund/Spiel pausiert" +msgstr "Lautstärke außerhalb Fokus" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "Weiches Licht" +msgstr "Volumetrisches Licht" #: src/settings_translation_file.cpp msgid "" From 4208022d55e7d14e5dfc38344fb74524ac7124d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Rodr=C3=ADguez?= Date: Fri, 12 Jul 2024 04:07:01 +0000 Subject: [PATCH 16/59] Translated using Weblate (Spanish) Currently translated at 89.2% (1191 of 1335 strings) --- po/es/minetest.po | 132 ++++++++++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 44 deletions(-) diff --git a/po/es/minetest.po b/po/es/minetest.po index f91110751..3a4675c38 100644 --- a/po/es/minetest.po +++ b/po/es/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Spanish (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-06-09 15:09+0000\n" -"Last-Translator: SergioFLS \n" +"PO-Revision-Date: 2024-07-14 21:23+0000\n" +"Last-Translator: Jorge Rodríguez \n" "Language-Team: Spanish \n" "Language: es\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -186,7 +186,7 @@ msgstr "Descargando..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Error obteniendo dependencias para el paquete" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -466,7 +466,7 @@ msgstr "Decoraciones" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Templos del desierto" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -477,6 +477,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Variante de mazmorras diferente generada en biomas de desierto (solo si las " +"mazmorras están activadas)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -1073,15 +1075,16 @@ msgid "Install games from ContentDB" msgstr "Instalar juegos desde ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game ya no es instalado por predeterminado" +msgstr "Minetest Game ya no es instalado por predeterminado." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest es una plataforma de creación de juegos que te permite jugar a " +"muchos juegos diferentes." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1116,9 +1119,8 @@ msgid "Start Game" msgstr "Empezar juego" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Necesitas instalar un juego antes de que puedas instalar un mod" +msgstr "Necesitas instalar un juego antes de poder crear un mundo." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1941,13 +1943,13 @@ msgid "Minimap in texture mode" msgstr "Minimapa en modo textura" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Fallo al abrir la página web" +msgstr "Fallo al compilar el shader \"%s\"." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Los shaders están activados pero el driver no soporta GLSL." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2148,7 +2150,7 @@ msgstr "" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Abrir URL?" #: src/gui/guiOpenURL.cpp #, fuzzy @@ -2455,7 +2457,7 @@ msgstr "Avanzado" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Permite que los líquidos sean traslúcidos." #: src/settings_translation_file.cpp msgid "" @@ -3510,7 +3512,7 @@ msgstr "Habilitar cacheado de mallas giradas." #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Activa depuración y comprobación de errores en el driver OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." @@ -3520,6 +3522,7 @@ msgstr "" msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Activa el modo de pantalla táctil, permitiendote jugar con pantalla táctil." #: src/settings_translation_file.cpp msgid "" @@ -4474,16 +4477,15 @@ msgstr "" "- Opaco: Transparencia desactivada" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Duración de un tick del servidor y el intervalo en el que los objetos se " -"actualizan generalmente sobre la\n" -"red, expresada en segundos." +"Duración de un tick del servidor y el intervalo en\n" +"el que los objetos se actualizan generalmente\n" +"sobre la red, expresada en segundos." #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -5423,13 +5425,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Proporción de cuevas grandes que contienen líquido." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "La versión del protocolo no coincide. " +msgstr "La versión del protocolo no coincide" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Gesto para golpear" #: src/settings_translation_file.cpp msgid "" @@ -5451,7 +5452,7 @@ msgstr "Entrada aleatoria" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Orden aleatorio de carga de mods" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5942,16 +5943,15 @@ msgid "Shaders" msgstr "Shaders (Sombreador)" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" "Los sombreadores permiten efectos visuales avanzados y pueden aumentar el " -"rendimiento en algunas tarjetas de\n" -"vídeo.\n" -"Esto solo funciona con el motor de vídeo OpenGL." +"rendimiento\n" +"en algunas tarjetas de vídeo. Esto solo funciona con el motor de vídeo " +"OpenGL." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -6037,7 +6037,7 @@ msgstr "" "aumentar este valor por encima de 5.\n" "Reducir este valor aumenta la densidad de cuevas y mazmorras.\n" "Alterar este valor es para uso especial, dejarlo sin cambios es\n" -"recomendable" +"recomendable." #: src/settings_translation_file.cpp msgid "Sky Body Orbit Tilt" @@ -6068,6 +6068,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Small-scale temperature variation for blending biomes on borders." msgstr "" +"Variación de temperatura a pequeña escala para mezclar biomas en bordes." #: src/settings_translation_file.cpp msgid "Smooth lighting" @@ -6282,17 +6283,23 @@ msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"El formato predefinido en que se guardan los perfiles\n" +"al llamar `/profiler save [format]` sin especificar formato." #: src/settings_translation_file.cpp msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"El retraso en milisegundos a partir del cual una interacción táctil es " +"considerada un toque prolongado." #: src/settings_translation_file.cpp msgid "" "The file path relative to your world path in which profiles will be saved to." msgstr "" +"La ruta de archivos relativa a la ruta de los mundos en la que se guardarán " +"los perfiles." #: src/settings_translation_file.cpp msgid "" @@ -6306,15 +6313,26 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"El gesto para golpear jugadores/entidades.\n" +"Los juegos y mods pueden ignorar esto.\n" +"\n" +"* sort_tap\n" +"Fácil de usar y muy conocido por otros juegos que no se mencionarán.\n" +"\n" +"* long_tap\n" +"Conocido por los controles clásicos para móviles de Minetest.\n" +"El combate es más o menos imposible." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" -msgstr "" +msgstr "El identificador del joystick a usar" #: src/settings_translation_file.cpp msgid "" "The length in pixels after which a touch interaction is considered movement." msgstr "" +"La longitud en píxeles a partir de la cual una interacción táctil es " +"considerada movimiento." #: src/settings_translation_file.cpp msgid "" @@ -6342,6 +6360,9 @@ msgid "" "The privileges that new users automatically get.\n" "See /privs in game for a full list on your server and mod configuration." msgstr "" +"Los privilegios que reciben los usuarios nuevos automaticamente.\n" +"Véase /privs en el juego para una lista completa en tu servidor y " +"configuración de mods." #: src/settings_translation_file.cpp msgid "" @@ -6361,6 +6382,10 @@ msgid "" "OpenGL is the default for desktop, and OGLES2 for Android.\n" "Shaders are supported by everything but OGLES1." msgstr "" +"El back-end de renderizado.\n" +"Nota: ¡se requiere reinicio después de cambiar esto!\n" +"OpenGL es el predeterminado para PC, y OGLES2 para Android.\n" +"Los shaders son soportados por todo excepto OGLES1." #: src/settings_translation_file.cpp msgid "" @@ -6394,6 +6419,8 @@ msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" +"El tiempo en segundos entre eventos repetidos al mantener\n" +"presionada una combinación de botones del joystick." #: src/settings_translation_file.cpp msgid "" @@ -6413,6 +6440,10 @@ msgid "" "enabled. Also, the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" +"La distancia vertical sobre la cuál el calor decae a 20 si 'altitude_chill' " +"está activo.\n" +"También, la distancia vertical sobre la cual la humedad decae a 10 si\n" +"'altitude_dry' está activo." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." @@ -6422,13 +6453,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Umbral para toques prolongados" #: src/settings_translation_file.cpp msgid "" "Time in seconds for item entity (dropped items) to live.\n" "Setting it to -1 disables the feature." msgstr "" +"Tiempo, en segundos, de vida de las entidades objeto (objetos soltados).\n" +"Establecerla a -1 desactiva esta característica." #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." @@ -6547,15 +6580,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "Liberar datos no usados del servidor" #: src/settings_translation_file.cpp msgid "Update information URL" -msgstr "" +msgstr "Actualizar información de URLs" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." -msgstr "" +msgstr "Límite Y superior de las mazmorras." #: src/settings_translation_file.cpp msgid "Upper Y limit of floatlands." @@ -6581,13 +6614,15 @@ msgstr "Usar filtrado bilinear al escalar texturas." #: src/settings_translation_file.cpp msgid "Use crosshair for touch screen" -msgstr "" +msgstr "Usar retícula en pantalla táctil" #: src/settings_translation_file.cpp msgid "" "Use crosshair to select object instead of whole screen.\n" "If enabled, a crosshair will be shown and will be used for selecting object." msgstr "" +"Usar la retícula para seleccionar objetos en lugar de usar la pantalla.\n" +"Si está activo, una retícula se mostrará y se usará para seleccionar objetos." #: src/settings_translation_file.cpp msgid "" @@ -6609,6 +6644,9 @@ msgid "" "If both bilinear and trilinear filtering are enabled, trilinear filtering\n" "is applied." msgstr "" +"Usar filtro trilinear al escalar texturas.\n" +"Si tanto los filtros bilinear y trilinear están activos, se aplica\n" +"el filtro trilinear." #: src/settings_translation_file.cpp #, fuzzy @@ -6655,17 +6693,19 @@ msgstr "Variación de la altura maxima de las montañas (En nodos)." #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "" +msgstr "Variación en el número de cuevas." #: src/settings_translation_file.cpp msgid "" "Variation of terrain vertical scale.\n" "When noise is < -0.55 terrain is near-flat." msgstr "" +"Variación de la escala vertical.\n" +"Cuando el ruido es < -0.55 el terreno es casi plano." #: src/settings_translation_file.cpp msgid "Varies depth of biome surface nodes." -msgstr "" +msgstr "Varía la profundidad de los nodos de la superficie de los biomas." #: src/settings_translation_file.cpp msgid "" @@ -6686,10 +6726,12 @@ msgid "" "Vertical screen synchronization. Your system may still force VSync on even " "if this is disabled." msgstr "" +"Sincronización vertical de la pantalla. Tu sistema aún podría forzar la " +"sincronización vertical incluso si está desactivada." #: src/settings_translation_file.cpp msgid "Video driver" -msgstr "" +msgstr "Driver de video" #: src/settings_translation_file.cpp msgid "View bobbing factor" @@ -6713,7 +6755,7 @@ msgstr "Volumen" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Multiplicador de volúmen cuando la ventana está desenfocada." #: src/settings_translation_file.cpp #, fuzzy @@ -6754,6 +6796,7 @@ msgstr "Velocidad del caminar" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." msgstr "" +"Velocidad al caminar, volar y escalar en modo rápido, en nodos por segundo." #: src/settings_translation_file.cpp msgid "Water level" @@ -6761,7 +6804,7 @@ msgstr "Nivel del agua" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "Nivel de superficie de agua del mundo." #: src/settings_translation_file.cpp msgid "Waving Nodes" @@ -6794,7 +6837,7 @@ msgstr "Movimiento de plantas" #: src/settings_translation_file.cpp msgid "Weblink color" -msgstr "" +msgstr "Color de los enlaces web" #: src/settings_translation_file.cpp msgid "" @@ -6875,11 +6918,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." -msgstr "" +msgstr "Ancho de las líneas de la caja de selección alrededor de los nodos." #: src/settings_translation_file.cpp msgid "Window maximized" -msgstr "" +msgstr "Ventana maximizada" #: src/settings_translation_file.cpp msgid "" @@ -6932,6 +6975,7 @@ msgstr "\"Y\" del límite superior de las grandes cuevas." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." msgstr "" +"Distancia en Y sobre la cual las cavernas se expanden a su tamaño completo." #: src/settings_translation_file.cpp msgid "" @@ -6943,7 +6987,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." -msgstr "" +msgstr "Nivel Y de superficie de terreno promedio." #: src/settings_translation_file.cpp msgid "Y-level of cavern upper limit." @@ -6951,7 +6995,7 @@ msgstr "Nivel Y del límite superior de las cavernas." #: src/settings_translation_file.cpp msgid "Y-level of higher terrain that creates cliffs." -msgstr "" +msgstr "Nivel Y de terreno más elevado que crea acantilados." #: src/settings_translation_file.cpp msgid "Y-level of lower terrain and seabed." From 1cd959199751138d0a744c7b600c039912c2919a Mon Sep 17 00:00:00 2001 From: y5nw Date: Thu, 11 Jul 2024 14:34:17 +0000 Subject: [PATCH 17/59] Translated using Weblate (Chinese (Simplified)) Currently translated at 96.1% (1283 of 1335 strings) --- po/zh_CN/minetest.po | 54 +++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/po/zh_CN/minetest.po b/po/zh_CN/minetest.po index cbbca5342..556e9fbf6 100644 --- a/po/zh_CN/minetest.po +++ b/po/zh_CN/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-01-30 16:01+0000\n" -"Last-Translator: yue weikai \n" +"PO-Revision-Date: 2024-07-31 22:09+0000\n" +"Last-Translator: y5nw \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -12,7 +12,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 5.4-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -82,9 +82,8 @@ msgstr "" "使用 '.help ' 获取该命令的更多信息,或使用 '.help all' 列出所有内容。" #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | <命令>]" +msgstr "[all | <命令>] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -151,7 +150,7 @@ msgstr "下载 $1 失败" msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" -msgstr "安装:\"$1\" 的文件类型不支持或压缩包已损坏" +msgstr "无法解压\"$1\":存储空间不足、文件类型不支持或压缩包已损坏" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -182,8 +181,9 @@ msgid "Downloading..." msgstr "下载中..." #: builtin/mainmenu/content/dlg_contentdb.lua +#, fuzzy msgid "Error getting dependencies for package" -msgstr "" +msgstr "无法获取这个包的依赖项" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -1102,7 +1102,7 @@ msgstr "启动游戏" #: builtin/mainmenu/tab_local.lua #, fuzzy msgid "You need to install a game before you can create a world." -msgstr "在安装mod前,你需要先安装一个子游戏" +msgstr "您需要先安装一个子游戏才能创建新的世界。" #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1417,7 +1417,7 @@ msgstr "雾气已启用" #: src/client/game.cpp #, fuzzy msgid "Fog enabled by game or mod" -msgstr "缩放被当前子游戏或 mod 禁用" +msgstr "雾被当前子游戏或 mod 启用" #: src/client/game.cpp msgid "Game info:" @@ -1917,11 +1917,12 @@ msgstr "材质模式小地图" #: src/client/shader.cpp #, fuzzy, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "网页打不开" +msgstr "无法编译“%s”着色器。" #: src/client/shader.cpp +#, fuzzy msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "着色器已启用,但是驱动程序不支持 GLSL。" #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2114,16 +2115,17 @@ msgstr "按键" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "打开" #: src/gui/guiOpenURL.cpp +#, fuzzy msgid "Open URL?" -msgstr "" +msgstr "是否打开网页?" #: src/gui/guiOpenURL.cpp #, fuzzy msgid "Unable to open URL" -msgstr "网页打不开" +msgstr "无法打开网页" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -3335,7 +3337,7 @@ msgstr "启用鼠标滚轮(滚动),以便在热栏中选择项目。" #: src/settings_translation_file.cpp #, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "启用随机用户输入(仅用于测试)。" +msgstr "使用随机顺序加载 mod(主要用于测试)。" #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3428,9 +3430,10 @@ msgid "Enables the post processing pipeline." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." -msgstr "" +msgstr "启用触摸屏模式。启用后您可以使用触摸屏玩游戏。" #: src/settings_translation_file.cpp msgid "" @@ -5097,9 +5100,8 @@ msgstr "" "则不暂停。" #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "地图生成器调试" +msgstr "OpenGL 调试" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5230,7 +5232,7 @@ msgstr "包含液体的大洞穴的比例。" #: src/settings_translation_file.cpp #, fuzzy msgid "Protocol version minimum" -msgstr "协议版本不匹配。 " +msgstr "最低协议版本" #: src/settings_translation_file.cpp msgid "Punch gesture" @@ -5254,8 +5256,9 @@ msgid "Random input" msgstr "随机输入" #: src/settings_translation_file.cpp +#, fuzzy msgid "Random mod load order" -msgstr "" +msgstr "使用随机顺序加载 Mod" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5633,7 +5636,7 @@ msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"设定语言。留空以使用系统语言。\n" +"设定语言。默认使用系统语言。\n" "变更后须重新启动。" #: src/settings_translation_file.cpp @@ -6166,10 +6169,10 @@ msgid "" "OpenGL is the default for desktop, and OGLES2 for Android.\n" "Shaders are supported by everything but OGLES1." msgstr "" -"关于渲染的后端引擎\n" +"用于渲染的后端引擎\n" "注:更改之后要重启游戏!\n" "OpenGL是默认的电脑端渲染引擎,OGLES2是用于安卓的.\n" -"实验性:被OpenGL和OGLES2的着色器." +"除了OGLES1之外的后端引擎都支持着色器" #: src/settings_translation_file.cpp msgid "" @@ -6302,9 +6305,8 @@ msgid "Tradeoffs for performance" msgstr "性能权衡" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "不透明液体" +msgstr "半透明液体" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6573,7 +6575,7 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "Volume when unfocused" -msgstr "游戏暂停时最高 FPS" +msgstr "游戏暂停时的音量" #: src/settings_translation_file.cpp #, fuzzy From aa11c1a2781ac4dd3402f4b47f3d8b56741bfff5 Mon Sep 17 00:00:00 2001 From: waxtatect Date: Sat, 13 Jul 2024 21:17:00 +0000 Subject: [PATCH 18/59] Translated using Weblate (French) Currently translated at 100.0% (1335 of 1335 strings) --- po/fr/minetest.po | 425 +++++++++++++++++++++++----------------------- 1 file changed, 213 insertions(+), 212 deletions(-) diff --git a/po/fr/minetest.po b/po/fr/minetest.po index edf4d6c43..233a963d6 100644 --- a/po/fr/minetest.po +++ b/po/fr/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: French (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2023-12-30 17:06+0000\n" -"Last-Translator: Gaël Chrétien \n" +"PO-Revision-Date: 2024-07-14 21:24+0000\n" +"Last-Translator: waxtatect \n" "Language-Team: French \n" "Language: fr\n" @@ -12,11 +12,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" -msgstr "Effacer la file d'attente du tchat" +msgstr "Effacer la file de messages du tchat" #: builtin/client/chatcommands.lua msgid "Empty command." @@ -44,7 +44,7 @@ msgstr "Joueurs en ligne : " #: builtin/client/chatcommands.lua msgid "The out chat queue is now empty." -msgstr "La file d'attente du tchat est maintenant vide." +msgstr "La file de messages du tchat est maintenant vide." #: builtin/client/chatcommands.lua msgid "This command is disabled by server." @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "Commande non disponible : " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Obtenir de l'aide pour les commandes" +msgstr "Obtenir de l'aide pour les commandes (-t : afficher dans le tchat)" #: builtin/common/chatcommands.lua msgid "" @@ -83,9 +82,8 @@ msgstr "" "pour tout lister." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | ]" +msgstr "[all | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -113,7 +111,7 @@ msgstr "Se reconnecter" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Le serveur demande de se reconnecter :" +msgstr "Le serveur a demandé une reconnexion :" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " @@ -149,13 +147,12 @@ msgid "Failed to download $1" msgstr "Échec du téléchargement de $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Échec de l'extraction de « $1 » (type de fichier non pris en charge ou " -"archive endommagée)" +"Échec de l'extraction de « $1 » (espace disque insuffisant, type de fichier " +"non pris en charge ou archive endommagée)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -187,7 +184,7 @@ msgstr "Téléchargement…" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Erreur d'obtention des dépendances pour le paquet" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -246,7 +243,7 @@ msgstr "Tout mettre à jour [$1]" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "View more information in a web browser" -msgstr "Voir plus d'informations dans un navigateur web" +msgstr "Voir plus d'informations dans le navigateur web" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "You need to install a game before you can install a mod" @@ -336,7 +333,7 @@ msgstr "" #: builtin/mainmenu/content/pkgmgr.lua msgid "Unable to find a valid mod, modpack, or game" -msgstr "Impossible de trouver un mod, un modpack ou un jeu valide" +msgstr "Impossible de trouver un mod, un pack de mods ou un jeu valide" #: builtin/mainmenu/content/pkgmgr.lua msgid "Unable to install a $1 as a $2" @@ -431,7 +428,7 @@ msgstr "Le monde « $1 » existe déjà" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "Terrain supplémentaire" +msgstr "Terrains supplémentaires" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" @@ -443,7 +440,7 @@ msgstr "Faible humidité en altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" -msgstr "Mélange de biomes" +msgstr "Transition des biomes" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" @@ -467,7 +464,7 @@ msgstr "Décorations" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Temples du désert" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -478,6 +475,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Variante de donjon différente générée dans les biomes désertiques (seulement " +"si les donjons sont activés)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -522,7 +521,8 @@ msgstr "Lacs" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" -"Humidité basse et chaleur élevée rendent les rivières peu profondes ou sèches" +"Humidité faible et chaleur élevée rendent les rivières peu profondes ou " +"sèches" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -1037,7 +1037,7 @@ msgstr "Renommer" #: builtin/mainmenu/tab_content.lua msgid "Update available?" -msgstr "Mise à jour disponible ?" +msgstr "Mise à jour disponible ?" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" @@ -1076,15 +1076,16 @@ msgid "Install games from ContentDB" msgstr "Installer des jeux à partir de ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game n'est plus installé par défaut" +msgstr "Minetest est livré sans jeu par défaut." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest est une plateforme de création avec laquelle découvrir de nombreux " +"jeux différents." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1119,9 +1120,8 @@ msgid "Start Game" msgstr "Démarrer" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Vous devez installer un jeu avant d'installer un mod" +msgstr "Vous devez en installer un pour créer un nouveau monde." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1198,7 +1198,7 @@ msgstr "Chargement des textures…" #: src/client/client.cpp msgid "Rebuilding shaders..." -msgstr "Reconstruction des shaders…" +msgstr "Reconstruction des nuanceurs…" #: src/client/clientlauncher.cpp msgid "Could not find or load game: " @@ -1264,7 +1264,7 @@ msgstr "Une erreur de sérialisation est survenue :" #: src/client/game.cpp #, c-format msgid "Access denied. Reason: %s" -msgstr "Accès refusé. Cause : %s" +msgstr "Accès refusé. Raison : %s" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1325,7 +1325,7 @@ msgstr "Connexion au serveur…" #: src/client/game.cpp msgid "Connection error (timed out?)" -msgstr "Erreur de connexion (perdue ?)" +msgstr "Erreur de connexion (délai expiré ?)" #: src/client/game.cpp msgid "Connection failed for unknown reason" @@ -1336,7 +1336,6 @@ msgid "Continue" msgstr "Continuer" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1354,8 +1353,8 @@ msgstr "" "Contrôles :\n" "Sans menu ouvert :\n" "– glissement du doigt : regarder autour\n" -"– appui : placer/utiliser\n" -"– appui long : creuser/frapper/utiliser\n" +"– appui : placer/frapper/utiliser (par défaut)\n" +"– appui long : creuser/utiliser (par défaut)\n" "Menu/Inventaire ouvert :\n" "– double-appui (en dehors) : fermer\n" "– appui sur objets dans l'inventaire : déplacer\n" @@ -1432,9 +1431,8 @@ msgid "Fog enabled" msgstr "Brouillard activé" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Zoom actuellement désactivé par un jeu ou un mod" +msgstr "Brouillard actuellement activé par un jeu ou un mod" #: src/client/game.cpp msgid "Game info:" @@ -1938,13 +1936,14 @@ msgid "Minimap in texture mode" msgstr "Mini-carte en mode texture" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Échec de l'ouverture de la page Web" +msgstr "Échec de la compilation du nuanceur « %s »." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." msgstr "" +"Les nuanceurs sont activés mais GLSL n'est pas pris en charge par le pilote." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -1973,7 +1972,7 @@ msgstr "Certains mods ont des dépendances insatisfaites :" #: src/gui/guiChatConsole.cpp msgid "Failed to open webpage" -msgstr "Échec de l'ouverture de la page Web" +msgstr "Échec de l'ouverture de la page web" #: src/gui/guiChatConsole.cpp msgid "Opening webpage" @@ -2141,16 +2140,15 @@ msgstr "Appuyer sur une touche" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Ouvrir" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Ouvrir l'URL ?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Échec de l'ouverture de la page Web" +msgstr "Impossible d'ouvrir l'URL" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2346,15 +2344,15 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." msgstr "" "Prise en charge de la 3D.\n" -"Actuellement disponible :\n" -"– aucun : pas de sortie 3D.\n" -"– anaglyphe : 3D en couleur cyan/magenta.\n" -"– entrelacé : prise en charge de l'écran avec polarisation basée sur les " +"Actuellement disponible :\n" +"– aucun : pas de sortie 3D.\n" +"– anaglyphe : 3D en couleur cyan/magenta.\n" +"– entrelacé : prise en charge de l'écran avec polarisation basée sur les " "lignes paires/impaires.\n" -"– haut-bas : partage haut et bas de l'écran.\n" -"– côte-à-côte : partage côte à côte de l'écran.\n" -"– vision croisée : vision croisée 3D.\n" -"Noter que le mode entrelacé nécessite que les shaders soient activés." +"– haut-bas : partage haut et bas de l'écran.\n" +"– côte-à-côte : partage côte à côte de l'écran.\n" +"– vision croisée : vision croisée 3D.\n" +"Noter que le mode entrelacé nécessite que les nuanceurs soient activés." #: src/settings_translation_file.cpp msgid "" @@ -2445,7 +2443,7 @@ msgstr "Avancé" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Permet aux liquides d'être translucides." #: src/settings_translation_file.cpp msgid "" @@ -2516,6 +2514,15 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Appliquer le tramage pour réduire les artefacts de bandes de couleur.\n" +"Le tramage augmente significativement la taille des captures d'écran " +"compressées sans perte.\n" +"Ne fonctionne pas correctement si l'affichage ou le système d'exploitation " +"effectue un tramage supplémentaire ou si les canaux de couleur ne sont pas " +"quantifiés à 8 bits.\n" +"Avec OpenGL ES, le tramage fonctionne seulement si les nuanceurs prennent en " +"charge une précision élevée en virgule flottante et cela peut avoir un " +"impact plus important sur les performances." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2534,7 +2541,6 @@ msgid "Ask to reconnect after crash" msgstr "Demander de se reconnecter après une coupure de connexion" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2546,18 +2552,16 @@ msgid "" "optimization.\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"À cette distance le serveur agressivement optimise quels blocs sont envoyés " -"aux clients.\n" +"À cette distance le serveur optimise agressivement les blocs envoyés aux " +"clients.\n" "Des valeurs faibles peuvent augmenter fortement la performance du serveur, " -"mais peut provoquer l'apparition de problèmes de rendu visibles (certains " -"blocs ne sont pas affichés sous l'eau ou dans les cavernes, ou parfois sur " -"terre).\n" +"mais peut provoquer l'apparition de problèmes de rendu (certains blocs " +"peuvent ne pas être rendus correctement dans les grottes).\n" "Une valeur supérieure à « max_block_send_distance » désactive cette " "optimisation.\n" "Établie en blocs de carte (16 nœuds)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2567,14 +2571,13 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"À cette distance le serveur agressivement optimise quels blocs sont envoyés " -"aux clients.\n" -"Des valeurs faibles peuvent augmenter fortement la performance du serveur, " -"mais peut provoquer l'apparition de problèmes de rendu visibles (certains " -"blocs ne sont pas affichés sous l'eau ou dans les cavernes, ou parfois sur " -"terre).\n" -"Une valeur supérieure à « max_block_send_distance » désactive cette " -"optimisation.\n" +"À cette distance le serveur effectue une vérification d'occlusion plus " +"simple et moins coûteuse.\n" +"Des valeurs plus faibles peuvent augmenter la performance du serveur, mais " +"peut provoquer l'apparition de problèmes de rendu (certains blocs ne sont " +"pas visibles).\n" +"Ceci est particulièrement utile pour les très grandes distances de vue (plus " +"de 500).\n" "Établie en blocs de carte (16 nœuds)." #: src/settings_translation_file.cpp @@ -2638,9 +2641,8 @@ msgid "Biome noise" msgstr "Bruit des biomes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Distance d'optimisation d'envoi des blocs" +msgstr "Distance d'optimisation de sélection des blocs" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2845,7 +2847,7 @@ msgstr "Nuages" #: src/settings_translation_file.cpp msgid "Clouds are a client-side effect." -msgstr "Les nuages ont un effet sur le client exclusivement." +msgstr "Activer les nuages côté client." #: src/settings_translation_file.cpp msgid "Clouds in menu" @@ -2864,6 +2866,9 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Liste séparée par des virgules des extensions AL et ALC qui ne doivent pas " +"être utilisées.\n" +"Utile pour les tests. Voir « al_extensions.[h, cpp] » pour plus de détails." #: src/settings_translation_file.cpp msgid "" @@ -2875,13 +2880,13 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" -"Liste des drapeaux séparés par des virgules des paquets à cacher du dépôt " -"des contenus.\n" +"Liste séparés par des virgules des étiquettes des paquets à cacher du dépôt " +"de contenus.\n" "« nonfree » peut être utilisé pour cacher les paquets non libres, comme " "défini par la « Free Software Foundation ».\n" "Vous pouvez aussi spécifier des classifications de contenu.\n" -"Ces drapeaux sont indépendants des versions de Minetest, consulter la liste " -"complète à l'adresse https://content.minetest.net/help/content_flags/." +"Ces étiquettes sont indépendants des versions de Minetest, consulter la " +"liste complète à l'adresse https://content.minetest.net/help/content_flags/." #: src/settings_translation_file.cpp msgid "" @@ -2956,7 +2961,7 @@ msgstr "Dépôt de contenu" #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" -msgstr "Drapeaux de la liste noire de ContentDB" +msgstr "Étiquettes de la liste noire de ContentDB" #: src/settings_translation_file.cpp msgid "ContentDB Max Concurrent Downloads" @@ -2982,8 +2987,8 @@ msgid "" "Controls sinking speed in liquid when idling. Negative values will cause\n" "you to rise instead." msgstr "" -"Contrôle la vitesse d'immersion dans un liquide lorsque inactif. Des valeurs " -"négatives font remonter." +"Contrôle la vitesse d'enfoncement sans mouvement dans un liquide. Les " +"valeurs négatives entraînent la montée." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -3030,7 +3035,7 @@ msgid "" "Also controls the object crosshair color" msgstr "" "Couleur du réticule (R,V,B).\n" -"Contrôle également la couleur du réticule de l'objet." +"Ceci s'applique également à la couleur du réticule de l'objet." #: src/settings_translation_file.cpp msgid "Debug log file size threshold" @@ -3087,7 +3092,6 @@ msgstr "" "ressources." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3099,10 +3103,14 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Activer pour empêcher les anciens clients de se connecter.\n" +"Définit les clients les plus anciens autorisés à se connecter.\n" "Les anciens clients sont compatibles dans le sens où ils ne s'interrompent " "pas lors de la connexion aux serveurs récents,\n" -"mais ils peuvent ne pas prendre en charge certaines fonctionnalités." +"mais ils peuvent ne pas prendre en charge certaines fonctionnalités.\n" +"Cela permet un contrôle plus précis que « strict_protocol_version_checking »." +"\n" +"Minetest applique toujours son propre minimum interne, activer « " +"strict_protocol_version_checking » le remplace." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3194,7 +3202,7 @@ msgid "" "Delay between mesh updates on the client in ms. Increasing this will slow\n" "down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" -"Délai entre les mises à jour du maillage sur le client en ms.\n" +"Délai entre les mises à jour du maillage du client en ms.\n" "Augmenter ceci ralentit le taux de mise à jour et réduit donc les " "tremblements sur les clients lents." @@ -3236,8 +3244,8 @@ msgid "" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" "Des déserts apparaissent lorsque « np_biome » dépasse cette valeur.\n" -"Quand le drapeau « snowbiomes » est activé (avec le nouveau système de " -"biomes), ce paramètre est ignoré." +"Quand l'option « snowbiomes » est activée (avec le nouveau système de biomes)" +", ce paramètre est ignoré." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" @@ -3314,9 +3322,8 @@ msgid "Enable Bloom Debug" msgstr "Activer le débogage du flou lumineux" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Activer les dégâts" +msgstr "Activer le tramage" #: src/settings_translation_file.cpp msgid "" @@ -3331,7 +3338,7 @@ msgid "" "Enable Lua modding support on client.\n" "This support is experimental and API can change." msgstr "" -"Active la prise en charge des mods Lua sur le client.\n" +"Active la prise en charge des mods Lua du client.\n" "Cette option est expérimentale et l'API peut changer." #: src/settings_translation_file.cpp @@ -3345,9 +3352,8 @@ msgstr "" "Sinon, utilise le filtrage PCF." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Post-traitement" +msgstr "Activer le post-traitement" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3385,7 +3391,7 @@ msgstr "Activer les manettes" #: src/settings_translation_file.cpp msgid "Enable joysticks. Requires a restart to take effect" -msgstr "Activer les manettes. Nécessite un redémarrage pour prendre effet." +msgstr "Active les manettes. Nécessite un redémarrage pour prendre effet." #: src/settings_translation_file.cpp msgid "Enable mod channels support." @@ -3402,15 +3408,14 @@ msgstr "" "de la barre d'inventaire." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." msgstr "" -"Active l'entrée aléatoire du joueur (seulement utilisé pour des tests)." +"Active le chargement aléatoire des mods (principalement utilisé pour les " +"tests)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." -msgstr "" -"Active l'entrée aléatoire du joueur (seulement utilisé pour des tests)." +msgstr "Active l'entrée aléatoire du joueur (seulement utilisé pour les tests)." #: src/settings_translation_file.cpp msgid "" @@ -3438,9 +3443,8 @@ msgstr "" "mais ils peuvent ne pas prendre en charge certaines fonctionnalités." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Écran tactile" +msgstr "Activer l'écran tactile" #: src/settings_translation_file.cpp msgid "" @@ -3496,26 +3500,25 @@ msgstr "Active la mise en cache des mailles orientés « facedir »." #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Active le débogage et la vérification des erreurs du pilote OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Active les opérations de post-traitement." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." -msgstr "" +msgstr "Active le mode écran tactile." #: src/settings_translation_file.cpp msgid "" "Enables tradeoffs that reduce CPU load or increase rendering performance\n" "at the expense of minor visual glitches that do not impact game playability." msgstr "" -"Active les compromis qui réduisent la charge du CPU ou améliorent les " +"Active les compromis pour réduire la charge du CPU où améliorer les " "performances de rendu.\n" -"Au détriment de problèmes visuels mineurs qui n'ont pas d'impact sur la " -"jouabilité." +"Au détriment de problèmes visuels mineurs sans impact sur la jouabilité." #: src/settings_translation_file.cpp msgid "Engine Profiler" @@ -3606,7 +3609,7 @@ msgstr "Bruit de profondeur de remplissage" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "Mappage de tons filmique" +msgstr "Activer le mappage de tons filmique" #: src/settings_translation_file.cpp msgid "Filtering and Antialiasing" @@ -3855,10 +3858,10 @@ msgid "" "and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Attributs de génération de terrain globaux.\n" -"Dans le générateur de terrain v6, le drapeau « décorations » contrôle toutes " +"Dans le générateur de terrain v6, l'option « décorations » contrôle toutes " "les décorations sauf les arbres et les herbes de la jungle.\n" -"Dans tous les autres générateurs de terrains, ce drapeau contrôle toutes les " -"décorations." +"Dans tous les autres générateurs de terrains, cette option contrôle toutes " +"les décorations." #: src/settings_translation_file.cpp msgid "" @@ -3941,7 +3944,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Heat blend noise" -msgstr "Bruit de mélange de chaleur" +msgstr "Bruit de transition de chaleur" #: src/settings_translation_file.cpp msgid "Heat noise" @@ -4028,8 +4031,9 @@ msgid "" "How fast liquid waves will move. Higher = faster.\n" "If negative, liquid waves will move backwards." msgstr "" -"Vitesse de déplacement des ondes de liquides. Plus élevée = plus rapide.\n" -"Si elle est négative, les ondes de liquides se déplacent en arrière." +"Vitesse de déplacement des ondulations des liquides. Plus élevée = plus " +"rapide.\n" +"Si elle est négative, les ondulations des liquides se déplacent en arrière." #: src/settings_translation_file.cpp msgid "" @@ -4047,7 +4051,7 @@ msgid "" "Decrease this to increase liquid resistance to movement." msgstr "" "Ralentissement lors du déplacement dans un liquide.\n" -"Réduire ceci pour augmenter la résistance liquide au mouvement." +"Réduire ceci pour augmenter la résistance au mouvement." #: src/settings_translation_file.cpp msgid "How wide to make rivers." @@ -4055,7 +4059,7 @@ msgstr "Largeur des rivières." #: src/settings_translation_file.cpp msgid "Humidity blend noise" -msgstr "Bruit de mélange de l'humidité" +msgstr "Bruit de transition de l'humidité" #: src/settings_translation_file.cpp msgid "Humidity noise" @@ -4114,8 +4118,8 @@ msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" -"Si activé, les actions sont enregistrés pour une restauration éventuelle.\n" -"Cette option est seulement activé quand le serveur démarre." +"Si activé, les actions sont enregistrées pour une restauration éventuelle.\n" +"Cette option est lue seulement au démarrage du serveur." #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." @@ -4459,19 +4463,19 @@ msgstr "" "– opaque : désactive la transparence" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Durée d'intervalle serveur et intervalle auquel les objets sont généralement " -"mis à jour sur le réseau, établie en secondes." +"Durée d'intervalle serveur (intervalle auquel tout est généralement mis à " +"jour), établie en secondes.\n" +"Ne s'applique pas aux sessions hébergées à partir du menu client." #: src/settings_translation_file.cpp msgid "Length of liquid waves." -msgstr "Longueur des ondes de liquides." +msgstr "Longueur de l'ondulation des liquides." #: src/settings_translation_file.cpp msgid "" @@ -4585,7 +4589,7 @@ msgstr "Délai de nettoyage d'une file de liquide" #: src/settings_translation_file.cpp msgid "Liquid sinking" -msgstr "Écoulement du liquide" +msgstr "Enfoncement dans un liquide" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." @@ -4687,18 +4691,17 @@ msgid "" "'altitude_dry': Reduces humidity with altitude." msgstr "" "Attributs spécifiques au générateur de terrain vallées.\n" -"« altitude_chill » : réduit la chaleur avec l’altitude.\n" -"« humid_rivers » : augmente l’humidité autour des rivières.\n" -"« vary_river_dept » : si activé, une humidité basse et une chaleur élevée " +"« altitude_chill » : réduit la chaleur avec l’altitude.\n" +"« humid_rivers » : augmente l’humidité autour des rivières.\n" +"« vary_river_dept » : si activé, une humidité faible et une chaleur élevée " "rendent les rivières moins profondes et parfois sèches.\n" -"« altitude_dry » : réduit l’humidité avec l’altitude." +"« altitude_dry » : réduit l’humidité avec l’altitude." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." msgstr "Attributs spécifiques au générateur de terrain v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4708,9 +4711,11 @@ msgid "" "will appear instead." msgstr "" "Attributs spécifiques au générateur de terrain v6.\n" -"Le drapeau « snowbiomes » active le nouveau système à 5 biomes.\n" -"Lorsque le drapeau « snowbiomes » est activé, les jungles sont " -"automatiquement activées et le drapeau « jungles » est ignoré." +"L'option « snowbiomes » active le nouveau système à 5 biomes.\n" +"Lorsque l'option « snowbiomes » est activée, les jungles sont " +"automatiquement activées et l'option « jungles » est ignorée.\n" +"L'option « temples » désactive la génération de temples dans le désert. Des " +"donjons normaux sont ajoutés à la place." #: src/settings_translation_file.cpp msgid "" @@ -4720,10 +4725,10 @@ msgid "" "'caverns': Giant caves deep underground." msgstr "" "Attributs spécifiques au générateur de terrain v7.\n" -"« montagnes » : montagnes.\n" -"« crêtes » : rivières.\n" -"« terrains flottants » : masses de terrains flottants dans l'atmosphère.\n" -"« cavernes » : cavernes immenses souterraines profondes." +"« montagnes » : montagnes.\n" +"« crêtes » : rivières.\n" +"« terrains flottants » : masses de terrains flottants dans l'atmosphère.\n" +"« cavernes » : cavernes immenses loin sous la surface." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -4759,7 +4764,7 @@ msgstr "Générateur de terrain carpatien" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain carpatien" +msgstr "Options spécifiques au générateur de terrain carpatien" #: src/settings_translation_file.cpp msgid "Mapgen Flat" @@ -4767,7 +4772,7 @@ msgstr "Générateur de terrain plat" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain plat" +msgstr "Options spécifiques au générateur de terrain plat" #: src/settings_translation_file.cpp msgid "Mapgen Fractal" @@ -4775,7 +4780,7 @@ msgstr "Générateur de terrain fractal" #: src/settings_translation_file.cpp msgid "Mapgen Fractal specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain fractal" +msgstr "Options spécifiques au générateur de terrain fractal" #: src/settings_translation_file.cpp msgid "Mapgen V5" @@ -4783,7 +4788,7 @@ msgstr "Générateur de terrain v5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain v5" +msgstr "Options spécifiques au générateur de terrain v5" #: src/settings_translation_file.cpp msgid "Mapgen V6" @@ -4791,7 +4796,7 @@ msgstr "Générateur de terrain v6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain v6" +msgstr "Options spécifiques au générateur de terrain v6" #: src/settings_translation_file.cpp msgid "Mapgen V7" @@ -4799,7 +4804,7 @@ msgstr "Générateur de terrain v7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain v7" +msgstr "Options spécifiques au générateur de terrain v7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" @@ -4807,7 +4812,7 @@ msgstr "Générateur de terrain vallées" #: src/settings_translation_file.cpp msgid "Mapgen Valleys specific flags" -msgstr "Drapeaux spécifiques au générateur de terrain vallées" +msgstr "Options spécifiques au générateur de terrain vallées" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -4874,8 +4879,8 @@ msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" -"Résistance maximale aux liquides. Contrôle la décélération lorsqu'un joueur " -"entre dans un liquide à haute vitesse." +"Résistance maximale aux liquides. Contrôle la décélération lors de l'entrée " +"dans un liquide à haute vitesse." #: src/settings_translation_file.cpp msgid "" @@ -4917,7 +4922,7 @@ msgid "" "be queued.\n" "This should be lower than curl_parallel_limit." msgstr "" -"Nombre maximal de téléchargements simultanés. Les téléchargements dépassant " +"Nombre maximal de téléchargements simultanés. Les téléchargements au-delà de " "cette limite sont mis en file d'attente.\n" "Ce nombre doit être inférieur à la limite de « curl_parallel_limit »." @@ -5027,9 +5032,8 @@ msgid "Minimap scan height" msgstr "Hauteur de balayage de la mini-carte" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Intervalle de répétition du placement" +msgstr "Intervalle de répétition minimale du minage" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -5102,9 +5106,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Facteur de sensibilité de la souris." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Seuil des cavernes" +msgstr "Sensibilité tactile" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5266,9 +5269,8 @@ msgstr "" "pas en pause si un formspec est ouvert." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Débogage de la génération de terrain" +msgstr "Débogage OpenGL" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5297,8 +5299,8 @@ msgid "" "Path to shader directory. If no path is defined, default location will be " "used." msgstr "" -"Répertoire des shaders. Si le chemin n'est pas défini, le chemin par défaut " -"est utilisé." +"Répertoire des nuanceurs. Si le chemin n'est pas défini, le chemin par " +"défaut est utilisé." #: src/settings_translation_file.cpp msgid "" @@ -5408,13 +5410,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Proportion de grandes grottes qui contiennent du liquide." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "La version du protocole ne correspond pas. " +msgstr "Version du protocole minimale" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Gestes tactiles" #: src/settings_translation_file.cpp msgid "" @@ -5436,7 +5437,7 @@ msgstr "Entrée aléatoire" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Ordre de chargement aléatoire des mods" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5625,8 +5626,8 @@ msgid "" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" -"Qualité des captures d'écran. Utilisé uniquement pour le format JPEG.\n" -"1 signifie mauvaise qualité ; 100 signifie la meilleure qualité.\n" +"Qualité des captures d'écran. Utilisé seulement pour le format JPEG.\n" +"1 signifie mauvaise qualité ; 100 signifie la meilleure qualité.\n" "Utiliser 0 pour la qualité par défaut." #: src/settings_translation_file.cpp @@ -5652,7 +5653,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Voir http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Select the antialiasing method to apply.\n" "\n" @@ -5677,16 +5677,17 @@ msgstr "" "\n" "* Aucun – Pas d'anticrénelage (par défaut)\n" "\n" -"* FSAA – Anticrénelage de la scène complète (incompatible avec les shaders)\n" +"* FSAA – Anticrénelage de la scène complète (incompatible avec « Post-" +"traitement » et « Sous-échantillonnage »)\n" "Alias anticrénelage multi-échantillon (MSAA), lisse les bords des blocs mais " "n'affecte pas l'intérieur des textures.\n" "Un redémarrage est nécessaire pour modifier cette option.\n" "\n" -"* FXAA – Anticrénelage approximatif rapide (nécessite des shaders)\n" +"* FXAA – Anticrénelage approximatif rapide (nécessite des nuanceurs)\n" "Applique un filtre de post-traitement pour détecter et lisser les bords à " "contraste élevé, fournit un équilibre entre vitesse et qualité d'image.\n" "\n" -"* SSAA – Anticrénelage par super-échantillonnage (nécessite des shaders)\n" +"* SSAA – Anticrénelage par super-échantillonnage (nécessite des nuanceurs)\n" "Rendu d'une image haute résolution de la scène, puis réduit l'échelle pour " "diminuer le crénelage. C'est la méthode la plus lente et la plus précise." @@ -5818,12 +5819,11 @@ msgstr "" "Plage : de -1 à 1,0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"Définit la langue. Laisser vide pour utiliser la langue du système.\n" +"Définit la langue. Par défaut, la langue du système est utilisée.\n" "Un redémarrage est nécessaire après cette modification." #: src/settings_translation_file.cpp @@ -5869,7 +5869,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." -msgstr "" +msgstr "Active l'éclairage volumétrique (parfois appelé « rayons de Dieu »)." #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5881,7 +5881,7 @@ msgstr "Active l'ondulation des liquides (comme l'eau)." #: src/settings_translation_file.cpp msgid "Set to true to enable waving plants." -msgstr "Active l'ondulation des végétaux." +msgstr "Active l'ondulation des plantes." #: src/settings_translation_file.cpp msgid "" @@ -5908,22 +5908,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Shader path" -msgstr "Chemin des shaders" +msgstr "Chemin des nuanceurs" #: src/settings_translation_file.cpp msgid "Shaders" msgstr "Nuanceurs" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" -"Les nuanceurs (« shaders ») permettent des effets visuels avancés et peuvent " -"améliorer les performances de certaines cartes graphiques.\n" -"Fonctionne seulement avec OpenGL." +"Les nuanceurs permettent des effets visuels avancés et peuvent améliorer les " +"performances de certaines cartes graphiques." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -6049,14 +6047,12 @@ msgid "Smooth lighting" msgstr "Lissage de l'éclairage" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." msgstr "" "Lisse la rotation de la caméra en mode cinématique, 0 pour désactiver.\n" -"Entrer le mode cinématique en utilisant la touche définie dans « Changer les " -"touches »." +"Entrer le mode cinématique en utilisant la touche définie dans « Contrôles »." #: src/settings_translation_file.cpp msgid "" @@ -6083,9 +6079,8 @@ msgid "Sound" msgstr "Audio" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "Drapeaux de la liste noire de ContentDB" +msgstr "Extensions de la liste noire audio" #: src/settings_translation_file.cpp msgid "" @@ -6152,7 +6147,7 @@ msgstr "Bruit d'étalement des plateaux montagneux" #: src/settings_translation_file.cpp msgid "Strength of 3D mode parallax." -msgstr "Intensité de parallaxe en mode 3D." +msgstr "Intensité parallaxe en mode 3D." #: src/settings_translation_file.cpp msgid "" @@ -6302,6 +6297,8 @@ msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"Délai en millisecondes après lequel une interaction tactile est considérée " +"comme un appui long." #: src/settings_translation_file.cpp msgid "" @@ -6322,18 +6319,26 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"Geste pour frapper les joueurs/entités.\n" +"Il peut être remplacé par les jeux et les mods.\n" +"\n" +"* appui bref\n" +"Facile à utiliser et bien connu dans d'autres jeux.\n" +"\n" +"* appui long\n" +"Connu des contrôles classiques de Minetest mobile.\n" +"Le combat est plus ou moins impossible." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" -msgstr "L'identifiant de la manette à utiliser." +msgstr "Identifiant de la manette à utiliser." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." msgstr "" -"Longueur en pixels nécessaire pour que l'interaction avec l'écran tactile " -"commence." +"Longueur en pixels après laquelle une interaction tactile est considérée " +"comme un mouvement." #: src/settings_translation_file.cpp msgid "" @@ -6342,23 +6347,22 @@ msgid "" "0.0 = Wave doesn't move at all.\n" "Default is 1.0 (1/2 node)." msgstr "" -"Hauteur maximale de la surface des liquides ondulants.\n" +"Hauteur maximale de la surface d'ondulation des liquides.\n" "4,0 – la hauteur des vagues est de deux blocs.\n" "0,0 – la vague ne bouge pas du tout.\n" "Par défaut est de 1,0 (1/2 bloc)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." msgstr "" -"Temps en secondes entre des placements de blocs répétés lors du maintien du " -"bouton de placement." +"Durée minimale en secondes entre le minage de blocs lors du maintien du " +"bouton ceuser." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "L'interface réseau que le serveur écoute." +msgstr "Interface réseau d'écoute du serveur." #: src/settings_translation_file.cpp msgid "" @@ -6387,7 +6391,6 @@ msgstr "" "Ceci doit être configuré avec « active_object_send_range_blocks »." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" @@ -6395,10 +6398,10 @@ msgid "" "Shaders are supported by everything but OGLES1." msgstr "" "Le moteur de rendu.\n" -"Remarque : un redémarrage est nécessaire après cette modification !\n" +"Remarque : un redémarrage est nécessaire après cette modification !\n" "OpenGL est la valeur par défaut pour les ordinateurs de bureau et OGLES2 " "pour Android.\n" -"Les shaders sont pris en charge par OpenGL et OGLES2 (expérimental)." +"Les nuanceurs sont pris en charge par tout sauf OGLES1." #: src/settings_translation_file.cpp msgid "" @@ -6416,8 +6419,8 @@ msgid "" "set to the nearest valid value." msgstr "" "Intensité (obscurité) de l'ombrage des blocs avec l'occlusion ambiante.\n" -"Les valeurs plus basses sont plus sombres, les valeurs plus hautes sont plus " -"claires.\n" +"Les valeurs plus faibles sont plus sombres, les valeurs plus hautes sont " +"plus claires.\n" "Une plage valide de valeurs pour ceci se situe entre 0,25 et 4,0.\n" "Si la valeur est en dehors de cette plage alors elle est définie à la plus " "proche des valeurs valides." @@ -6480,7 +6483,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Sensibilité pour les appuis longs" #: src/settings_translation_file.cpp msgid "" @@ -6543,9 +6546,8 @@ msgid "Tradeoffs for performance" msgstr "Compromis pour la performance" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Liquides opaques" +msgstr "Liquides translucides" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6594,14 +6596,14 @@ msgstr "" "performance." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "URL to JSON file which provides information about the newest Minetest " "release\n" "If this is empty the engine will never check for updates." msgstr "" "URL du fichier JSON qui fournit des informations sur la nouvelle version de " -"Minetest" +"Minetest.\n" +"Si ce champ est vide, le moteur ne vérifie pas les mises à jour." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6668,14 +6670,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Use crosshair for touch screen" -msgstr "Utiliser le réticule pour l'écran tactile" +msgstr "Utiliser le réticule" #: src/settings_translation_file.cpp msgid "" "Use crosshair to select object instead of whole screen.\n" "If enabled, a crosshair will be shown and will be used for selecting object." msgstr "" -"Utiliser le réticule pour la sélection d'objets au lieu de l'écran entier.\n" +"Utiliser le réticule pour la sélection d'objets au lieu de l'ensemble de " +"l'écran.\n" "Si activé, un réticule est affiché et utilisé pour la sélection d'objets." #: src/settings_translation_file.cpp @@ -6695,11 +6698,11 @@ msgid "" "This flag enables use of raytraced occlusion culling test for\n" "client mesh sizes smaller than 4x4x4 map blocks." msgstr "" -"Utiliser l'élimination des blocs invisibles par Ray Tracing dans le nouvel " +"Utiliser l'élimination des blocs invisibles par Ray Tracing avec le nouvel " "algorithme.\n" -"Ce drapeau active l'utilisation du test d'élimination des blocs invisibles " +"Cette option active l'utilisation du test d'élimination des blocs invisibles " "par Ray Tracing,\n" -"pour les maillages clients de taille inférieure à 4×4×4 blocs de carte." +"pour les maillages clients de taille inférieure à 4 × 4 × 4 blocs de carte." #: src/settings_translation_file.cpp msgid "" @@ -6775,8 +6778,8 @@ msgid "" "Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" "Variation de la rugosité du terrain.\n" -"Définit la valeur de « persistance » pour les bruits terrain_base et " -"terrain_alt." +"Définit la valeur de « persistance » pour les bruits « terrain_base » et « " +"terrain_alt »." #: src/settings_translation_file.cpp msgid "Varies steepness of cliffs." @@ -6820,7 +6823,7 @@ msgstr "Volume du son" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Facteur du volume fenêtre non sélectionnée." #: src/settings_translation_file.cpp msgid "" @@ -6831,14 +6834,12 @@ msgstr "" "Nécessite le son système pour être activé." #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "IPS fenêtre non sélectionnée ou jeu mis en pause" +msgstr "Volume fenêtre non sélectionnée" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "Lissage de l'éclairage" +msgstr "Éclairage volumétrique" #: src/settings_translation_file.cpp msgid "" @@ -6881,27 +6882,27 @@ msgstr "Environnement mouvant" #: src/settings_translation_file.cpp msgid "Waving leaves" -msgstr "Feuilles ondulantes" +msgstr "Ondulation des feuilles" #: src/settings_translation_file.cpp msgid "Waving liquids" -msgstr "Liquides ondulants" +msgstr "Ondulation des liquides" #: src/settings_translation_file.cpp msgid "Waving liquids wave height" -msgstr "Hauteur des vagues des liquides ondulants" +msgstr "Hauteur des vagues de l'ondulation des liquides" #: src/settings_translation_file.cpp msgid "Waving liquids wave speed" -msgstr "Vitesse de déplacement des liquides ondulants" +msgstr "Vitesse de déplacement de l'ondulation des liquides" #: src/settings_translation_file.cpp msgid "Waving liquids wavelength" -msgstr "Longueur d'onde des liquides ondulants" +msgstr "Longueur d'onde de l'ondulation des liquides" #: src/settings_translation_file.cpp msgid "Waving plants" -msgstr "Plantes ondulantes" +msgstr "Ondulation des plantes" #: src/settings_translation_file.cpp msgid "Weblink color" @@ -6943,12 +6944,12 @@ msgid "" msgstr "" "En utilisant le filtrage bilinéaire/trilinéaire/anisotrope, les textures de " "basse résolution peuvent être floues.\n" -"Elles sont donc agrandies avec l'interpolation du plus proche voisin pour " +"Elles sont donc agrandies avec l'interpolation au plus proche voisin pour " "préserver des pixels nets.\n" -"Ceci détermine la taille minimale pour les textures agrandies ;\n" +"Ceci détermine la taille minimale pour les textures agrandies ;\n" "les valeurs plus élevées ont un rendu plus net, mais nécessitent plus de " "mémoire. Les puissances de 2 sont recommandées.\n" -"Ce paramètre est appliqué uniquement si le filtrage bilinéaire/trilinéaire/" +"Ce paramètre est appliqué seulement si le filtrage bilinéaire/trilinéaire/" "anisotrope est activé.\n" "Ceci est également utilisé comme taille de texture de nœud de base pour " "l'agrandissement automatique des textures alignées sur le monde." @@ -7008,7 +7009,7 @@ msgid "" "Whether to show the client debug info (has the same effect as hitting F5)." msgstr "" "Détermine la visibilité des informations de débogage du client (même effet " -"que taper F5)." +"que d'appuyer sur F5)." #: src/settings_translation_file.cpp msgid "Width component of the initial window size." @@ -7038,7 +7039,7 @@ msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" -"Chemin du monde (tout ce qui relatif au monde est enregistré ici).\n" +"Chemin du monde (tout ce qui existe dans le monde est enregistré ici).\n" "Inutile si démarré depuis le menu." #: src/settings_translation_file.cpp From 3d556da8b853739cb3ad7569dbc40a20d71f82b7 Mon Sep 17 00:00:00 2001 From: Yic95 <0Luke.Luke0@gmail.com> Date: Sat, 13 Jul 2024 15:25:11 +0000 Subject: [PATCH 19/59] Translated using Weblate (Chinese (Traditional)) Currently translated at 91.3% (1220 of 1335 strings) --- po/zh_TW/minetest.po | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po index f0793a6a6..a9a0601be 100644 --- a/po/zh_TW/minetest.po +++ b/po/zh_TW/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Chinese (Traditional) (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-01-14 12:31+0000\n" -"Last-Translator: reimu105 \n" +"PO-Revision-Date: 2024-07-13 21:31+0000\n" +"Last-Translator: Yic95 <0Luke.Luke0@gmail.com>\n" "Language-Team: Chinese (Traditional) \n" "Language: zh_TW\n" @@ -12,7 +12,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 5.4-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -5252,26 +5252,24 @@ msgid "Prometheus listener address" msgstr "Prometheus 監聽器位址" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Prometheus listener address.\n" "If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" "Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" -"Prometheus 监听器地址。\n" -"如果Minetest在编译时启用了ENABLE_PROMETHEUS选项,\n" -"在该地址上为 Prometheus 启用指标侦听器。\n" -"可以从 http://127.0.0.1:30000/metrics 获取指标" +"Prometheus 監聽器地址。\n" +"如果Minetest在編輯時啓用了ENABLE_PROMETHEUS選項,\n" +"在該地址上為 Prometheus 啓用指標偵聽器。\n" +"可以從 http://127.0.0.1:30000/metrics 獲取指標" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." msgstr "含有液體的大型洞穴的比例。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "協定版本不符合。 " +msgstr "協定版本不符合" #: src/settings_translation_file.cpp msgid "Punch gesture" @@ -5296,7 +5294,7 @@ msgstr "隨機輸入" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "依隨機順序載入 mod" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" From aeda08c109cf1403df62ddf8265f1c324fbfaad9 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sat, 13 Jul 2024 23:56:57 +0000 Subject: [PATCH 20/59] Translated using Weblate (Spanish) Currently translated at 91.9% (1227 of 1335 strings) --- po/es/minetest.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/po/es/minetest.po b/po/es/minetest.po index 3a4675c38..45b0a46a2 100644 --- a/po/es/minetest.po +++ b/po/es/minetest.po @@ -4,7 +4,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" "PO-Revision-Date: 2024-07-14 21:23+0000\n" -"Last-Translator: Jorge Rodríguez \n" +"Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "Comando no disponible: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Obtener ayuda para los comandos" +msgstr "Obtener ayuda para los comandos (-t: salida en el chat)" #: builtin/common/chatcommands.lua msgid "" @@ -83,9 +82,8 @@ msgstr "" "todo." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[todo | ]" +msgstr "[all | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -148,12 +146,12 @@ msgid "Failed to download $1" msgstr "Fallo al descargar $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Fallo al extraer \"$1\" (Formato de archivo no soportado o archivo corrupto)" +"No se pudo extraer \"$1\" (espacio en disco insuficiente, tipo de archivo no " +"compatible o archivo dañado)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" From 5142f328785858e3e2ec84a4d5fd99260675ba27 Mon Sep 17 00:00:00 2001 From: ninjum Date: Sat, 13 Jul 2024 23:58:27 +0000 Subject: [PATCH 21/59] Translated using Weblate (Galician) Currently translated at 86.5% (1156 of 1335 strings) --- po/gl/minetest.po | 772 ++++++++++++++++++++++++---------------------- 1 file changed, 407 insertions(+), 365 deletions(-) diff --git a/po/gl/minetest.po b/po/gl/minetest.po index 7ee42a078..2f28367e4 100644 --- a/po/gl/minetest.po +++ b/po/gl/minetest.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-07-08 19:09+0000\n" +"PO-Revision-Date: 2024-07-20 23:09+0000\n" "Last-Translator: ninjum \n" "Language-Team: Galician \n" @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "Comando non dispoñible: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Obter axuda para os comandos" +msgstr "Obteña axuda para os comandos (-t: saída no chat)" #: builtin/common/chatcommands.lua msgid "" @@ -83,9 +82,8 @@ msgstr "" "lista completa." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | ]" +msgstr "[todo | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -137,7 +135,7 @@ msgstr "Só admítense as versións de protocolo entre $1 e $2." #: builtin/mainmenu/content/contentdb.lua msgid "Error installing \"$1\": $2" -msgstr "" +msgstr "Erro ao instalar \"$1\": $2" #: builtin/mainmenu/content/contentdb.lua msgid "Failed to download \"$1\"" @@ -148,12 +146,12 @@ msgid "Failed to download $1" msgstr "Erro ao descargar $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Instalación: Formato de ficheiro \"$1\" non compatible ou ficheiro corrupto" +"Non se puido extraer '$1' (espazo en disco insuficiente, tipo de arquivo non " +"compatible ou arquivo danado)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -185,7 +183,7 @@ msgstr "Descargando..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Produciuse un erro ao obter dependencias para o paquete" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -224,7 +222,7 @@ msgstr "En cola" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Texture packs" -msgstr "Paq. de text." +msgstr "Paquetes de texturas" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "The package $1 was not found." @@ -248,7 +246,7 @@ msgstr "Ver máis información nun navegador web" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "You need to install a game before you can install a mod" -msgstr "" +msgstr "Precisas instalar un xogo antes de poder instalar un mod" #: builtin/mainmenu/content/dlg_install.lua msgid "$1 and $2 dependencies will be installed." @@ -328,21 +326,16 @@ msgid "Failed to install $1 to $2" msgstr "Error ao instalar $1 en $2" #: builtin/mainmenu/content/pkgmgr.lua -#, fuzzy msgid "Install: Unable to find suitable folder name for $1" -msgstr "" -"Instalación do mod: Non se puido atopar un nome de cartafol adecuado para o " -"paquete de mods $1" +msgstr "Instalación: Non se puido atopar un nome de carpeta adecuado para $1" #: builtin/mainmenu/content/pkgmgr.lua -#, fuzzy msgid "Unable to find a valid mod, modpack, or game" -msgstr "Non se puido atopar un mod ou paquete de mods válido" +msgstr "Non se puido atopar un mod, paquete de mods ou xogo válido" #: builtin/mainmenu/content/pkgmgr.lua -#, fuzzy msgid "Unable to install a $1 as a $2" -msgstr "Non se puido instalar un mod como $1" +msgstr "Non se puido instalar un $1 como un $2" #: builtin/mainmenu/content/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" @@ -468,7 +461,7 @@ msgstr "Decoracións" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Templos do deserto" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -479,6 +472,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Variante de calabozo diferente xerada en biomas do deserto (só se os alxubes " +"están habilitados)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -675,7 +670,7 @@ msgstr "Rexistrarse" #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "Dismiss" -msgstr "" +msgstr "Descartar" #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "" @@ -683,21 +678,25 @@ msgid "" "\"Minetest Game\". Since Minetest 5.8.0, Minetest ships without a default " "game." msgstr "" +"Durante moito tempo, o motor Minetest incluía un xogo predeterminado chamado " +"\"Minetest Game\". Dende Minetest 5.8.0, Minetest inclúese sen un xogo " +"predeterminado." #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "" "If you want to continue playing in your Minetest Game worlds, you need to " "reinstall Minetest Game." msgstr "" +"Se queres seguir xogando nos teus mundos de Minetest, precisarás reinstalar " +"Minetest Game." #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "Minetest Game is no longer installed by default" -msgstr "" +msgstr "Minetest Game xa non se instala por defecto" #: builtin/mainmenu/dlg_reinstall_mtg.lua -#, fuzzy msgid "Reinstall Minetest Game" -msgstr "Instalar outro xogo" +msgstr "Reinstalar Minetest Game" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" @@ -726,6 +725,10 @@ msgid "" "Visit $3 to find out how to get the newest version and stay up to date with " "features and bugfixes." msgstr "" +"Versión instalada: $1\n" +"Nova versión: $2\n" +"Visita $3 para saber como obter a versión máis recente e estar ao día cas " +"características e correccións de erros." #: builtin/mainmenu/dlg_version_info.lua msgid "Later" @@ -770,9 +773,8 @@ msgid "Select file" msgstr "Seleccionar ficheiro" #: builtin/mainmenu/settings/components.lua -#, fuzzy msgid "Set" -msgstr "Seleccionar" +msgstr "Establecer" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua msgid "(No description of setting given)" @@ -841,16 +843,15 @@ msgstr "Suavizado" #: builtin/mainmenu/settings/dlg_settings.lua msgid "(Use system language)" -msgstr "" +msgstr "(Usar a linguaxe do sistema)" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Accessibility" -msgstr "" +msgstr "Accesibilidade" #: builtin/mainmenu/settings/dlg_settings.lua -#, fuzzy msgid "Back" -msgstr "Atrás" +msgstr "Voltar" #: builtin/mainmenu/settings/dlg_settings.lua src/gui/guiKeyChangeMenu.cpp #: src/settings_translation_file.cpp @@ -871,18 +872,16 @@ msgid "General" msgstr "Xeral" #: builtin/mainmenu/settings/dlg_settings.lua -#, fuzzy msgid "Movement" -msgstr "Movemento rápido" +msgstr "Movemento" #: builtin/mainmenu/settings/dlg_settings.lua -#, fuzzy msgid "Reset setting to default" -msgstr "Restaurar" +msgstr "Restablecer a configuración predeterminada" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Reset setting to default ($1)" -msgstr "" +msgstr "Restablecer a configuración predeterminada ($1)" #: builtin/mainmenu/settings/dlg_settings.lua builtin/mainmenu/tab_online.lua msgid "Search" @@ -890,7 +889,7 @@ msgstr "Procurar" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Show advanced settings" -msgstr "" +msgstr "Amosar configuracións avanzadas" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Show technical names" @@ -910,11 +909,11 @@ msgstr "Contido: Mods" #: builtin/mainmenu/settings/shadows_component.lua msgid "(The game will need to enable shadows as well)" -msgstr "" +msgstr "(O xogo tamén precisará activar as sombras)" #: builtin/mainmenu/settings/shadows_component.lua msgid "Custom" -msgstr "" +msgstr "Personalizado" #: builtin/mainmenu/settings/shadows_component.lua msgid "Disabled" @@ -963,11 +962,11 @@ msgstr "Desenvolvedores principais" #: builtin/mainmenu/tab_about.lua msgid "Core Team" -msgstr "" +msgstr "Equipo Central" #: builtin/mainmenu/tab_about.lua msgid "Irrlicht device:" -msgstr "" +msgstr "Dispositivo Irrlicht:" #: builtin/mainmenu/tab_about.lua msgid "Open User Data Directory" @@ -998,18 +997,16 @@ msgid "Browse online content" msgstr "Explorar contido en liña" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Browse online content [$1]" -msgstr "Explorar contido en liña" +msgstr "Navegar polo contido en liña [$1]" #: builtin/mainmenu/tab_content.lua msgid "Content" msgstr "Contido" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Content [$1]" -msgstr "Contido" +msgstr "Contido [$1]" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" @@ -1073,13 +1070,15 @@ msgstr "Instalar xogos do ContentDB" #: builtin/mainmenu/tab_local.lua msgid "Minetest doesn't come with a game by default." -msgstr "" +msgstr "Minetest non trae un xogo por defecto." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest é unha plataforma de creación de xogos que che permite xogar a " +"moitos xogos diferentes." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1115,7 +1114,7 @@ msgstr "Xogar só" #: builtin/mainmenu/tab_local.lua msgid "You need to install a game before you can create a world." -msgstr "" +msgstr "Tes que instalar un xogo antes de poder crear un mundo." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1245,7 +1244,7 @@ msgstr "- Público: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- PvP: " +msgstr "- Xogador contra xogador: " #: src/client/game.cpp msgid "- Server Name: " @@ -1289,10 +1288,9 @@ msgid "Camera update enabled" msgstr "Actualización da cámara activada" #: src/client/game.cpp -#, fuzzy msgid "Can't show block bounds (disabled by game or mod)" msgstr "" -"Non se puido mostrar os límites de bloco (é preciso o permiso 'basic_debug')" +"Non se poden amosar os límites dos bloques (desactivado polo xogo ou mod)" #: src/client/game.cpp msgid "Change Password" @@ -1331,7 +1329,6 @@ msgid "Continue" msgstr "Continuar" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1346,18 +1343,18 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" -"Controis por defecto:\n" -"Menú oculto:\n" -"- Un clic: activa botón\n" -"- Dobre clic: colocar/usar\n" -"- Deslizar dedo: mirar arredor\n" -"Menú/inventario visible:\n" -"- Dobre clic: (fóra do menú/inventario):\n" -" -->pechar\n" -"- Clic no obxecto e logo clic nun compartimento:\n" -" --> mover obxecto\n" -"- Clic e arrastar, e logo clic con os dous dedos\n" -" --> colocar un só obxecto\n" +"Controis:\n" +"Sen menú aberto:\n" +"- deslizar o dedo: mirar arredor\n" +"- toque: colocar/perforar/utilizar (predeterminado)\n" +"- Toque longo: cavar/utilizar (predeterminado)\n" +"Menú/inventario aberto:\n" +"- Dobre toque (exterior):\n" +" --> pechar\n" +"- pila táctil, rañura táctil:\n" +" --> mover pila\n" +"- toca e arrastra, toca co segundo dedo\n" +" --> coloca un único elemento na rañura\n" #: src/client/game.cpp #, c-format @@ -1431,9 +1428,8 @@ msgid "Fog enabled" msgstr "Néboa activada" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "O zoom está actualmente desactivado polo xogo ou mod" +msgstr "Néboa habilitada polo xogo ou mod" #: src/client/game.cpp msgid "Game info:" @@ -1555,28 +1551,27 @@ msgid "Unable to listen on %s because IPv6 is disabled" msgstr "Non se puido escoitar %s porque o IPv6 está desactivado" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range disabled" -msgstr "Campo de visión ilimitada activado" +msgstr "Desactivado o rango de visión ilimitado" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range enabled" -msgstr "Campo de visión ilimitada activado" +msgstr "Rango de visualización ilimitado activado" #: src/client/game.cpp msgid "Unlimited viewing range enabled, but forbidden by game or mod" -msgstr "" +msgstr "Alcance de visión ilimitado activado, pero prohibido polo xogo ou mod" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing changed to %d (the minimum)" -msgstr "O campo de visión está ao mínimo: %d" +msgstr "Visualización cambiada a %d (o mínimo)" #: src/client/game.cpp #, c-format msgid "Viewing changed to %d (the minimum), but limited to %d by game or mod" msgstr "" +"A visualización cambiou a %d (o mínimo), pero limitada a %d polo xogo ou mod" #: src/client/game.cpp #, c-format @@ -1584,15 +1579,17 @@ msgid "Viewing range changed to %d" msgstr "Campo de visión cambiada a %d" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing range changed to %d (the maximum)" -msgstr "Campo de visión cambiada a %d" +msgstr "O rango de visualización cambiouse a %d (o máximo)" #: src/client/game.cpp #, c-format msgid "" "Viewing range changed to %d (the maximum), but limited to %d by game or mod" msgstr "" +"O alcance de visión cambiou a %d (o máximo), pero está limitado a %d polo " +"xogo ou mod" #: src/client/game.cpp #, c-format @@ -1614,9 +1611,8 @@ msgid "Zoom currently disabled by game or mod" msgstr "O zoom está actualmente desactivado polo xogo ou mod" #: src/client/gameui.cpp -#, fuzzy msgid "Chat currently disabled by game or mod" -msgstr "O zoom está actualmente desactivado polo xogo ou mod" +msgstr "Chat actualmente desactivado polo xogo ou mod" #: src/client/gameui.cpp msgid "Chat hidden" @@ -1653,32 +1649,28 @@ msgstr "Retroceso" #. ~ Usually paired with the Pause key #: src/client/keycode.cpp -#, fuzzy msgid "Break Key" -msgstr "Tecla para agacharse" +msgstr "Tecla de interrupción" #: src/client/keycode.cpp msgid "Caps Lock" msgstr "Bloq Maiús" #: src/client/keycode.cpp -#, fuzzy msgid "Clear Key" -msgstr "Limpar" +msgstr "Tecla de Borrar" #: src/client/keycode.cpp -#, fuzzy msgid "Control Key" -msgstr "Control" +msgstr "Tecla de control" #: src/client/keycode.cpp -#, fuzzy msgid "Delete Key" -msgstr "Eliminar" +msgstr "Tecla de eliminar" #: src/client/keycode.cpp msgid "Down Arrow" -msgstr "" +msgstr "Frecha abaixo" #: src/client/keycode.cpp msgid "End" @@ -1734,7 +1726,7 @@ msgstr "Botón esquerdo" #: src/client/keycode.cpp msgid "Left Control" -msgstr "Ctrl esq." +msgstr "Control Esquerdo" #: src/client/keycode.cpp msgid "Left Menu" @@ -1742,17 +1734,16 @@ msgstr "Menú esquerdo" #: src/client/keycode.cpp msgid "Left Shift" -msgstr "Shift esq." +msgstr "Shift esquerdo" #: src/client/keycode.cpp msgid "Left Windows" -msgstr "Win. esq." +msgstr "Win. esqueda" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp -#, fuzzy msgid "Menu Key" -msgstr "Menú" +msgstr "Tecla do menú" #: src/client/keycode.cpp msgid "Middle Button" @@ -1760,7 +1751,7 @@ msgstr "Botón central" #: src/client/keycode.cpp msgid "Num Lock" -msgstr "Bloq. núm." +msgstr "Bloq. Núm" #: src/client/keycode.cpp msgid "Numpad *" @@ -1836,9 +1827,8 @@ msgstr "Páxina arriba" #. ~ Usually paired with the Break key #: src/client/keycode.cpp -#, fuzzy msgid "Pause Key" -msgstr "Pausa" +msgstr "Tecla de pausa" #: src/client/keycode.cpp msgid "Play" @@ -1847,12 +1837,11 @@ msgstr "Xogar" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "Impr. pant." +msgstr "Imprimir" #: src/client/keycode.cpp -#, fuzzy msgid "Return Key" -msgstr "Enter" +msgstr "Tecla de retorno" #: src/client/keycode.cpp msgid "Right Arrow" @@ -1864,7 +1853,7 @@ msgstr "Botón dereito" #: src/client/keycode.cpp msgid "Right Control" -msgstr "Ctrl der." +msgstr "Control dereito" #: src/client/keycode.cpp msgid "Right Menu" @@ -1872,15 +1861,15 @@ msgstr "Menú dereito" #: src/client/keycode.cpp msgid "Right Shift" -msgstr "Shift der." +msgstr "Shift dereito" #: src/client/keycode.cpp msgid "Right Windows" -msgstr "Win. der." +msgstr "Windows dereito" #: src/client/keycode.cpp msgid "Scroll Lock" -msgstr "Bloq. Despr." +msgstr "Bloqueo de desprazamento" #. ~ Key name #: src/client/keycode.cpp @@ -1888,9 +1877,8 @@ msgid "Select" msgstr "Seleccionar" #: src/client/keycode.cpp -#, fuzzy msgid "Shift Key" -msgstr "Shift" +msgstr "Tecla Maiúsculas" #: src/client/keycode.cpp msgid "Sleep" @@ -1910,7 +1898,7 @@ msgstr "Tabulador" #: src/client/keycode.cpp msgid "Up Arrow" -msgstr "" +msgstr "Frecha cara arriba" #: src/client/keycode.cpp msgid "X Button 1" @@ -1921,9 +1909,8 @@ msgid "X Button 2" msgstr "X Botón 2" #: src/client/keycode.cpp -#, fuzzy msgid "Zoom Key" -msgstr "Zoom" +msgstr "Tecla de zoom" #: src/client/minimap.cpp msgid "Minimap hidden" @@ -1944,30 +1931,33 @@ msgid "Minimap in texture mode" msgstr "Minimapa en modo textura" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Erro ao abrir páxina web" +msgstr "Produciuse un erro ao compilar o sombreador \"%s\"." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Os sombreadores están habilitados pero o controlador non admite GLSL." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp #, c-format msgid "%s is missing:" -msgstr "" +msgstr "%s falta:" #: src/content/mod_configuration.cpp msgid "" "Install and enable the required mods, or disable the mods causing errors." msgstr "" +"Instala e habilita os mods necesarios, ou desactiva os mods que causan erros." #: src/content/mod_configuration.cpp msgid "" "Note: this may be caused by a dependency cycle, in which case try updating " "the mods." msgstr "" +"Nota: isto pode ser causado por un ciclo de dependencia, nese caso, proba " +"actualizar os mods." #: src/content/mod_configuration.cpp msgid "Some mods have unsatisfied dependencies:" @@ -2083,7 +2073,7 @@ msgstr "Seg. obxecto" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "Obxecto ant." +msgstr "Obxecto anterior" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" @@ -2143,16 +2133,15 @@ msgstr "Unha tecla" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Aberto" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Abrir Enderezo?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Erro ao abrir páxina web" +msgstr "Non se pode abrir o enderezo" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2195,6 +2184,8 @@ msgstr "gl" msgid "" "Name is not registered. To create an account on this server, click 'Register'" msgstr "" +"O nome non está rexistrado. Para crear unha conta neste servidor, fai clic " +"en 'Rexistrar'" #: src/network/clientpackethandler.cpp msgid "Name is taken. Please choose another name" @@ -2432,7 +2423,7 @@ msgid "" msgstr "" "Axusta a densidade da capa flotante.\n" "Aumentar o valor para aumentar a densidade. Pode ser positivo ou negativo.\n" -"Valor = 0,0: o 50 % do volume é terreo flotante.\n" +"Valor = 0,0: o 50% o do volume é terreo flotante.\n" "Valor = 2.0 (pode ser maior dependendo de 'mgv7_np_floatland', probar\n" "para estar seguro) crea una capa sólida de terreo flotante." @@ -2446,7 +2437,7 @@ msgstr "Avanzado" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Permite que os líquidos sexan translúcidos." #: src/settings_translation_file.cpp msgid "" @@ -2517,6 +2508,14 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Aplique tramado para reducir os artefactos de bandas de cor.\n" +"O tramado aumenta significativamente o tamaño da compresión sen perdas\n" +"das capturas de pantalla e funciona incorrectamente se a pantalla ou o " +"sistema operativo\n" +"realiza un tramado adicional ou se as canles de cor non están cuantificadas\n" +"a 8 bits.\n" +"Con OpenGL ES, o tramado só funciona se o sombreador admite alta\n" +"precisión de punto flotante e pode ter un maior impacto no rendemento." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2535,7 +2534,6 @@ msgid "Ask to reconnect after crash" msgstr "Preguntar para reconectar logo dunha caída de conexión" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2547,20 +2545,18 @@ msgid "" "optimization.\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"A esta distancia, o servidor optimizará de forma agresiva a que bloques se " +"A esta distancia, o servidor optimizará de forma agresiva que bloques se " "envían\n" -"clientes.\n" -"Os valores pequenos poden mellorar moito o rendemento, a costa de\n" -"fallos visibles de renderizado (algúns bloques non se mostrarán baixo a auga " -"nin nas covas,\n" -"así como ás veces en chán).\n" -"Establecer isto nun valor maior que \"max_block_send_distance\" desactiva " -"isto\n" +"aos clientes.\n" +"Os valores pequenos poden mellorar moito o rendemento, a expensas de fallos " +"visibles\n" +"na renderización (algúns bloques poden non renderizarse correctamente nas " +"covas).\n" +"Establecer isto nun valor maior que max_block_send_distance desactiva esta\n" "optimización.\n" -"Indicado en bloques de mapas (16 nós)." +"Indicado en MapBlocks (16 nodos)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2570,17 +2566,13 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"A esta distancia, o servidor optimizará de forma agresiva a que bloques se " -"envían\n" -"clientes.\n" -"Os valores pequenos poden mellorar moito o rendemento, a costa de\n" -"fallos visibles de renderizado (algúns bloques non se mostrarán baixo a auga " -"nin nas covas,\n" -"así como ás veces en chán).\n" -"Establecer isto nun valor maior que \"max_block_send_distance\" desactiva " -"isto\n" -"optimización.\n" -"Indicado en bloques de mapas (16 nós)." +"A esta distancia o servidor realizará unha comprobación de oclusión máis " +"sinxela e económica.\n" +"Valores máis pequenos poden mellorar o rendemento, a costa de fallos de\n" +"renderización visibles temporalmente (bloques que faltan).\n" +"Isto é especialmente útil para un rango de visualización moi grande (máis de " +"500).\n" +"Expresado en MapBlocks (16 nodos)." #: src/settings_translation_file.cpp msgid "Audio" @@ -2611,9 +2603,8 @@ msgid "Base terrain height." msgstr "Altura base do terreo." #: src/settings_translation_file.cpp -#, fuzzy msgid "Base texture size" -msgstr "Tamaño mínimo de textura" +msgstr "Tamaño da textura base" #: src/settings_translation_file.cpp msgid "Basic privileges" @@ -2636,18 +2627,16 @@ msgid "Bind address" msgstr "Vincular enderezo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Biome API" -msgstr "Biomas" +msgstr "API de bioma" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Ruído de bioma" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Distancia de optimización do envío de bloques" +msgstr "Distancia de optimización da eliminación de bloques" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2655,20 +2644,19 @@ msgstr "Distancia de optimización do envío de bloques" #: src/settings_translation_file.cpp msgid "Bloom" -msgstr "" +msgstr "Resplandor" #: src/settings_translation_file.cpp msgid "Bloom Intensity" -msgstr "" +msgstr "Intensidade do resplandor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bloom Radius" -msgstr "Radio de nubes" +msgstr "Radio de Resplandor (Bloom)" #: src/settings_translation_file.cpp msgid "Bloom Strength Factor" -msgstr "" +msgstr "Factor de intensidade do resplandor" #: src/settings_translation_file.cpp msgid "Bobbing" @@ -2816,7 +2804,7 @@ msgstr "Cliente" #: src/settings_translation_file.cpp msgid "Client Mesh Chunksize" -msgstr "" +msgstr "Tamaño dos fragmentos da malla do cliente" #: src/settings_translation_file.cpp msgid "Client and Server" @@ -2831,14 +2819,12 @@ msgid "Client side modding restrictions" msgstr "Restricións para modear no lado do cliente" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client-side Modding" -msgstr "Personalización do cliente" +msgstr "Modificación do lado do cliente" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client-side node lookup range restriction" -msgstr "Restrición do rango de busca do nodo do lado do cliente" +msgstr "Restricción do rango de busca de nodos do lado do cliente" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2853,7 +2839,6 @@ msgid "Clouds" msgstr "Nubes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Clouds are a client-side effect." msgstr "As nubes son un efecto do lado do cliente." @@ -2874,6 +2859,8 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Lista separada por comas de extensións AL e ALC que non deben usarse.\n" +"Útil para probas. Vexa al_extensions.[h,cpp] para máis detalles." #: src/settings_translation_file.cpp msgid "" @@ -2961,9 +2948,8 @@ msgid "Console height" msgstr "Altura da consola" #: src/settings_translation_file.cpp -#, fuzzy msgid "Content Repository" -msgstr "Contido do repositorio en liña" +msgstr "Repositorio de contidos" #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" @@ -2992,6 +2978,8 @@ msgid "" "Controls sinking speed in liquid when idling. Negative values will cause\n" "you to rise instead." msgstr "" +"Controla a velocidade de afundimento no líquido cando estás inactivo\n" +"Valores negativos farán que subas en vez de baixar." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -3094,7 +3082,6 @@ msgstr "" "pero tamén consume máis recursos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3106,10 +3093,16 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Activar para impedir a conexión de clientes antigos.\n" -"Os clientes máis antigos son compatibles porque non fallarán ao conectarse\n" -"a novos servidores, pero é posible que non sexan compatibles todas as " -"funcións novas que esperan." +"Define os clientes máis antigos aos que se permite conectarse.\n" +"Os clientes máis antigos son compatibles no sentido de que non fallarán ao " +"conectarse\n" +"a novos servidores, pero é posible que non admitan todas as novas " +"características que esperas.\n" +"Isto permite un control máis detallado que a verificación estrita da versión " +"do protocolo.\n" +"Minetest segue aplicando o seu propio mínimo interno, e habilitar a\n" +"verificación estrita da versión do protocolo sobreporá efectivamente esta " +"configuración." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3139,6 +3132,9 @@ msgid "" "Smaller values make bloom more subtle\n" "Range: from 0.01 to 1.0, default: 0.05" msgstr "" +"Define a cantidade de resplandor que se aplica á imaxe renderizada\n" +"Os valores máis pequenos fan que o resplandor sexa máis sutil\n" +"Rango: de 0,01 a 1,0, por defecto: 0,05" #: src/settings_translation_file.cpp msgid "Defines large-scale river channel structure." @@ -3161,6 +3157,8 @@ msgid "" "Defines the magnitude of bloom overexposure.\n" "Range: from 0.1 to 10.0, default: 1.0" msgstr "" +"Define a magnitude da sobreexposición do resplandor.\n" +"Rango: de 0,1 a 10,0, valor predeterminado: 1,0" #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -3174,6 +3172,9 @@ msgid "" "methods.\n" "Value of 2 means taking 2x2 = 4 samples." msgstr "" +"Define o tamaño da grella de mostraxe para os métodos de antialiás FSAA e " +"SSAA.\n" +"Un valor de 2 significa tomar 2x2 = 4 mostras." #: src/settings_translation_file.cpp msgid "Defines the width of the river channel." @@ -3266,6 +3267,10 @@ msgid "" "Distance in nodes at which transparency depth sorting is enabled\n" "Use this to limit the performance impact of transparency depth sorting" msgstr "" +"Distancia en nodos á que se habilita a ordenación de profundidade de " +"transparencia\n" +"Usa isto para limitar o impacto no rendemento da ordenación de profundidade " +"de transparencia" #: src/settings_translation_file.cpp msgid "Domain name of server, to be displayed in the serverlist." @@ -3297,20 +3302,19 @@ msgstr "Sonido de calabozos" #: src/settings_translation_file.cpp msgid "Enable Automatic Exposure" -msgstr "" +msgstr "Activar a exposición automática" #: src/settings_translation_file.cpp msgid "Enable Bloom" -msgstr "Activar o resplandor" +msgstr "Activar o Resplandor" #: src/settings_translation_file.cpp msgid "Enable Bloom Debug" -msgstr "" +msgstr "Activar depuración do resplandor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Activar danos" +msgstr "Habilitar a eliminación de bandas" #: src/settings_translation_file.cpp msgid "" @@ -3339,13 +3343,12 @@ msgstr "" "verdadero. Senón, utiliza o filtrado PCF." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Activar joysticks" +msgstr "Habilitar o postprocesado" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" -msgstr "" +msgstr "Habilitar a eliminación por rastrexo de raios" #: src/settings_translation_file.cpp msgid "" @@ -3354,6 +3357,10 @@ msgid "" "automatically adjust to the brightness of the scene,\n" "simulating the behavior of human eye." msgstr "" +"Activar corrección automática da exposición\n" +"Cando se activa, o motor de post-procesado axustará\n" +"automaticamente á luminosidade da escena,\n" +"simulando o comportamento do ollo humano." #: src/settings_translation_file.cpp msgid "" @@ -3375,6 +3382,7 @@ msgstr "Activar joysticks" #: src/settings_translation_file.cpp msgid "Enable joysticks. Requires a restart to take effect" msgstr "" +"Activar pancas de xogo (joysticks). Require un reinicio para facer efecto" #: src/settings_translation_file.cpp msgid "Enable mod channels support." @@ -3387,11 +3395,12 @@ msgstr "Activar seguridade dos mods" #: src/settings_translation_file.cpp msgid "Enable mouse wheel (scroll) for item selection in hotbar." msgstr "" +"Activar a roda do rato (scroll) para a selección de elementos na barra de " +"acceso rápido." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "Activar a entrada de comandos aleatoria (só para tests)." +msgstr "Habilitar a carga aleatoria de mods (principalmente usado para probas)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3407,7 +3416,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enable split login/register" -msgstr "" +msgstr "Activar o inicio de sesión/rexistro dividido" #: src/settings_translation_file.cpp msgid "" @@ -3423,9 +3432,8 @@ msgstr "" "funcións novas que esperan." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Límite da pantalla táctil" +msgstr "Habilitar a pantalla táctil" #: src/settings_translation_file.cpp msgid "" @@ -3480,15 +3488,18 @@ msgstr "Activa o rexistro de mallas xiradas." #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." msgstr "" +"Habilita a depuración e a verificación de erros no controlador de OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Habilita o pipeline de postprocesado." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Habilita o modo de pantalla táctil, permitindo xogar ao xogo cunha pantalla " +"táctil." #: src/settings_translation_file.cpp msgid "" @@ -3500,9 +3511,8 @@ msgstr "" "a costa de pequenos falllos visuais que non afectan á hora de xogar." #: src/settings_translation_file.cpp -#, fuzzy msgid "Engine Profiler" -msgstr "Perfil do motor do xogo" +msgstr "Perfilador do Motor" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" @@ -3513,7 +3523,6 @@ msgid "Entity methods" msgstr "Métodos de entidade" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Exponent of the floatland tapering. Alters the tapering behavior.\n" "Value = 1.0 creates a uniform, linear tapering.\n" @@ -3522,18 +3531,20 @@ msgid "" "Values < 1.0 (for example 0.25) create a more defined surface level with\n" "flatter lowlands, suitable for a solid floatland layer." msgstr "" -"Expoñente do estreitamento da terreo flotante. Altera este comportamento.\n" -"O valor = 1,0 crea un estrechamento uniforme e lineal.\n" -"Os valores > 1.0 crean un afilamento suave adecuado para a separación " -"predeterminada\n" -"cháns flotantes.\n" -"Os valores < 1,0 (por exemplo 0,25) crean un nivel de superficie máis " -"definido con\n" -"cháns baixas máis planas, adecuadas para unha capa sólida de terreo flotante." +"Expoñente da redución das terras flotantes. Modifica o comportamento da " +"redución.\n" +"Valor = 1.0 crea unha redución uniforme e linear.\n" +"Valores > 1.0 crean unha redución suave axeitada para as terras flotantes " +"separadas\n" +"por defecto.\n" +"Valores < 1.0 (por exemplo 0.25) crean un nivel de superficie máis definido " +"con\n" +"terras baixas máis planas, axeitado para unha capa sólida de terras " +"flotantes." #: src/settings_translation_file.cpp msgid "Exposure compensation" -msgstr "" +msgstr "Compensación de exposición" #: src/settings_translation_file.cpp msgid "FPS" @@ -3615,14 +3626,13 @@ msgid "Fixed virtual joystick" msgstr "Joystick virtual fixo" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Fixes the position of virtual joystick.\n" "If disabled, virtual joystick will center to first-touch's position." msgstr "" -"(Android) Corrixe a posición do joystick virtual.\n" -"Se está desactivado, o joystick virtual centrarase na posición do primeiro " -"toque." +"Corrixe a posición da panca de xogos ( joystick) virtual.\n" +"Se está desactivado, a panca de xogos virtual centrarase na posición do " +"primeiro toque." #: src/settings_translation_file.cpp msgid "Floatland density" @@ -3661,9 +3671,8 @@ msgid "Fog start" msgstr "Inicio de néboa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Font" -msgstr "Tamaño da fonte" +msgstr "Fonte" #: src/settings_translation_file.cpp msgid "Font bold by default" @@ -3806,9 +3815,8 @@ msgid "Fullscreen mode." msgstr "Modo de pantalla completa." #: src/settings_translation_file.cpp -#, fuzzy msgid "GUI" -msgstr "GUIs" +msgstr "Interface gráfica do usuario (GUI)" #: src/settings_translation_file.cpp msgid "GUI scaling" @@ -3891,9 +3899,8 @@ msgid "HUD" msgstr "HUD" #: src/settings_translation_file.cpp -#, fuzzy msgid "HUD scaling" -msgstr "Escala de IGU" +msgstr "Escalado do HUD" #: src/settings_translation_file.cpp msgid "" @@ -3931,11 +3938,8 @@ msgid "Heat noise" msgstr "Ruído da calor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Height component of the initial window size." -msgstr "" -"Componente de altura do tamaño inicial xanela inicial. Ignórase en pantalla " -"completa." +msgstr "Componente de altura do tamaño inicial da xanela." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3999,11 +4003,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Hotbar: Enable mouse wheel for selection" -msgstr "" +msgstr "Barra acceso rápido: Activar a roda do rato para a selección" #: src/settings_translation_file.cpp msgid "Hotbar: Invert mouse wheel direction" -msgstr "" +msgstr "Barra acceso rápido: inverte a dirección da roda do rato" #: src/settings_translation_file.cpp msgid "How deep to make rivers." @@ -4018,14 +4022,15 @@ msgstr "" "Se é negativo, as ondas líquidas moveranse cara atrás." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "How long the server will wait before unloading unused mapblocks, stated in " "seconds.\n" "Higher value is smoother, but will use more RAM." msgstr "" -"Tempo de espera do servidor en eliminar bloques non utilizados.\n" -"Canta maior resolución maior fluidez, aínda que consume máis memoria RAM." +"Tempo que o servidor esperará antes de descargar os bloques de mapa non " +"utilizados, expresado en segundos.\n" +"Un valor máis alto proporciona un funcionamento máis suave, pero utilizará " +"máis memoria RAM." #: src/settings_translation_file.cpp msgid "" @@ -4118,39 +4123,35 @@ msgstr "" "Actívao só se sabes o que fas." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, players cannot join without a password or change theirs to an " "empty password." msgstr "" -"Se está activado, os novos xogadores non poderán unirse con contrasinais " -"baleiros." +"Se está habilitado, os xogadores non poden unirse sen un contrasinal ou " +"cambiar o seu contrasinal a un contrasinal baleiro." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, the server will perform map block occlusion culling based on\n" "on the eye position of the player. This can reduce the number of blocks\n" "sent to the client by 50-80%. Clients will no longer receive most\n" "invisible blocks, so that the utility of noclip mode is reduced." msgstr "" -"Se está activado, o servidor realizará a eliminación de oclusión de bloques " -"de mapa baseándose\n" +"Se activado, o servidor realizará ocultación de bloques do mapa baseada na\n" "na posición dos ollos do xogador. Isto pode reducir o número de bloques\n" -"enviado ao cliente entre un 50 % e un 80 %. O cliente xa non recibirá o máis " -"invisible,\n" -"de xeito que se reduce a utilidade do modo espectador." +"enviados ao cliente en un 50-80%. Os clientes deixarán de recibir a maioría " +"\n" +"dos bloques invisibles, reducindo a utilidade do modo noclip." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, you can place nodes at the position (feet + eye level) where you " "stand.\n" "This is helpful when working with nodeboxes in small areas." msgstr "" -"Se está activado, pode colocar bloques na posición (pés + nivel dos ollos) " -"onde está.\n" -"Isto é útil cando se traballa con caixas de nós en áreas pequenas." +"Se habilitado, podes colocar nodos na posición (altura dos pés + altura " +"ocular) onde estás.\n" +"Isto é útil cando traballas con caixas de nodos en áreas pequenas." #: src/settings_translation_file.cpp msgid "" @@ -4253,9 +4254,8 @@ msgstr "" "Intervalo para gardado de cambios importantes no mundo, indicado en segundos." #: src/settings_translation_file.cpp -#, fuzzy msgid "Interval of sending time of day to clients, stated in seconds." -msgstr "Intervalo de envío da hora do dia aos clientes." +msgstr "Intervalo de envío da hora do día aos clientes, expresado en segundos." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4268,6 +4268,8 @@ msgstr "Inverter rato" #: src/settings_translation_file.cpp msgid "Invert mouse wheel (scroll) direction for item selection in hotbar." msgstr "" +"Inverter a dirección da roda do rato (scroll) para a selección de elementos " +"na barra de acceso rápido." #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." @@ -4409,7 +4411,7 @@ msgstr "Límite de lagos no mapa" #: src/settings_translation_file.cpp msgid "Language" -msgstr "Idiomas" +msgstr "Lingua" #: src/settings_translation_file.cpp msgid "Large cave depth" @@ -4440,21 +4442,21 @@ msgid "" msgstr "" "Apariencia das follas:\n" "- Detalladas: todas as caras son visibles\n" -"- Simples: só vense as caras externas, se se utilizan special_tiles " +"- Simples: só vense as caras externas, cando se utilizan special_tiles " "definidos\n" "- Opacas: desactiva a transparencia" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Duración do tick do servidor e o intervalo no que os obxetos actualízanse " -"polo xeral\n" -"na rede." +"Duración dun tick de servidor (o intervalo no que xeralmente se actualiza " +"todo),\n" +"indicado en segundos.\n" +"Non se aplica ás sesións aloxadas desde o menú do cliente." #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -4528,9 +4530,8 @@ msgid "Light curve low gradient" msgstr "Gradiente baixo da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lighting" -msgstr "Iluminación suave" +msgstr "Iluminación" #: src/settings_translation_file.cpp msgid "" @@ -4551,11 +4552,11 @@ msgid "" "Only has an effect if compiled with cURL." msgstr "" "Limita o número de solicitudes paralelas HTTP. Afecta:\n" -"- Recuperación de medios se o servidor usa a configuración " -"\"remote_media\".\n" +"- Recuperación de medios se o servidor usa a configuración \"remote_media\"." +"\n" "- Descarga da lista de servidores e anuncio do servidor.\n" "- Descargas realizadas polo menú principal (por exemplo, xestor de mods).\n" -"Só ten efecto se se compila con cURL." +"Só ten efecto cando se compila con cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" @@ -4609,6 +4610,9 @@ msgid "" "from the bright objects.\n" "Range: from 0.1 to 8, default: 1" msgstr "" +"Valor lóxico que controla ata onde se espalla o efecto de resplandor\n" +"desde os obxectos brillantes. \n" +"Rango: de 0.1 a 8, predeterminado: 1" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." @@ -4686,7 +4690,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Atributos de xeración de mundos específicos do xerador de mundos v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4695,11 +4698,13 @@ msgid "" "The 'temples' flag disables generation of desert temples. Normal dungeons " "will appear instead." msgstr "" -"Atributos de xeración de mundos específicos do xerador de mundos v6.\n" -"O marcador \"snowbiomes\" activa o novo sistema de 5 biomas.\n" -"Cando o marcador \"snowbiomes\" está activado, as selvas están habilitadas " +"Atributos de xeración de mapas específicos de Mapgen v6.\n" +"A bandeira \"snowbiomes\" activa o novo sistema de 5 biomas.\n" +"Cando a bandeira 'snowbiomes' está activada, as xunglas están habilitadas " "automaticamente e\n" -"o marcador \"selvas\" é ignorado." +"a bandeira \"xunglas\" é ignorada.\n" +"A bandeira \"templos\" desactiva a xeración de templos no deserto. No seu " +"lugar aparecerán os alxubes normais." #: src/settings_translation_file.cpp msgid "" @@ -4734,9 +4739,8 @@ msgid "Mapblock mesh generation delay" msgstr "Retraso da xeración da malla do mapa de bloques" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generation threads" -msgstr "Retraso da xeración da malla do mapa de bloques" +msgstr "Fíos de xeración da malla do bloque de mapa" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" @@ -4921,8 +4925,8 @@ msgid "" msgstr "" "Número máximo de paquetes enviados por etapa de envío. Se tes unha conexión " "lenta\n" -"intenta reducilo, pero non ata un número inferior ao dobre do que ten por " -"obxectivo o cliente." +"intenta reducilo, pero non ata un número inferior ao dobre do\n" +"que ten por obxectivo o cliente." #: src/settings_translation_file.cpp msgid "Maximum number of players that can be connected simultaneously." @@ -4954,18 +4958,16 @@ msgid "Maximum simultaneous block sends per client" msgstr "Número máximo de envíos de bloques simultáneos por cliente" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum size of the outgoing chat queue" -msgstr "Tamaño máximo da cola de saída do chat" +msgstr "Tamaño máximo da cola de chat de saída" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum size of the outgoing chat queue.\n" "0 to disable queueing and -1 to make the queue size unlimited." msgstr "" -"Tamaño máximo da fila de chat de saída.\n" -"0 para desactivar a cola e -1 para que o tamaño da cola sexa ilimitado." +"Tamaño máximo da cola de saída de chat.\n" +"0 para desactivar a cola e -1 para facer que o tamaño da cola sexa ilimitado." #: src/settings_translation_file.cpp msgid "" @@ -5012,9 +5014,8 @@ msgid "Minimap scan height" msgstr "Altura de escaneo do minimapa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Intervalo de repetición da acción \"colocar\"" +msgstr "Intervalo mínimo de repetición de escavación" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -5030,12 +5031,11 @@ msgstr "Mapeo de Mip" #: src/settings_translation_file.cpp msgid "Miscellaneous" -msgstr "" +msgstr "Miscelánea" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mod Profiler" -msgstr "Análise do mundo" +msgstr "Perfilador de mods" #: src/settings_translation_file.cpp msgid "Mod Security" @@ -5086,9 +5086,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Multiplicador da sensibilidade do rato." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Límite da cova" +msgstr "Limiar de movemento" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5153,9 +5152,8 @@ msgid "New users need to input this password." msgstr "Os novos usuarios deben introducir este contrasinal." #: src/settings_translation_file.cpp -#, fuzzy msgid "Node and Entity Highlighting" -msgstr "Resaltar nodos" +msgstr "Destacado de nodos e entidades" #: src/settings_translation_file.cpp msgid "Node highlighting" @@ -5209,9 +5207,8 @@ msgstr "" "consumo de memoria (4096=100MB, como regra xeral)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Number of messages a player may send per 10 seconds." -msgstr "Cantidade de mensaxes que un xogador pode enviar en 10 segundos." +msgstr "Cantidade de mensaxes que un xogador pode enviar por cada 10 segundos." #: src/settings_translation_file.cpp msgid "" @@ -5219,15 +5216,17 @@ msgid "" "Value of 0 (default) will let Minetest autodetect the number of available " "threads." msgstr "" +"Número de fíos a usar para xeración de mallas.\n" +"O valor 0 (predeterminado) permitirá a Minetest detectar automaticamente o " +"número de fíos dispoñibles." #: src/settings_translation_file.cpp msgid "Occlusion Culler" -msgstr "" +msgstr "Eliminador de oclusión" #: src/settings_translation_file.cpp -#, fuzzy msgid "Occlusion Culling" -msgstr "Determinar bloques invisibles do lado do servidor" +msgstr "Eliminación de oclusión" #: src/settings_translation_file.cpp msgid "" @@ -5247,9 +5246,8 @@ msgstr "" "aberto." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Depuración do xerador de mundos" +msgstr "Depuración de OpenGL" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5329,7 +5327,7 @@ msgstr "Filtrado de Poisson" #: src/settings_translation_file.cpp msgid "Post Processing" -msgstr "" +msgstr "Post-procesamento" #: src/settings_translation_file.cpp msgid "" @@ -5384,13 +5382,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Proporción de covas grandes que conteñen líquido." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "A versión do protocolo non coincide " +msgstr "Versión mínima do protocolo" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "xesto de golpe" #: src/settings_translation_file.cpp msgid "" @@ -5412,7 +5409,7 @@ msgstr "Entrada aleatoria" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Orde de carga aleatoria de mods" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5423,9 +5420,8 @@ msgid "Regular font path" msgstr "Camiño da fonte regular" #: src/settings_translation_file.cpp -#, fuzzy msgid "Remember screen size" -msgstr "Autogardar o tamaño da pantalla" +msgstr "Lembrar o tamaño da pantalla" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5461,13 +5457,13 @@ msgid "" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" "Restrinxe o acceso de algunhas funcións do cliente en servidores.\n" -"Combine isto de abaixo para restrinxir recursos aos clientes ou coloque 0 " +"Combine isto de abaixo para restrinxir recursos aos clientes ou coloque 0\n" "para que non haxa restriccións:\n" "LOAD_CLIENT_MODS: 1 (desactiva a carga de mods no cliente)\n" "CHAT_MESSAGES: 2 (desactiva a chamada \"send_chat_message\" no cliente)\n" "READ_ITEMDEFS: 4 (desactiva a chamada \"get_item_def\" no cliente)\n" "READ_NODEDEFS: 8 (desactiva a chamada \"get_node_def\" no cliente)\n" -"LOOKUP_NODES_LIMIT: 16 (desactiva a chamada \"get_node\" no cliente para " +"LOOKUP_NODES_LIMIT: 16 (desactiva a chamada \"get_node\" no cliente para\n" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (desactiva a chamada \"get_player_names\" no cliente)" @@ -5543,6 +5539,11 @@ msgid "" "is maximized is stored in window_maximized.\n" "(Autosaving window_maximized only works if compiled with SDL.)" msgstr "" +"Garda o tamaño da xanela automaticamente cando se modifique.\n" +"Se está activado, o tamaño da pantalla gárdase en screen_w e screen_h, e se " +"a xanela\n" +"é maximizada gardarase en window_maximized.\n" +"(O gardado automático window_maximized só funciona se foi compilado con SDL.)" #: src/settings_translation_file.cpp msgid "Saving map received from server" @@ -5638,6 +5639,25 @@ msgid "" "Renders higher-resolution image of the scene, then scales down to reduce\n" "the aliasing effects. This is the slowest and the most accurate method." msgstr "" +"Escolle o método de suavización para aplicar.\n" +"\n" +"* Ningún: non hai antialiasing (predeterminado)\n" +"\n" +"* FSAA: antialiasing de pantalla completa proporcionado por hardware\n" +"(incompatible con posprocesamento e submostraxe)\n" +"A.K.A antialiasing de varias mostras (MSAA)\n" +"Suaviza os bordos do bloque pero non afecta o interior das texturas.\n" +"É necesario reiniciar para cambiar esta opción.\n" +"\n" +"* FXAA - Antialiasing aproximado rápido (require sombreadores)\n" +"Aplica un filtro de posprocesamento para detectar e suavizar os bordos de " +"alto contraste.\n" +"Ofrece equilibrio entre velocidade e calidade de imaxe.\n" +"\n" +"* SSAA - Antialiasing de supermostraxe (require sombreadores)\n" +"Mostra a imaxe de maior resolución da escena e, a continuación, redúcese " +"para reducir\n" +"os efectos de aliasing. Este é o método máis lento e preciso." #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." @@ -5682,7 +5702,7 @@ msgstr "" "6 = Conxunto 4D de Julia \"Mandy Cousin\".\n" "7 = Conxunto 4D de Mandelbrot \"Variation\".\n" "8 = Conxunto 4D de Julia \"Variation\".\n" -"9 = Conxunto 4D de Mandelbrot \"Mandelbrot/Mandelbar\".\n" +"9 = Conxunto 4D de Mandelbrot/Mandelbar\" Mandelbrot \".\n" "10 = Conxunto 3D de Julia \"Mandelbrot/Mandelbar”.\n" "11 = Conxunto 3D de Mandelbrot \"Christmas Tree\".\n" "12 = Conxunto 3D de Julia \"Christmas Tree\".\n" @@ -5698,9 +5718,8 @@ msgid "Server" msgstr "Servidor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server Gameplay" -msgstr "Nome do servidor" +msgstr "Xogo do servidor" #: src/settings_translation_file.cpp msgid "Server Security" @@ -5727,9 +5746,8 @@ msgid "Server port" msgstr "Porto do servidor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Server-side occlusion culling" -msgstr "Determinar bloques invisibles do lado do servidor" +msgstr "Ocultación de oclusión no lado do servidor" #: src/settings_translation_file.cpp msgid "Server/Env Performance" @@ -5740,9 +5758,8 @@ msgid "Serverlist URL" msgstr "URL da lista de servidores" #: src/settings_translation_file.cpp -#, fuzzy msgid "Serverlist and MOTD" -msgstr "URL da lista de servidores" +msgstr "Lista de servidores e Mensaxe do Día (MOTD)" #: src/settings_translation_file.cpp msgid "Serverlist file" @@ -5764,22 +5781,24 @@ msgid "" "Value of 0.0 (default) means no exposure compensation.\n" "Range: from -1 to 1.0" msgstr "" +"Axusta a compensación de exposición en unidades EV.\n" +"O valor de 0.0 (predeterminado) significa que non hai compensación de " +"exposición.\n" +"Rango: de -1 a 1.0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"Establece o idioma. Deixa o campo baleiro para usar o idioma do sistema.\n" -"É necesario reiniciar despois de cambiar isto." +"Establece o idioma. Por defecto, utilízase o idioma do sistema.\n" +"É preciso reiniciar despois de cambiar isto." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the maximum length of a chat message (in characters) sent by clients." msgstr "" -"Establece a lonxitude máxima de caracteres dunha mensaxe de chat enviada " +"Establecer a lonxitude máxima dunha mensaxe de chat (en caracteres) enviada " "polos clientes." #: src/settings_translation_file.cpp @@ -5791,33 +5810,36 @@ msgstr "" "Axusta a forza gamma da sombra.\n" "Axeita a intensidade das sombras dinámicas no xogo.\n" "Un valor menor implica sombras máis claras, mentres que un valor maior " -"implica sombras máis escuras" +"implica sombras máis escuras." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the soft shadow radius size.\n" "Lower values mean sharper shadows, bigger values mean softer shadows.\n" "Minimum value: 1.0; maximum value: 15.0" msgstr "" -"Establece o tamaño do raio de sombras suaves.\n" -"Os valores máis baixos son sombras máis nítidas, os valores maiores " -"significan son máis suaves.\n" -"Valor mínimo: 1,0; valor máximo: 10,0" +"Establece o tamaño do radio das sombras suaves.\n" +"Os valores máis baixos significan sombras máis nítidas, valores maiores " +"significan sombras máis suaves.\n" +"Valor mínimo: 1,0; valor máximo: 15,0" #: src/settings_translation_file.cpp msgid "Set to true to enable Shadow Mapping." -msgstr "Pon a verdadeiro para activar o Mapeado de Sombras" +msgstr "Pon a verdadeiro para activar o Mapeado de Sombras." #: src/settings_translation_file.cpp msgid "" "Set to true to enable bloom effect.\n" "Bright colors will bleed over the neighboring objects." msgstr "" +"Estableza a verdadeiro para activar o efecto de resplandor.\n" +"As cores brillantes difundiranse sobre os obxectos veciños." #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." msgstr "" +"Establece a verdadeiro para habilitar o efecto de iluminación volumétrica (" +"alcume 'raios de Deus')." #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5838,6 +5860,12 @@ msgid "" "top-left - processed base image, top-right - final image\n" "bottom-left - raw base image, bottom-right - bloom texture." msgstr "" +"Establecer verdadeiro para renderizar a descomposición de depuración do " +"efecto de resplandor.\n" +"No modo de depuración, a pantalla divídese en 4 cuadrantes:\n" +"arriba á esquerda - imaxe base procesada, arriba á dereita - imaxe final\n" +"abaixo á esquerda - imaxe base en bruto, abaixo á dereita - textura de " +"resplandor." #: src/settings_translation_file.cpp msgid "" @@ -5858,7 +5886,6 @@ msgid "Shaders" msgstr "Sombreadores" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" @@ -5866,8 +5893,7 @@ msgid "" msgstr "" "Os sombreadores permiten efectos visuais avanzados e poden aumentar o " "rendemento nalgunhas\n" -"tarxetas de vídeo.\n" -"Isto só funciona con o modo de vídeo OpenGL." +"tarxetas gráficas." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -5894,9 +5920,8 @@ msgstr "" "sombra." #: src/settings_translation_file.cpp -#, fuzzy msgid "Shadow strength gamma" -msgstr "Intensidade da sombra" +msgstr "Factor de intensidade de sombra gamma" #: src/settings_translation_file.cpp msgid "Show debug info" @@ -5930,6 +5955,12 @@ msgid "" "draw calls, benefiting especially high-end GPUs.\n" "Systems with a low-end GPU (or no GPU) would benefit from smaller values." msgstr "" +"Longo do lado dun cubo de bloques de mapa co cliente considerará xuntos\n" +"ao xerar as mallas.\n" +"Valores maiores aumentan a utilización da GPU ao reducir o número de\n" +"chamadas de debuxo, beneficiando especialmente as GPUs de alta gama.\n" +"Sistemas con GPUs de baixo rendemento (ou sen GPU) beneficiarían de valores " +"máis pequenos." #: src/settings_translation_file.cpp msgid "" @@ -5983,18 +6014,20 @@ msgid "Smooth lighting" msgstr "Iluminación suave" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." -msgstr "Suaviza a rotación da cámara en modo cinemático. 0 para desactivar." +msgstr "" +"Suaviza a rotación da cámara cando está en modo cinemático, 0 para " +"desactivar. Entra no modo cinemático usando a tecla establecida en Controis." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera, also called look or mouse smoothing. 0 to " "disable." -msgstr "Suaviza a rotación da cámara en modo cinemático. 0 para desactivar." +msgstr "" +"Suaviza a rotación da cámara, tamén coñecido como suavizado de vista ou " +"rato. 0 para desactivar." #: src/settings_translation_file.cpp msgid "Sneaking speed" @@ -6013,9 +6046,8 @@ msgid "Sound" msgstr "Son" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "Lista negra de marcas de ContentDB" +msgstr "Lista negra de extensións de son" #: src/settings_translation_file.cpp msgid "" @@ -6041,7 +6073,6 @@ msgstr "" "que agrupar algúns (ou todos) os obxectos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Spread a complete update of shadow map over given number of frames.\n" "Higher values might make shadows laggy, lower values\n" @@ -6050,8 +6081,8 @@ msgid "" msgstr "" "Distribuír unha actualización completa do mapa de sombras sobre unha " "determinada cantidade de fotogramas.\n" -"Os valores máis altos poden facer que as sombras sexan latentes e os valores " -"máis baixos\n" +"Os valores máis altos poden facer cas sombras sexan lentas e os valores máis " +"baixos\n" "consumirán máis recursos.\n" "Valor mínimo: 1; Valor máximo 16" @@ -6235,14 +6266,14 @@ msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"O retraso en milisegundos despois do cal unha interacción táctil se " +"considera un toque prolongado." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The file path relative to your world path in which profiles will be saved to." msgstr "" -"O camiño do ficheiro relativa ao camiño do mundo no que se gardarán os " -"perfís." +"O camiño do ficheiro relativa ao camiño do mundo onde se gardarán os perfís." #: src/settings_translation_file.cpp msgid "" @@ -6256,20 +6287,28 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"O xesto para golpear xogadores/entidades.\n" +"Isto pode ser anulado por xogos e modificacións.\n" +"\n" +"* toque_curto\n" +"Fácil de usar e coñecido doutros xogos que non deben ser nomeados.\n" +"\n" +"* toque_longo\n" +"Coñecido polos controis móbiles clásicos de Minetest.\n" +"O combate é máis ou menos imposible." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" msgstr "O identificador do joystick que se vai utilizar" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." msgstr "" -"A lonxitude en píxeles que tarda en iniciar a interacción da pantalla táctil." +"A lonxitude en píxeles despois da cal unha interacción táctil se considera " +"movemento." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The maximum height of the surface of waving liquids.\n" "4.0 = Wave height is two nodes.\n" @@ -6277,20 +6316,18 @@ msgid "" "Default is 1.0 (1/2 node)." msgstr "" "Altura máxima da superficie de líquidos con ondas.\n" -"4.0 = Altura da onda é dous nós.\n" -"0.0 = A onda non se move.\n" -"Por defecto é 1.0 (medio nó).\n" -"É necesario activar os líquidos con ondas." +"4.0 = A altura da onda é de dous nodos.\n" +"0.0 = A onda non se move en absoluto.\n" +"O valor por defecto é 1.0 (1/2 nodo)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." msgstr "" -"O tempo en segundos que tarda entre colocacións repetidas de nodos cando se " -"mantén presionado\n" -"o botón de colocar obxectos." +"O tempo mínimo en segundos que se necesita entre escavar nodos cando se " +"mantén premido\n" +"o botón de escavación." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6323,17 +6360,16 @@ msgstr "" "Isto debería configurarse xunto con active_object_send_range_blocks." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" "OpenGL is the default for desktop, and OGLES2 for Android.\n" "Shaders are supported by everything but OGLES1." msgstr "" -"O motor de renderizado.\n" -"Nota: ¡É necesario reiniciar despois de facer este cambio!\n" +"O backend de renderizado.\n" +"Nota: É preciso reiniciar despois de cambiar isto!\n" "OpenGL é o predeterminado para escritorio, e OGLES2 para Android.\n" -"Os shaders son compatibles con OpenGL e OGLES2 (experimental)." +"Os sombreadores son compatibles con todo menos con OGLES1." #: src/settings_translation_file.cpp msgid "" @@ -6399,15 +6435,15 @@ msgid "The type of joystick" msgstr "O tipo de joystick" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" "enabled. Also, the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" -"A distancia vertical sobre a que a calor cae 20 se é 'altitude_chill'\n" -"activado. Tamén a distancia vertical na que a humidade cae 10 se\n" -"'altitude_dry' está activado." +"A distancia vertical sobre a cal a temperatura cae en 20 se 'altitude_chill' " +"está\n" +"habilitado. Tamén a distancia vertical sobre a cal a humidade cae en 10 se\n" +"'altitude_dry' está habilitado." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." @@ -6416,7 +6452,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Limiar para golpes longos" #: src/settings_translation_file.cpp msgid "" @@ -6439,11 +6475,10 @@ msgid "Time speed" msgstr "Velocidade do tempo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Timeout for client to remove unused map data from memory, in seconds." msgstr "" -"Tempo de espera para que o cliente elimine os datos do mapa non utilizados " -"da memoria." +"Tempo limite para que o cliente elimine os datos do mapa non utilizados da " +"memoria, en segundos." #: src/settings_translation_file.cpp msgid "" @@ -6462,32 +6497,28 @@ msgid "Tooltip delay" msgstr "Atraso da información sobre ferramentas" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen" -msgstr "Límite da pantalla táctil" +msgstr "Pantalla táctil" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen sensitivity" -msgstr "Sensibilidade do rato" +msgstr "Sensibilidade da pantalla táctil" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen sensitivity multiplier." -msgstr "Multiplicador da sensibilidade do rato." +msgstr "Multiplicador de sensibilidade da pantalla táctil." #: src/settings_translation_file.cpp msgid "Tradeoffs for performance" msgstr "Compensacións para o rendemento" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Líquidos opacos" +msgstr "Líquidos translúcidos" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" -msgstr "" +msgstr "Distancia de ordenación de transparencias" #: src/settings_translation_file.cpp msgid "Trees noise" @@ -6520,6 +6551,13 @@ msgid "" "\n" "This setting should only be changed if you have performance problems." msgstr "" +"Tipo de eliminador de ocultación\n" +"\n" +"\"loops\" é o algoritmo legado con bucles anidados e complexidade O(n³)\n" +"\"bfs\" é o novo algoritmo baseado en busca en anchura (breadth-first-search)" +" e eliminación de caras laterais.\n" +"\n" +"Esta configuración só debe ser cambiada se tes problemas de rendemento." #: src/settings_translation_file.cpp msgid "" @@ -6527,6 +6565,9 @@ msgid "" "release\n" "If this is empty the engine will never check for updates." msgstr "" +"Enderezo para ficheiro JSON que proporciona información sobre a versión máis " +"recente de Minetest\n" +"Se está baleiro, o motor nunca buscará actualizacións." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6561,7 +6602,7 @@ msgstr "Eliminar datos do servidor non utilizados" #: src/settings_translation_file.cpp msgid "Update information URL" -msgstr "" +msgstr "Enderezo de información de actualización" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." @@ -6580,36 +6621,35 @@ msgid "Use a cloud animation for the main menu background." msgstr "Usa unha animación de nube para o fondo do menú principal." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use anisotropic filtering when looking at textures from an angle." -msgstr "Usa o filtro anisótropo ao ver texturas desde un ángulo." +msgstr "Usar filtrado anisotrópico ao observar texturas desde un ángulo." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use bilinear filtering when scaling textures." -msgstr "Usa o filtro trilineal ao escalar texturas." +msgstr "Usar filtrado bilineal ao escalar texturas." #: src/settings_translation_file.cpp msgid "Use crosshair for touch screen" -msgstr "" +msgstr "Usar retículo para pantalla táctil" #: src/settings_translation_file.cpp msgid "" "Use crosshair to select object instead of whole screen.\n" "If enabled, a crosshair will be shown and will be used for selecting object." msgstr "" +"Usar retículo para seleccionar obxectos en vez de toda a pantalla.\n" +"Se está activado, mostrarase un retículo que se utilizará para seleccionar " +"obxectos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Use mipmaps when scaling textures. May slightly increase performance,\n" "especially when using a high-resolution texture pack.\n" "Gamma-correct downscaling is not supported." msgstr "" -"Usa o mipmapping para escalar texturas. Pode aumentar lixeiramente o " -"rendemento,\n" -"sobre todo cando se usa un paquete de texturas de alta resolución.\n" -"Non se admite a redución de escala correcta gamma." +"Usar mipmaps ao escalar texturas. Pode aumentar lixeramente o rendemento,\n" +"especialmente cando se usa un paquete de texturas de alta resolución.\n" +"O escalado correcto de gamma non está soportado." #: src/settings_translation_file.cpp msgid "" @@ -6617,6 +6657,9 @@ msgid "" "This flag enables use of raytraced occlusion culling test for\n" "client mesh sizes smaller than 4x4x4 map blocks." msgstr "" +"Usar eliminación de ocultación por raios no novo eliminador.\n" +"Esta bandeira permite o uso de proba de eliminación de ocultación por raios\n" +"para tamaños de malla do cliente menores de 4x4x4 bloques de mapa." #: src/settings_translation_file.cpp msgid "" @@ -6624,17 +6667,19 @@ msgid "" "If both bilinear and trilinear filtering are enabled, trilinear filtering\n" "is applied." msgstr "" +"Usar filtrado trilineal ao escalar texturas.\n" +"Se están activados tanto o filtrado bilineal como o filtrado trilineal,\n" +"aplicarase o filtrado trilineal.." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Use virtual joystick to trigger \"Aux1\" button.\n" "If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" -"(Android) Use o joystick virtual para activar o botón \"Aux1\".\n" -"Se está activado, o joystick virtual tamén tocará o botón \"Aux1\" cando " -"estea fóra do círculo principal." +"Usar a panca de xogos ( joystick) virtual para activar o botón \"Aux1\".\n" +"Se está activado, a panca de xogos virtual tamén tocará o botón \"Aux1\" " +"cando estea fóra do círculo principal." #: src/settings_translation_file.cpp msgid "User Interfaces" @@ -6706,6 +6751,8 @@ msgid "" "Vertical screen synchronization. Your system may still force VSync on even " "if this is disabled." msgstr "" +"Sincronización vertical da pantalla. O teu sistema pode forzar a " +"sincronización vertical aínda que isto estea desactivado." #: src/settings_translation_file.cpp msgid "Video driver" @@ -6733,7 +6780,7 @@ msgstr "Volume" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Multiplicador de volume cando a xanela non está en foco." #: src/settings_translation_file.cpp msgid "" @@ -6744,14 +6791,12 @@ msgstr "" "É necesario que o son do sistema estea activado." #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "FPS cando está en segundo plano ou pausado" +msgstr "Volume en segundo plano" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "Iluminación suave" +msgstr "Iluminación volumétrica" #: src/settings_translation_file.cpp msgid "" @@ -6892,7 +6937,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether the window is maximized." -msgstr "" +msgstr "Se a xanela está maximizada." #: src/settings_translation_file.cpp msgid "" @@ -6928,11 +6973,8 @@ msgstr "" "mesmo)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Width component of the initial window size." -msgstr "" -"Componente de largura do tamaño inicial da xanela. Ignórase en pantalla " -"completa." +msgstr "Componente de anchura do tamaño inicial da xanela." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6940,7 +6982,7 @@ msgstr "Largura das liñas do bloque de selección arredor dos nós." #: src/settings_translation_file.cpp msgid "Window maximized" -msgstr "" +msgstr "Xanela maximizada" #: src/settings_translation_file.cpp msgid "" From 6c19e68d6b118c03a5df5c0a429e054ef502e257 Mon Sep 17 00:00:00 2001 From: BlackImpostor Date: Mon, 15 Jul 2024 11:26:04 +0000 Subject: [PATCH 22/59] Translated using Weblate (Russian) Currently translated at 100.0% (1335 of 1335 strings) --- po/ru/minetest.po | 275 ++++++++++++++++++++++++---------------------- 1 file changed, 146 insertions(+), 129 deletions(-) diff --git a/po/ru/minetest.po b/po/ru/minetest.po index 703f8bfcf..047cd70fe 100644 --- a/po/ru/minetest.po +++ b/po/ru/minetest.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: Russian (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-07-07 10:09+0000\n" +"PO-Revision-Date: 2024-07-16 12:09+0000\n" "Last-Translator: BlackImpostor \n" "Language-Team: Russian \n" @@ -11,8 +11,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua @@ -72,9 +72,8 @@ msgid "Command not available: " msgstr "Команда недоступна: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Получить справку по командам" +msgstr "Получить справку по командам (-t: вывод в чат)" #: builtin/common/chatcommands.lua msgid "" @@ -84,9 +83,8 @@ msgstr "" "help all» для вывода всего списка." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | <команда>]" +msgstr "[all | <команда>] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -149,12 +147,12 @@ msgid "Failed to download $1" msgstr "Не удалось загрузить $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Не удалось извлечь «$1» (неподдерживаемый тип файла или повреждённый архив)" +"Не удалось извлечь «$1» (недостаточно места на диске, неподдерживаемый тип " +"файла или поврежденный архив)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -186,7 +184,7 @@ msgstr "Загрузка…" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Ошибка при получении зависимостей для дополнения" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -464,7 +462,7 @@ msgstr "Декорации" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Пустынные храмы" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -475,6 +473,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Другой вариант данжей, генерируемый в биомах пустыни (только если включены " +"сами данжи)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -1069,15 +1069,16 @@ msgid "Install games from ContentDB" msgstr "Установить игры с ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game больше не установлен по умолчанию" +msgstr "Minetest Game больше не стоит по умолчанию." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest - это платформа для создания модификаций, которая позволяет вам " +"играть во множество различных игр и устанавливать дополнения." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1112,9 +1113,8 @@ msgid "Start Game" msgstr "Начать игру" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Вам нужно установить игру, прежде чем вы сможете установить мод" +msgstr "Вам требуется установить игру, прежде чем вы сможете создать мир." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1328,7 +1328,6 @@ msgid "Continue" msgstr "Продолжить" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1343,17 +1342,17 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" -"Управление по умолчанию:\n" -"Меню скрыто:\n" +"Управление:\n" +"Нет открытых меню:\n" "- провести пальцем: осмотреться\n" "- нажатие: разместить/применить\n" "- долгое нажатие: копать/удар/применить\n" -"В меню/инвентаре:\n" +"В открытом меню:\n" "- двойное нажатие (вне меню)\n" " --> закрыть меню\n" "- нажать на стак, затем на слот:\n" " --> передвинуть стак\n" -"- потащить стак, нажать вторым пальцем:\n" +"- нажать и потащить стак, нажать вторым пальцем:\n" " --> положить один предмет в слот\n" #: src/client/game.cpp @@ -1427,9 +1426,8 @@ msgid "Fog enabled" msgstr "Туман включён" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Приближение на данный момент отключено игрой или модом" +msgstr "Туман включён игрой или модом" #: src/client/game.cpp msgid "Game info:" @@ -1929,13 +1927,13 @@ msgid "Minimap in texture mode" msgstr "Миникарта в текстурном режиме" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Не удалось открыть страницу" +msgstr "Не удалось скомпилировать шейдер «%s»." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Шейдеры включены, но GLSL не поддерживается драйвером." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2131,16 +2129,15 @@ msgstr "нажмите клавишу" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Открыто" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Открыть URL-адрес?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Не удалось открыть страницу" +msgstr "Не удается открыть URL-адрес" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2432,7 +2429,7 @@ msgstr "Дополнительно" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Позволяет жидкостям быть прозрачными." #: src/settings_translation_file.cpp msgid "" @@ -2502,6 +2499,16 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Примените сглаживание, чтобы уменьшить искажения цветовых полос.\n" +"Сглаживание значительно увеличивает размер\n" +"скриншотов, сжатых без потерь, и работает некорректно, если дисплей или " +"операционная система\n" +"выполняют дополнительное сглаживание или если цветовые каналы не квантованы\n" +"до 8 бит.\n" +"В OpenGL ES сглаживание работает только в том случае, если шейдер " +"поддерживает высокую\n" +"точность с плавающей запятой, и это может оказать более высокое влияние на " +"производительность." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2520,7 +2527,6 @@ msgid "Ask to reconnect after crash" msgstr "Запрашивать переподключение после краха" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2532,17 +2538,19 @@ msgid "" "optimization.\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"На этом расстоянии сервер будет агрессивно оптимизировать то, какие\n" -"мапблоки будут отправлены клиентам.\n" -"Малые значения могут увеличить производительность за счёт заметных\n" -"проблем визуализации (некоторые фрагменты не будут отрисовываться\n" -"под водой, в пещерах, а иногда и на суше).\n" -"Установка этого значения больше, чем max_block_send_distance\n" -"отключит эту оптимизацию.\n" -"Указывается в мапблоках карты (16 нод)." +"На таком расстоянии сервер будет активно оптимизировать, какие блоки будут " +"отправляться\n" +"клиентам.\n" +"Небольшие значения потенциально значительно повышают производительность за " +"счет видимых\n" +"сбоев в рендеринге (некоторые блоки могут отображаться некорректно в шахтах)." +"\n" +"Установка значения, превышающего значение max_block_send_distance, отключает " +"эту\n" +"оптимизацию.\n" +"Указано в MapBlocks (16 нод)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2552,14 +2560,13 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"На этом расстоянии сервер будет агрессивно оптимизировать то, какие\n" -"мапблоки будут отправлены клиентам.\n" -"Малые значения могут увеличить производительность за счёт заметных\n" -"проблем визуализации (некоторые фрагменты не будут отрисовываться\n" -"под водой, в пещерах, а иногда и на суше).\n" -"Установка этого значения больше, чем max_block_send_distance\n" -"отключит эту оптимизацию.\n" -"Указывается в мапблоках карты (16 нод)." +"На таком расстоянии сервер выполнит более простую и дешевую проверку " +"окклюзии.\n" +"Меньшие значения потенциально повышают производительность за счет временно " +"заметных\n" +"сбоев в рендеринге (пропущенных блоков).\n" +"Это особенно полезно при очень большом диапазоне просмотра (более 500).\n" +"Указано в MapBlocks (16 узлов)." #: src/settings_translation_file.cpp msgid "Audio" @@ -2622,9 +2629,8 @@ msgid "Biome noise" msgstr "Шум биомов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Дистанция оптимизирования отправки мапблока" +msgstr "Отбраковка блоков оптимизирует расстояние" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2847,6 +2853,10 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Список разделенных запятыми расширений AL и ALC, которые не следует " +"использовать.\n" +"Полезно для тестирования. Подробности смотрите в разделе " +"al_extensions.[h,cpp]." #: src/settings_translation_file.cpp msgid "" @@ -3069,7 +3079,6 @@ msgstr "" "но также использует больше ресурсов." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3081,11 +3090,16 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Включите, чтобы запретить подключение старых клиентов.\n" -"Старые клиенты совместимы в том смысле, что они не будут крашиться при " -"подключении\n" -"к новым серверам, однако они могут не поддерживать всех новых функций, " -"которые вы ожидаете." +"Определите, к каким самым старым клиентам разрешено подключаться.\n" +"Старые клиенты совместимы в том смысле, что они не будут выходить из строя " +"при подключении\n" +"к новым серверам, но они могут поддерживать не все новые функции, которые вы " +"ожидаете.\n" +"Это позволяет осуществлять более детальный контроль, чем " +"strict_protocol_version_checking.\n" +"Minetest по-прежнему применяет свой собственный внутренний минимум, и " +"включение\n" +"strict_protocol_version_checking эффективно отменит это." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3291,9 +3305,8 @@ msgid "Enable Bloom Debug" msgstr "Включить отладку свечения" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Включить урон" +msgstr "Включить Дебандинг" #: src/settings_translation_file.cpp msgid "" @@ -3322,9 +3335,8 @@ msgstr "" "противном случае используется фильтрация PCF." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Постобработка" +msgstr "Включить Постобработку" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3376,9 +3388,9 @@ msgid "Enable mouse wheel (scroll) for item selection in hotbar." msgstr "Включает колёсико мыши (прокрутку) для выбора предмета в хотбаре." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "Включить случайный ввод пользователя (только для тестов)." +msgstr "" +"Включите случайную загрузку модов (в основном используемых для тестирования)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3411,9 +3423,8 @@ msgstr "" "которые вы ожидаете." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Сенсорный экран" +msgstr "Включить сенсорный экран" #: src/settings_translation_file.cpp msgid "" @@ -3468,16 +3479,18 @@ msgstr "Включает кэширование повёрнутых мешей. #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Включает отладку и проверку ошибок в драйвере OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Включает конвейер последующей обработки." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Включает сенсорный режим, позволяющий играть в игру с помощью сенсорного " +"экрана." #: src/settings_translation_file.cpp msgid "" @@ -4400,15 +4413,15 @@ msgstr "" "- Opaque: прозачность отключена" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Длительность шага сервера и интервал, с которым объекты обычно\n" -"обновляются по сети, в секундах." +"Длительность тика сервера (интервал, с которым обычно все обновляется),\n" +"указанная в секундах.\n" +"Не применяется к сеансам, размещенным из клиентского меню." #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -4636,7 +4649,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Атрибуты генерации для мапгена v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4645,10 +4657,12 @@ msgid "" "The 'temples' flag disables generation of desert temples. Normal dungeons " "will appear instead." msgstr "" -"Атрибуты генерации для мапгена v6.\n" -"Параметр «snowbiomes» (снежные биомы) включает новую систему с 5 биомами.\n" -"Если «snowbiomes» включён, то автоматически активируются джунгли,\n" -"а флаг «jungles» не учитывается." +"Атрибуты создания карт, специфичные для Mapgen v6.\n" +"Флаг «snowbiomes» включает новую систему 5 биомов.\n" +"При включенном флаге «snowbiomes» автоматически включаются джунгли, а\n" +"флаг «jungles» игнорируется.\n" +"Флаг «temples» отключает создание храмов в пустыне. Вместо них появятся " +"обычные данжи." #: src/settings_translation_file.cpp msgid "" @@ -4954,9 +4968,8 @@ msgid "Minimap scan height" msgstr "Высота сканирования миникарты" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Интервал повторного размещения" +msgstr "Минимальный интервал повторения раскопок" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -5027,9 +5040,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Множитель чувствительности мыши." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Порог пещер" +msgstr "Порог перемещения" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5184,9 +5196,8 @@ msgstr "" "Не срабатывает, если какая-либо форма уже открыта." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Отладка мапгена" +msgstr "Отладка OpenGL" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5322,13 +5333,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Соотношение больших пещер, которые содержат жидкости." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "Несоответствие версии протокола. " +msgstr "Минимальная версия протокола" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Жест удара кулаком" #: src/settings_translation_file.cpp msgid "" @@ -5349,7 +5359,7 @@ msgstr "Случайный ввод" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Случайный порядок загрузки мода" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5560,7 +5570,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "См. http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Select the antialiasing method to apply.\n" "\n" @@ -5583,22 +5592,25 @@ msgid "" msgstr "" "Выберите метод сглаживания, который необходимо применить.\n" "\n" -"* None - сглаживание отсутствует (по умолчанию)\n" +"* * Нет - сглаживание отсутствует (по умолчанию).\n" "\n" -"* FSAA - аппаратное полноэкранное сглаживание (несовместимое с шейдерами)\n" -", известное как сглаживание с несколькими выборками (MSAA)\n" +"* FSAA - Аппаратное полноэкранное сглаживание\n" +"(несовместимое с постобработкой и недостаточной дискретизацией)\n" +", аналогичное сглаживанию с несколькими выборками (MSAA)\n" "Сглаживает края блоков, но не влияет на внутреннюю часть текстур.\n" "Для изменения этого параметра требуется перезагрузка.\n" "\n" -"* FXAA - быстрое приблизительное сглаживание (требуются шейдеры)\n" -"Применяет фильтр постобработки для обнаружения и сглаживания " +"* FXAA - Быстрое приблизительное сглаживание (требуется использование " +"шейдеров)\n" +"Применяется фильтр последующей обработки для обнаружения и сглаживания " "высококонтрастных краев.\n" "Обеспечивает баланс между скоростью и качеством изображения.\n" "\n" -"* SSAA - сглаживание с супер-выборкой (требуются шейдеры)\n" -"Рендерит изображение сцены с более высоким разрешением, затем уменьшает " -"масштаб,\n" -"чтобы уменьшить эффекты наложения. Это самый медленный и точный метод." +"* SSAA - сглаживание с использованием суперсэмплирования (требуются шейдеры)" +"\n" +"Визуализирует изображение сцены с более высоким разрешением, затем уменьшает " +"масштаб, чтобы уменьшить\n" +"эффекты наложения. Это самый медленный и точный метод." #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." @@ -5727,13 +5739,12 @@ msgstr "" "Диапазон: от -1 до 1.0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"Устанавливает язык. Оставьте пустым, чтобы использовать системный язык.\n" -"Требует перезапуска после изменения." +"Установит язык. По умолчанию используется язык системы.\n" +"После изменения этого параметра требуется перезагрузка." #: src/settings_translation_file.cpp msgid "" @@ -5776,6 +5787,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." msgstr "" +"Установите значение true, чтобы включить эффект объемного освещения (он же " +"\"Божественные лучи\")." #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5822,16 +5835,14 @@ msgid "Shaders" msgstr "Шейдеры" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" -"Шейдеры позволяют использовать дополнительные визуальные эффекты и могут " -"увеличить\n" -"производительность некоторых видеоплат.\n" -"Работают только с движком отрисовки OpenGL." +"Шейдеры позволяют создавать расширенные визуальные эффекты и могут повысить " +"производительность некоторых\n" +"видеокарт." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -5952,14 +5963,13 @@ msgid "Smooth lighting" msgstr "Мягкое освещение" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." msgstr "" -"Плавное вращение камеры в кинематографичном режиме, 0 для отключения. " -"Включите кинематографичный режим клавишей, определённой в настройках " -"управления." +"Сглаживает поворот камеры в кинематографическом режиме, 0 для отключения. " +"Войдите в кинематографический режим, используя клавишу, установленную в " +"элементах управления." #: src/settings_translation_file.cpp msgid "" @@ -5986,9 +5996,8 @@ msgid "Sound" msgstr "Звук" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "Чёрный список меток ContentDB" +msgstr "Черный список Расширений Звука" #: src/settings_translation_file.cpp msgid "" @@ -6204,6 +6213,8 @@ msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"Задержка в миллисекундах, после которой сенсорное взаимодействие считается " +"длительным нажатием." #: src/settings_translation_file.cpp msgid "" @@ -6223,17 +6234,26 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"Жест, обозначающий удар по игроку/объекту.\n" +"Его можно изменить в играх и модах.\n" +"\n" +"* короткий удар\n" +"Прост в использовании и хорошо известен по другим играм, названия которых не " +"указываются.\n" +"\n" +"* длинный удар\n" +"Известен по классическому мобильному элементу управления Minetest.\n" +"Сражение более или менее невозможно." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" msgstr "Идентификатор используемого контроллера" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." msgstr "" -"Расстояние в пикселях, с которого начинается действие от сенсорного экрана." +"Длина в пикселях, после которой сенсорное взаимодействие считается движением." #: src/settings_translation_file.cpp msgid "" @@ -6248,13 +6268,13 @@ msgstr "" "Значение по умолчанию — 1.0 (1/2 ноды)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." msgstr "" -"Задержка в секундах перед повторным размещением ноды\n" -"при удержании клавиши размещения." +"Минимальное время в секундах, которое требуется между копающими узлами при " +"удерживании\n" +"кнопки копать." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6287,17 +6307,17 @@ msgstr "" "Это должно быть настроено вместе с active_object_send_range_blocks." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" "OpenGL is the default for desktop, and OGLES2 for Android.\n" "Shaders are supported by everything but OGLES1." msgstr "" -"Движок отрисовки.\n" -"Примечение: после изменения этой настройки требуется перезапуск!\n" -"OpenGL по умолчанию для компьютеров и OGLES2 для Android.\n" -"Шейдеры поддерживаются OpenGL и OGLES2 (экспериментально)." +"Серверная часть рендеринга.\n" +"Примечание: После изменения этого параметра требуется перезагрузка!\n" +"По умолчанию для настольных компьютеров используется OpenGL, а для Android - " +"OGLES2.\n" +"Шейдеры поддерживаются всеми, кроме OGLES1." #: src/settings_translation_file.cpp msgid "" @@ -6377,7 +6397,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Порог для длинных нажатий" #: src/settings_translation_file.cpp msgid "" @@ -6438,9 +6458,8 @@ msgid "Tradeoffs for performance" msgstr "Компромиссы для производительности" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Непрозрачные жидкости" +msgstr "Полупрозрачные жидкости" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6487,14 +6506,14 @@ msgstr "" "производительностью." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "URL to JSON file which provides information about the newest Minetest " "release\n" "If this is empty the engine will never check for updates." msgstr "" -"Адрес к файлу JSON, который предоставляет сведения о последнем выпуске " -"Minetest" +"URL-адрес файла JSON, который предоставляет информацию о последней версии " +"Minetest\n" +"Если поле не заполнено, движок никогда не будет проверять наличие обновлений." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6709,7 +6728,7 @@ msgstr "Громкость" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Увеличивается громкость, когда окно не сфокусировано." #: src/settings_translation_file.cpp msgid "" @@ -6720,14 +6739,12 @@ msgstr "" "Требует включенной звуковой системы." #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "Максимум FPS при паузе или вне фокуса" +msgstr "Громкость при расфокусировке" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "Мягкое освещение" +msgstr "Объемное освещение" #: src/settings_translation_file.cpp msgid "" From 0dcf3c57c79bd8cd716cd10cf5dc2f0d70c07fd6 Mon Sep 17 00:00:00 2001 From: AlexTECPlayz Date: Fri, 26 Jul 2024 19:45:12 +0000 Subject: [PATCH 23/59] Translated using Weblate (Romanian) Currently translated at 55.7% (744 of 1335 strings) --- po/ro/minetest.po | 173 ++++++++++++++++++++-------------------------- 1 file changed, 74 insertions(+), 99 deletions(-) diff --git a/po/ro/minetest.po b/po/ro/minetest.po index 59d37524b..3421fb593 100644 --- a/po/ro/minetest.po +++ b/po/ro/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Romanian (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-03-04 07:35+0000\n" -"Last-Translator: Lars Müller \n" +"PO-Revision-Date: 2024-07-27 04:09+0000\n" +"Last-Translator: AlexTECPlayz \n" "Language-Team: Romanian \n" "Language: ro\n" @@ -13,7 +13,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -72,9 +72,8 @@ msgid "Command not available: " msgstr "Comandă indisponibilă: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Obține ajutor pentru comenzi" +msgstr "Obțineți ajutor pentru comenzi (-t: răspuns în chat)" #: builtin/common/chatcommands.lua msgid "" @@ -84,9 +83,8 @@ msgstr "" "complete." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | ]" +msgstr "[all | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -121,7 +119,6 @@ msgid "Protocol version mismatch. " msgstr "Nepotrivire versiune protocol. " #: builtin/mainmenu/common.lua -#, fuzzy msgid "Server enforces protocol version $1. " msgstr "Serverul forțează versiunea protocolului $1. " @@ -150,11 +147,10 @@ msgid "Failed to download $1" msgstr "Nu s-a putut descărca $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" -msgstr "Eroare la despachetarea „$1” (fișier incompatibil sau arhivă defectă)" +msgstr "Eroare în extragerea „$1” (fișier incompatibil sau arhivă coruptă)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -186,7 +182,7 @@ msgstr "Descărcare..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Eroare la obținerea dependențelor pentru pachet" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -464,7 +460,7 @@ msgstr "Decorațiuni" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Temple în deșert" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -474,7 +470,7 @@ msgstr "„Development Test” este destinat dezvoltatorilor." msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" -msgstr "" +msgstr "Variantă diferită de temniță generată în ecosisteme deșertice" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -695,9 +691,8 @@ msgid "Minetest Game is no longer installed by default" msgstr "Minetest Game nu mai este instalat în mod implicit" #: builtin/mainmenu/dlg_reinstall_mtg.lua -#, fuzzy msgid "Reinstall Minetest Game" -msgstr "Instalează un alt joc" +msgstr "Reinstalați jocul Minetest" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" @@ -774,9 +769,8 @@ msgid "Select file" msgstr "Selectează fila" #: builtin/mainmenu/settings/components.lua -#, fuzzy msgid "Set" -msgstr "Selectează" +msgstr "Selectați" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua msgid "(No description of setting given)" @@ -878,9 +872,8 @@ msgid "Movement" msgstr "Mișscare" #: builtin/mainmenu/settings/dlg_settings.lua -#, fuzzy msgid "Reset setting to default" -msgstr "Restabilește valori implicite" +msgstr "Restabiliți la valorile implicite" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Reset setting to default ($1)" @@ -1000,18 +993,16 @@ msgid "Browse online content" msgstr "Căutați conținut online" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Browse online content [$1]" -msgstr "Căutați conținut online" +msgstr "Explorați conținut online [$1]" #: builtin/mainmenu/tab_content.lua msgid "Content" msgstr "Conţinut" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Content [$1]" -msgstr "Conţinut" +msgstr "Conţinut [$1]" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" @@ -1034,9 +1025,8 @@ msgid "Rename" msgstr "Redenumiți" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Update available?" -msgstr "" +msgstr "Actualizare disponibilă?" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" @@ -1075,15 +1065,16 @@ msgid "Install games from ContentDB" msgstr "Instalarea jocurilor din ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game nu mai este instalat în mod implicit" +msgstr "Minetest nu vine cu un joc preinstalat." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest este o platformă de creare de jocuri care vă permite să jucați " +"multe jocuri diferite." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1118,9 +1109,8 @@ msgid "Start Game" msgstr "Începe Jocul" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Trebuie să instalezi un joc înainte să poți instala un mod" +msgstr "Trebuie să instalați un joc înainte să puteți crea o lume." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1294,10 +1284,8 @@ msgid "Camera update enabled" msgstr "Actualizarea camerei este activată" #: src/client/game.cpp -#, fuzzy msgid "Can't show block bounds (disabled by game or mod)" -msgstr "" -"Nu se pot afișa limitele blocurilor (dezactivate de modificare sau joc)" +msgstr "Nu se pot afișa limitele blocurilor (dezactivate de mod sau joc)" #: src/client/game.cpp msgid "Change Password" @@ -1336,7 +1324,6 @@ msgid "Continue" msgstr "Continuă" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1351,18 +1338,18 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" -"Controale implicite:\n" -"Niciun meniu vizibil:\n" -"- apăsare unică: activare buton\n" -"- apăsare dublă: plasare / utilizare\n" -"- deget glisant: privește în jur\n" -"Meniu / Inventar vizibil:\n" -"- apăsare dublă (exterior):\n" -" -> close\n" -"- touch stack, slot pentru atingere:\n" -" -> mută stiva\n" -"- atingeți și trageți, atingeți al doilea deget\n" -" -> plasați un singur element în slot\n" +"Controale:\n" +"Niciun meniu deschis:\n" +"- glisați degetul: priviți în jur\n" +"- apăsați: plasați/perforați/utilizați (implicit)\n" +"- apăsați lung: săpați/utilizați (implicit)\n" +"Meniu/inventar deschis:\n" +"- dublă apăsare (în exterior):\n" +" --> închideți\n" +"- atingeți grămada, atingeți slotul:\n" +" --> mutați grămada\n" +"- atingeți și trageți, apăsați cu un al doilea deget\n" +" --> plasați un singur articol în slot\n" #: src/client/game.cpp #, c-format @@ -1435,9 +1422,8 @@ msgid "Fog enabled" msgstr "Ceață activată" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Zoom dezactivat în prezent de joc sau mod" +msgstr "Ceață activată de joc sau mod" #: src/client/game.cpp msgid "Game info:" @@ -1559,23 +1545,21 @@ msgid "Unable to listen on %s because IPv6 is disabled" msgstr "Ascultarea pe %s nu este posibilă pentru că IPv6 este dezactivat" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range disabled" -msgstr "Interval de vizualizare nelimitat activat" +msgstr "Distanță de vizibilitate nelimitată dezactivată" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range enabled" -msgstr "Interval de vizualizare nelimitat activat" +msgstr "Distanță de vizibilitate nelimitată activată" #: src/client/game.cpp msgid "Unlimited viewing range enabled, but forbidden by game or mod" msgstr "Rază infinită de vedere activată. dar interzisă de joc sau mod" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing changed to %d (the minimum)" -msgstr "Intervalul de vizualizare este cel puțin: %d" +msgstr "Distanța de vizibilitate schimbată la %d (minimă)" #: src/client/game.cpp #, c-format @@ -1589,9 +1573,9 @@ msgid "Viewing range changed to %d" msgstr "Intervalul de vizualizare s-a modificat la %d" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing range changed to %d (the maximum)" -msgstr "Intervalul de vizualizare s-a modificat la %d" +msgstr "Distanța de vizibilitate schimbată la %d (maximă)" #: src/client/game.cpp #, c-format @@ -1601,9 +1585,10 @@ msgstr "" "Vederea schimbată la %d (maximul), dar limitată la %d de către joc sau mod" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing range changed to %d, but limited to %d by game or mod" -msgstr "Intervalul de vizualizare s-a modificat la %d" +msgstr "" +"Distanța de vizibilitate schimbată la %d, dar limitată la %d de joc sau mod" #: src/client/game.cpp #, c-format @@ -1657,28 +1642,24 @@ msgstr "Înapoi" #. ~ Usually paired with the Pause key #: src/client/keycode.cpp -#, fuzzy msgid "Break Key" -msgstr "Cheie pentru furiș" +msgstr "Tasta de pauză" #: src/client/keycode.cpp msgid "Caps Lock" msgstr "Majuscule" #: src/client/keycode.cpp -#, fuzzy msgid "Clear Key" -msgstr "Șterge" +msgstr "Tasta de eliminare" #: src/client/keycode.cpp -#, fuzzy msgid "Control Key" -msgstr "Control" +msgstr "Tasta Control" #: src/client/keycode.cpp -#, fuzzy msgid "Delete Key" -msgstr "Șterge" +msgstr "Tasta de ștergere" #: src/client/keycode.cpp msgid "Down Arrow" @@ -1729,9 +1710,8 @@ msgid "Insert" msgstr "Insert" #: src/client/keycode.cpp -#, fuzzy msgid "Left Arrow" -msgstr "Ctrl Stânga" +msgstr "Săgeată stânga" #: src/client/keycode.cpp msgid "Left Button" @@ -1755,9 +1735,8 @@ msgstr "Windows Stânga" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp -#, fuzzy msgid "Menu Key" -msgstr "Meniu" +msgstr "Tastă Meniu" #: src/client/keycode.cpp msgid "Middle Button" @@ -1832,20 +1811,17 @@ msgid "OEM Clear" msgstr "Curățare OEM" #: src/client/keycode.cpp -#, fuzzy msgid "Page Down" -msgstr "Pagină în jos" +msgstr "Pagină jos" #: src/client/keycode.cpp -#, fuzzy msgid "Page Up" msgstr "Pagină sus" #. ~ Usually paired with the Break key #: src/client/keycode.cpp -#, fuzzy msgid "Pause Key" -msgstr "Pauză" +msgstr "Tasta Pauză" #: src/client/keycode.cpp msgid "Play" @@ -1857,14 +1833,12 @@ msgid "Print" msgstr "Imprimare" #: src/client/keycode.cpp -#, fuzzy msgid "Return Key" -msgstr "Înapoi" +msgstr "Tasta Retur" #: src/client/keycode.cpp -#, fuzzy msgid "Right Arrow" -msgstr "Ctrl Dreapta" +msgstr "Săgeată dreapta" #: src/client/keycode.cpp msgid "Right Button" @@ -1896,9 +1870,8 @@ msgid "Select" msgstr "Selectează" #: src/client/keycode.cpp -#, fuzzy msgid "Shift Key" -msgstr "Shift" +msgstr "Tasta Shift" #: src/client/keycode.cpp msgid "Sleep" @@ -1929,9 +1902,8 @@ msgid "X Button 2" msgstr "X Butonul 2" #: src/client/keycode.cpp -#, fuzzy msgid "Zoom Key" -msgstr "Mărire" +msgstr "Tasta Mărire" #: src/client/minimap.cpp msgid "Minimap hidden" @@ -1952,13 +1924,13 @@ msgid "Minimap in texture mode" msgstr "Mini hartă în modul de textură" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Pagina nu s-a putut deschide" +msgstr "Eroare la compilarea shaderului \"%s\"." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Shaderele sunt activate dar GLSL nu este suportat de driver." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2155,16 +2127,15 @@ msgstr "apasă o tastă" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Deschideți" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Deschideți URL?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Pagina nu s-a putut deschide" +msgstr "URL nu s-a putut deschide" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2215,9 +2186,9 @@ msgid "Name is taken. Please choose another name" msgstr "Numele este folosit. Vă rugăm să alegeți altul" #: src/server.cpp -#, fuzzy, c-format +#, c-format msgid "%s while shutting down: " -msgstr "Se închide..." +msgstr "%s în timp ce se închide: " #: src/settings_translation_file.cpp msgid "" @@ -2462,7 +2433,7 @@ msgstr "Avansat" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Permiteți lichidelor să fie transparente." #: src/settings_translation_file.cpp msgid "" @@ -3132,19 +3103,21 @@ msgstr "Definește zonele unde copacii pot avea mere." #: src/settings_translation_file.cpp msgid "Defines areas with sandy beaches." -msgstr "" +msgstr "Definește zone cu plaje nisipoase." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" +msgstr "Definește distribuția de teren înalt și înclinația stâncilor." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain." -msgstr "" +msgstr "Definește distribuția de teren înalt." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." msgstr "" +"Definește mărimea totală a cavernelor, valori mai mici vor crea caverne mai " +"mari." #: src/settings_translation_file.cpp msgid "" @@ -3155,25 +3128,27 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Defines large-scale river channel structure." -msgstr "" +msgstr "Definește structura canalelor de scală mare." #: src/settings_translation_file.cpp msgid "Defines location and terrain of optional hills and lakes." -msgstr "" +msgstr "Definește locația și terenul dealurilor și lacurilor opționale." #: src/settings_translation_file.cpp msgid "Defines the base ground level." -msgstr "" +msgstr "Definește nivelul de bază al solului." #: src/settings_translation_file.cpp msgid "Defines the depth of the river channel." -msgstr "" +msgstr "Definește adâncimea canalul unui râu." #: src/settings_translation_file.cpp msgid "" "Defines the magnitude of bloom overexposure.\n" "Range: from 0.1 to 10.0, default: 1.0" msgstr "" +"Definește magnitudinea supraexpunerii la strălucire.\n" +"Interval: de la 0.1 la 10.0, implicit: 1.0" #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." From e558e44af4f6b4733ceee98faf210ece85f6b267 Mon Sep 17 00:00:00 2001 From: reimu105 Date: Fri, 26 Jul 2024 03:32:07 +0000 Subject: [PATCH 24/59] Translated using Weblate (Chinese (Traditional)) Currently translated at 91.6% (1223 of 1335 strings) --- po/zh_TW/minetest.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po index a9a0601be..3ae35bba6 100644 --- a/po/zh_TW/minetest.po +++ b/po/zh_TW/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Chinese (Traditional) (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-07-13 21:31+0000\n" -"Last-Translator: Yic95 <0Luke.Luke0@gmail.com>\n" +"PO-Revision-Date: 2024-07-27 04:09+0000\n" +"Last-Translator: reimu105 \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_TW\n" @@ -1054,9 +1054,8 @@ msgid "Install games from ContentDB" msgstr "從 ContentDB 安裝遊戲" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "預設不再安裝 Minetest 遊戲" +msgstr "預設不再安裝 Minetest 遊戲。" #: builtin/mainmenu/tab_local.lua msgid "" @@ -1097,9 +1096,8 @@ msgid "Start Game" msgstr "開始遊戲" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "您需要先安裝遊戲才能安裝模組" +msgstr "您需要先安裝遊戲才能安裝模組。" #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -3048,7 +3046,6 @@ msgstr "" "但也使用更多的資源。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3060,9 +3057,12 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"啟用以讓舊的用戶端無法連線。\n" -"較舊的用戶端在這個意義上相容,它們不會在連線至\n" -"新伺服器時當掉,但它們可能會不支援一些您預期會有的新功能。" +"定義允許連線的最早的客戶端。\n" +"較舊的客戶端是相容的,因為它們在連接時不會崩潰\n" +"到新伺服器,但它們可能不支援您期望的所有新功能。\n" +"這允許比 strict_protocol_version_checking 更細粒度的控制。\n" +"Minetest 仍然強制執行其自己的內部最低限度,並啟用\n" +"strict_protocol_version_checking 將有效地覆蓋這一點。" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." From c0fd23e6884a9b02bc0b5ae8aa97498711dba545 Mon Sep 17 00:00:00 2001 From: Yof Date: Mon, 29 Jul 2024 21:43:43 +0000 Subject: [PATCH 25/59] Translated using Weblate (Ukrainian) Currently translated at 96.6% (1290 of 1335 strings) --- po/uk/minetest.po | 253 +++++++++++++++++++++++----------------------- 1 file changed, 124 insertions(+), 129 deletions(-) diff --git a/po/uk/minetest.po b/po/uk/minetest.po index 02cff8873..045a723e7 100644 --- a/po/uk/minetest.po +++ b/po/uk/minetest.po @@ -3,17 +3,17 @@ msgstr "" "Project-Id-Version: Ukrainian (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-06-23 19:09+0000\n" -"Last-Translator: YearOfFuture \n" +"PO-Revision-Date: 2024-08-04 22:09+0000\n" +"Last-Translator: Yof \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.6-rc\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -72,9 +72,8 @@ msgid "Command not available: " msgstr "Команда недоступна: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Отримати довідку щодо команд" +msgstr "Отримати довідку щодо команд (-t: вивести у чаті)" #: builtin/common/chatcommands.lua msgid "" @@ -84,9 +83,8 @@ msgstr "" "all', щоб перелічити все." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | <команда>]" +msgstr "[all | <команда>] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -149,12 +147,12 @@ msgid "Failed to download $1" msgstr "Не вдалося завантажити $1" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Не вдалося витягти \"$1\" (непідтримуваний тип файлу або пошкоджений архів)" +"Не вдалося витягти \"$1\" (недостатнє місце на диску, непідтримуваний тип " +"файлу або пошкоджений архів)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -186,7 +184,7 @@ msgstr "Завантаження..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Помилка при отриманні залежностей для пакунку" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -464,7 +462,7 @@ msgstr "Декорації" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Храми пустель" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -475,6 +473,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Інший варіант підземель, що генерується у біомах пустелі (тільки якщо " +"увімкнені підземелля)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -1068,15 +1068,15 @@ msgid "Install games from ContentDB" msgstr "Встановити ігри з ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game більше не встановлюється за замовчуванням" +msgstr "Minetest більше не встановлювається з грою." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest – це ігрова платформа, що дозволяє вам грати у багато різних ігор." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1111,9 +1111,8 @@ msgid "Start Game" msgstr "Почати гру" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Вам потрібно встановити гру перед тим, як встановлювати мод" +msgstr "Вам потрібно встановити гру перед ти, як створювати світ." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1327,7 +1326,6 @@ msgid "Continue" msgstr "Продовжити" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1343,16 +1341,16 @@ msgid "" " --> place single item to slot\n" msgstr "" "Керування:\n" -"Коли меню не відображається:\n" -"- провести пальцем: роззирнутися\n" -"- дотик: встановити/використати\n" -"- довгий дотик: копати/вдарити/використати\n" -"Коли відображається меню або інвертар:\n" -"- дотикнутися двічі (поза межами):\n" +"Коли немає відкритих меню:\n" +"- проведення пальцем: роззирнутися\n" +"- дотик: встановити/вдарити/використати\n" +"- довгий дотик: копати/використати\n" +"У відкритому меню або інвертарі:\n" +"- подвійний дотик (поза межами):\n" " --> закрити\n" -"- Торкнутися купи, торкнутися комірки:\n" +"- доторкання купи, доторкання комірки\n" " --> перемістити купу\n" -"- Торкнутися і тягнути, дотикнутися другим пальцем\n" +"- доторкання і перетягування, дотик другим пальцем\n" " --> помістити один предмет у комірку\n" #: src/client/game.cpp @@ -1426,9 +1424,8 @@ msgid "Fog enabled" msgstr "Туман увімкнено" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Наближення (бінокль) вимкнено грою або модифікацією" +msgstr "Туман увімкнено грою або модом" #: src/client/game.cpp msgid "Game info:" @@ -1926,13 +1923,13 @@ msgid "Minimap in texture mode" msgstr "Мінімапа в текстурному режимі" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Не вдалося завантажити вебсторінку" +msgstr "Не вдалося скомпілювати шейдер \"%s\"." #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Відтінювачі увімкнені, але GLSL не підтримується драйвером." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2129,16 +2126,15 @@ msgstr "натисніть клавішу" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Відкрити" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Відкрити URL?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Не вдалося завантажити вебсторінку" +msgstr "Не вдалося відкрити URL" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2426,7 +2422,7 @@ msgstr "Додатково" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Дозволяє рідинам бути напівпрозорими." #: src/settings_translation_file.cpp msgid "" @@ -2496,6 +2492,13 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Застосуйте згладжування, щоб зменшити кількість артефактів кольорових смуг.\n" +"Згладжування значно збільшує розмір знімків екрана, стиснутих без втрат,\n" +"і працює некоректно, якщо екран або операційна система виконує\n" +"додаткове згладжування або якщо кольорові канали не квантуються\n" +"до 8 бітів.\n" +"З OpenGL ES згладжування працює лише якщо відтінювач підтримує високу\n" +"точність чисел з плаваючою комою й може більше впливати на продуктивність." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2514,7 +2517,6 @@ msgid "Ask to reconnect after crash" msgstr "Запитувати про перезʼєднання під час збою" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2526,17 +2528,15 @@ msgid "" "optimization.\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"На цій відстані сервер буде агресивно оптимізувати те, які блоки\n" -"надсилаються клієнтам.\n" -"Маленькі значення можуть значно покращити продуктивність, за\n" -"рахунок проблем відображення (деякі блоки не будуть\n" -"відображені під водою й у печерах, а також иноді на поверхні).\n" -"Виставлення цього до значення, що більше, ніж\n" -"max_block_send_distance, вимикає цю оптимізацію.\n" +"На цій відстані сервер буде агресивно оптимізувати, які блоки\n" +"надсилатимуться клієнтам.\n" +"Меньші значення потенційно значно підвищують продуктивність за рахунок\n" +"проблем промальовування (блоки можуть неправильно відображатися у печерах).\n" +"Виставлення цього до значення більше за max_block_send_distance вимикає\n" +"цю оптимізацію.\n" "Зазначається у блоках мапи (16 блоків)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2546,13 +2546,11 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"На цій відстані сервер буде агресивно оптимізувати те, які блоки\n" -"надсилаються клієнтам.\n" -"Маленькі значення можуть значно покращити продуктивність, за\n" -"рахунок проблем відображення (деякі блоки не будуть\n" -"відображені під водою й у печерах, а також иноді на поверхні).\n" -"Виставлення цього до значення, що більше, ніж\n" -"max_block_send_distance, вимикає цю оптимізацію.\n" +"На цій відстані сервер буде виконувати простіше й дешевше перевірку " +"затінення.\n" +"Меньші значення потенційно підвищують продуктивність, за рахунок тимчасово\n" +"видимих проблем відображення (зниклі блоки).\n" +"Це особливо корисно для дуже великого діапазону огляду (понад 500).\n" "Зазначається у блоках мапи (16 блоків)." #: src/settings_translation_file.cpp @@ -2616,9 +2614,8 @@ msgid "Biome noise" msgstr "Шум біому" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Оптимальна відстань надсилання блока" +msgstr "Відстань оптимізації вибракування блоків" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2840,6 +2837,9 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Розділений комами перелік розширень AL і ALC, які не повинно використовувати." +"\n" +"Корисно для тестування. Подробиці у файлах al_extensions.[h,cpp]." #: src/settings_translation_file.cpp msgid "" @@ -2851,9 +2851,9 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" -"Розділений комами перелік міток, які треба приховувати у репозиторії " -"вмісту.\n" -"\"nonfree\" використовується для приховання пакетів, що не є \"вільним " +"Розділений комами перелік міток, які треба приховувати у репозиторії вмісту." +"\n" +"\"nonfree\" використовується для приховання пакунків, що не є \"вільним " "програмним\n" "забезпеченням\", як визначено Фондом вільного програмного забезпечення.\n" "Ви також можете вказувати оцінки вмісту.\n" @@ -3064,7 +3064,6 @@ msgstr "" "диск, але також використовує більше ресурсів." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3076,10 +3075,14 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Увімкніть, щоб заборонити підключення старим клієнтам.\n" -"Старші клієнти сумісні у тому сенсі, що вони не зазнаватимуть збою при\n" -"підключенні до нових серверів, але вони можуть не підтримувати усі нові " -"функції, на які ви очікуєте." +"Визначте найстаріші клієнти, яким дозволено під'єднуватися.\n" +"Старіші клієнти сумісні у тому сенсі, що вони не зазнаватимуть збою при " +"підключенні\n" +"до нових серверів, але можуть не підтримувати усі нові функції, на які ви " +"очікуєте.\n" +"Це дозволяє детальніший контроль, ніж strict_protocol_version_checking.\n" +"Minetest все ще примушує свій внутрішній мінімум, і включення\n" +"strict_protocol_version_checking перевизначить це ефективно." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3283,9 +3286,8 @@ msgid "Enable Bloom Debug" msgstr "Увімкнути зневадження світіння" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Пошкодження" +msgstr "Увімкнути дебандинг" #: src/settings_translation_file.cpp msgid "" @@ -3314,9 +3316,8 @@ msgstr "" "тіней\". Інакше використовується PCF." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Постобробка" +msgstr "Увімкнути постобробку" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3369,9 +3370,8 @@ msgstr "" "доступу." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "Увімкнути випадкове введення користувача (тільки для тестування)." +msgstr "Увімкнути випадкове завантаження модів (в основному для тестування)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3403,9 +3403,8 @@ msgstr "" "функції, на які ви очікуєте." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Сенсорний екран" +msgstr "Увімкнути сенсорний екран" #: src/settings_translation_file.cpp msgid "" @@ -3443,7 +3442,7 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" -"Вмикає кінематографічне тональне відображення Hable's «Uncharted 2».\n" +"Вмикає кінематографічне тональне відображення \"Uncharted 2\".\n" "Імітує криву тона фотоплівки й наближає\n" "зображення до більшого динамічного діапазону. Середній контраст злегка\n" "посилюється, відблиски й тіні поступово стискається." @@ -3458,16 +3457,17 @@ msgstr "Вмикає кешування мешів, яких повернули. #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Вмикає зневадження й перевірку помилок у драйвері OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Вмикає конвеєр постобробки." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Вмикає режим сенсорного екрану, дозволяючи вам грати з сенсорним екраном." #: src/settings_translation_file.cpp msgid "" @@ -4387,15 +4387,15 @@ msgstr "" "- Opaque: вимкнути прозорість" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Довжина кроку серверу й інтервал, з яким об'єкти загалом оновлюються по\n" -"мережі, зазначається у секундах." +"Довжина кроку серверу (інтервал, з яким все зазвичай оновлюються),\n" +"зазначається у секундах.\n" +"Не застовується до сесій, які запущено з клієнтського меню." #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -4625,7 +4625,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Спеціальні атрибути генерації для генератору світу V5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4634,10 +4633,12 @@ msgid "" "The 'temples' flag disables generation of desert temples. Normal dungeons " "will appear instead." msgstr "" -"Спеціальні атрибути генерації для генератору світу V6.\n" +"Спеціальні атрибути генерації для генератору світу v6.\n" "Мітка \"snowbiomes\" вмикає нову систему з 5 біомами.\n" -"Коли мітку \"snowbiomes\" увімкнено, автоматично увімкаються джунглі,\n" -"ігноруючи мітку \"jungles\"." +"Коли мітку \"snowbiomes\" увімкнено, автоматично увімкаються джунглі й\n" +"мітка \"jungles\" ігнорується.\n" +"Мітка \"temples\" вимикає генерацію храмів пустель. Замість них " +"з'являтимуться звичайні підземелля." #: src/settings_translation_file.cpp msgid "" @@ -4943,9 +4944,8 @@ msgid "Minimap scan height" msgstr "Висота сканування мінімапи" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Інтервал повторного розміщення" +msgstr "Мінімальний інтервал повторення копання" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -5016,9 +5016,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Множник чутливості миші." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Поріг каверн" +msgstr "Поріг переміщення" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5172,9 +5171,8 @@ msgstr "" "Не відкриває, якщо будь-яка форму вже відкрито." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Налагодження генератора світу" +msgstr "Зневадження OpenGL" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5308,13 +5306,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "Співвідношення великих печер, що містять рідину." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "Невідповідність версії протоколу. " +msgstr "Мінімальна версія протоколу" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Жест удару" #: src/settings_translation_file.cpp msgid "" @@ -5335,7 +5332,7 @@ msgstr "Випадковий ввід" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Випадковий порядок завантаження модів" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5545,7 +5542,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Дивіться https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Select the antialiasing method to apply.\n" "\n" @@ -5570,9 +5566,9 @@ msgstr "" "\n" "* None - без згладжування (за замовчуванням)\n" "\n" -"* FSAA - апаратне повноекранне згладжування (несумісно із відтінювачами),\n" -"також відоме як згладжування з декількома вибірками (multi-sample " -"antialiasing, MSAA)\n" +"* FSAA - апаратне повноекранне згладжування\n" +"(несумісне з пост-обробкою й субдискретизацією),\n" +"також відоме як multi-sample antialiasing (MSAA)\n" "Згладжує кути блоків, але не впливає на внутрішню частину текстур.\n" "Для змінення цього вибору потребується перезавантаження.\n" "\n" @@ -5582,9 +5578,8 @@ msgstr "" "Забезпечує баланс між швидкістю і якістю зображення.\n" "\n" "* SSAA - згладжування із супер-вибіркою (потребує відтінювачів)\n" -"Промальовує зображення сцени з вищою роздільністю, потім зменьшує масштаб, " -"для зменьшення\n" -"ефектів накладення. Це найповільніший і найточніший метод." +"Промальовує зображення сцени з вищою роздільністю, потім зменьшує масштаб,\n" +"для зменшення ефектів накладення. Це найповільніший і найточніший метод." #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." @@ -5713,13 +5708,12 @@ msgstr "" "Діапазон: від -1 до 1.0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"Вказати мову. Залиште порожнім, щоб використовувати системну мову.\n" -"Потрібен перезапуск після цієї зміни." +"Вкажіть мову. За замовчування використовується системна мова.\n" +"Після зміни цього потрібен перезапуск." #: src/settings_translation_file.cpp msgid "" @@ -5762,7 +5756,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." -msgstr "" +msgstr "Увімкніть ефект об'ємного освітлення (також відомий як \"Godrays\")." #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5809,15 +5803,13 @@ msgid "Shaders" msgstr "Відтінювачі" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" -"Відтінювачі дозволяють додаткові визуальні ефекти й можуть збільшити\n" -"продуктивність на деяких відеокартах.\n" -"Це працює тільки з двигуном промальовування OpenGL." +"Відтінювачі дозволяють просунуті визуальні ефекти й можуть збільшити\n" +"продуктивність на деяких відеокартах." #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -5939,14 +5931,12 @@ msgid "Smooth lighting" msgstr "Згладжене освітлення" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." msgstr "" -"Робить обертання камери плавним у кінематографічному режимі, 0 для " -"відключення. Входіть у кінематографічний режім клавішою, визначеною у " -"Змінити клавіші." +"Згладжує обертання камери у кінематографічному режимі, 0 для відключення. " +"Входьте у кінематографічний режім клавішою, визначеною у Керування." #: src/settings_translation_file.cpp msgid "" @@ -5973,9 +5963,8 @@ msgid "Sound" msgstr "Звук" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "Чорний список міток ContentDB" +msgstr "Чорний список розширень звуку" #: src/settings_translation_file.cpp msgid "" @@ -6191,6 +6180,8 @@ msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." msgstr "" +"Затримка в мілісекундах, після якої сенсорна взаємодія вважається довгим " +"дотиком." #: src/settings_translation_file.cpp msgid "" @@ -6210,16 +6201,25 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"Жест, що означає удар по гравцю або сутності.\n" +"Це перевизначатися іграми або модами.\n" +"\n" +"* short_tap (короткий дотик)\n" +"Простий у використанні й відомий за іншими іграми, які не повинні бути " +"названі.\n" +"\n" +"* long_tap (довгий дотик)\n" +"Відомий за класичному мобільному управлінні Minetest.\n" +"Бої більш-менш неможливі." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" msgstr "Ідентифікатор джойстика, що використовується" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." -msgstr "Довжина в пікселях, з якої починається дія з сенсорним екраном." +msgstr "Довжина в пікселях, після якої сенсорна взаємодія вважається рухом." #: src/settings_translation_file.cpp msgid "" @@ -6234,13 +6234,12 @@ msgstr "" "За замовчуванням – 1.0 (1/2 блоки)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." msgstr "" -"Затримка в секундах між повторними розміщеннями блоків при\n" -"затисканні кнопки розміщення." +"Мінімальний час у секундах у перервах на копання блоків при\n" +"затисканні кнопки копання." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6273,7 +6272,6 @@ msgstr "" "Це повинно бути налаштовано разом з active_object_send_range_blocks." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" @@ -6283,7 +6281,7 @@ msgstr "" "Двигун промальовування.\n" "Примітка: після змінення цього потрібен перезапуск!\n" "За замовчуванням OpenGL для ПК, й OGLES2 для Android.\n" -"Відтінювачі підтримуються OpenGL і OGLES2 (експериментально)." +"Відтінювачі підтримуються усіма крім OGLES1." #: src/settings_translation_file.cpp msgid "" @@ -6328,7 +6326,7 @@ msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" -"Затримка в секундах між подіями, що повторюються,\n" +"Затримка в секундах між подіями, що повторюються\n" "при затисканні комбінації кнопок джойстику." #: src/settings_translation_file.cpp @@ -6359,7 +6357,7 @@ msgstr "Третій з 4 шумів 2D що разом визначають д #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "Поріг для довгих дотиків" #: src/settings_translation_file.cpp msgid "" @@ -6420,9 +6418,8 @@ msgid "Tradeoffs for performance" msgstr "Домовленності для продуктивності" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Непрозорі рідини" +msgstr "Напівпрозорі рідини" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6469,13 +6466,13 @@ msgstr "" "продуктивністю." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "URL to JSON file which provides information about the newest Minetest " "release\n" "If this is empty the engine will never check for updates." msgstr "" -"Адреса файлу JSON, що забезпечує інформацію про найновіший реліз Minetest" +"URL до файлу JSON, що забезпечує інформацію про найновіший реліз Minetest\n" +"Якщо ще порожнє, рушій ніколи не перевірятиме оновлення." #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6688,7 +6685,7 @@ msgstr "Гучність" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "Множник гучності, коли вікно не сфокусовано." #: src/settings_translation_file.cpp msgid "" @@ -6699,14 +6696,12 @@ msgstr "" "Вимагає увімкнення системи звуку." #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "FPS, при паузі або поза фокусом" +msgstr "Гучність поза фокусом" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "Згладжене освітлення" +msgstr "Об'ємне освітлення" #: src/settings_translation_file.cpp msgid "" From a760faa3faee00e65585fa0016d5f96f6904a734 Mon Sep 17 00:00:00 2001 From: Honzapkcz Date: Fri, 2 Aug 2024 11:05:43 +0000 Subject: [PATCH 26/59] Translated using Weblate (Czech) Currently translated at 90.0% (1202 of 1335 strings) --- po/cs/minetest.po | 61 +++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/po/cs/minetest.po b/po/cs/minetest.po index 08670d990..5675eb55f 100644 --- a/po/cs/minetest.po +++ b/po/cs/minetest.po @@ -3,16 +3,16 @@ msgstr "" "Project-Id-Version: Czech (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2023-06-19 10:48+0000\n" -"Last-Translator: Robinson \n" +"PO-Revision-Date: 2024-08-02 22:09+0000\n" +"Last-Translator: Honzapkcz \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.18.1\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -187,7 +187,7 @@ msgstr "Stahuji..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Chyba získávání závislostí balíčku" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -230,7 +230,7 @@ msgstr "Balíčky textur" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "The package $1 was not found." -msgstr "" +msgstr "Balíček $1 nebyl nalezen." #: builtin/mainmenu/content/dlg_contentdb.lua builtin/mainmenu/tab_content.lua msgid "Uninstall" @@ -250,7 +250,7 @@ msgstr "Zobrazit více informací v prohlížeči" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "You need to install a game before you can install a mod" -msgstr "" +msgstr "Musíš nainstalovat hru před tím než budeš moct instalovat mod" #: builtin/mainmenu/content/dlg_install.lua msgid "$1 and $2 dependencies will be installed." @@ -465,7 +465,7 @@ msgstr "Dekorace" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Pouštní chrámy" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -476,6 +476,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Různé varianty žalářů generované v pouštních biomech (pouze když jsou žaláře " +"povoleny)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -671,7 +673,7 @@ msgstr "Registrovat" #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "Dismiss" -msgstr "" +msgstr "Odmítnout" #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "" @@ -679,16 +681,20 @@ msgid "" "\"Minetest Game\". Since Minetest 5.8.0, Minetest ships without a default " "game." msgstr "" +"Po dlouhou dobu, Minetest engine byl dodáván s výchozí hrou „Minetest hra“. " +"Od verze 5.8.0 už Minetest s touto hrou dodáván není." #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "" "If you want to continue playing in your Minetest Game worlds, you need to " "reinstall Minetest Game." msgstr "" +"Pokud chceš pokračovat v hraní tvých světů Menetest Hry, tak si ji musíš " +"přeinstalovat." #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "Minetest Game is no longer installed by default" -msgstr "" +msgstr "Minetest Hra už není instalována jako výchozí" #: builtin/mainmenu/dlg_reinstall_mtg.lua #, fuzzy @@ -841,11 +847,11 @@ msgstr "vyhlazení" #: builtin/mainmenu/settings/dlg_settings.lua msgid "(Use system language)" -msgstr "" +msgstr "(Použít jazyk systému)" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Accessibility" -msgstr "" +msgstr "Přístupnost" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Back" @@ -881,7 +887,7 @@ msgstr "Obnovit výchozí" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Reset setting to default ($1)" -msgstr "" +msgstr "Vrátit nastavení do původního stavu ($1)" #: builtin/mainmenu/settings/dlg_settings.lua builtin/mainmenu/tab_online.lua msgid "Search" @@ -889,7 +895,7 @@ msgstr "Vyhledat" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Show advanced settings" -msgstr "" +msgstr "Zobrazit pokročilé nastavení" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Show technical names" @@ -909,11 +915,11 @@ msgstr "Obsah: mody" #: builtin/mainmenu/settings/shadows_component.lua msgid "(The game will need to enable shadows as well)" -msgstr "" +msgstr "(Hra bude muset také povolit stíny)" #: builtin/mainmenu/settings/shadows_component.lua msgid "Custom" -msgstr "" +msgstr "Vlastní" #: builtin/mainmenu/settings/shadows_component.lua msgid "Disabled" @@ -966,7 +972,7 @@ msgstr "Hlavní členové týmu" #: builtin/mainmenu/tab_about.lua msgid "Irrlicht device:" -msgstr "" +msgstr "Irrlicht zařízení:" #: builtin/mainmenu/tab_about.lua msgid "Open User Data Directory" @@ -1073,7 +1079,7 @@ msgstr "Instalovat hry z ContentDB" #: builtin/mainmenu/tab_local.lua msgid "Minetest doesn't come with a game by default." -msgstr "" +msgstr "Minetest není dodáván s výchozí hrou." #: builtin/mainmenu/tab_local.lua msgid "" @@ -1115,7 +1121,7 @@ msgstr "Spuštění hry" #: builtin/mainmenu/tab_local.lua msgid "You need to install a game before you can create a world." -msgstr "" +msgstr "Musíš si nainstalovat hru před tím než si můžeš vytvořit svět." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1675,7 +1681,7 @@ msgstr "Vymazat" #: src/client/keycode.cpp msgid "Down Arrow" -msgstr "" +msgstr "Šipka Dolů" #: src/client/keycode.cpp msgid "End" @@ -1911,7 +1917,7 @@ msgstr "Tabulátor" #: src/client/keycode.cpp msgid "Up Arrow" -msgstr "" +msgstr "Šipka Nahoru" #: src/client/keycode.cpp msgid "X Button 1" @@ -1951,7 +1957,7 @@ msgstr "Nepodařilo se otevřít webovou stránku" #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Shadery jsou povoleny ale GLSL není podporovaný driverem." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2147,11 +2153,11 @@ msgstr "stiskni klávesu" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Otevřít" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Otevřít odkaz?" #: src/gui/guiOpenURL.cpp #, fuzzy @@ -2279,7 +2285,7 @@ msgstr "2D šum, který umisťuje říční koryta a kanály." #: src/settings_translation_file.cpp msgid "3D" -msgstr "" +msgstr "3D" #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2445,7 +2451,7 @@ msgstr "Pokročilé" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Povolí průhledné kapaliny." #: src/settings_translation_file.cpp msgid "" @@ -2866,6 +2872,9 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Čárkou oddělený seznam všech AL a ALC rozšíření které by něměly být použity." +"\n" +"Užitečné pro testování. Podívejte se do al_extensions.[h,cpp] pro detaily." #: src/settings_translation_file.cpp msgid "" From 0f166aa7ec58a478a02f0daa21d3b223195d3226 Mon Sep 17 00:00:00 2001 From: BreadW Date: Mon, 5 Aug 2024 12:46:48 +0000 Subject: [PATCH 27/59] Translated using Weblate (Japanese) Currently translated at 97.6% (1304 of 1335 strings) --- po/ja/minetest.po | 232 +++++++++++++++++++++++----------------------- 1 file changed, 115 insertions(+), 117 deletions(-) diff --git a/po/ja/minetest.po b/po/ja/minetest.po index 5ae1d6201..f08ea965f 100644 --- a/po/ja/minetest.po +++ b/po/ja/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Japanese (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2023-12-16 10:05+0000\n" -"Last-Translator: Jun Nogata \n" +"PO-Revision-Date: 2024-08-08 13:09+0000\n" +"Last-Translator: BreadW \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -12,7 +12,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 5.3\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "コマンドは使用できません: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "コマンドのヘルプを表示する" +msgstr "コマンドのヘルプを表示 (-t: チャットで出力)" #: builtin/common/chatcommands.lua msgid "" @@ -83,9 +82,8 @@ msgstr "" "べてを一覧表示します。" #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | ]" +msgstr "[all | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -148,12 +146,11 @@ msgid "Failed to download $1" msgstr "$1のダウンロードに失敗" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" -msgstr "" -"「$1」の展開に失敗 (サポートされていないファイル形式または壊れたアーカイブ)" +msgstr "「$1」の展開に失敗 (ディスク容量の不足、サポートされていないファイルタイプま" +"たは壊れたアーカイブ)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -185,7 +182,7 @@ msgstr "ダウンロード中..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "パッケージの依存関係を取得するエラー" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -463,7 +460,7 @@ msgstr "デコレーション" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "砂漠の寺院" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -473,7 +470,8 @@ msgstr "Development Testは開発者用です。" msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" -msgstr "" +msgstr "砂漠のバイオームで生成された異なるダンジョンのバリエーション(ダンジョンが有効" +"になっている場合のみ)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -860,7 +858,7 @@ msgstr "Clear" #: builtin/mainmenu/settings/dlg_settings.lua src/client/game.cpp #: src/settings_translation_file.cpp msgid "Controls" -msgstr "操作" +msgstr "キー割り当て" #: builtin/mainmenu/settings/dlg_settings.lua src/settings_translation_file.cpp msgid "General" @@ -1064,15 +1062,15 @@ msgid "Install games from ContentDB" msgstr "コンテンツDBからゲームをインストール" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "Minetest Game は初期状態ではインストールされていない" +msgstr "Minetest は初期状態でゲームが付属していません。" #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." -msgstr "" +msgstr "Minetestは、さまざまなゲームで遊ぶことを可能にするゲーム制作プラットフォーム" +"です." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1107,9 +1105,8 @@ msgid "Start Game" msgstr "ゲームスタート" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "MODをインストールする前に、ゲームをインストールする必要があります" +msgstr "ワールドを作る前に、ゲームをインストールする必要があります。" #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1292,11 +1289,11 @@ msgstr "パスワード変更" #: src/client/game.cpp msgid "Cinematic mode disabled" -msgstr "映画風モード 無効" +msgstr "シネマティックモード 無効" #: src/client/game.cpp msgid "Cinematic mode enabled" -msgstr "映画風モード 有効" +msgstr "シネマティックモード 有効" #: src/client/game.cpp msgid "Client disconnected" @@ -1323,7 +1320,6 @@ msgid "Continue" msgstr "再開" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1341,15 +1337,15 @@ msgstr "" "操作方法:\n" "メニューなし:\n" "- スライド: 見回す\n" -"- タップ: 置く/使う\n" -"- ロングタップ: 掘る/パンチ/使う  ブロックの破壊- ダブルタップ: 設置/使用\n" -"メニュー/インベントリの操作:\n" +"- タップ: 置く/パンチ/使う(基本)\n" +"- ロングタップ: 掘る/使う(基本)\n" +"メニュー/インベントリを開く:\n" "- ダブルタップ (メニューの外):\n" " --> 閉じる\n" "- アイテムをタッチし、スロットをタッチ:\n" " --> アイテムを移動\n" "- タッチしてドラッグし、二本目の指でタップ:\n" -" --> アイテムを1つスロットに置く\n" +" --> スロットにアイテムを1つ置く\n" #: src/client/game.cpp #, c-format @@ -1422,9 +1418,8 @@ msgid "Fog enabled" msgstr "霧 有効" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "ズームはゲームやMODによって無効化されている" +msgstr "霧はゲームやMODによって有効化されている" #: src/client/game.cpp msgid "Game info:" @@ -1922,13 +1917,13 @@ msgid "Minimap in texture mode" msgstr "ミニマップ テクスチャモード" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "ウェブページを開けませんでした" +msgstr "「%s」シェーダーをコンパイルできませんでした。" #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "シェーダーは有効ですが、このドライバはGLSLをサポートしていません。" #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2045,7 +2040,7 @@ msgstr "キーが重複しています" #: src/gui/guiKeyChangeMenu.cpp msgid "Keybindings." -msgstr "キーに対する機能の割り当て。" +msgstr "キーに対する機能の割り当てです。" #: src/gui/guiKeyChangeMenu.cpp msgid "Left" @@ -2125,16 +2120,15 @@ msgstr "キー入力待ち" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "開く" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "URLを開く?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "ウェブページを開けませんでした" +msgstr "URLを開くことができない" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2418,7 +2412,7 @@ msgstr "詳細" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "液体が半透明になることを可能にします。" #: src/settings_translation_file.cpp msgid "" @@ -2488,6 +2482,17 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"色帯状のアーティファクトを減らすためにディザリングを適用します。\n" +"ディザリングにより、可逆圧縮されたスクリーンショットのサイズが大幅に増加しま" +"す。\n" +"また、ディスプレイまたはオペレーティング " +"システムが追加のディザリングを実行する場合、\n" +"またはカラー チャネルが 8 ビットに量子化されていない場合、" +"ディザリングは正しく動作\n" +"しません。\n" +"OpenGL ES では、" +"ディザリングはシェーダーが高い浮動小数点精度をサポートしている場合に\n" +"のみ機能し、パフォーマンスに大きな影響を与える可能性があります。" #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2506,7 +2511,6 @@ msgid "Ask to reconnect after crash" msgstr "クラッシュ後に再接続を促す" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2522,13 +2526,12 @@ msgstr "" "最適化します。\n" "小さい値に設定すると、描画の視覚的な不具合を犠牲にして、\n" "パフォーマンスが大幅に向上する可能性があります(いくつかのブロックは\n" -"水中や洞窟、時には陸の上でも描画されません)。\n" +"洞窟で正しく描画されません)。\n" "max_block_send_distance より大きい値に設定すると、この最適化は\n" "無効になります。 \n" "マップブロック(16ノード)で表記。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2538,13 +2541,10 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"この距離でサーバーはどのブロックをクライアントへ送信するかを積極的に\n" -"最適化します。\n" -"小さい値に設定すると、描画の視覚的な不具合を犠牲にして、\n" -"パフォーマンスが大幅に向上する可能性があります(いくつかのブロックは\n" -"水中や洞窟、時には陸の上でも描画されません)。\n" -"max_block_send_distance より大きい値に設定すると、この最適化は\n" -"無効になります。 \n" +"この距離でサーバーはよりシンプルで安価なオクルージョンチェックを行います。\n" +"小さい値に設定すると、描画の視覚的な不具合(不足するブロック)を一時的に\n" +"犠牲にして、パフォーマンスが向上する可能性があります。\n" +"これは特に非常に広い視野(500以上)に有用です。\n" "マップブロック(16ノード)で表記。" #: src/settings_translation_file.cpp @@ -2608,9 +2608,8 @@ msgid "Biome noise" msgstr "バイオームノイズ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "ブロック送信最適化距離" +msgstr "ブロックカリングの最適化距離" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2670,7 +2669,7 @@ msgstr "カメラの滑らかさ" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "映画風モードでのカメラの滑らかさ" +msgstr "シネマティックモードでのカメラの滑らかさ" #: src/settings_translation_file.cpp msgid "Cave noise" @@ -2833,6 +2832,8 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"使用されるべきでない拡張子ALおよびALCのカンマ区切りリストです。\n" +"テストのために有用です。 詳細は al_extensions.[h,cpp] を参照してください。" #: src/settings_translation_file.cpp msgid "" @@ -3053,7 +3054,6 @@ msgstr "" "しかし、より多くのリソースを消費します。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3065,10 +3065,14 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"古いクライアントが接続できないようにします。\n" -"古いクライアントは新しいサーバーに接続してもクラッシュしないという\n" -"意味で互換性がありますが、期待しているすべての新機能をサポート\n" -"しているわけではありません。" +"接続を許可する最も古いクライアントを定義します。\n" +"古いクライアントは、" +"新しいサーバーに接続するときにクラッシュしないという意味では\n" +"互換性がありますが、期待されるすべての新機能をサポートしているわけではない可" +"能性があります。\n" +"これにより、strict_protocol_version_checking よりも細かい管理ができます。\n" +"Minetest は依然として独自の内部最小値を強制しており、\n" +"strict_protocol_version_checking はこれをが効果的に上書きします。" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3269,9 +3273,8 @@ msgid "Enable Bloom Debug" msgstr "ブルームデバッグを有効化" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "ダメージ有効" +msgstr "バンディング除去有効" #: src/settings_translation_file.cpp msgid "" @@ -3300,9 +3303,8 @@ msgstr "" "ときはPCFフィルタリングを使用します。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "後処理" +msgstr "後処理有効" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3352,9 +3354,8 @@ msgid "Enable mouse wheel (scroll) for item selection in hotbar." msgstr "ホットバーの項目選択のためのマウスホイール(スクロール)を有効にします。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "ランダムなユーザー入力を有効にします (テストにのみ使用)。" +msgstr "ランダムなMODの読み込みを有効にします(主にテストに使用されます)。" #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3386,9 +3387,8 @@ msgstr "" "しているわけではありません。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "タッチスクリーン" +msgstr "タッチスクリーン有効" #: src/settings_translation_file.cpp msgid "" @@ -3442,16 +3442,17 @@ msgstr "facedir回転メッシュのキャッシングを有効にします。" #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "OpenGL ドライバでデバッグとエラーチェックを有効にします。" #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "後処理パイプラインを有効にします。" #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." -msgstr "" +msgstr "タッチスクリーンモードを有効にし、タッチスクリーンでゲームを遊ぶことができま" +"す。" #: src/settings_translation_file.cpp msgid "" @@ -4374,15 +4375,14 @@ msgstr "" "- Opaque: 透明性を無効化" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"サーバーが時を刻む間隔とオブジェクトが通常ネットワーク上で更新される間隔を\n" -"秒単位で定めます。" +"サーバーが時を刻む長さ (通常、すべてが更新される間隔) を秒単位で定めます。\n" +"クライアント メニューからホストされるセッションには適用されません。" #: src/settings_translation_file.cpp msgid "Length of liquid waves." @@ -4607,7 +4607,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "マップジェネレータ v5 に固有のマップ生成属性。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4619,7 +4618,9 @@ msgstr "" "マップジェネレータ v6 に固有のマップ生成属性。\n" "'snowbiomes' フラグは新しい5つのバイオームシステムを有効にします。\n" "'snowbiomes' フラグを有効にすると、ジャングルが自動的に有効になり、\n" -"'jungles' フラグは無視されます。" +"'jungles' フラグは無視されます。\n" +"'temples' フラグは砂漠の寺院の生成を無効にします。代わりに通常のダンジョンが" +"生成されます。" #: src/settings_translation_file.cpp msgid "" @@ -4924,9 +4925,8 @@ msgid "Minimap scan height" msgstr "ミニマップのスキャン高さ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "設置の繰り返し間隔" +msgstr "繰り返し掘る最小間隔" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." @@ -4997,9 +4997,8 @@ msgid "Mouse sensitivity multiplier." msgstr "マウス感度の倍率。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "大きな洞窟のしきい値" +msgstr "動きのしきい値" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5152,9 +5151,8 @@ msgstr "" "フォームスペックが開かれているときはポーズメニューを開きません。" #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "マップジェネレータのデバッグ" +msgstr "OpenGLのデバッグ" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5287,13 +5285,12 @@ msgid "Proportion of large caves that contain liquid." msgstr "大きな洞窟の液体を含む割合です。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "プロトコルのバージョンが一致していません。 " +msgstr "プロトコルバージョンの最小限" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "パンチのジェスチャー" #: src/settings_translation_file.cpp msgid "" @@ -5314,7 +5311,7 @@ msgstr "ランダム入力" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "MODのランダム読み込み" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5523,7 +5520,6 @@ msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "参照 https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Select the antialiasing method to apply.\n" "\n" @@ -5548,8 +5544,8 @@ msgstr "" "\n" "* 必須なし - アンチエイリアシングなし (既定)\n" "\n" -"* FSAA - ハードウェア認証フルスクリーンアンチエイリアシング(シェーダーと互換" -"性なし)\n" +"* FSAA - ハードウェアによるフルスクリーンアンチエイリアシング\n" +"(後処理およびアンダーサンプリングと互換性なし)\n" "別名 マルチサンプルアンチエイリアシング(MSAA)\n" "ブロックの縁を滑らかにしますが、テクスチャの内部には影響しません。\n" "このオプションを変更するには再起動が必要です。\n" @@ -5560,8 +5556,8 @@ msgstr "" "処理速度と画質のバランスをとります。\n" "\n" "* SSAA - スーパーサンプリングアンチエイリアシング(シェーダーが必要)\n" -"シーンの高解像度画像をレンダリングした後、スケールダウンしてエイリアシング効" -"果を\n" +"シーンの高解像度画像をレンダリングした後、" +"スケールダウンしてエイリアシング効果を\n" "軽減します。これは最も遅く、最も正確な方式です。" #: src/settings_translation_file.cpp @@ -5691,13 +5687,12 @@ msgstr "" "範囲: -1 から 1.0 まで" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"言語を設定してください。システム言語を使用するには空のままにします。\n" -"変更後は再起動が必要です。" +"言語を設定してください。初期状態ではシステム言語が使用されます。\n" +"変更後の再起動が必要です。" #: src/settings_translation_file.cpp msgid "" @@ -5739,7 +5734,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Set to true to enable volumetric lighting effect (a.k.a. \"Godrays\")." -msgstr "" +msgstr "true " +"に設定すると、ボリュームライティング効果(別名「Godrays」)が有効になります。" #: src/settings_translation_file.cpp msgid "Set to true to enable waving leaves." @@ -5784,15 +5780,13 @@ msgid "Shaders" msgstr "シェーダー" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" -"シェーダーは高度な視覚効果を可能にし、ビデオカードによっては\n" -"パフォーマンスが向上する可能性があります。\n" -"これはOpenGLビデオバックエンドでのみ機能します。" +"シェーダーにより高度な視覚効果が可能になり、一部のビデオ カードの\n" +"パフォーマンスが向上する場合があります。" #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -5909,13 +5903,12 @@ msgid "Smooth lighting" msgstr "滑らかな照明" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths rotation of camera when in cinematic mode, 0 to disable. Enter " "cinematic mode by using the key set in Controls." msgstr "" -"映画風モードでのカメラの旋回を滑らかにします。無効にするには 0。キー変更で設" -"定されたキーを使用して映画風モードに切替えます。" +"シネマティックモードでのカメラの旋回を滑らかにし、0 で無効にします。\n" +"キー割り当てで設定されたキーを使用してシネマティックモードに切替えます。" #: src/settings_translation_file.cpp msgid "" @@ -5942,9 +5935,8 @@ msgid "Sound" msgstr "サウンド" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sound Extensions Blacklist" -msgstr "コンテンツDBフラグのブラックリスト" +msgstr "音声拡張子のブラックリスト" #: src/settings_translation_file.cpp msgid "" @@ -6151,7 +6143,7 @@ msgstr "" msgid "" "The delay in milliseconds after which a touch interaction is considered a " "long tap." -msgstr "" +msgstr "タッチ操作がロングタップとみなされるまでのミリ秒単位の遅延。" #: src/settings_translation_file.cpp msgid "" @@ -6170,16 +6162,24 @@ msgid "" "Known from the classic Minetest mobile controls.\n" "Combat is more or less impossible." msgstr "" +"プレイヤー/エンティティをパンチするためのジェスチャーです。\n" +"これはゲームやMODによって上書きされる可能性があります。\n" +"\n" +"* ショートタップ\n" +"使いやすく、名前は挙げませんが他のゲームでもよく知られています。\n" +"\n" +"* ロングタップ\n" +"古典的な Minetest のモバイル版操作として知られています。\n" +"戦闘はほぼ不可能です。" #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" msgstr "使用するジョイスティックの識別子" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The length in pixels after which a touch interaction is considered movement." -msgstr "タッチスクリーン操作が開始されるまでにかかるピクセル単位の長さ。" +msgstr "タッチ操作が動きと見なされるまでのピクセル単位の長さです。" #: src/settings_translation_file.cpp msgid "" @@ -6194,11 +6194,12 @@ msgstr "" "既定は 1.0 (1/2 ノード) です。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The minimum time in seconds it takes between digging nodes when holding\n" "the dig button." -msgstr "設置ボタンを押したままノードの設置を繰り返す秒単位の間隔。" +msgstr "" +"掘削ボタンを押したときにノードを掘る間にかかる秒単位の\n" +"最小時間です。" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6230,7 +6231,6 @@ msgstr "" "これは active_object_send_range_blocks と一緒に設定する必要があります。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The rendering back-end.\n" "Note: A restart is required after changing this!\n" @@ -6238,9 +6238,9 @@ msgid "" "Shaders are supported by everything but OGLES1." msgstr "" "レンダリングのバックエンドです。\n" -"注:これを変更した後は再起動が必要です。\n" +"注:これを変更した後は再起動が必要です!\n" "デスクトップでは OpenGL が、Android では OGLES2 が規定です。\n" -"シェーダーは OpenGL と OGLES2 (実験的) でサポートされています。" +"シェーダーは OGLES1 以外のすべてでサポートされています。" #: src/settings_translation_file.cpp msgid "" @@ -6310,7 +6310,7 @@ msgstr "一緒に丘陵/山岳地帯の高さを定義する2Dノイズ4つの #: src/settings_translation_file.cpp msgid "Threshold for long taps" -msgstr "" +msgstr "ロングタップのしきい値" #: src/settings_translation_file.cpp msgid "" @@ -6370,9 +6370,8 @@ msgid "Tradeoffs for performance" msgstr "パフォーマンスのためのトレードオフ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "不透明な液体" +msgstr "半透明な液体" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6417,12 +6416,13 @@ msgstr "" "パフォーマンスの問題がある場合のみ、この設定を変更する必要があります。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "URL to JSON file which provides information about the newest Minetest " "release\n" "If this is empty the engine will never check for updates." -msgstr "最新のMinetestリリースに関する情報を提供するJSONファイルへのURL" +msgstr "" +"最新の Minetest リリースに関する情報を提供する JSON ファイルへの URL\n" +"これが空の場合、エンジンは更新をチェックしません。" #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." @@ -6631,7 +6631,7 @@ msgstr "音量" #: src/settings_translation_file.cpp msgid "Volume multiplier when the window is unfocused." -msgstr "" +msgstr "ウィンドウがフォーカスされていないときの音量乗数です。" #: src/settings_translation_file.cpp msgid "" @@ -6642,14 +6642,12 @@ msgstr "" "サウンド システムを有効にする必要があります。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume when unfocused" -msgstr "非アクティブまたはポーズメニュー表示中のFPS" +msgstr "フォーカスされていないときの音量" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volumetric lighting" -msgstr "滑らかな照明" +msgstr "ボリュームライティング" #: src/settings_translation_file.cpp msgid "" From 2877e8e624454137325a204afff23a84d1468524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C4=87ad=C5=BAorid=C5=BA?= Date: Mon, 5 Aug 2024 08:41:47 +0000 Subject: [PATCH 28/59] Translated using Weblate (Komi) Currently translated at 28.0% (375 of 1335 strings) --- po/kv/minetest.po | 135 +++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 81 deletions(-) diff --git a/po/kv/minetest.po b/po/kv/minetest.po index d21ab49a8..d815cb5fe 100644 --- a/po/kv/minetest.po +++ b/po/kv/minetest.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-05-27 12:33+0000\n" +"PO-Revision-Date: 2024-08-06 19:09+0000\n" "Last-Translator: Mićadźoridź \n" "Language-Team: Komi \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -76,9 +76,8 @@ msgid "Command not available: " msgstr "Командаыс сиптӧма: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Командаяс йылысь юӧр босьтны" +msgstr "Командаяс йылысь юӧр босьтны (-t: чатӧ гижӧм)" #: builtin/common/chatcommands.lua msgid "" @@ -86,9 +85,8 @@ msgid "" msgstr "Гиж «.help » содтӧд юӧрла али «.help all» — тыр лыддьӧгла." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | <команда>]" +msgstr "[all | <команда>] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -151,11 +149,12 @@ msgid "Failed to download $1" msgstr "$1 бӧсьтӧм эз артмы" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" -msgstr "«$1» перйыны эз артмы (уджавтӧм файл сикас али жугалӧм топӧдӧм файл)" +msgstr "" +"«$1» перйыны эз артмы (дискын пуктанін этша, уджавтӧм файл сикас али жугалӧм " +"топӧдӧм файл)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -273,7 +272,6 @@ msgid "Already installed" msgstr "Нин пуктӧма" #: builtin/mainmenu/content/dlg_install.lua -#, fuzzy msgid "Base Game:" msgstr "Медшӧр ворсӧм:" @@ -572,7 +570,6 @@ msgid "Seed" msgstr "Сид" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Smooth transition between biomes" msgstr "Биомъяс костын лайкыд вуджӧм" @@ -588,15 +585,15 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "Шӧр климат, Пустыня" +msgstr "Шӧр климата ин, Лыааин" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "Шӧр климат, Пустыня, Джунгли" +msgstr "Шӧр климата ин, Лыааин, Джунгли" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "Шӧр климат, Пустыня, Джунгли, Тундра, Парма" +msgstr "Шӧр климата ин, Лыааин, Джунгли, Тундра, Парма" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" @@ -692,7 +689,7 @@ msgstr "" #: builtin/mainmenu/dlg_reinstall_mtg.lua msgid "Reinstall Minetest Game" -msgstr "Minetest Game вылысь пуктыны" +msgstr "Minetest Game выльысь пуктыны" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" @@ -713,7 +710,6 @@ msgid "A new $1 version is available" msgstr "Выль $1 версия восьтӧма" #: builtin/mainmenu/dlg_version_info.lua -#, fuzzy msgid "" "Installed version: $1\n" "New version: $2\n" @@ -722,8 +718,8 @@ msgid "" msgstr "" "Пуктӧм версия: $1\n" "Выль версия: $2\n" -"$3-ӧ пырӧй медвыль версия босьтӧмла да выль функцияяс да веськӧдӧмъяс йылысь " -"тӧдмалӧмла." +"Медвыль версия босьтӧм да выль функцияяс али лӧсьӧдӧмъяс йылысь тӧдмалӧм " +"могысь пырӧй $3-ӧ." #: builtin/mainmenu/dlg_version_info.lua msgid "Later" @@ -743,7 +739,7 @@ msgstr "Лӧсьӧданін" #: builtin/mainmenu/serverlistmgr.lua msgid "Public server list is disabled" -msgstr "Восьса серверъяслӧн лыддьӧг кусӧдӧма" +msgstr "Восьса серверъяслӧн лыддьӧгныс кусӧдӧма" #: builtin/mainmenu/serverlistmgr.lua msgid "Try reenabling public serverlist and check your internet connection." @@ -789,7 +785,6 @@ msgstr "Октавъяс" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua #: src/settings_translation_file.cpp -#, fuzzy msgid "Offset" msgstr "Вештӧм" @@ -803,14 +798,12 @@ msgid "Scale" msgstr "Бердӧг" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua -#, fuzzy msgid "X spread" -msgstr "X паськалӧм" +msgstr "X кузя разалӧм" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua -#, fuzzy msgid "Y spread" -msgstr "Y паськалӧм" +msgstr "Y кузя разалӧм" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua msgid "Z spread" @@ -870,9 +863,8 @@ msgid "General" msgstr "Медшӧр" #: builtin/mainmenu/settings/dlg_settings.lua -#, fuzzy msgid "Movement" -msgstr "Вештӧм" +msgstr "Вуджӧм" #: builtin/mainmenu/settings/dlg_settings.lua msgid "Reset setting to default" @@ -956,12 +948,10 @@ msgid "Active renderer:" msgstr "" #: builtin/mainmenu/tab_about.lua -#, fuzzy msgid "Core Developers" -msgstr "Медшӧр артмӧдысь" +msgstr "Медшӧр артмӧдысьяс" #: builtin/mainmenu/tab_about.lua -#, fuzzy msgid "Core Team" msgstr "Медшӧр котыр" @@ -1112,9 +1102,8 @@ msgid "Start Game" msgstr "Ворсны кутны" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Мод пуктытӧдз тіянлы колӧ ворсӧм пуктыны" +msgstr "Енкӧла вӧчтӧдз тіянлы колӧ пуктыны ворсӧм." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1126,9 +1115,8 @@ msgstr "" #. ~ PvP = Player versus Player #: builtin/mainmenu/tab_online.lua -#, fuzzy msgid "Damage / PvP" -msgstr "Воштӧм / PvP" +msgstr "Доймӧм / PvP" #: builtin/mainmenu/tab_online.lua msgid "Favorites" @@ -1212,7 +1200,7 @@ msgstr "Ворсысьлӧн нимыс вывті кузь." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Ен могысь, ним бӧрйы!" +msgstr "Ен могысь, ним бӧрйӧй!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " @@ -1247,7 +1235,7 @@ msgstr "- РvP: " #: src/client/game.cpp msgid "- Server Name: " -msgstr "- Серверлӧн нимыс: " +msgstr "- Серверлӧн ним: " #: src/client/game.cpp msgid "A serialization error occurred:" @@ -1662,9 +1650,8 @@ msgid "Erase EOF" msgstr "" #: src/client/keycode.cpp -#, fuzzy msgid "Execute" -msgstr "Лэдзны" +msgstr "Вӧчны" #: src/client/keycode.cpp msgid "Help" @@ -1963,9 +1950,8 @@ msgid "Autoforward" msgstr "" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -#, fuzzy msgid "Automatic jumping" -msgstr "Автоматика чеччалӧм" +msgstr "Автоматӧн чеччыштӧм" #: src/gui/guiKeyChangeMenu.cpp msgid "Aux1" @@ -1976,9 +1962,8 @@ msgid "Backward" msgstr "Бӧрӧ" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Block bounds" -msgstr "Блок доръяс" +msgstr "Мапблоклӧн доръяс" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" @@ -2057,9 +2042,8 @@ msgid "Prev. item" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Range select" -msgstr "Тыдалан шымыртӧм" +msgstr "Тыдалан диапазон" #: src/gui/guiKeyChangeMenu.cpp msgid "Right" @@ -2360,7 +2344,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Admin name" -msgstr "Веськӧдлысьлӧн нимыс" +msgstr "Веськӧдлысьлӧн ним" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2435,9 +2419,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Arm inertia" -msgstr "Лайкъялӧм ки" +msgstr "Довкъялысь ки" #: src/settings_translation_file.cpp msgid "" @@ -2527,7 +2510,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Biome API" -msgstr "Биомлӧн API'ыс" +msgstr "Биомлӧн API" #: src/settings_translation_file.cpp msgid "Biome noise" @@ -2603,11 +2586,11 @@ msgstr "Рудӧглӧн шувгӧм" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "Рудӧглӧн шувгӧмыс #1" +msgstr "Рудӧглӧн шувгӧм #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "Рудӧглӧн шувгӧмыс #2" +msgstr "Рудӧглӧн шувгӧм #2" #: src/settings_translation_file.cpp msgid "Cave width" @@ -2657,7 +2640,7 @@ msgstr "Чатлӧн командаяс" #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "Чатса шрифтлӧн ыдждаыс" +msgstr "Чатса шрифтлӧн ыджда" #: src/settings_translation_file.cpp msgid "Chat log level" @@ -2743,7 +2726,7 @@ msgstr "Менюын кымӧръяс" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "Рӧма ру" +msgstr "Рӧма руалӧм" #: src/settings_translation_file.cpp msgid "Colored shadows" @@ -2808,15 +2791,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Console alpha" -msgstr "Консольлӧн сӧдзлуныс" +msgstr "Консольлӧн сӧдзлун" #: src/settings_translation_file.cpp msgid "Console color" -msgstr "Консольлӧн рӧмыс" +msgstr "Консольлӧн рӧм" #: src/settings_translation_file.cpp msgid "Console height" -msgstr "Консольлӧн сутдас" +msgstr "Консольлӧн судта" #: src/settings_translation_file.cpp msgid "Content Repository" @@ -2832,7 +2815,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "ContentDB-лӧн инпасыс" +msgstr "ContentDB-лӧн инпас" #: src/settings_translation_file.cpp msgid "" @@ -2878,7 +2861,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "Витанторлӧн рӧмыс" +msgstr "Витанторлӧн рӧм" #: src/settings_translation_file.cpp msgid "" @@ -2895,9 +2878,8 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debugging" -msgstr "Ладвыв пуктӧм" +msgstr "Лӧсьӧдӧм" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -3134,9 +3116,8 @@ msgid "Enable Bloom Debug" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Ставсӧ ӧзтыны" +msgstr "Лӧсьӧдӧм ӧзтыны" #: src/settings_translation_file.cpp msgid "" @@ -3158,9 +3139,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Контроллерсӧ ӧзтыны" +msgstr "Содтӧд эффектъяслысь вӧччӧм ӧзтыны" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3431,9 +3411,8 @@ msgid "Fog" msgstr "Ру" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fog start" -msgstr "Руалӧм суйӧр" +msgstr "Руалӧмлӧн доръяс" #: src/settings_translation_file.cpp msgid "Font" @@ -3457,7 +3436,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Font size" -msgstr "Шрифтлӧн ыдждаыс" +msgstr "Шрифтлӧн ыджда" #: src/settings_translation_file.cpp msgid "Font size divisible by" @@ -4222,7 +4201,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Main menu script" -msgstr "Медшӧр менюлӧн скриптыс" +msgstr "Медшӧр менюлӧн скрипт" #: src/settings_translation_file.cpp msgid "" @@ -4628,9 +4607,8 @@ msgid "Mouse sensitivity multiplier." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Вештӧм" +msgstr "Вуджан тагӧс" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -4816,9 +4794,8 @@ msgid "Player transfer distance" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Poisson filtering" -msgstr "Пуассонлӧн юклӧм" +msgstr "Пуассон серти разӧдӧм" #: src/settings_translation_file.cpp msgid "Post Processing" @@ -4867,9 +4844,8 @@ msgid "Proportion of large caves that contain liquid." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "Протоколлӧн версияыс оз лӧсяв. " +msgstr "Протоколлӧн медічӧт версия" #: src/settings_translation_file.cpp msgid "Punch gesture" @@ -5146,11 +5122,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Server URL" -msgstr "Серверлӧн инпасыс" +msgstr "Серверлӧн инпас" #: src/settings_translation_file.cpp msgid "Server address" -msgstr "Серверлӧн доменыс" +msgstr "Серверлӧн домен" #: src/settings_translation_file.cpp msgid "Server description" @@ -5158,7 +5134,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Server name" -msgstr "Серверлӧн нимыс" +msgstr "Серверлӧн ним" #: src/settings_translation_file.cpp msgid "Server port" @@ -5303,7 +5279,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Shadow strength gamma" -msgstr "Вуджӧрлӧн гаммаыс" +msgstr "Вуджӧрлӧн гамма" #: src/settings_translation_file.cpp msgid "Show debug info" @@ -5751,9 +5727,8 @@ msgid "Tradeoffs for performance" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "Сӧдзтӧм кизьӧрторъяс" +msgstr "Сӧдзов кизьӧрторъяс" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -5800,7 +5775,6 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Undersampling" msgstr "Субдискретизация" @@ -5888,7 +5862,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "User Interfaces" msgstr "Интерфейсъяс" @@ -6057,7 +6030,7 @@ msgstr "Лайкъялысь быдмӧгъяс" #: src/settings_translation_file.cpp msgid "Weblink color" -msgstr "Ыстӧглӧн рӧмыс" +msgstr "Ыстӧглӧн рӧм" #: src/settings_translation_file.cpp msgid "" @@ -6220,7 +6193,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "cURL" -msgstr "cURL" +msgstr "URL" #: src/settings_translation_file.cpp msgid "cURL file download timeout" From b52f7c76cdbfe6e83740ddb4b71e6cd57bc8201c Mon Sep 17 00:00:00 2001 From: hugoalh Date: Fri, 9 Aug 2024 05:51:13 +0000 Subject: [PATCH 29/59] Translated using Weblate (Chinese (Traditional)) Currently translated at 94.9% (1267 of 1335 strings) --- po/zh_TW/minetest.po | 153 +++++++++++++++++-------------------------- 1 file changed, 59 insertions(+), 94 deletions(-) diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po index 3ae35bba6..8f9298bf5 100644 --- a/po/zh_TW/minetest.po +++ b/po/zh_TW/minetest.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: Chinese (Traditional) (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-07-27 04:09+0000\n" -"Last-Translator: reimu105 \n" +"PO-Revision-Date: 2024-08-10 06:09+0000\n" +"Last-Translator: hugoalh \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_TW\n" @@ -71,9 +71,8 @@ msgid "Command not available: " msgstr "指令無法使用: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "取得指令的說明" +msgstr "取得指令幫助(-t:輸出至聊天中)" #: builtin/common/chatcommands.lua msgid "" @@ -81,9 +80,8 @@ msgid "" msgstr "使用「.help 」來取得更多資訊,或使用「.help all」來列出所有指令。" #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[all | <命令>]" +msgstr "[all | <指令>] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -182,7 +180,7 @@ msgstr "正在下載..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "獲取套件的相依元件時發生錯誤" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -196,7 +194,7 @@ msgstr "安裝" #: builtin/mainmenu/content/dlg_contentdb.lua #: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp msgid "Loading..." -msgstr "正在載入..." +msgstr "載入中…" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Mods" @@ -458,7 +456,7 @@ msgstr "裝飾物" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "沙漠聖殿" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -468,7 +466,7 @@ msgstr "開發測試是針對開發人員的。" msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" -msgstr "" +msgstr "在沙漠生物群落中生成不同的地牢變體(僅當啟用地牢時)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -645,7 +643,7 @@ msgstr "缺少名稱" #: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_online.lua msgid "Name" -msgstr "名字" +msgstr "名稱" #: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_online.lua @@ -719,7 +717,7 @@ msgstr "" #: builtin/mainmenu/dlg_version_info.lua msgid "Later" -msgstr "稍後提醒" +msgstr "稍後" #: builtin/mainmenu/dlg_version_info.lua msgid "Never" @@ -1061,7 +1059,7 @@ msgstr "預設不再安裝 Minetest 遊戲。" msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." -msgstr "" +msgstr "Minetest 是一個遊戲創建平台,可以讓你遊玩許多不同的遊戲。" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1126,7 +1124,7 @@ msgstr "加入遊戲" #: builtin/mainmenu/tab_online.lua msgid "Login" -msgstr "登錄" +msgstr "登入" #: builtin/mainmenu/tab_online.lua msgid "Ping" @@ -1410,9 +1408,8 @@ msgid "Fog enabled" msgstr "已啟用霧氣" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "遠近調整目前已被遊戲或模組停用" +msgstr "霧已由遊戲或模組啟用" #: src/client/game.cpp msgid "Game info:" @@ -1440,7 +1437,7 @@ msgstr "MiB/秒" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "迷你地圖目前已被遊戲或 Mod 停用" +msgstr "迷你地圖目前已被遊戲或模組停用" #: src/client/game.cpp msgid "Multiplayer" @@ -1637,9 +1634,8 @@ msgid "Caps Lock" msgstr "大寫鎖定鍵" #: src/client/keycode.cpp -#, fuzzy msgid "Clear Key" -msgstr "清除" +msgstr "清除鍵" #: src/client/keycode.cpp msgid "Control Key" @@ -1667,7 +1663,7 @@ msgstr "執行" #: src/client/keycode.cpp msgid "Help" -msgstr "說明" +msgstr "幫助" #: src/client/keycode.cpp msgid "Home" @@ -1723,9 +1719,8 @@ msgstr "左 Windows 鍵" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp -#, fuzzy msgid "Menu Key" -msgstr "選單" +msgstr "選單鍵" #: src/client/keycode.cpp msgid "Middle Button" @@ -1811,9 +1806,8 @@ msgstr "Page up" #. ~ Usually paired with the Break key #: src/client/keycode.cpp -#, fuzzy msgid "Pause Key" -msgstr "暫停" +msgstr "暫停鍵" #: src/client/keycode.cpp msgid "Play" @@ -1864,9 +1858,8 @@ msgid "Select" msgstr "選擇" #: src/client/keycode.cpp -#, fuzzy msgid "Shift Key" -msgstr "Shift" +msgstr "Shift 鍵" #: src/client/keycode.cpp msgid "Sleep" @@ -1903,7 +1896,7 @@ msgstr "遠近調整" #: src/client/minimap.cpp msgid "Minimap hidden" -msgstr "已隱藏迷你地圖" +msgstr "迷你地圖已隱藏" #: src/client/minimap.cpp #, c-format @@ -1920,13 +1913,13 @@ msgid "Minimap in texture mode" msgstr "材質模式的迷你地圖" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "無法開啟網頁" +msgstr "無法編譯「%s」著色器。" #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "著色器已啟用,但是驅動程式不支援 GLSL。" #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2119,16 +2112,15 @@ msgstr "按下按鍵" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "開啟" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "開啟網址?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "無法開啟網頁" +msgstr "無法開啟網址" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2394,16 +2386,15 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" -"調整浮地層的密度。\n" -"增加值以增加密度。 可以是正值,也可以是負值。\n" -"值 = 0.0:50% 的體積是浮地。\n" -"值 = 2.0(可以更高,取決於“mgv7_np_floatland”,始終測試\n" -"可以肯定的是)創造了一個堅固的浮地層。" +"調整浮空島層的密度。\n" +"增加數值以增加密度。可以是正值或負值。\n" +"值 = 0.0:50% 的體積是浮空島。\n" +"值 = 2.0(可以更高,取決於「mgv7_np_floatland」,總是進行測試以確定)建立一個" +"堅固的浮空島層。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Admin name" -msgstr "將物品名稱加至末尾" +msgstr "管理員名稱" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2411,7 +2402,7 @@ msgstr "進階" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "允許液體呈半透明狀。" #: src/settings_translation_file.cpp msgid "" @@ -2428,9 +2419,8 @@ msgstr "" "在夜晚的自然光照下作用很小。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Always fly fast" -msgstr "總是啟用飛行與快速模式" +msgstr "總是快速飛行" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2570,9 +2560,8 @@ msgid "Base terrain height." msgstr "基礎地形高度。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base texture size" -msgstr "過濾器的最大材質大小" +msgstr "基礎材質大小" #: src/settings_translation_file.cpp msgid "Basic privileges" @@ -2595,9 +2584,8 @@ msgid "Bind address" msgstr "綁定地址" #: src/settings_translation_file.cpp -#, fuzzy msgid "Biome API" -msgstr "生物雜訊" +msgstr "生物群落 API" #: src/settings_translation_file.cpp msgid "Biome noise" @@ -2617,14 +2605,12 @@ msgid "Bloom" msgstr "泛光" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bloom Intensity" -msgstr "泛光强度" +msgstr "泛光強度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bloom Radius" -msgstr "雲朵範圍" +msgstr "泛光半徑" #: src/settings_translation_file.cpp msgid "Bloom Strength Factor" @@ -3292,9 +3278,8 @@ msgstr "" "使用泊松盤演算法來產生“軟陰影”。 不啟用的話就會使用 PCF 濾鏡。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "後製處理" +msgstr "啟用後製處理" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3378,9 +3363,8 @@ msgstr "" "新伺服器時當掉,但它們可能會不支援一些您預期會有的新功能。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "海灘雜訊閾值" +msgstr "啟用觸控螢幕" #: src/settings_translation_file.cpp msgid "" @@ -3442,7 +3426,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." -msgstr "" +msgstr "啟用觸控螢幕模式,讓你可以使用觸控螢幕玩遊戲。" #: src/settings_translation_file.cpp msgid "" @@ -4651,7 +4635,6 @@ msgid "Mapgen Flat specific flags" msgstr "地圖產生器平地標籤" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" msgstr "地圖產生器分形" @@ -4922,14 +4905,12 @@ msgid "Miscellaneous" msgstr "各種的" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mod Profiler" -msgstr "分析器" +msgstr "模組分析器" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mod Security" -msgstr "安全" +msgstr "模組安全" #: src/settings_translation_file.cpp msgid "Mod channels" @@ -4979,9 +4960,8 @@ msgid "Mouse sensitivity multiplier." msgstr "滑鼠靈敏度倍數。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "洞穴閾值" +msgstr "移動閾值" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5035,7 +5015,6 @@ msgstr "" "當從主選單啟動時,這個值將會被覆寫。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Networking" msgstr "網路" @@ -5136,9 +5115,8 @@ msgstr "" "打開。" #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Mapgen 除錯" +msgstr "OpenGL 偵錯" #: src/settings_translation_file.cpp msgid "Optional override for chat weblink color." @@ -5301,12 +5279,10 @@ msgid "Recent Chat Messages" msgstr "最近聊天訊息" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "報告路徑" +msgstr "常規字型路徑" #: src/settings_translation_file.cpp -#, fuzzy msgid "Remember screen size" msgstr "自動儲存視窗大小" @@ -5485,7 +5461,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Screenshots" -msgstr "螢幕擷取" +msgstr "螢幕截圖" #: src/settings_translation_file.cpp msgid "Seabed noise" @@ -5670,13 +5646,12 @@ msgstr "" "範圍:從-1到1.0" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set the language. By default, the system language is used.\n" "A restart is required after changing this." msgstr "" -"設定語言。留空以使用系統語言。\n" -"變更後必須重新啟動以使其生效。" +"設定語言。預設情況下,使用系統語言。\n" +"變更後需要重新啟動。" #: src/settings_translation_file.cpp msgid "" @@ -5762,15 +5737,13 @@ msgid "Shaders" msgstr "著色器" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" "cards." msgstr "" -"著色器可實現高級視覺效果,並可能提高某些影片的效能\n" -"牌。\n" -"這僅適用於 OpenGL 視訊後端。" +"著色器允許實現高級視覺效果,\n" +"並可能提高某些顯示卡的性能。" #: src/settings_translation_file.cpp msgid "Shadow filter quality" @@ -6330,28 +6303,24 @@ msgid "Tooltip delay" msgstr "工具提示延遲" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen" -msgstr "海灘雜訊閾值" +msgstr "觸控螢幕" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen sensitivity" -msgstr "滑鼠靈敏度" +msgstr "觸控螢幕靈敏度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touchscreen sensitivity multiplier." -msgstr "滑鼠靈敏度倍數。" +msgstr "觸控螢幕靈敏度倍數。" #: src/settings_translation_file.cpp msgid "Tradeoffs for performance" msgstr "性能的權衡" #: src/settings_translation_file.cpp -#, fuzzy msgid "Translucent liquids" -msgstr "不透明液體" +msgstr "半透明液體" #: src/settings_translation_file.cpp msgid "Transparency Sorting Distance" @@ -6366,7 +6335,6 @@ msgid "Trilinear filtering" msgstr "三線性過濾器" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6374,7 +6342,7 @@ msgid "" msgstr "" "True = 256\n" "False = 128\n" -"對於讓迷你地圖在較慢的機器上變得流暢有效。" +"使迷你地圖在速度較慢的機器上更加平滑。" #: src/settings_translation_file.cpp msgid "Trusted mods" @@ -6689,18 +6657,16 @@ msgid "Waving liquids wave speed" msgstr "波動的水速度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "波動的水長度" +msgstr "波動液體的波長" #: src/settings_translation_file.cpp msgid "Waving plants" msgstr "植物擺動" #: src/settings_translation_file.cpp -#, fuzzy msgid "Weblink color" -msgstr "色彩選取框" +msgstr "網路連結顏色" #: src/settings_translation_file.cpp msgid "" @@ -6829,9 +6795,8 @@ msgstr "" "若從主選單啟動則不需要。" #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" -msgstr "世界遊戲" +msgstr "世界開始時間" #: src/settings_translation_file.cpp msgid "" From 78e94b299d3bf265968d3fdca75b8439388009b6 Mon Sep 17 00:00:00 2001 From: nauta-turbidus Date: Sun, 11 Aug 2024 12:52:21 +0000 Subject: [PATCH 30/59] Translated using Weblate (Polish) Currently translated at 88.9% (1187 of 1335 strings) --- po/pl/minetest.po | 625 +++++++++++++++++++--------------------------- 1 file changed, 255 insertions(+), 370 deletions(-) diff --git a/po/pl/minetest.po b/po/pl/minetest.po index c3cedd9c7..8ad317f2a 100644 --- a/po/pl/minetest.po +++ b/po/pl/minetest.po @@ -3,17 +3,17 @@ msgstr "" "Project-Id-Version: Polish (Minetest)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-11 15:14+0200\n" -"PO-Revision-Date: 2024-04-22 15:07+0000\n" -"Last-Translator: Mateusz Malinowski \n" +"PO-Revision-Date: 2024-08-11 15:14+0000\n" +"Last-Translator: nauta-turbidus \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.5-dev\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.7-dev\n" #: builtin/client/chatcommands.lua msgid "Clear the out chat queue" @@ -72,9 +72,8 @@ msgid "Command not available: " msgstr "Polecenie nie jest dostępne: " #: builtin/common/chatcommands.lua -#, fuzzy msgid "Get help for commands (-t: output in chat)" -msgstr "Uzyskaj pomoc dotyczącą poleceń" +msgstr "Uzyskaj pomoc dotyczącą poleceń (-t: wyjście na czacie)" #: builtin/common/chatcommands.lua msgid "" @@ -84,9 +83,8 @@ msgstr "" "wyświetlić wszystko." #: builtin/common/chatcommands.lua -#, fuzzy msgid "[all | ] [-t]" -msgstr "[wszystko | ]" +msgstr "[wszystko | ] [-t]" #: builtin/fstk/ui.lua msgid "" @@ -149,13 +147,12 @@ msgid "Failed to download $1" msgstr "Pobieranie $1 do $2 nie powiodło się :(" #: builtin/mainmenu/content/contentdb.lua -#, fuzzy msgid "" "Failed to extract \"$1\" (insufficient disk space, unsupported file type or " "broken archive)" msgstr "" -"Nie udało się wypakować \"$1\" (niewspierany typ pliku lub uszkodzone " -"archiwum)" +"Nie udało się wypakować \"$1\" (za mało miejsca na dysku, niewspierany typ " +"pliku lub uszkodzone archiwum)" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "" @@ -187,7 +184,7 @@ msgstr "Pobieranie..." #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Error getting dependencies for package" -msgstr "" +msgstr "Błąd przy pobieraniu zależności dla pakietu" #: builtin/mainmenu/content/dlg_contentdb.lua msgid "Games" @@ -465,7 +462,7 @@ msgstr "Dekoracje" #: builtin/mainmenu/dlg_create_world.lua msgid "Desert temples" -msgstr "" +msgstr "Pustynne świątynie" #: builtin/mainmenu/dlg_create_world.lua msgid "Development Test is meant for developers." @@ -476,6 +473,8 @@ msgid "" "Different dungeon variant generated in desert biomes (only if dungeons " "enabled)" msgstr "" +"Osobny wariant lochu generowany w biomach pustynnych (tylko jeśli lochy " +"włączone)" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -776,9 +775,8 @@ msgid "Select file" msgstr "Wybierz plik" #: builtin/mainmenu/settings/components.lua -#, fuzzy msgid "Set" -msgstr "Wybierz" +msgstr "Ustaw" #: builtin/mainmenu/settings/dlg_change_mapgen_flags.lua msgid "(No description of setting given)" @@ -1002,18 +1000,16 @@ msgid "Browse online content" msgstr "Przeglądaj zawartość online" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Browse online content [$1]" -msgstr "Przeglądaj zawartość online" +msgstr "Przeglądaj zawartość online [$1]" #: builtin/mainmenu/tab_content.lua msgid "Content" msgstr "Zawartość" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Content [$1]" -msgstr "Zawartość" +msgstr "Zawartość [$1]" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" @@ -1036,9 +1032,8 @@ msgid "Rename" msgstr "Zmień nazwę" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Update available?" -msgstr "" +msgstr "Aktualizacja dostępna?" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" @@ -1077,15 +1072,16 @@ msgid "Install games from ContentDB" msgstr "Instaluj gry z ContentDB" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Minetest doesn't come with a game by default." -msgstr "\"Minetest Game\" nie jest już domyślnie instalowana" +msgstr "Minetest nie ma domyślnie zainstalowanej gry." #: builtin/mainmenu/tab_local.lua msgid "" "Minetest is a game-creation platform that allows you to play many different " "games." msgstr "" +"Minetest to platforma tworzenia gier, która pozwala Ci grać w wiele różnych " +"gier." #: builtin/mainmenu/tab_local.lua msgid "New" @@ -1120,9 +1116,8 @@ msgid "Start Game" msgstr "Rozpocznij grę" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "You need to install a game before you can create a world." -msgstr "Musisz zainstalować grę, zanim zainstalujesz mody" +msgstr "Musisz zainstalować grę, zanim będziesz mógł stworzyć świat." #: builtin/mainmenu/tab_online.lua msgid "Address" @@ -1296,9 +1291,8 @@ msgid "Camera update enabled" msgstr "Aktualizowanie kamery włączone" #: src/client/game.cpp -#, fuzzy msgid "Can't show block bounds (disabled by game or mod)" -msgstr "Nie można wyświetlić granic bloków (wyłączone przez mod lub grę)" +msgstr "Nie można wyświetlić granic bloków (wyłączone przez grę lub mod)" #: src/client/game.cpp msgid "Change Password" @@ -1337,7 +1331,6 @@ msgid "Continue" msgstr "Kontynuuj" #: src/client/game.cpp -#, fuzzy msgid "" "Controls:\n" "No menu open:\n" @@ -1354,16 +1347,16 @@ msgid "" msgstr "" "Domyślne sterowanie:\n" "Brak widocznego menu:\n" -"- pojedyncze dotknięcie: aktywacja\n" -"- podwójne dotknięcie: postaw/użyj\n" "- przejechanie palcem: rozglądanie się\n" +"- dotknięcie: postaw/uderz/użyj (domyślnie)\n" +"- długie dotknięcie: kop/użyj (domyślnie)\n" "Menu/Ekwipunek widoczny:\n" "- potwójne dotknięcie poza menu:\n" " -->zamknij\n" -"- dotknięcie stacka, dotknięcie slota:\n" -" --> przenieś stack\n" +"- dotknięcie stosu, dotknięcie miejsca:\n" +" --> przenieś stos\n" "- dotknięcie i przeciągnięcie, dotknięcie drugim palcem\n" -" --> umieść pojedynczy item w slocie\n" +" --> umieść pojedynczy przedmiot w miejscu\n" #: src/client/game.cpp #, c-format @@ -1436,9 +1429,8 @@ msgid "Fog enabled" msgstr "Mgła włączona" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled by game or mod" -msgstr "Powiększenie jest obecnie wyłączone przez grę lub mod" +msgstr "Mgła włączona przez grę lub mod" #: src/client/game.cpp msgid "Game info:" @@ -1560,14 +1552,12 @@ msgid "Unable to listen on %s because IPv6 is disabled" msgstr "Nie można nasłuchiwać na %s, ponieważ IPv6 jest wyłączony" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range disabled" -msgstr "Włączono nieskończony zasięg widoczności" +msgstr "Nieograniczony zasięg widoczności wyłączony" #: src/client/game.cpp -#, fuzzy msgid "Unlimited viewing range enabled" -msgstr "Włączono nieskończony zasięg widoczności" +msgstr "Nieograniczony zasięg widoczności włączony" #: src/client/game.cpp msgid "Unlimited viewing range enabled, but forbidden by game or mod" @@ -1593,9 +1583,9 @@ msgid "Viewing range changed to %d" msgstr "Zasięg widoczności zmieniony na %d" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "Viewing range changed to %d (the maximum)" -msgstr "Zmieniono zasięg widoczności na %d%%" +msgstr "Zmieniono zasięg widoczności na %d (maksymalny)" #: src/client/game.cpp #, c-format @@ -1662,28 +1652,24 @@ msgstr "Backspace" #. ~ Usually paired with the Pause key #: src/client/keycode.cpp -#, fuzzy msgid "Break Key" -msgstr "Skradanie" +msgstr "Break" #: src/client/keycode.cpp msgid "Caps Lock" msgstr "Klawisz Caps Lock" #: src/client/keycode.cpp -#, fuzzy msgid "Clear Key" -msgstr "Delete" +msgstr "Clear" #: src/client/keycode.cpp -#, fuzzy msgid "Control Key" -msgstr "Control" +msgstr "Ctrl" #: src/client/keycode.cpp -#, fuzzy msgid "Delete Key" -msgstr "Usuń" +msgstr "Delete" #: src/client/keycode.cpp msgid "Down Arrow" @@ -1734,9 +1720,8 @@ msgid "Insert" msgstr "Insert" #: src/client/keycode.cpp -#, fuzzy msgid "Left Arrow" -msgstr "Lewy Control" +msgstr "Strzałka w lewo" #: src/client/keycode.cpp msgid "Left Button" @@ -1760,7 +1745,6 @@ msgstr "Lewy Windows" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp -#, fuzzy msgid "Menu Key" msgstr "Menu" @@ -1837,18 +1821,15 @@ msgid "OEM Clear" msgstr "OEM Clear" #: src/client/keycode.cpp -#, fuzzy msgid "Page Down" -msgstr "Page down" +msgstr "Page Down" #: src/client/keycode.cpp -#, fuzzy msgid "Page Up" -msgstr "Page up" +msgstr "Page Up" #. ~ Usually paired with the Break key #: src/client/keycode.cpp -#, fuzzy msgid "Pause Key" msgstr "Pause" @@ -1862,14 +1843,12 @@ msgid "Print" msgstr "Drukuj" #: src/client/keycode.cpp -#, fuzzy msgid "Return Key" msgstr "Enter" #: src/client/keycode.cpp -#, fuzzy msgid "Right Arrow" -msgstr "Prawy Control" +msgstr "Strzałka w prawo" #: src/client/keycode.cpp msgid "Right Button" @@ -1901,7 +1880,6 @@ msgid "Select" msgstr "Wybierz" #: src/client/keycode.cpp -#, fuzzy msgid "Shift Key" msgstr "Shift" @@ -1934,9 +1912,8 @@ msgid "X Button 2" msgstr "Przycisk X 2" #: src/client/keycode.cpp -#, fuzzy msgid "Zoom Key" -msgstr "Zoom" +msgstr "Klawisz Zoom" #: src/client/minimap.cpp msgid "Minimap hidden" @@ -1957,13 +1934,13 @@ msgid "Minimap in texture mode" msgstr "Minimapa w trybie teksturowym" #: src/client/shader.cpp -#, fuzzy, c-format +#, c-format msgid "Failed to compile the \"%s\" shader." -msgstr "Nie udało się otworzyć strony internetowej" +msgstr "Nie udało się skompilować shadera \"%s\"" #: src/client/shader.cpp msgid "Shaders are enabled but GLSL is not supported by the driver." -msgstr "" +msgstr "Shadery są włączone, ale GLSL nie jest wspierany przez sterownik." #. ~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" #: src/content/mod_configuration.cpp @@ -2160,16 +2137,15 @@ msgstr "naciśnij klawisz" #: src/gui/guiOpenURL.cpp msgid "Open" -msgstr "" +msgstr "Otwórz" #: src/gui/guiOpenURL.cpp msgid "Open URL?" -msgstr "" +msgstr "Otworzyć URL?" #: src/gui/guiOpenURL.cpp -#, fuzzy msgid "Unable to open URL" -msgstr "Nie udało się otworzyć strony internetowej" +msgstr "Nie udało się otworzyć adresu URL" #: src/gui/guiPasswordChange.cpp msgid "Change" @@ -2327,7 +2303,7 @@ msgid "" "to be adjusted, as floatland tapering functions best when this noise has\n" "a value range of approximately -2.0 to 2.0." msgstr "" -"Szum 3D określający strukturę terenów pływających.\n" +"Szum 3D określający strukturę latających wysp.\n" "Jeśli wartość domyślna zostanie zmieniona, konieczne będzie dostosowanie " "\"skali\" szumu (domyślnie 0,7), \n" "ponieważ zwężanie terenów pływających działa najlepiej, \n" @@ -2350,7 +2326,6 @@ msgid "3D noise that determines number of dungeons per mapchunk." msgstr "Szum 3D, który wpływa na liczbę lochów na jeden mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "3D support.\n" "Currently supported:\n" @@ -2365,10 +2340,11 @@ msgstr "" "Wsparcie 3D\n" "Aktualnie wspierane:\n" "- none: bez wyjścia 3d.\n" -"- anaglyph: Niebieski/karmazynowy kolor 3d.\n" -"- interlaced: bazujący na polaryzacji parzystej/nieparzystej linii.\n" +"- anaglyph: 3d poprzez kolory cyjan/magenta\n" +"- interlaced: wsparcie ekranów z parzystą/nieparzystą polaryzacją " +"liniową\n" "- topbottom: podzielony ekran góra/dół.\n" -"- sidebyside: podzielony obok siebie.\n" +"- sidebyside: podzielony ekran obok siebie.\n" "- crossview: obuoczne 3d\n" "Zauważ, że tryb interlaced wymaga włączenia shaderów." @@ -2462,7 +2438,7 @@ msgstr "Zaawansowane" #: src/settings_translation_file.cpp msgid "Allows liquids to be translucent." -msgstr "" +msgstr "Pozwala na przejrzyste płyny." #: src/settings_translation_file.cpp msgid "" @@ -2503,14 +2479,12 @@ msgid "Announce to this serverlist." msgstr "Rozgłoś listę serwerów." #: src/settings_translation_file.cpp -#, fuzzy msgid "Anti-aliasing scale" -msgstr "Antyaliasing:" +msgstr "Skala antyaliasingu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Antialiasing method" -msgstr "Antyaliasing:" +msgstr "Metoda antyaliasingu" #: src/settings_translation_file.cpp msgid "Append item name" @@ -2534,6 +2508,13 @@ msgid "" "With OpenGL ES, dithering only works if the shader supports high\n" "floating-point precision and it may have a higher performance impact." msgstr "" +"Zastosuj dithering, żeby zmniejszyć artefakty bandingu.\n" +"Dithering znacząco zwiększa rozmiar bezstratnie skompresowanych\n" +"zrzutów ekranu i działa nieprawidłowo, jeśli system operacyjny\n" +"wykonuje dodatkowy dithering lub jeśli kanały kolorów\n" +"nie są skwantowane na 8 bitów.\n" +"Z OpenGL ES, dithering działa tylko jeśli shader wspiera wysoką precyzję\n" +"liczb zmiennoprzecinkowych i może mieć większy wpływ na wydajność." #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2552,7 +2533,6 @@ msgid "Ask to reconnect after crash" msgstr "Poproś o ponowne połączenie po awarii" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2569,15 +2549,13 @@ msgstr "" "klientów.\n" "Małe wartości potencjalnie znacznie poprawiają wydajność, kosztem " "widocznych\n" -"trzaski renderowania (niektóre bloki nie będą renderowane pod wodą i w " -"jaskiniach,\n" -"jak również czasami na lądzie).\n" -"Ustawienie tego na wartość większą niż max_block_send_distance wyłącza to\n" -"optymalizacja.\n" -"Podane w mapblocks (16 węzłów)." +"błędów renderowania (niektóre bloki mogą nie być renderowane poprawnie w " +"jaskiniach).\n" +"Ustawienie tego na wartość większą niż max_block_send_distance wyłącza te\n" +"optymalizacje.\n" +"Wyrażone w MapBlocks (16 węzłów)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will perform a simpler and cheaper occlusion " "check.\n" @@ -2587,17 +2565,12 @@ msgid "" "This is especially useful for very large viewing range (upwards of 500).\n" "Stated in MapBlocks (16 nodes)." msgstr "" -"W tej odległości serwer agresywnie zoptymalizuje, które bloki są wysyłane " -"do\n" -"klientów.\n" -"Małe wartości potencjalnie znacznie poprawiają wydajność, kosztem " -"widocznych\n" -"trzaski renderowania (niektóre bloki nie będą renderowane pod wodą i w " -"jaskiniach,\n" -"jak również czasami na lądzie).\n" -"Ustawienie tego na wartość większą niż max_block_send_distance wyłącza to\n" -"optymalizacja.\n" -"Podane w mapblocks (16 węzłów)." +"W tej odległości serwer wykona prostsze i tańsze sprawdzenie przesłonięcia.\n" +"Mniejsze wartości potencjalnie poprawiają wydajność, kosztem tymczasowych\n" +"błędów renderowania (brakujące bloki).\n" +"To jest szczególnie użyteczne przy bardzo dużych zasięgach widoczności (" +"powyżej 500).\n" +"Wyrażone w MapBlocks (16 nodes)." #: src/settings_translation_file.cpp msgid "Audio" @@ -2628,9 +2601,8 @@ msgid "Base terrain height." msgstr "Bazowa wysokość terenu." #: src/settings_translation_file.cpp -#, fuzzy msgid "Base texture size" -msgstr "Minimalna wielkość tekstury dla filtrów" +msgstr "Podstawowy rozmiar tekstury" #: src/settings_translation_file.cpp msgid "Basic privileges" @@ -2653,18 +2625,16 @@ msgid "Bind address" msgstr "Sprawdzanie adresu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Biome API" -msgstr "Biomy" +msgstr "API biomów" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Szum biomu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Block cull optimize distance" -msgstr "Dystans optymalizacji wysyłanych bloków" +msgstr "Dystans optymalizacji pomijania bloków" #: src/settings_translation_file.cpp msgid "Block send optimize distance" @@ -2832,7 +2802,7 @@ msgstr "Klient" #: src/settings_translation_file.cpp msgid "Client Mesh Chunksize" -msgstr "" +msgstr "Rozmiar modelu chunka na kliencie" #: src/settings_translation_file.cpp msgid "Client and Server" @@ -2851,9 +2821,8 @@ msgid "Client-side Modding" msgstr "Modyfikacje po stronie klienta" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client-side node lookup range restriction" -msgstr "Ograniczenie zakresu wyszukiwania węzłów po stronie klienta" +msgstr "Ograniczenie zasięgu wyszukiwania node'ów po stronie klienta" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2868,7 +2837,6 @@ msgid "Clouds" msgstr "Chmury 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "Clouds are a client-side effect." msgstr "Chmury są efektem po stronie klienta." @@ -2889,6 +2857,9 @@ msgid "" "Comma-separated list of AL and ALC extensions that should not be used.\n" "Useful for testing. See al_extensions.[h,cpp] for details." msgstr "" +"Lista wymienionych po przecinku rozszerzeń AL i ALC, które nie powinny być " +"użyte.\n" +"Przydatne do testowania. Sprawdź al_extensions.[h,cpp] po szczegóły." #: src/settings_translation_file.cpp msgid "" @@ -3110,7 +3081,6 @@ msgstr "" "ale także zużywa więcej zasobów." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Define the oldest clients allowed to connect.\n" "Older clients are compatible in the sense that they will not crash when " @@ -3122,11 +3092,15 @@ msgid "" "Minetest still enforces its own internal minimum, and enabling\n" "strict_protocol_version_checking will effectively override this." msgstr "" -"Włącz blokadę dla połączenia starych klientów.\n" -"Starsze klienty mogą być kompatybilne w tym sensie że nie będą się " -"zawieszać\n" -"kiedy łączą sę z nowym serwerem, ale mogą nie wspierać wszystkich nowych " -"spodziewanych funkcjonalności." +"Wyznacz najstarsze klienty, które mogą połączyć się z serwerem.\n" +"Starsze klienty mogą być kompatybilne w tym sensie, że nie będą się " +"zawieszać,\n" +"kiedy łączą się z nowym serwerem, ale mogą nie wspierać wszystkich nowych " +"funkcjonalności., których się spodziewasz.\n" +"To pozwala na bardziej szczegółowe rozróżnianie niż " +"strict_protocol_version_checking.\n" +"Minetest i tak wymusza swoje własne, wewnętrzne minimum, a włączenie\n" +"strict_protocol_version_checking efektywnie nadpisze skutki tego ustawienia." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -3194,6 +3168,8 @@ msgid "" "methods.\n" "Value of 2 means taking 2x2 = 4 samples." msgstr "" +"Zdefiniuj rozmiar siatki próbkowania dla metod antyaliasingu FSAA i SSAA.\n" +"Wartość 2 oznacza branie 2x2 = 4 próbek." #: src/settings_translation_file.cpp msgid "Defines the width of the river channel." @@ -3330,9 +3306,8 @@ msgid "Enable Bloom Debug" msgstr "Włącz debug efektu bloom" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Debanding" -msgstr "Włącz obrażenia" +msgstr "Włącz Debanding" #: src/settings_translation_file.cpp msgid "" @@ -3361,9 +3336,8 @@ msgstr "" "razie używa filtrowania PCF." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable Post Processing" -msgstr "Przetwarzanie końcowe" +msgstr "Włącz Post Processing" #: src/settings_translation_file.cpp msgid "Enable Raytraced Culling" @@ -3376,6 +3350,10 @@ msgid "" "automatically adjust to the brightness of the scene,\n" "simulating the behavior of human eye." msgstr "" +"Włącz automatyczną poprawę ekspozycji.\n" +"Kiedy włączone, silnik post-processingu automatycznie\n" +"dostosuje jasność sceny, symulując zachowanie\n" +"oka ludzkiego." #: src/settings_translation_file.cpp msgid "" @@ -3411,9 +3389,8 @@ msgid "Enable mouse wheel (scroll) for item selection in hotbar." msgstr "Włącz szybki wybór przedmiotów na hotbarze kółkiem myszy (scrollem)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable random mod loading (mainly used for testing)." -msgstr "Włącz losowe wejście użytkownika (tylko dla testowania)." +msgstr "Włącz losową kolejność ładowania modów (głównie do testowania)." #: src/settings_translation_file.cpp msgid "Enable random user input (only used for testing)." @@ -3446,9 +3423,8 @@ msgstr "" "spodziewanych funkcjonalności." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable touchscreen" -msgstr "Ekran dotykowy" +msgstr "Włącz ekran dotykowy" #: src/settings_translation_file.cpp msgid "" @@ -3503,16 +3479,18 @@ msgstr "Włącza cachowanie facedir obracanych meshów." #: src/settings_translation_file.cpp msgid "Enables debug and error-checking in the OpenGL driver." -msgstr "" +msgstr "Włącza debug i sprawdzanie błędów w sterowniku OpenGL." #: src/settings_translation_file.cpp msgid "Enables the post processing pipeline." -msgstr "" +msgstr "Włącza potok post-processimgu." #: src/settings_translation_file.cpp msgid "" "Enables touchscreen mode, allowing you to play the game with a touchscreen." msgstr "" +"Włącza tryb ekranu dotykowego, pozwalając grać w grę z użyciem ekranu " +"dotykowego." #: src/settings_translation_file.cpp msgid "" @@ -3524,7 +3502,6 @@ msgstr "" "kosztem drobnych usterek wizualnych, które nie wpływają na grywalność gry." #: src/settings_translation_file.cpp -#, fuzzy msgid "Engine Profiler" msgstr "Profiler silnika" @@ -3545,18 +3522,17 @@ msgid "" "Values < 1.0 (for example 0.25) create a more defined surface level with\n" "flatter lowlands, suitable for a solid floatland layer." msgstr "" -"Wykładnik zwężenia pływającej wyspy. Zmienia zachowanie zwężenia.\n" +"Wykładnik zwężenia latającej wyspy. Zmienia zachowanie zwężenia.\n" "Wartość = 1.0 tworzy jednolite, liniowe zwężenie.\n" "Wartości > 1.0 tworzą gładkie zwężenie odpowiednie dla domyślnie " "odseparowanych\n" -"floatlands.\n" +"latających wysp.\n" "Wartości < 1.0 (np. 0.25) tworzą bardziej zdefiniowany poziom powierzchni z\n" -"płaskimi nizinami, odpowiednimi dla jednolitej warstwy pływających wysp." +"płaskimi nizinami, odpowiednimi dla jednolitej warstwy latającego lądu." #: src/settings_translation_file.cpp -#, fuzzy msgid "Exposure compensation" -msgstr "Współczynnik naświetlenia" +msgstr "Kompensacja ekspozycji" #: src/settings_translation_file.cpp msgid "FPS" @@ -3638,12 +3614,11 @@ msgid "Fixed virtual joystick" msgstr "Ustaw wirtualny joystick" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Fixes the position of virtual joystick.\n" "If disabled, virtual joystick will center to first-touch's position." msgstr "" -"(Android) Mocuje pozycję wirtualnego joysticka.\n" +"Mocuje pozycję wirtualnego joysticka.\n" "Gdy jest wyłączona, wirtualny joystick przestawi się do miejsca pierwszego " "dotknięcia." @@ -3833,9 +3808,8 @@ msgid "Fullscreen mode." msgstr "Tryb pełnoekranowy." #: src/settings_translation_file.cpp -#, fuzzy msgid "GUI" -msgstr "Interfejsy użytkownika" +msgstr "Interfejs graficzny" #: src/settings_translation_file.cpp msgid "GUI scaling" @@ -3942,10 +3916,10 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" -"Spraw by profiler instruował się samoczynnie:\n" -"*instruowanie pustych funkcji.\n" -"To estymuje narzut, który instrumentacja dodaje (+1 wywołanie funkcji).\n" -"*instruowanie samplera będącego w użyciu do zaktualizowania statystyk." +"Spraw by profiler zmierzył się sam:\n" +"* Zmierz pustą funkcję.\n" +"To szacuje narzut, który pomiar dodaje (+1 wywołanie funkcji).\n" +"* Zmierz samplera będącego w użyciu do aktualizowania statystyk." #: src/settings_translation_file.cpp msgid "Heat blend noise" @@ -3956,10 +3930,8 @@ msgid "Heat noise" msgstr "Szum gorąca" #: src/settings_translation_file.cpp -#, fuzzy msgid "Height component of the initial window size." -msgstr "" -"Wysokość początkowego rozmiaru okna. Ignorowana w trybie pełnoekranowym." +msgstr "Komponent wysokościowy początkowego rozmiaru okna." #: src/settings_translation_file.cpp msgid "Height noise" @@ -4023,25 +3995,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Hotbar: Enable mouse wheel for selection" -msgstr "" +msgstr "Hotbar: Włącz użycie kółka myszy do wyboru" #: src/settings_translation_file.cpp msgid "Hotbar: Invert mouse wheel direction" -msgstr "" +msgstr "Hotbar: Odwróć kierunek kółka myszy" #: src/settings_translation_file.cpp msgid "How deep to make rivers." msgstr "Jak głębokie tworzyć rzeki." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "How fast liquid waves will move. Higher = faster.\n" "If negative, liquid waves will move backwards." msgstr "" "Jak szybko fale cieczy będą się poruszać. Wyższa = szybciej.\n" -"Wartość ujemna, fale cieczy będą poruszać się do tyłu.\n" -"Wymaga włączenia falowania cieczy." +"Wartość ujemna, fale cieczy będą poruszać się do tyłu." #: src/settings_translation_file.cpp msgid "" @@ -4149,32 +4119,29 @@ msgstr "" "swojego hasła na puste." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, the server will perform map block occlusion culling based on\n" "on the eye position of the player. This can reduce the number of blocks\n" "sent to the client by 50-80%. Clients will no longer receive most\n" "invisible blocks, so that the utility of noclip mode is reduced." msgstr "" -"Jeśli opcja jest włączona, serwer przeprowadzi usuwanie bloków mapy na " -"podstawie\n" -"pozycji gracza. Zredukuje to o 50-80% liczbę bloków\n" -"wysyłanych na serwer. Klient nie będzie już widział większości ukrytych " -"bloków,\n" +"Jeśli opcja jest włączona, serwer przeprowadzi pomijanie przesłoniętych " +"bloków mapy\n" +"na podstawie pozycji gracza. To może zredukować o 50-80% liczbę bloków " +"wysyłanych\n" +"do klienta. Klient nie będzie już widział większości zakrytych bloków,\n" "więc przydatność trybu noclip zostanie ograniczona." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, you can place nodes at the position (feet + eye level) where you " "stand.\n" "This is helpful when working with nodeboxes in small areas." msgstr "" -"Jeżeli włączone, możesz położyć bloki w pozycji gdzie stoisz.\n" +"Jeżeli włączone, możesz stawiać bloki w pozycji, gdzie stoisz.\n" "Pomocne gdy pracujesz na małych powierzchniach." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If the CSM restriction for node range is enabled, get_node calls are " "limited\n" @@ -4193,7 +4160,6 @@ msgstr "" "informacja o czasie zostanie dodana do komunikatu polecenia czatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" "this setting when it is opened, the file is moved to debug.txt.1,\n" @@ -4201,9 +4167,10 @@ msgid "" "debug.txt is only moved if this setting is positive." msgstr "" "Jeśli rozmiar pliku debug.txt przekroczy liczbę megabajtów określoną w tym " -"ustawieniu, plik zostanie przeniesiony do pliku debug.txt.1.\n" -"w tym ustawieniu, plik jest przenoszony do debug.txt.1,\n" -"usuwając starszy debug.txt.1, jeśli taki istnieje.\n" +"ustawieniu\n" +"podczas otwierania, plik zostanie przeniesiony do pliku debug.txt.1, w tym " +"usuwając\n" +"starszy debug.txt.1, jeśli taki istnieje.\n" "debug.txt jest przenoszony tylko wtedy, gdy wartość tego ustawienia jest " "dodatnia." @@ -4228,58 +4195,54 @@ msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." msgstr "Przeźroczystość konsoli w grze (od 0.0 do 1.0)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" -"Początkowa prędkość pionowa podczas skoku, w blokach na sekundę do kwadratu." +msgstr "Początkowa prędkość pionowa podczas skoku, w blokach na sekundę." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" -"Instrument wbudowany.\n" -"Najczęściej potrzebny tylko dla osób pracujących nad jądrem" +"Mierz kod wbudowany.\n" +"Najczęściej potrzebny tylko dla osób pracujących nad silnikiem" #: src/settings_translation_file.cpp -#, fuzzy msgid "Instrument chat commands on registration." -msgstr "Instrument poleceń czatu przy rejestracji." +msgstr "Mierz polecenia czatu przy rejestracji." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" -"Poinstruuj globalne funkcje zwrotne przy rejestracji \n" +"Mierz globalne funkcje zwrotne przy rejestracji.\n" "(wszystko co prześlesz do funkcji minetest.register_*() )" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Active Block Modifiers on registration." msgstr "" -"Poinstruuj działanie funkcji aktywnych modyfikatorów bloków przy rejestracji." +"Mierz działanie funkcji modyfikatorów aktywnych bloków (ABM) przy " +"rejestracji." #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." msgstr "" -"Poinstruuj działanie funkcji ładowania modyfikatorów bloków przy rejestracji." +"Mierz działanie funkcji modyfikatorów ładowania bloków (LBM) przy " +"rejestracji." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "Poinstruuj metody jednostkowe przy rejestracji." +msgstr "Mierz metody bytów przy rejestracji." #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "Interwał zapisywania ważnych zmian w świecie, w sekundach." #: src/settings_translation_file.cpp -#, fuzzy msgid "Interval of sending time of day to clients, stated in seconds." -msgstr "Interwał wysyłania czasu gry do klientów." +msgstr "Interwał wysyłania czasu gry do klientów, w sekundach." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4292,20 +4255,20 @@ msgstr "Odwróć mysz" #: src/settings_translation_file.cpp msgid "Invert mouse wheel (scroll) direction for item selection in hotbar." msgstr "" +"Odwróć kierunek kółka myszy (przewijania) przy wyborze przedmiotów w " +"hotbarze." #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." msgstr "Odwróć pionowy ruch myszy." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Ścieżka czcionki typu Monospace" +msgstr "Ścieżka czcionki kursywnej" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "Ścieżka czcionki typu Monospace" +msgstr "Ścieżka czcionki kursywnej typu Monospace" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -4316,7 +4279,6 @@ msgid "Iterations" msgstr "Iteracje" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Iterations of the recursive function.\n" "Increasing this increases the amount of fine detail, but also\n" @@ -4337,21 +4299,18 @@ msgid "Joystick button repetition interval" msgstr "Interwał powtarzania przycisku joysticka" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick dead zone" -msgstr "Typ Joysticka" +msgstr "Strefa martwa joysticka" #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Czułość drgania joysticka" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick type" msgstr "Typ Joysticka" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "W component of hypercomplex constant.\n" @@ -4361,12 +4320,11 @@ msgid "" msgstr "" "Wyłącznie dla Zbioru Julii: \n" "komponent W stałej hiperzespolonej, \n" -"która determinuje fraktali.\n" +"która determinuje kształt fraktali.\n" "Nie ma wpływu na fraktale trójwymiarowe.\n" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "X component of hypercomplex constant.\n" @@ -4379,7 +4337,6 @@ msgstr "" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Y component of hypercomplex constant.\n" @@ -4391,7 +4348,6 @@ msgstr "" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Z component of hypercomplex constant.\n" @@ -4428,7 +4384,6 @@ msgid "Keyboard and Mouse" msgstr "Klawiatura i mysz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Kick players who sent more than X messages per 10 seconds." msgstr "" "Wyrzuca graczy, którzy wysłali więcej niż X wiadomości w ciągu 10 sekund." @@ -4450,19 +4405,16 @@ msgid "Large cave depth" msgstr "Głębia dużej jaskini" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large cave maximum number" msgstr "Maksymalna liczba dużych jaskiń" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large cave minimum number" msgstr "Minimalna liczba dużych jaskiń" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large cave proportion flooded" -msgstr "Duża część jaskini zalana" +msgstr "Zalana część dużej jaskini" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -4481,33 +4433,34 @@ msgstr "" "- Opaque: wyłącza przeźroczystość" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of a server tick (the interval at which everything is generally " "updated),\n" "stated in seconds.\n" "Does not apply to sessions hosted from the client menu." msgstr "" -"Długość interwału czasowego serwera w trakcie którego obiekty są ogólnie " -"aktualizowane \n" -"przez sieć." +"Długość interwału czasowego serwera (w trakcie którego wszystko jest na " +"ogół\n" +"aktualizowane), wyrażony w sekundach.\n" +"Nie ma zastosowania w sesjach hostowanych z menu klienta." #: src/settings_translation_file.cpp -#, fuzzy msgid "Length of liquid waves." -msgstr "Szybkość fal wodnych" +msgstr "Szybkość fal płynów." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of time between Active Block Modifier (ABM) execution cycles, stated " "in seconds." -msgstr "Długość czasu pomiędzy wykonywanymi cyklami ABM" +msgstr "" +"Długość czasu pomiędzy cyklami wykonywania modyfikatorów aktywnych bloków " +"(ABM), wyrażona w sekundach." #: src/settings_translation_file.cpp -#, fuzzy msgid "Length of time between NodeTimer execution cycles, stated in seconds." -msgstr "Długość czasu pomiędzy wykonywanymi cyklami NodeTimer" +msgstr "" +"Długość czasu pomiędzy cyklami wykonywania NodeTimer'ów, wyrażona w " +"sekundach." #: src/settings_translation_file.cpp msgid "" @@ -4516,7 +4469,6 @@ msgstr "" "Czas pomiędzy cyklami zarządzania aktywnymi blokami, podany w sekundach." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- (no logging)\n" @@ -4535,31 +4487,28 @@ msgstr "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost" -msgstr "Przyśpieszenie środkowe krzywej światła" +msgstr "Wzmocnienie krzywej światła" #: src/settings_translation_file.cpp msgid "Light curve boost center" msgstr "Centrum środkowego przyśpieszenia krzywej światła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost spread" -msgstr "Rozrzut przyśpieszenia środkowego krzywej światła" +msgstr "Rozrzut wzmocnienia krzywej światła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve gamma" -msgstr "Przyśpieszenie środkowe krzywej światła" +msgstr "Gamma krzywej światła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve high gradient" -msgstr "Przyśpieszenie środkowe krzywej światła" +msgstr "Górny gradient krzywej światła" #: src/settings_translation_file.cpp msgid "Light curve low gradient" @@ -4610,7 +4559,6 @@ msgid "Liquid queue purge time" msgstr "Czas kolejki czyszczenia cieczy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" msgstr "Zanurzanie w cieczy" @@ -4637,9 +4585,8 @@ msgstr "" " Przydatne dla twórców modów i operatorów serwerów." #: src/settings_translation_file.cpp -#, fuzzy msgid "Loading Block Modifiers" -msgstr "Interwał modyfikatora aktywnego bloku" +msgstr "Modyfikatory Ładowania Bloków (LBM)" #: src/settings_translation_file.cpp msgid "" @@ -4656,9 +4603,8 @@ msgid "Lower Y limit of dungeons." msgstr "Zmniejsz limit Y dla lochów." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Zmniejsz limit Y dla lochów." +msgstr "Dolny limit Y dla latających wysp." #: src/settings_translation_file.cpp msgid "Main menu script" @@ -4672,23 +4618,20 @@ msgstr "" "kierunku patrzenia." #: src/settings_translation_file.cpp -#, fuzzy msgid "Map Compression Level for Disk Storage" -msgstr "Poziom kompresji mapy dla pamięci masowej dysku" +msgstr "Poziom kompresji mapy dla pamięci masowej na dysku" #: src/settings_translation_file.cpp -#, fuzzy msgid "Map Compression Level for Network Transfer" -msgstr "Poziom kompresji map dla transferu sieciowego" +msgstr "Poziom kompresji mapy dla transferu sieciowego" #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Katalog map" #: src/settings_translation_file.cpp -#, fuzzy msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "Właściwości generowania mapy określające Mapgen Carpathian." +msgstr "Właściwości generowania mapy specyficzne dla generatora Carpathian." #: src/settings_translation_file.cpp msgid "" @@ -4699,18 +4642,16 @@ msgstr "" "Do płaskiego świata mogą być dodane przypadkowe jeziora i wzgórza." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Właściwości generowania mapy określające Mapgen v7.\n" -"\"grzbiety\" aktywują tworzenie niefraktalnego terenu:\n" +"Właściwości generowania mapy specyficzne dla generatora Fractal.\n" +"\"terrain\" aktywuje tworzenie niefraktalnego terenu:\n" "oceanu, wysp oraz podziemi." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Valleys.\n" "'altitude_chill': Reduces heat with altitude.\n" @@ -4719,7 +4660,7 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" -"Atrybuty generowania mapy specyficzne dla dolin Mapgen.\n" +"Atrybuty generowania mapy specyficzne dla generatora Valleys.\n" "'altitude_chill': Zmniejsza ciepło wraz z wysokością nad poziomem morza.\n" "'humid_rivers': Zwiększa wilgotność wokół rzek.\n" "'vary_river_depth': Jeżeli włączone, niska wilgotność i wysoka temperatura " @@ -4728,12 +4669,10 @@ msgstr "" "'altitude_dry': Zmniejsza wilgotność wraz z wysokością." #: src/settings_translation_file.cpp -#, fuzzy msgid "Map generation attributes specific to Mapgen v5." -msgstr "Właściwości generowania mapy określające Mapgen v5." +msgstr "Właściwości generowania mapy specyficzne dla generatora v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -4742,11 +4681,12 @@ msgid "" "The 'temples' flag disables generation of desert temples. Normal dungeons " "will appear instead." msgstr "" -"Atrybuty generowania map specyficzne dla Generatora map v6.\n" -"Flaga „biomów śnieżnych” włącza nowy system 5 biomów.\n" -"Gdy flaga „biomy śnieżne” jest włączona, dżungle są automatycznie włączane " -"i\n" -"flaga „dżungli” jest ignorowana." +"Właściwości generowania map specyficzne dla generatora v6.\n" +"Flaga 'snowbiomes' włącza nowy system 5 biomów.\n" +"Gdy flaga 'snowbiomes' jest włączona, dżungle są automatycznie włączane i\n" +"flaga 'jungles' jest ignorowana.\n" +"Flaga 'temples' wyłącza generowanie świątyń pustynnych. Zwykłe lochy będą " +"pojawiać się zamiast tego." #: src/settings_translation_file.cpp msgid "" @@ -4769,9 +4709,8 @@ msgid "Map save interval" msgstr "Interwał zapisu mapy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Map shadows update frames" -msgstr "Interwał czasowy aktualizacji cieczy" +msgstr "Klatki aktualizacji cieni mapy" #: src/settings_translation_file.cpp msgid "Mapblock limit" @@ -4782,82 +4721,68 @@ msgid "Mapblock mesh generation delay" msgstr "Opóźnienie generacji siatki bloków Mapblock" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generation threads" -msgstr "Opóźnienie generacji siatki bloków Mapblock" +msgstr "Wątki generowania modelu bloku mapy" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" msgstr "Przekroczenie czasu wyładowania bloków mapy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian" -msgstr "Generator mapy fractal" +msgstr "Generator mapy Carpathian" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian specific flags" -msgstr "Specyficzne flagi dla generatora Mapgen flat" +msgstr "Specyficzne flagi dla generatora Carpathian" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Generator mapy flat" +msgstr "Generator mapy Płaski" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat specific flags" -msgstr "Specyficzne flagi dla generatora Mapgen flat" +msgstr "Specyficzne flagi dla generatora Płaskiego" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Generator mapy fractal" +msgstr "Generator mapy Fractal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Specyficzne flagi dla generatora Mapgen flat" +msgstr "Specyficzne flagi dla generatora Fractal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" -msgstr "Generator mapy v5" +msgstr "Generator mapy V5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5 specific flags" -msgstr "Generator mapy flat flagi" +msgstr "Flagi specyficzne dla generatora mapy V5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" -msgstr "Generator mapy v6" +msgstr "Generator mapy V6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6 specific flags" -msgstr "Generator mapy flat flagi" +msgstr "Flagi specyficzne dla generatora mapy V6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" -msgstr "Generator mapy v7" +msgstr "Generator mapy V7" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7 specific flags" -msgstr "Specyficzne flagi Mapgen v7" +msgstr "Flagi specyficzne dla generatora mapy V7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" msgstr "Generator mapy Valleys" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Specyficzne flagi dla generatora Mapgen flat" +msgstr "Specyficzne flagi dla generatora Valleys" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -4892,51 +4817,45 @@ msgid "Maximum FPS" msgstr "Maksymalny FPS" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum FPS when the window is not focused, or when the game is paused." -msgstr "Maksymalny FPS gdy gra spauzowana." +msgstr "Maksymalny FPS gdy przełączono poza okno gry lub gra jest zapauzowana." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum distance to render shadows." -msgstr "Maksymalna odległość do renderowania cieni." +msgstr "Maksymalna odległość dla renderowania cieni." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "Maksymalna ilość bloków załadowanych w sposób wymuszony" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum hotbar width" -msgstr "Maksymalna długość hotbar" +msgstr "Maksymalna długość hotbara" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "Maksymalny limit losowej liczby dużych jaskiń na mapchunk." +msgstr "Górna granica losowej liczby dużych jaskiń na mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "Maksymalny limit losowej liczby małych jaskiń na mapchunk." +msgstr "Górna granica losowej liczby małych jaskiń na mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" -"Maksymalny opór cieczy. Wpływa na spowolnienie przy wejściu w ciecz \n" +"Maksymalny opór cieczy. Wpływa na spowolnienie przy wejściu w ciecz\n" "z dużą prędkością." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks that are simultaneously sent per client.\n" "The maximum total count is calculated dynamically:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" msgstr "" -"Maksymalna ilość bloków, które są jednocześnie wysyłane na jednego klienta.\n" +"Maksymalna liczba bloków, które są jednocześnie wysyłane na jednego klienta." +"\n" "Maksymalna łączna liczba jest obliczana dynamicznie:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" @@ -4946,25 +4865,22 @@ msgstr "" "Maksymalna liczba bloków, które mogą być skolejkowane podczas wczytywania." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" "Maksymalna liczba bloków do skolejkowania, które mają być wygenerowane.\n" -"Pozostaw puste a odpowiednia liczba zostanie dobrana automatycznie." +"Ten limit jest egzekwowany na gracza." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" "Maksymalna liczba bloków do skolejkowania które mają być wczytane z pliku.\n" -"Pozostaw puste a odpowiednia liczba zostanie dobrana automatycznie." +"Ten limit jest egzekwowany na gracza." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of concurrent downloads. Downloads exceeding this limit will " "be queued.\n" @@ -4972,7 +4888,7 @@ msgid "" msgstr "" "Maksymalna liczba jednocześnie pobieranych plików. Pobieranie przekraczające " "ten limit zostanie umieszczone w kolejce.\n" -"Powinien być niższy niż curl_parallel_limit." +"To powinno być niższe niż curl_parallel_limit." #: src/settings_translation_file.cpp msgid "" @@ -4995,7 +4911,6 @@ msgstr "" "numer klienta." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of players that can be connected simultaneously." msgstr "Maksymalna liczba graczy, która może się jednocześnie połączyć." @@ -5024,34 +4939,30 @@ msgid "Maximum simultaneous block sends per client" msgstr "Maksymalny jednoczesny blok wysłany, na każdego klienta" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum size of the outgoing chat queue" -msgstr "Maksymalny rozmiar kolejki wiadomości czatu" +msgstr "Maksymalny rozmiar kolejki wychodzących wiadomości czatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum size of the outgoing chat queue.\n" "0 to disable queueing and -1 to make the queue size unlimited." msgstr "" -"Maksymalny rozmiar kolejki wiadomości czatu\n" -"Wartość 0, wyłącza kolejkę, -1 to nieograniczony rozmiar kolejki." +"Maksymalny rozmiar kolejki wychodzących wiadomości czatu\n" +"Wartość 0 wyłącza kolejkę, -1 to nieograniczony rozmiar kolejki." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum time a file download (e.g. a mod download) may take, stated in " "milliseconds." -msgstr "Maksymalny czas na pobranie pliku (np.: moda) w ms." +msgstr "Maksymalny czas na pobranie pliku (np. moda) w milisekundach." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum time an interactive request (e.g. server list fetch) may take, " "stated in milliseconds." msgstr "" -"Maksymalny czas, jaki może zająć interaktywne żądanie (np. pobranie listy z " -"serwera), podany w milisekundach." +"Maksymalny czas, jaki może zająć interaktywne żądanie (np. pobranie listy " +"serwerów), podany w milisekundach." #: src/settings_translation_file.cpp msgid "Maximum users" @@ -5074,7 +4985,6 @@ msgid "Method used to highlight selected object." msgstr "Metoda użyta do podświetlenia wybranego obiektu." #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimal level of logging to be written to chat." msgstr "Minimalny poziom logowania, który ma być zapisywany na czacie." @@ -5083,19 +4993,16 @@ msgid "Minimap scan height" msgstr "Wysokość skanowania minimapy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum dig repetition interval" -msgstr "Interwał powtórzenia prawego kliknięcia myszy" +msgstr "Minimalna przerwa pomiędzy powtórzeniem kopania" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "Szum 3D, który wpływa na liczbę lochów na jeden mapchunk." +msgstr "Dolna granica losowej liczby dużych jaskiń na mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "Minimalny limit losowej liczby małych jaskiń na mapchunk." +msgstr "Dolna granica losowej liczby małych jaskiń na mapchunk." #: src/settings_translation_file.cpp msgid "Mipmapping" @@ -5106,23 +5013,20 @@ msgid "Miscellaneous" msgstr "Różne" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mod Profiler" -msgstr "Profiler" +msgstr "Profiler modów" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mod Security" -msgstr "Bezpieczeństwo" +msgstr "Bezpieczeństwo modów" #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Kanały modów" #: src/settings_translation_file.cpp -#, fuzzy msgid "Modifies the size of the HUD elements." -msgstr "Modyfikuje rozmiar elementów paska HUD." +msgstr "Modyfikuje rozmiar elementów HUD." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5133,9 +5037,8 @@ msgid "Monospace font size" msgstr "Rozmiar czcionki Monospace" #: src/settings_translation_file.cpp -#, fuzzy msgid "Monospace font size divisible by" -msgstr "Rozmiar czcionki Monospace" +msgstr "Rozmiar czcionki Monospace podzielny przez" #: src/settings_translation_file.cpp msgid "Mountain height noise" @@ -5146,14 +5049,12 @@ msgid "Mountain noise" msgstr "Szum góry" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mountain variation noise" -msgstr "Szum wysokości góry" +msgstr "Szum zróżnicowania gór" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mountain zero level" -msgstr "Szum góry" +msgstr "Poziom zerowy gór" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" @@ -5164,9 +5065,8 @@ msgid "Mouse sensitivity multiplier." msgstr "Mnożnik czułości myszy." #: src/settings_translation_file.cpp -#, fuzzy msgid "Movement threshold" -msgstr "Próg groty" +msgstr "Próg ruchu" #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5185,7 +5085,6 @@ msgid "Mute sound" msgstr "Wycisz dźwięk" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this.\n" @@ -5194,8 +5093,8 @@ msgid "" msgstr "" "Nazwa generatora map, który ma być użyty podczas tworzenia nowego świata.\n" "Tworzenie świata w menu głównym nadpisze tę wartość.\n" -"Obecne mapgeny są w bardzo niestabilnym stanie:\n" -"- Opcjonalne floatlands z v7 (domyślnie wyłączone)." +"Obecne mapgeny w bardzo niestabilnym stanie:\n" +"- Opcjonalne latające wyspy z v7 (domyślnie wyłączone)." #: src/settings_translation_file.cpp msgid "" @@ -5250,7 +5149,6 @@ msgid "Number of emerge threads" msgstr "Liczba powstających wątków" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5272,7 +5170,7 @@ msgstr "" "OSTRZEŻENIE: Zwiększenie liczby wątków emerge zwiększa szybkość mapgena " "silnika,\n" "ale może to wpłynąć na wydajność gry przez zakłócanie innych\n" -"procesami, szczególnie w grze dla pojedynczego gracza i/lub podczas " +"procesów, szczególnie w grze dla pojedynczego gracza i/lub podczas " "uruchamiania kodu Lua w\n" "'on_generated'. Dla wielu użytkowników optymalnym ustawieniem może być '1'." @@ -5288,7 +5186,6 @@ msgstr "" "konsumpcją pamięci (4096=100MB, praktyczna zasada)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Number of messages a player may send per 10 seconds." msgstr "Dozwolona liczba wiadomości wysłanych przez gracza w ciągu 10 sekund." @@ -5298,18 +5195,19 @@ msgid "" "Value of 0 (default) will let Minetest autodetect the number of available " "threads." msgstr "" +"Liczba wątków do użycia do generacji modeli.\n" +"Wartość 0 (domyślna) sprawi, że Minetest automatycznie wykryje liczbę " +"dostępnych wątków." #: src/settings_translation_file.cpp msgid "Occlusion Culler" -msgstr "" +msgstr "Occlusion Culler" #: src/settings_translation_file.cpp -#, fuzzy msgid "Occlusion Culling" -msgstr "Occulusion culling po stronie serwera" +msgstr "Pomijanie przesłoniętych modeli po stronie serwera" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" @@ -5327,14 +5225,12 @@ msgstr "" "otwarty." #: src/settings_translation_file.cpp -#, fuzzy msgid "OpenGL debug" -msgstr "Generator mapy debugowanie" +msgstr "Debug OpenGL" #: src/settings_translation_file.cpp -#, fuzzy msgid "Optional override for chat weblink color." -msgstr "Opcjonalna zmiana koloru łącza internetowego czatu." +msgstr "Opcjonalna zmiana koloru łącza internetowego na czacie." #: src/settings_translation_file.cpp msgid "" @@ -5347,12 +5243,11 @@ msgstr "" "jest niedostępna." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Path to save screenshots at. Can be an absolute or relative path.\n" "The folder will be created if it doesn't already exist." msgstr "" -"Ścieżka w której zapisywane są zrzuty ekranu. Może być bezwzględna lub " +"Ścieżka, w której zapisywane są zrzuty ekranu. Może być bezwzględna lub " "względna.\n" "Folder zostanie utworzony, jeśli jeszcze nie istnieje." @@ -5385,40 +5280,34 @@ msgid "Pause on lost window focus" msgstr "Pauza, gdy okno jest nieaktywne" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks load from disk" -msgstr "Limit załadowanych bloków z dysku na jednego gracza" +msgstr "Limit bloków zakolejkowanych do załadowania z dysku na jednego gracza" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Limit kolejek oczekujących do wytworzenia" +msgstr "Limit bloków zakolejkowanych do wygenerowania na jednego gracza" #: src/settings_translation_file.cpp msgid "Physics" msgstr "Fizyka" #: src/settings_translation_file.cpp -#, fuzzy msgid "Place repetition interval" -msgstr "Interwał powtórzenia prawego kliknięcia myszy" +msgstr "Interwał powtórzenia stawiania" #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Odległość przesyłania graczy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Poisson filtering" -msgstr "Filtrowanie dwuliniowe" +msgstr "Filtrowanie Poissona" #: src/settings_translation_file.cpp -#, fuzzy msgid "Post Processing" -msgstr "Przetwarzanie końcowe" +msgstr "Post Processing" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Prevent digging and placing from repeating when holding the respective " "buttons.\n" @@ -5427,7 +5316,8 @@ msgid "" msgstr "" "Zapobiegaj powtarzaniu kopania i stawiania bloków podczas przytrzymania " "przycisków myszy.\n" -"Włącz to jeśli zbyt często kopiesz lub stawiasz obiekty przez przypadek." +"Włącz to jeśli zbyt często kopiesz lub stawiasz obiekty przez przypadek.\n" +"Na ekranach dotykowych, to wpływa tylko na kopanie." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." @@ -5454,34 +5344,31 @@ msgstr "Profiler" #: src/settings_translation_file.cpp #, fuzzy msgid "Prometheus listener address" -msgstr "Adres słuchacza Prometheusa" +msgstr "Adres nasłuchiwacza Prometheusa" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Prometheus listener address.\n" "If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" "Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" -"Adres listenera Prometheus.\n" +"Adres listenera Prometheusa.\n" "Jeśli Minetest jest skompilowany z włączoną opcją ENABLE_PROMETHEUS,\n" -"włącz słuchanie metryk dla Prometheusa na tym adresie.\n" -"Metryki mogą być pobierane na stronie http://127.0.0.1:30000/metrics" +"włącz listener metryk dla Prometheusa na tym adresie.\n" +"Metryki mogą być ładowane na http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp -#, fuzzy msgid "Proportion of large caves that contain liquid." -msgstr "Proporcja dużych jaskiń, które zawierają ciecz." +msgstr "Część dużych jaskiń, która zawiera ciecz." #: src/settings_translation_file.cpp -#, fuzzy msgid "Protocol version minimum" -msgstr "Niezgodne wersje protokołów. " +msgstr "Minimalna wersja protokołu" #: src/settings_translation_file.cpp msgid "Punch gesture" -msgstr "" +msgstr "Gest uderzenia" #: src/settings_translation_file.cpp msgid "" @@ -5502,7 +5389,7 @@ msgstr "Losowe wejście" #: src/settings_translation_file.cpp msgid "Random mod load order" -msgstr "" +msgstr "Losowa kolejność ładowania modów" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -6247,7 +6134,6 @@ msgid "Strip color codes" msgstr "Usuń kody kolorów" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Surface level of optional water placed on a solid floatland layer.\n" "Water is disabled by default and will only be placed if this value is set\n" @@ -6266,12 +6152,12 @@ msgstr "" "wartość ta jest ustawiona\n" "powyżej 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (początek\n" "górnego zwężenia).\n" -"***OSTRZEŻENIE, POTENCJALNE ZAGROŻENIE DLA ŚWIATÓW I WYDAJNOŚCI " -"SERWERÓW***:\n" -"Przy włączonym umieszczaniu wody, tereny pływające muszą być ustawione i " +"***OSTRZEŻENIE, POTENCJALNE ZAGROŻENIE DLA ŚWIATÓW I WYDAJNOŚCI SERWERÓW***:" +"\n" +"Przy włączonym umieszczaniu wody, latające wyspy muszą być skonfigurowane i " "przetestowane\n" -"oraz być warstwą stałą poprzez ustawienie 'mgv7_floatland_density' na 2.0 " -"(lub innej\n" +"oraz być warstwą stałą poprzez ustawienie 'mgv7_floatland_density' na 2.0 (" +"lub innej\n" "wymaganej wartości w zależności od 'mgv7_np_floatland'), \n" "aby uniknąć intensywnego przepływu wody na serwerze oraz ogromnego zalania\n" "powierzchni świata poniżej." @@ -6717,9 +6603,8 @@ msgid "Upper Y limit of dungeons." msgstr "Górna granica Y lochów." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Górna granica Y lochów." +msgstr "Górna granica Y latających wysp." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -7168,10 +7053,10 @@ msgid "" "For a solid floatland layer, this controls the height of hills/mountains.\n" "Must be less than or equal to half the distance between the Y limits." msgstr "" -"Odległość Y, na której pływające tereny zwężają się od pełnej gęstości do " -"zera.\n" +"Odległość Y, na której latające wyspy zwężają się od pełnej gęstości do zera." +"\n" "Zbieżność rozpoczyna się w tej odległości od granicy Y.\n" -"W przypadku litej warstwy pływów kontroluje wysokość wzgórz/gór.\n" +"W przypadku litej warstwy latającego lądu kontroluje wysokość wzgórz/gór.\n" "Musi być mniejsza lub równa połowie odległości między granicami Y." #: src/settings_translation_file.cpp From dfb23c8db059be66cd3735d453aa272c48021f34 Mon Sep 17 00:00:00 2001 From: "updatepo.sh" Date: Sun, 11 Aug 2024 17:35:23 +0200 Subject: [PATCH 31/59] Update minetest.conf.example and settings_translation_file.cpp --- minetest.conf.example | 9 +++++++-- src/settings_translation_file.cpp | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/minetest.conf.example b/minetest.conf.example index eaedae947..efe9c19bd 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -116,7 +116,7 @@ # type: bool # virtual_joystick_triggers_aux1 = false -# The gesture for for punching players/entities. +# The gesture for punching players/entities. # This can be overridden by games and mods. # # * short_tap @@ -707,6 +707,11 @@ # type: string # contentdb_url = https://content.minetest.net +# If enabled and you have ContentDB packages installed, Minetest may contact ContentDB to +# check for package updates when opening the mainmenu. +# type: bool +# contentdb_enable_updates_indicator = true + # Comma-separated list of flags to hide in the content repository. # "nonfree" can be used to hide packages which do not qualify as 'free software', # as defined by the Free Software Foundation. @@ -740,7 +745,7 @@ # type: bool # enable_split_login_register = true -# URL to JSON file which provides information about the newest Minetest release +# URL to JSON file which provides information about the newest Minetest release. # If this is empty the engine will never check for updates. # type: string # update_information_url = https://www.minetest.net/release_info.json diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp index 78c3cfb44..6347bc257 100644 --- a/src/settings_translation_file.cpp +++ b/src/settings_translation_file.cpp @@ -50,7 +50,7 @@ fake_function() { gettext("Virtual joystick triggers Aux1 button"); gettext("Use virtual joystick to trigger \"Aux1\" button.\nIf enabled, virtual joystick will also tap \"Aux1\" button when out of main circle."); gettext("Punch gesture"); - gettext("The gesture for for punching players/entities.\nThis can be overridden by games and mods.\n\n* short_tap\nEasy to use and well-known from other games that shall not be named.\n\n* long_tap\nKnown from the classic Minetest mobile controls.\nCombat is more or less impossible."); + gettext("The gesture for punching players/entities.\nThis can be overridden by games and mods.\n\n* short_tap\nEasy to use and well-known from other games that shall not be named.\n\n* long_tap\nKnown from the classic Minetest mobile controls.\nCombat is more or less impossible."); gettext("Graphics and Audio"); gettext("Graphics"); gettext("Screen"); @@ -276,6 +276,8 @@ fake_function() { gettext("Content Repository"); gettext("ContentDB URL"); gettext("The URL for the content repository"); + gettext("Enable updates available indicator on content tab"); + gettext("If enabled and you have ContentDB packages installed, Minetest may contact ContentDB to\ncheck for package updates when opening the mainmenu."); gettext("ContentDB Flag Blacklist"); gettext("Comma-separated list of flags to hide in the content repository.\n\"nonfree\" can be used to hide packages which do not qualify as 'free software',\nas defined by the Free Software Foundation.\nYou can also specify content ratings.\nThese flags are independent from Minetest versions,\nso see a full list at https://content.minetest.net/help/content_flags/"); gettext("ContentDB Max Concurrent Downloads"); @@ -289,7 +291,7 @@ fake_function() { gettext("Enable split login/register"); gettext("If enabled, account registration is separate from login in the UI.\nIf disabled, new accounts will be registered automatically when logging in."); gettext("Update information URL"); - gettext("URL to JSON file which provides information about the newest Minetest release\nIf this is empty the engine will never check for updates."); + gettext("URL to JSON file which provides information about the newest Minetest release.\nIf this is empty the engine will never check for updates."); gettext("Server"); gettext("Admin name"); gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden."); From 20afc762cc64dd8def83e70302247d67c86e12b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sun, 11 Aug 2024 17:54:05 +0200 Subject: [PATCH 32/59] Fix empty tables / text lists emitting row events (#14955) Also makes these elements no longer show a selected nonexisting row --- src/gui/guiFormSpecMenu.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 8d554ef8a..99a93e051 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -1188,7 +1188,9 @@ void GUIFormSpecMenu::parseTable(parserData* data, const std::string &element) std::vector v_pos = split(parts[0],','); std::vector v_geom = split(parts[1],','); std::string name = parts[2]; - std::vector items = split(parts[3],','); + std::vector items; + if (!parts[3].empty()) + items = split(parts[3],','); std::string str_initial_selection; if (parts.size() >= 5) @@ -1258,7 +1260,9 @@ void GUIFormSpecMenu::parseTextList(parserData* data, const std::string &element std::vector v_pos = split(parts[0],','); std::vector v_geom = split(parts[1],','); std::string name = parts[2]; - std::vector items = split(parts[3],','); + std::vector items; + if (!parts[3].empty()) + items = split(parts[3],','); std::string str_initial_selection; std::string str_transparent = "false"; From 835dd01fa163df815215b8c694af0910657602b6 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 11 Aug 2024 16:54:55 +0100 Subject: [PATCH 33/59] Bump version to 5.9.0 --- CMakeLists.txt | 2 +- android/build.gradle | 2 +- misc/net.minetest.minetest.metainfo.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b1b9d07d..fd996b8e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ set(VERSION_PATCH 0) set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string") # Change to false for releases -set(DEVELOPMENT_BUILD TRUE) +set(DEVELOPMENT_BUILD FALSE) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") if(VERSION_EXTRA) diff --git a/android/build.gradle b/android/build.gradle index 34f78732a..99244721a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,7 +4,7 @@ project.ext.set("versionMajor", 5) // Version Major project.ext.set("versionMinor", 9) // Version Minor project.ext.set("versionPatch", 0) // Version Patch // ^ keep in sync with cmake -project.ext.set("versionCode", 46) // Android Version Code +project.ext.set("versionCode", 48) // Android Version Code // NOTE: +2 after each release! // +1 for ARM and +1 for ARM64 APK's, because // each APK must have a larger `versionCode` than the previous diff --git a/misc/net.minetest.minetest.metainfo.xml b/misc/net.minetest.minetest.metainfo.xml index a5585d229..4045b8f23 100644 --- a/misc/net.minetest.minetest.metainfo.xml +++ b/misc/net.minetest.minetest.metainfo.xml @@ -149,6 +149,6 @@ celeron55@gmail.com - + From 1222750c50c3077d5793675bfdc337b66ed24313 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 11 Aug 2024 16:55:00 +0100 Subject: [PATCH 34/59] Continue with 5.10.0-dev --- CMakeLists.txt | 4 ++-- android/build.gradle | 2 +- doc/client_lua_api.md | 2 +- doc/menu_lua_api.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fd996b8e6..6623fa828 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,12 +11,12 @@ set(CLANG_MINIMUM_VERSION "7.0.1") # You should not need to edit these manually, use util/bump_version.sh set(VERSION_MAJOR 5) -set(VERSION_MINOR 9) +set(VERSION_MINOR 10) set(VERSION_PATCH 0) set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string") # Change to false for releases -set(DEVELOPMENT_BUILD FALSE) +set(DEVELOPMENT_BUILD TRUE) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") if(VERSION_EXTRA) diff --git a/android/build.gradle b/android/build.gradle index 99244721a..69fd26625 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. project.ext.set("versionMajor", 5) // Version Major -project.ext.set("versionMinor", 9) // Version Minor +project.ext.set("versionMinor", 10) // Version Minor project.ext.set("versionPatch", 0) // Version Patch // ^ keep in sync with cmake project.ext.set("versionCode", 48) // Android Version Code diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md index cbf243616..fac3f7b93 100644 --- a/doc/client_lua_api.md +++ b/doc/client_lua_api.md @@ -1,4 +1,4 @@ -Minetest Lua Client Modding API Reference 5.9.0 +Minetest Lua Client Modding API Reference 5.10.0 ================================================ * More information at * Developer Wiki: diff --git a/doc/menu_lua_api.md b/doc/menu_lua_api.md index 19540a607..9f0e23a11 100644 --- a/doc/menu_lua_api.md +++ b/doc/menu_lua_api.md @@ -1,4 +1,4 @@ -Minetest Lua Mainmenu API Reference 5.9.0 +Minetest Lua Mainmenu API Reference 5.10.0 ========================================= Introduction From c6c2c4f60f69435e07bf2d4649b1b05a345f46a8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 11 Aug 2024 19:18:11 +0100 Subject: [PATCH 35/59] Revert "Disable SDL2 for 5.9.0 (#14944)" (#14959) This reverts commit ebaf3c8d77e5240b505b7e7b0c05a769e44d8e0e. --- .github/workflows/windows.yml | 2 +- android/native/build.gradle | 2 +- doc/compiling/linux.md | 12 ++++++------ doc/compiling/windows.md | 3 +-- irr/README.md | 2 +- irr/src/CMakeLists.txt | 2 +- util/buildbot/buildwin32.sh | 1 + util/buildbot/buildwin64.sh | 1 + util/buildbot/common.sh | 4 ++++ util/buildbot/sha256sums.txt | 2 ++ util/ci/common.sh | 2 +- 11 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4b937e80e..367933148 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -71,7 +71,7 @@ jobs: env: VCPKG_VERSION: 01f602195983451bc83e72f4214af2cbc495aa94 # 2024.05.24 - vcpkg_packages: zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp opengl-registry + vcpkg_packages: zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp sdl2 strategy: fail-fast: false matrix: diff --git a/android/native/build.gradle b/android/native/build.gradle index 806dda2f0..0be7c1d99 100644 --- a/android/native/build.gradle +++ b/android/native/build.gradle @@ -8,7 +8,7 @@ android { compileSdk 34 targetSdkVersion 34 externalNativeBuild { - cmake { + cmake { arguments "-DANDROID_STL=c++_shared", "-DENABLE_CURL=1", "-DENABLE_SOUND=1", "-DENABLE_GETTEXT=1", diff --git a/doc/compiling/linux.md b/doc/compiling/linux.md index 3b31250e8..573c6908e 100644 --- a/doc/compiling/linux.md +++ b/doc/compiling/linux.md @@ -21,27 +21,27 @@ For Debian/Ubuntu users: - sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libxi-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev gettext + sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev gettext libsdl2-dev For Fedora users: - sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libpng-devel libjpeg-devel libvorbis-devel libXi-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel gettext + sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libpng-devel libjpeg-devel libvorbis-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel spatialindex-devel libzstd-devel gettext SDL2-devel For openSUSE users: - sudo zypper install gcc gcc-c++ cmake libjpeg8-devel libpng16-devel openal-soft-devel libcurl-devel sqlite3-devel luajit-devel libzstd-devel Mesa-libGL-devel libXi-devel libvorbis-devel freetype2-devel + sudo zypper install gcc gcc-c++ cmake libjpeg8-devel libpng16-devel openal-soft-devel libcurl-devel sqlite3-devel luajit-devel libzstd-devel Mesa-libGL-devel libvorbis-devel freetype2-devel SDL2-devel For Arch users: - sudo pacman -S --needed base-devel libcurl-gnutls cmake libxi libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd gettext + sudo pacman -S --needed base-devel libcurl-gnutls cmake libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd gettext sdl2 For Alpine users: - sudo apk add build-base cmake libpng-dev jpeg-dev libxi-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev zstd-dev gettext + sudo apk add build-base cmake libpng-dev jpeg-dev mesa-dev sqlite-dev libogg-dev libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev gmp-dev jsoncpp-dev luajit-dev zstd-dev gettext sdl2-dev For Void users: - sudo xbps-install cmake libpng-devel jpeg-devel libXi-devel mesa sqlite-devel libogg-devel libvorbis-devel libopenal-devel libcurl-devel freetype-devel zlib-devel gmp-devel jsoncpp-devel LuaJIT-devel zstd libzstd-devel gettext + sudo xbps-install cmake libpng-devel jpeg-devel mesa sqlite-devel libogg-devel libvorbis-devel libopenal-devel libcurl-devel freetype-devel zlib-devel gmp-devel jsoncpp-devel LuaJIT-devel zstd libzstd-devel gettext SDL2-devel ## Download diff --git a/doc/compiling/windows.md b/doc/compiling/windows.md index 7c20cd81c..c63a7b319 100644 --- a/doc/compiling/windows.md +++ b/doc/compiling/windows.md @@ -13,9 +13,8 @@ It is highly recommended to use vcpkg as package manager. After you successfully built vcpkg you can easily install the required libraries: - ```powershell -vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp gettext opengl-registry --triplet x64-windows +vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp gettext sdl2 --triplet x64-windows ``` - `curl` is optional, but required to read the serverlist, `curl[winssl]` is required to use the content store. diff --git a/irr/README.md b/irr/README.md index f07bb6d63..96d3b0d97 100644 --- a/irr/README.md +++ b/irr/README.md @@ -22,7 +22,7 @@ Aside from standard search options (`ZLIB_INCLUDE_DIR`, `ZLIB_LIBRARY`, ...) the * `ENABLE_OPENGL3` (default: `OFF`) - Enable OpenGL 3+ driver * `ENABLE_GLES1` - Enable OpenGL ES driver, legacy * `ENABLE_GLES2` - Enable OpenGL ES 2+ driver -* `USE_SDL2` (default: ON for Android, OFF for other platforms) - Use SDL2 instead of older native device code +* `USE_SDL2` (default: platform-dependent, usually `ON`) - Use SDL2 instead of older native device code However, IrrlichtMt cannot be built or installed separately. diff --git a/irr/src/CMakeLists.txt b/irr/src/CMakeLists.txt index 15a752c38..d5e9d47e7 100644 --- a/irr/src/CMakeLists.txt +++ b/irr/src/CMakeLists.txt @@ -1,6 +1,6 @@ # When enabling SDL2 by default on macOS, don't forget to change # "NSHighResolutionCapable" to true in "Info.plist". -if(ANDROID) +if(NOT APPLE) set(DEFAULT_SDL2 ON) endif() diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh index b070a4343..34767f707 100755 --- a/util/buildbot/buildwin32.sh +++ b/util/buildbot/buildwin32.sh @@ -42,6 +42,7 @@ download "$libhost/llvm/libleveldb-$leveldb_version-win32.zip" download "$libhost/llvm/openal-soft-$openal_version-win32.zip" download "$libhost/llvm/libjpeg-$libjpeg_version-win32.zip" download "$libhost/llvm/libpng-$libpng_version-win32.zip" +download "$libhost/llvm/sdl2-$sdl2_version-win32.zip" # Set source dir, downloading Minetest as needed get_sources diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh index 541045a02..c63a18901 100755 --- a/util/buildbot/buildwin64.sh +++ b/util/buildbot/buildwin64.sh @@ -42,6 +42,7 @@ download "$libhost/llvm/libleveldb-$leveldb_version-win64.zip" download "$libhost/llvm/openal-soft-$openal_version-win64.zip" download "$libhost/llvm/libjpeg-$libjpeg_version-win64.zip" download "$libhost/llvm/libpng-$libpng_version-win64.zip" +download "$libhost/llvm/sdl2-$sdl2_version-win64.zip" # Set source dir, downloading Minetest as needed get_sources diff --git a/util/buildbot/common.sh b/util/buildbot/common.sh index 5359d3517..a7fa3b5d3 100644 --- a/util/buildbot/common.sh +++ b/util/buildbot/common.sh @@ -15,6 +15,7 @@ zlib_version=1.3.1 zstd_version=1.5.5 libjpeg_version=3.0.1 libpng_version=1.6.40 +sdl2_version=2.30.3 download () { local url=$1 @@ -87,6 +88,9 @@ add_cmake_libs () { -DJPEG_INCLUDE_DIR=$libdir/libjpeg/include -DJPEG_DLL="$(_dlls $libdir/libjpeg/bin/libjpeg*)" + -DCMAKE_PREFIX_PATH=$libdir/sdl2/lib/cmake + -DSDL2_DLL="$(_dlls $libdir/sdl2/bin/*)" + -DZLIB_INCLUDE_DIR=$libdir/zlib/include -DZLIB_LIBRARY=$libdir/zlib/lib/libz.dll.a -DZLIB_DLL=$libdir/zlib/bin/zlib1.dll diff --git a/util/buildbot/sha256sums.txt b/util/buildbot/sha256sums.txt index 4c6c13fcc..0587e6ea1 100644 --- a/util/buildbot/sha256sums.txt +++ b/util/buildbot/sha256sums.txt @@ -19,6 +19,8 @@ da6ad10632cf172992158e9ea0977a87914b5d5de93a972c3430b6a412237556 luajit-2024012 2b1dabe83d478b398cf9226d96de7fa62c973365c4aea70d27ba5782fb49d2d0 luajit-20240125-win64.zip e2443451fe5c2066eb564c64b8a1762738a88b7fd749c8b5907fed45c785497b openal-soft-1.23.1-win32.zip cb041445a118469caefbad2647470cb8571c8337bce2adc07634011ab5625417 openal-soft-1.23.1-win64.zip +574e0847e622ff09ab23e2b22b77685a2ab6ee43de3e2932f3e8a14a4d7b9338 sdl2-2.30.3-win32.zip +6127afdfc7b6a4ade8caf9a7267748ffea974f729866dd5be96c7a69d2f0fee7 sdl2-2.30.3-win64.zip 326701086a0ed66e09a9f3ec4d971654c13b6bd79cfdd079c947ecdcd6409525 sqlite3-3.44.2-win32.zip b2d474e3625f8f426b6cc5c0ecac831a1de46f7d1027bf4a9f6267b0b0411d42 sqlite3-3.44.2-win64.zip 8af10515d57dbfee5d2106cd66cafa2adeb4270d4c6047ccbf7e8b5d2d50681c zlib-1.3.1-win32.zip diff --git a/util/ci/common.sh b/util/ci/common.sh index bd0220db5..201b182f2 100644 --- a/util/ci/common.sh +++ b/util/ci/common.sh @@ -4,7 +4,7 @@ install_linux_deps() { local pkgs=( cmake gettext postgresql - libpng-dev libjpeg-dev libgl1-mesa-dev libxi-dev libfreetype-dev + libpng-dev libjpeg-dev libgl1-mesa-dev libsdl2-dev libfreetype-dev libsqlite3-dev libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev libpq-dev libleveldb-dev libcurl4-openssl-dev libzstd-dev ) From 5b19d315b3b32e18615eaa176c9419756087f578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sun, 11 Aug 2024 20:18:30 +0200 Subject: [PATCH 36/59] devtest: Add sam to testentities (#14882) --- .../mods/testentities/models/LICENSE.txt | 7 +++++++ .../testentities/models/testentities_sam.b3d | Bin 0 -> 73433 bytes .../testentities/models/testentities_sam.png | Bin 0 -> 2754 bytes games/devtest/mods/testentities/visuals.lua | 13 +++++++++++++ 4 files changed, 20 insertions(+) create mode 100644 games/devtest/mods/testentities/models/LICENSE.txt create mode 100644 games/devtest/mods/testentities/models/testentities_sam.b3d create mode 100644 games/devtest/mods/testentities/models/testentities_sam.png diff --git a/games/devtest/mods/testentities/models/LICENSE.txt b/games/devtest/mods/testentities/models/LICENSE.txt new file mode 100644 index 000000000..4317d68d3 --- /dev/null +++ b/games/devtest/mods/testentities/models/LICENSE.txt @@ -0,0 +1,7 @@ +Original model by MirceaKitsune (CC BY-SA 3.0). +Various alterations and fixes by kilbith, sofar, xunto, Rogier-5, TeTpaAka, Desour, +stujones11, An0n3m0us (CC BY-SA 3.0): + testentities_sam.b3d + +Jordach (CC BY-SA 3.0): + testentities_sam.png diff --git a/games/devtest/mods/testentities/models/testentities_sam.b3d b/games/devtest/mods/testentities/models/testentities_sam.b3d new file mode 100644 index 0000000000000000000000000000000000000000..3e0827e40b5608d36019d0cfef98994d2fb9584c GIT binary patch literal 73433 zcmeEvcX$)W6Siz@(|hlx8PjdcHkNeuncl(l4yJcZ?_kk;@7?qenr#uVijhMLEtF6L zB%y?s03pdQg%IGI*_+kf3gL)9zwi0(d6xHbKo>g!)AJ@>2!75 zv~ODz5YOuk>@})apE3PL>At?uT;@fmGt1D(7>MuTXxXZMgQXxLZfLKGKo<|BYm3_2 zqCwlng^DX8I<#rmHdkRqEZ*D~O8@==vFp}1snfgv9H)Af8O{SiW}po18Q32GLA%b? zzG3~@SkLWdygnA&JeMS+jVSw)c&DD+#V?R1OHy@(f{Mf{&QG+{}22>-qj9$i1plV zX7aIJwGZl!dZK)#9q+IB54R0+VwrqVKW)3BAGWLV-P_gsdzNpOL(=W~awjZ%HRBJu zvHLUoL%RjqtEl>O8>4-7@&LGh;e%}>K5WPFQ`!qc`-k$C@x|*mx$MJbGX>y}KqepC zKOBE^G;desYp=(4vzva}cDx7k9~`?neL)ZW8|7d;9G@7Bf1cYj(7#wa#-|Uj$9C2K zKWx{5eAcd!uhmbLkM|!4aTM-HV}n|nh5LJMSLCbuX|H$b$L_COk8<%qKXS=u_W7_~ z$L~+`8};J{^F!W$7C%0`9_6d{QQNtWs2{U0ldsxO+s^VAlmB5mldt3X>qGh2u8yy! z9mfR@v0Woy)2`%C(LY>s5c`Msce9_i-5djRSC8>eoj>f}FwU`Xz3Tr$`@2MFNBxv` zasKh^nf^Gx-R3WENBL}i#H#ZP+u(SY2z_+TuUM3?&R--j|6ubA`lpG{*oFrmf3sVB zS6bC}wSR(q&HW*MGy4ebF8P5T;uqY5U9aQ)%TVKk_WnwIfcP1U@l(y;+`nSM27!=Y z=CJkwuKds2UHO5v0}sXo4{f^+<3DRx$B(z8eDwc0u^9g~^6~HC2x0ff>(%^#f6r_S zsOZPrHS+0tQNBh$jeMOf=0}u|2kMCaf&JI!SEW^LSNsRpym+pb>*gwVpHU2^Ecz?BB9bYaV+u8lu_^9&X zDrQ5qUF{#X;ej%g{-OV1yLx}#9uM-(F8}h}uH+YS{bfeI@nGW%vMuWKG5$4gSJr1A z=5KAg4xfKC`AvJh;vZr9g0VW?ygDKJf*IJV9N0gUV~&CL4A1THuJ-=@8+y1N+jTO^ z_uS6(#CDB*J~pU@Dj)A3&h*r_#|roN+|KTwq26D6y-PoKf8~0-FCM6yOMa|+f7VFt zf&Bige;;0t?dttMY)AR3ebjcYW4s_=9UpDGPKWkW`-l4Rb|&A|{-JzqSI1Y=j(Wi% zwrlRMX=nG375&3Z?STw&{6+g|+u8j!*Yh^GJ=liy)A)~jySx3g?SXiI=6~w_-P_GE z?bY*2Di9nbSX$qgkJl)O~O z^8!%vL&*oFAl31_2o!iNt1AShDAn=21Qd96t1AYjB-Qb}43yGPN5Y!9nXWHRDx0wN@c3!c~vM?paesyMs+;Lm(w+%REJWF>UbUoB@{{s6g}1PJQ7L- zlyE4usgCDHCq4mmB^F9OC|JkyhEN(nsSl+Q)$zP3 zlqOIbLup2JJZ}l51(fDcT2UR(+dydzB@Rkks^fVFDD9!NgVK@ec-{p{XDFSZbfr3; z_khwJN;fDysgCEpq4a_h52X(jtmAoqDE*-Hg))HZcs>})ASeT&452!n4~H@g%1|f? zRL66C>pv382q>eej_2c`jD<1=%6O{d`6MV4p-g}>nd*2x4a!s~Q=lYL9nWV#nGVGa zWhNA?!56;I-YNVvKh)IC|jwH=i8xdgOUVg2NbO1`EDq?pzMUQhw6A< zr)85Cxd8FF%l;fu7k_36_V>}%P3SvOmw#!8R7}3CO-YF0ui7A@oY!sDvO%oB!oqeR zc50S=39}IT5h_%(96O~2Q5f&#bL0FQo6k%z?GK6Ib0}0C!mM5%0Sdp+2VGvk!r@tVdX%umNF1 z!bXIR37Zf$C2U66oUjF9OTt!!afGc2+Yq)TY)6Q}4v!8Bu%L&hov7ZKunS>V!fp)B za(BWWggpu487e^#PkU3n4`E-zeuVuA2M`V<97H&na0ua0!eNBN2@?oM5RN1qML3#p z3?T+fJjN-&f+n6$p!!6@NraOLrw~phoJN>PXeOLaID>E|;Vi=0gmVbz63!!>Pq=_^ zA>ksz#e_=;ml7@`Tu!)xa3$d?LJYQetWkgkT|8Y!_4R}s2saXLBHT>4g>Wlj65%$& z?SwlBcM|R*+)cQLuvvr7ZE>}d73w}vc>E2>_Y9^k##&z31!f+LeZA!7s5m7pi5X^m;N0I2*|-(CQB{E<^Ow1qp@UG8n* zW)#b9&*p*aZZjKj=k$uUXZOH$m%9YGmFA7I=kUOFm)jP&;fq(>b9%we2HdG>srFnR zxb8X}f|vQ}4=>qsd*Hh3&>XlK)t}q*c)@-2Hc|egXBJ0ZFSt{In`=~FM?NpOC4t+{ zr-UQF7u=KoCdxIhmv|Axrab5t}WdC*L~bj-!-6bF)z4ihbCZ$;$CpkzO}%x0$`BvQd*Hh3 zfN^IY#GMKrxbAW>o}GetR?!33T`tDS;SeV)dEmOs#rQi5;xD9_|MW?W>l-1iSN4L7 zI<13z5$q*50P;{3FS$Tt59Rxcs4l}_HH9T-V*>@4xx26ZK zr*Rt#<5tT9*Ih2pZy_GI?s9p43-!Qtm&@~8m=_JYgvTZ|W6l-mUI8!qntYi^>x!;jT;#CpM<0^C!MDvml{ za8CpGS4VkAT`#z0VBCDK6?fG0z;(Bo8Mt$U^E&E#!F>wc^Z)a8H1LAk8vOT*JU`nT zdcm~-x8{tC_C_AK?(-ri%(rIcQtXYr;I;?u*Ed$$n|R>5+hI9ypB756<8!$C7`t=R zfxEQ4(ca7h*InN`!0k~thrPKM+?T-ZUHMB}3op3;05@gLcw0*^xER-~{+h$q$_p;) zzk2srYn+$dfX_y!wf2$=H1=W^?TbH>2ILzAp^!i4Deu>SV#dGQ|K5K=Tc~)$Ef}^U zt(^z1`?#UprF~Xf+k3%%3pP7o3$k_az*TjIMyUJ&+@XtC**bc`eGJ^WXP($PdBHsg z++5Ep**kl|O#<%ZZawW?yx{f(?#)q4?Oi=^-EEcwxOoSr*t>b)y4ztZ%;VT4*X-TB z;06M>@uk1)J-pzqg1BSLmfO+O3+_9JlUpm5cEo$Z?GN0X=c+k+dBMH;26Fe>C`WHE zxSfD|rExt+A1}DC{z;U7JJ`(8*9-1;;66@n?dazPcMNb-8@6}!_k!C8xQEAfa18K* zi*jo;YVR261sC-_bhx!+kQdxvfV;%r%z^I#-RHc!Pj&?RKIvD_F~kGc-6yXDxBSH@ z$51c0y}=*qm#^*^<^}gPaHDpYb`1A|y9E5V=i%Ir1P@&IzLkJ^v2^@v`v?zQ_r9$M z?!$36>?6J42EaTH9%r%Rd(!{1Z&%=6nzh_M+5^{JhmFA9Ri}@Aj2GN9z)g>vKWw6ffnzt+38I)eA1#;dijZG%vVl-|1lAL@&5FZuwx`%wBNOA8gB}g`DlfQw&>!+tcdYh;`wwsn&M)m)%Ycg6L42_ z?`_}Y1sB)r7v=@qH+#W-1l))3eztA#f{XFjf8AQ!Rxh|1*O$zwYD@Bhi#9BjW36?Y zmt6l6YtpuR$vt`^>%tvcF5BPp;j>=kF-e~Edv)i|PvGwQ1n%xn;O_YZ?q{FC-Ai2D zUy|AHn?;XaN&B3*LC!Ooa*OX6nYNF(*E^ohl)F74SK5B!o~m;qQ*P>>jH3sLJLYyq zrrfwUla3xFu1=RZ7ihXeUdsLL+vBy9iThvr4xZaSDuuZJWrw#Tw?(BA_rL7>_svsL z7UFs_Zc&FnLGBlypzjgl{+Atwf*p<$_rJ#N71%e8xZaGL)l0cBZbxli>I>tRW+$!} zNTJ-==G8{Qig7$<${1$X+7 ziL$lX3+cEAu6r&lbs$5TjTZDF0Q*=9E&UG%cox? z?tuOmKgy*sPQT=Z+{@P!$UE*rT&0Q|e&49Ag?B5YLvvE^w2phOz6YkV%u(7*e zFMI{6Gvh^ws*(Ak5&o7AaTBh(li!!xvk>|b`V$5aW+lu*nqGhVI#uEgiQ#W5;h}jPS}F5C1ESVIKtM1Z3x>Ewj*p$*nzMk zVJE`Qgk1=`5_Ti(PS}I6Ct*B8v)qfYH(?*bz6_Ork$|WDsXl;kAmJdw!GuEyhY}7W z98Q=(ID&8_;V8n2wn@o=)OAmf^Yv~tmJQU1H< ziSn=q$a56C_GzeKq^_}S=^ z1swSe>ut1V@))Cz{0Vat{I|yXY>wF2rM5DPzI+ZrP4$Ou@BsJC;5Jfl<$vuHYtOQk z6}iG#^n{oE2AFTRM?SL8-7>-!$hbPQr+NGc=H~wHMWuGrzP9%>ceIsLDxY1stUIkkP;(Cf_w}G1r;@Q)~ zGwjO?WVcl$uHutooa_SnJSx`MG--G{dy%icw^kB$Nanht9-jkuFT~$cc`MmV6+d7N zVq7z~uMpSo0Jj*#^^==^v2|)Z*;-lQddwI918#oE7Y#~ou-P`1W1Db+?iypQ&G5Wt z_4iTdVhh>2Pu$2h;cB_uUMlL$KbO41QfXDD!^h=5tolCcpALnL8<%a2s`e3m@&2gq zk(N5+lSUhi8_t(AR9CnkwL{ABWyVCGSH@DQlMOXU2O8sKRZp|L7vwet`>r2Y$y9j! z0YgnUeYM=q!0iR&_QmUVrna4bFw`QhCx5sF{;>DL5>w-1Gfh8F%5H>#!o$q{jE^y5 zS>Vpx=QPdLZ!$$+s$hhKhE(pqP*rnmCGg+0@qd`s4Ee(JRh<|k1V%=7pBH$|1DF?$ zVP3qAyJ*_cy^~R|P`S-mOyzoXgZY;6FkIR+?6K+9?vciDkqb3d2YlJq2K`jql2Y03CTtyaVf4_v^v~_xLzIN`Z{}cX-=gtj3&~7=Qosxd@T1NU;OWWvh>}< zT2hsd*pweP^F3(y&{9o2-*(7#oRP_#my) zFYMcQuJID4IS=Bb{l9;0y85Q0k)E+BR;yf; zdmQGmwA>&?{CUK5@CVu0)J+FIW{BBg{ab%PIjMMst)^)YgN)4>m&YibkPE9p+_5gn zCf(UF$8T&@51ZV{_{)gvhRHX2Mzwb1YHg;RtIuz3{)0Q~FaHI#p3I*AtdMDLTY(!} zlk18yQHK+09gUw^u3HB-Dawlu874lJgoh&+ASAna@MLkec6)CTdt<9hp2-~ zU*w*FSTfi#SIRLyz!Cht$<|ZkG99?S5fGz-e_bY7SLb!)-qhF@FLGTm3j1~tV&D2s z>m|QuMIGm(+u3>%mtwU`2js>;OkH|ANqW<%tmFB%9=6_$%k2=)hUYY>V94K zNQQHj9M!fDu=NpiP~r~CMD8`n0jF&HrK6>)InL!zu=N$>>OwgWxqm=zsq#&-)Us+V z$4L7aTR(+MzAirN^#QJPlto&5GStzf#{^q{(n0B4tYC*)z-`m}u=FA&%<+8hMB4yC zuBrp-f^rY^u}GVXggIVao?xT*cYOWpvKi|87P!CmN|tsQLmV$^kFzQ7_*`)(4CV3i z57^;(mwl2ce+@^zuSePj3wBWTMY(NYtx>V#PU*(-V8`HDLu^B+Z`$<(@=*3~FmBI> zZj^j&!zkF;z)TW$mByp87HVbj*DXeJ=-YX(4ICIe+H71{J z6zQvQ15>$7#9)X!#rFQs)actU>;((FvyK+If)3>&p3TqdG#y;C$=>*@+g9a$E00mh z0vDh4Qsb7Gf=A4>AKG!$I+o-r;}#N%_eOgm;=huv=|1N6egF?1{v&6AYxIpLg0#6xFMKu>r7UkAdIf~vx zLGIWGg^bz!;-aQ7?#J~_0DU)I++gh8^j6eVQ7+3_+`edsvS5cbCtn$BgasR>5m&LV znCH>HMZvx`A6GJ6I6J_QD9FwC!MH6@#?5pgbhW|ExLn`Z5B%XU_(PQuGfg>m9yLrS zxt{zN{cIli*?~2iOwO-v8)gVx-3R_#Nbz6OfdcOgGZh{98eGtU&x?6yE}GVi$!DBJ zT*W6d1TLR%JzhRGm1|qhI9uQ+SMe{1@_O{j4W>8r$t3}!Rr^7wEZ;zQAS z*`=+OV~ukax%B=)nVZ_Ua|7be=D>o|)ukrRGB#-0<5%LIKD9rzs5z@ zT=zXz)_tZ8?o zna`;Fj>Vsk)wqMQasB%jtbdotM@^P2I^#y_8|6ZmebE+tUHxWX}PZmA5`vY=aG8?A6&mM&-UPu1j$9402%u zn1r7d>oISch>)xR-88uup^IyC_ z_U#rtGZe{YF2CZ%7t)|My+czKDvy&;Q~S09o~7|G9{B`GiJ*gpxSn)SuG5)=V_P#f z2j|91GnM?SUq`<#y;GPmH1_3kkJC=PTk;-1(S&8TSn1x?%~`KG4CeP?Sx$ zNXX1)JpP_z7jfSa*PiHSvG8vR-cbBKPh65K*i7TU(%LNM8W)J`={f5p#NVyC%^?_n zlX9C6e$BXi&g%sG;(U8nT$cj#EgESTNiOLSuC;?^9!Gbn+bi@E$)#}<^yTpZJ~nRY zFm5T|l3ZmDWe7IY_(OWzn9eD;N$!96nZp{@J>`z5gP^a*e;q?Y`lQ??E{~}^{vz^u zkrm@_=iVvbk-nMDH-(~X!ku0XzLGm?SkLDD`j63VSl=X8r~3>F1_ssGP=^ES@agDu zlm7p$jkspHICc#BSAwu4VJX7Wgk=cJ5(Y9BiH_R1YSs zLRgg$#)KW!31Jn;4p_CZqZT1Ng|GvnH9H_uumik_9pKsQh#-t4tW6k2XdpBavK20z zOH^mk4$fn!&Kv>GW2s(;ur6Ue!uo^_2pbYMB5X|9gs>@LGs5PCEeKl@wjzupY)#mP zuq|Ob!uEt62s;vXBJ51qg|I7OH^T0OJqUXe#uN4;>`mB*urFah!v2H<2nRAW%Yz69 z6AmF9N;r&gIAH?e2!_fh!|`+!)khPKVQ7}e5{@GrPdI_0@(FP~okaD?gi{Eo5>6vb zBs3FFC!9ezlW-P8vpkz{4&hwFc?^|LjN|D7sxKs5M7Wr63E@)0WrWKKR}iiwTt&E= za1G&F!gYk}2{#aKB-})}nQ#l?R>CC0ZG_ticM$F*+(o#Xa1WvTMqEw&1;z*Q*NK-w z{I&Q3evCVNSYw#hX6K5Zf+AZC+seL%i(DTit_yOTEo)+cB;vH+tz7%Nx=HM7xF6$g zANbJlFL1B)POtst`Ed3%T;#rgzb6)iLI_gz?Ut*l@fC1$*AI>=vMq^y4fkXE{##|U z@dj|ee=s9z`NP-jYq%=cEd0=z(fXcoA8@N&wncr@E{uH*SEDb}fhWf!3yPTf0=LMq zf1-wWO<-TcRpqJ=_o(-abFn5JaL+FZG<2%Jo_!4$xk}$e9l}oxGfjg3-Yn9$p`oo` zx;-b2g)g(O@{*3*Vn+TYrt5DLo%y#7HI#dBpM4D%3^#HFv9IB( zebYh8P#)G1Q*-}lf*0=2rq9z2#^w?1Yq;(<qKXxC+7`&ch+TJ!`1dp zEBASVk979$L}%FAn}*~IE!fv^-R1HZ==J^xkSYVW&e?m08!J1oui+y1o#JP#Z>R(E zEBus0I`mhfvqk(9Lxb{~*V%Qld3E+4lBFm9j2xRoTX)@GcWLjKSg{J{YJ zP|8g%+Lo8n>c3JT6CEK8Lssuz#;8KAeU4&=KN8dE(OCOhFFkAEvld4C2mUh&vTT zxgO(LHHv2y-MHMgh%YHl-hntd6XIkg;?lSY@i&g*uMfoE91wqlM17&AjvJ5bcOkB) zLtL*ca$$+7aw}85*a!LIJ>&~qzv8^$Hq&ymQy$9yb5LaB(5-AE?#H+w1`g%FHNyOc z>tK~@uBnwfo#ZZs{MHomTQ%a+SP1$yB7Lo(?;X$=*V8E16L$;cx39?#HHb^TBgpMU z_RS9VEeQ4n1vUCAKTvR;|DkdF4#sUMj2o`qHGT8w4?MrYO||-Fn%|&NBRBK>29uF- zJ9O#-EqO~n1Le1Z8*A})=aE2etNZ_&i1_?yb@h3KB&Vg$KRp|LsbjT3KczE5M(k|e3`~8Vw=iu&+Sdy#QEQ9I5?OP&8 zHYot|eAhJ(47%o>*w=71W6X5GO}NP4aw&^66S%z=-Z4B|(VBe?SJgpW!_4me)>IhQ zCAa*p8q5hz*w=7Xu9z>LE&J7!2Hes$&Kja}#Imp9syZlKuJ3p4e>C-mwNZTVF~i!~ z5$tQYs$9`0yWYHRDhO+?21Qa0SKn80G$cDvoOF!^`b6v6r%fk;o1@?^!=sg@9gT>a zh1Qe&{x}vlSAAg`4eP#DQELq|yX14=^RuciRA}7rn)Z@$RLLQa{>B~(=fP3=TC_`G>6ZSP+m7Bpf0dPI4&7Ep$0PEkL71|oEE;`G;hO2VL z*!PpUgXtu2C+`R|T%Pke`x>r>%j9yM4M%I5YQh@)ra8Z1_@f2(7J|NN-;m#VMSy80 zaLpC(MV0!iy}c!IDXv3J%~}1srW=m~H!gK^)QtH>?D*~gbXWxdHss`NhV?wGAOzZLI|^R5UtZ4eGAvw>D67*MakQ#=Ogp z+>6hA*|Q$L%TT%I1IXh#9KU>x>5y7&R_!@qS#9{fL**(PagodT35$$RK;MQ5HKWE4 zNwwiS5tW;9NGo^GyXVF<;Qm!>WmJnrMeO+AMCFrD^aE2w6}L8 zt`Z-TT${#FhxPlqm~sJk(Z#HW+)o$SI|*`iu3U)nADQNumVxj5Y!5PIU+_8m8m_7X zTnHQKqe5;r}(J*P4ucI63OYv9eTc3IlP4{6QXH;BlkhUUgV}SKLDAiL&IuCr6Ukie?MtAICICcui>H{+;u?io@HgEHxSp;|98?* zV{{YtHC&Y&AI9y4IP`TzDGs<7US2R9UelU=4Og{qtji8Kc3J9Fm7ISjI$tJSHGJQy z6Z;yj%3a2C3zvPMZB3~qaEr{lWmq=6JNp{0s)L#7fc?X=;AV)F1-OTk?idVd@$753 zs@zyX-@E5RrDuPD9lpJ5@cFS9`x>q)SJ@1rgh-!M`aTYzTz;mTipLFrar9#|WWsNdmXor4-X7n8zV^yBUT&zR$jf ztI;7@u-Um)rf7&IhRacgms!)<*Kk!G)H#ILENwQ@1pgq;nR=(NL2k63eGM16${Hrn zr2}$921}-95YGl=`zh*q&jj{0TvcwMkl$Lz=Q6=p1)cf3AB-y1DU5v$SLKSEkDgji z8ZQC&LfbJ>!B1baui+w>>XuiZpBu4jQ@b# zZ6}gz`&|lWU&B>(h!x_xqrntd@|v9?2TIlUYna5ohO2V%e-KsW=DR(Ky>l#bu4Lql z5nI_tTn!gSQRPAf>#kgg@0vB-gIex}Zxy-UfZR$TcZ$FjH!Un7eZSjZs&;yVB=$92 zluPjp@5$mGqMq#FBs)waxt{F%fb822?3-n068jpis;`m@`5d}W<8~g#tvZaGS=85+ zFHnaL&UG|e%2rS>?QaazGv6yzCa!x-#r|pYP#4HUO9Z)@=eMPT+zjRq zC=+eGvuCLE4szjzjJt+#$eYUqxymyG+5!1(qC%u7=v&_XcMWF9$IAt-_{?y8QcY<& za0`sSYd8jZeubceTb_SYP4b8QR{y6vhDoq~z~6FIo2lyu)M4-SU}-sUCqBPz_;FMd z_BCAOlFeK`iR-ABA(f=6u-*wy{?;%6);su{kSZ4{z~RODeV}w1xRGaX8dk$P3V%1! za9whdU*Tm*X*%T1=B=+AHu+X%U&H+vw^ElPQaI$zhGo7nOn`OYIzes*^L6YOmY+)G zlYRzn@jMp|-*wC9SWjG~Z(@8nRx!J@4RY-Czs?wfVV#PDu&&-jaur|KvHXU*qVK%x^1W#T7n@VI@!%ZbiE z7j-|@ctpQc{JqdyF8-$IEf;@x^p=aiO?u1y>=U?qiA(ELVXXm8aG0GrM*5e>_rIS* z4RzpaT5emk-K0@Bq~s^?KS8YAYj0ZHV%kSs@=4bQRJ`WL_g_cP+&)bXyqC{WvC@8N zzsQA}I_J~YH;!q4agv<-=UR^U+bT!HgZ2kH;Qg`0^qC(MQe&Jv^JtXAXG_0mShRe= z<+4v0*TfW!93u~`VQ>s6G&vd;WCB;~56>PhjybbntlafkuwzC*zi3#*GOp4$alJDy zXkbjSQWNE$*ZyHYniv!fll-IHcAJXFOv*V`zS@3@{aXHg5(Kc1>M-i|!f4McTFH8)wlAg-sr zT|8VoW?J#7&W0oJhkmxnU^yaip`y{@*tmf)ui_>;7fh-e*8N7L5c!$4leF61s$2(lX)Z-MA)Z8ty?f53# zVk0i~O;{^meAGCmSHNUv`*sDxsuYc~*fZg_sBtkmk7b&3kbZ4wma|5S!-Ec(+pw%# ze?yw}EYZ2H_vVn~{U%Gg$n`kifWqD}9TT}wQ^$Bjr+ly+GCOa#%wondb`n>~L%J~J zavv_&`*(Xbh}B2GYj3#LIG;U(xXPMV{7qtSm#0$mhwzV6syDZNcPu;m8ZP<{&0}yo zRfqTWdPnD3nJAz6=Co~M`8n)sxT>Ftn_!>(v@!a52>jzupX~OLchjU3ZaQf7?ObqQ z^p*hl2T*N`*hgJIC!HiNy^9BTR&{s;a$kVl6CigK$UQ||vV&gBT~=Sw_bli;0rWjB zaLvMdn1f`8K46EtV27_nZYb9mZ5&DV-3#{p0qlE*xSo6+n&43L&{?RdHe+qBTv)zS zFE++`tNODsJ|}Y781w%93GsK{Q`iVweU@z$#NYEG7ix;lP~Rm!7o(T&oF>0~G1cBD zXuouUxQczvg3ZD|j*N%@{qS;b zd*J>-(p7;A6^#y9gSspJUV|ErG1){&qH8^l#?ru;5~df*t3*AI-jmTjVQ&cfOD5@3g$B3H1l-yh7r&NI{2 z*^h#KZwWex^SDHtH8DjZ$2jdbH``mnxP41pim6O4k2`-%m>+Yk#yIEiotN1Y!5?lD z*OQ<1wlP0*o;lUVUIzT^4skurp|$0h|2nITx@8Lm|Gg`6g)ttx>V`D;DZE>0ci-xa zw3xmVxlmJm2P#;{P|D&jehqg55~=;3%Ph zt|Vb8!qS9g2+I-%65=inJaC5w9=Q7g58PRS2kx4{BS?Y&zY~}2fWIW7pEV(DO4y9B zIbjRJmV~Vc;~466tqI!@wk5=0rtrXDo$$b4l<>e`i}2{AfUYxP7s9TD-3YrA_8{y@ z7*E)Xus2~J!oGz42>TNbARI_Ih;T6B5W=B^!w82HCJ>HbXqHD3jv^dQIEJB4H827+BTOVTGc?Qi77@o0-w-0sB%H-ir<+YUhY;Vk;W3Z> zX_n^`!g2r(v%HXS5ksABG2s%zrG(1}mlLiaTuHc!a5do?!nK6!2-g#CAlyi}iEuOF z7Q(HBNrd@SKI~5cj8XGWJ~MPHq4Yw)R*bNvoqg`TQ&Wk zv_Cs1n6e9U#is(k6E}QGpmkHd^`;!erL6CIJB70OPNk_n4Xtalq?>XQmsUTiT08Ka zO8TUs)_(Wzn{o+UaVKs^+KJm|>wN2io>`>a#C0Dx)Pe8Bz1L}zwU=C2%0paF_T@Wq zN4`2>osc6)%1c}tH}-2Mw;A85wC?A0>)mD%Qa(4i$m3kTqjT=#^VViN>q_~FOHW%O`~ehb=(TVu;}>)s!FNks&?X5klNF1HWJ z4FI`CiA(y1Y4znhamRzc&p_W|#HDd#a=9J&PTXN+2VA4zoY(r9yL|_NecOY5aUG+L z51z(t4vbq17&lz&AXjTME|>emTJi^64{7Cc+amIvxZKZh&4gUCFS7%;1^3_Y$$xQO zgY zLwwi>@u56%X>O+Qej)OmxYZ%<{04ESf+$yrB|M&ugLu{z;#oyEF3RJD@5Jp6adI`p z$x6hfaTDS%--+83;%_O4zd@qDP*dgdxLz6J`VSD-D~sF^Etl`a{q|1fqxB$P1QXX& z+~GTM-#-mHvNU>YRFzD)&;*D2WKtDs>R5Q*iTgX`w=R(1su7pQLeQ7*#4QE+tt{wU zJrge9iCdEFP=mPSJAz!k6L%=sw<6fLrl7Bm`2)8b--+7?#%&vnTP=Z`d47YNGCNS; z*cfxabkA?lsIgh*`3)u`<9eDG?)gnmTy0$EedF^jl=54+$Q5!6pU3?mzb%CP7C~I< z8`Kn^#QyP}xR~GiKz@rPE{~I(i^zB4j)MF)3G!QQ;?lejbl~xf=eH;~xp;4GU%nG} zKE%mZ5GM`9{jd1j0phPwl*{57kL!FV?r@6hCgNt6FD6oclZZ>><}nZP{1#1I#lB*k zbkA=wf?TL*;sf7_TdD8Q)`ymO2?CPFcRcUJHUIX++Hi1pDVDg3%`#F^F1Ih=i92`o z1MBu?ouoR%)y5L{ow%zO+_5fP0iVnhbP(SL&!L^T`Tee1%O^CE>Iq!&E$Cy|iF*`& zMeR}jto3I0SgF3CgJLtTFW-rKu<|jhVRnSnK#;5G!0pC&;%+LOY905!ique$t7CRR zF8T!DiJMShmv!#S(o!ShX0{VIAZo3(QkQ&EV^J>D)H%d=;$Gb{&$?}}uhfLNRZ)+{O=&Y%kz!hU3---Lp_AqOqIiH)Fi(K|g zF4vjw#BE{DZ%zGifvJVag_@eP_)gq?74D_&{G+|8C2`$j30}i@;yO|`r{$bi#MFwo zT0g^az*3iX;%0wnOl#3E)fgvmJ@3SAuyOIxu2r)dTMJyMX!OMz)SdVz{+iJSP|a`n zw`$)$vJ*E$(bw}%+^}l1j(%1>tFfIR*Yi%?&BJS^%^#R*Y%g#<@5CKgYh~IE_?JZ; z1g__uxM%cN()PS=Z|X=~#m_wN#La#&tF`r$1*T4dT+cgko7jV_E#`l2>MU}h_Tf(4 z-T4|=e_49g)J5QW-id2l*4sMN@x;_s;6g<+7JMgejcke5Qp0?uZp5WIR^~iMw#L*_yL=7HNdQO%k|# zXJD5*-K@!v?wdx6IwbS^Bj%zVhjTAQS@l`dO``<4>KsBY-^p0+PGRfphU-oEE>(Tr z40P#$T)q=`X4aq5CiX}$jS=K}-ibS)+rhM*9l}gw1+M3vxcA$PNi#lrZ5&5jvM)Rq zsQH5L#66a)bXuNmNyhO4*Yi%?;1kJ51I~sUCkQ%t-if<@f2pI5jY)=y0@w3S+;`_n z9$8UmYt$r>3pG_=s9@cRe_}4245-P42en+j6ITMc5g>Ppz!i6<@SV8zL0=!xcPeo` ztqJ%}+(KZ7Ah5$Ufom4*%Xi{Bz`ljSzKNm^@HnTeY0-cAPTcQd+@fLJ%p%v7FYp?^ z6L%o^!yfR5>BLpm%Brs;m+!Qt{Tr!w)=dWEpmmp&UfPCJkAdDc#f!pFo)dZ!(34=<9doat03;o^T0)2v1sF2 zZHQ;{MJ{_LLmOb>J8{26~-D4{Djqk+ed1#3sH}m|qRFInyiv35KXk)$;cg5+u*4vObmkDys zuJt$aTp@F5ii3 zj=OHH1M9Q3nQ-||+^MC%v6g^!-#USt!Tbzui*or+-1fOITFtPYTu)rZAH?{;cjBJ- z^NjWUP+w_-z>O9Bm+!=Fxcj*EvHgi@qrmmN6L>L?y}nuCdftiKqTViRPk0X4LR?xSy5cX&<~wnB)?H&Q{7-w+R)OnzC+_~NGp!RA z7BM9WTyZCE2il3-^imtE@8DG9HjxW8^<4$uiM#oFHfw0Dtj6sgxX4!uG-~qO4&qY$ z6?Wn_QFr3TeARosW#=bwcYOkP_a|`od;<5gPvGt)Ei1_C!8O6>A{T0k zZP6c26)zTj`3n5&Ncp~DUS*4YA92Yig`Kzq7Cnug(`1@6OQl=J>reMN_KRGXT$Dfb zueg}qeJ43*4{2j+)3tK?0pgOr0(bt-1u=hQ8Ry(pXPIgK_PoAl`-*W-L!yj9s`F!_p)hp#d<64r-;kr zI&x80EH_7#lM|XYl#jiPiq6(%spGW3Rn{e(o3txhE;pu{Y#mxUdS~NY>0gOlmSgcf zIIhp`4vLd^|5{KkztunbT5&o33~{x-&UJPlx3igW{lCs8cevP5F1Kw;biV@?_2)z` z8)Gi_?16l8n_X?>Igz8Iuk~7KKQD5jrut6))0c9<{6UX$;Y)Bb+TzT;IJslPg7W-f*`t4X5R-n9xb)kM z%Xjb^w8Kb^|6U?4jhoANaE!TqD}sHmgMBZHT&Su4dU^|tTLl=mG#a-nq7H)1xId(W zKLmh3d?RvM-?-h-&z6Fp{Q!Pe4gBn?z=aCv@G<|rCU6z|A{VdWa_@lLQXu!bz*Xe( zvEcfm|7Hb!ZxC0pnYykSOkv}W|e|QD{aGSVVKSN!ye>(89tmJ3kfS=tVu67P_I}`x_4I%$+1^#U0eV8xl4m zY)sgMuqk0P!sdi62wM`iB8+2bmRl3HA#6+7j^Tgp#DzD@#P34bm9QIK-<_}rVNb$% z!d`^E3HuQCCG1DopKt)-K*B+Ug9(Qa4ka8$IGiwna0KB=%)-yLQ9f72DN#^&?tL0n9l2SEYyP(XAzjA% znp*CecI6UZv21&$-3(C zA;{$`gyl7+8UF@u=>f)?Re&2n+=1^c$+~?13UVhLIc0nS+fFo2ZxAMGErX|2Va5uEpZQ$l0?yR7BDY|jL334MBuQs&>ZimiYYaIk`PU22D zygkJ%1u%WN4vA^0rfk5ynQvyT3Bb)o+_<{wDdtW7V&5KKG97|{Pxx-kx>}LI%}v}w zzBg0M&-?_rC#pX;H3zOyf1uVcc9SI!af9@~r08mh+&^L0(fMqvYHbH@UgDb9 z_@?ScWD(@%8I@O>3fygdzp2#`xcP`%PoFE*obD@d+xwJ|N&ypi6DL~x&OG>2bHu?y1qb^jDCIdI^&EK`w1GgY?n`V6z zZjKVU^^Vk(8UnXr5naeA;1(k8tPAB*b?JsIs#oVcAm*f)gi``3{?$rpiJg1DKDTi=kv$vAE$iR;N9a+5#!{!%I#{h<_b zGxM`%XDcOd18!;J7W3f0C&_>RnOiIQC2-3Sw~dE+kwNpK<`YA51k8)F#Pu}arqO(B zyuN-i&bL6~dYZ=(G>>n!da~~lvTsSs zZ#9YQY23!U<+obI^(Mc86EZt^@-z4R7D`-i@>>{jJ|Cu;(Ce?rzt*2l;0wW8|)#!{Z09;C*`-=#Pt-<-18eOl$d?%d&qAc zD8DVE{00jp#?37L^898b?maK^n~AthJmj}Jl;7$@ej5XET_SE~dFV9cw{F0VCayR6 zErz&39`ak>LrUK43i%E5rcB&l3zkha8^nD4rM0Hi2=b=yAO6XxZ!B@+W<#FeBy#sz zsz_6Sn~|jCw>reV*aPx>S!Mme-{5q%m6uKfch9*z$(KQHUE=!WfOScRxYj6lskl@c z)+PG(g_H9_ZmCDym2G`fW4{Yb)vo(C2IiH_z;#wFo!kky^@)4$uFn@{y||8&pZQ8Z z0k>yhQ1WizHXv^D+v_RjUq$ZCUw$&RhV@yxk<7j+x+|tZ@A;m{zti6&>+by}tnEkrk==9$xD9U%O)d!eqB(Kz-8z)4i&dTj_!#%upJ99n z+^yrsB$owl3$E{gUdg&-CBJcf^FJQPzU`;GtmL|pwe6tz%%li;WKn-h zToHeLXX4)MbUsBFGMI6>+++R2<)rNq^1=vzi+{Mkz6)_{u7hWs%UuPzI}PD-&r1>V z`40Y;>+SsYU5Ohx1D+X1G#2Fc&K@pTc^@G+o#b!1H{M_0jkxydby9WtLIiHln|gUw zNTlq$)!$NflfS+@ac8aXm8uIVC~&Lq(#wT%YE+=n?rou z+Kti66<0*ciBJ43`yTr1dlI)#-leHJ^EP3=b!e!UTR0=-JlO**XZ!;6@x&e3XA{Id zBja-4nORCNH+vc>&!`+=xm`X$-;21v=J*V_y$)!{;>llOa+zGUGh`rgE? ze>w%Y!(pkU`g*Hx!(`v8wdGEo0xUV&2I%_`x7849sxG5MP2_SN8hjZhPpng0{%TNw zrB2@feP801dw2}`){Aku?7Ycga%`L0a-DGjmc=6i^!@#(h2M^n7EF6 zXx~wSegC}`Cbt9o7W&rL(g5r`gt#Lm9Jh{a+_-(4!?=9`Y1Zk+S_WU(4bO0s3LY9X$*DEO0C1ayvY&ua^&JM9Qld_*yRe2k3_r z_q=X8a32cXA*1xN->OKt_aI+O&PV?G1mZeE^BmTlc>zmYbqio|Vy_CILnFrJb{H2BF6Z`*lz;ly z$D*6$uOCI+J(K)kEV>BX!;#@~lW!vAq2KygUU%@JbOxne005!r9d%%{aE7u^R6SrNe7FQd@SB2 zhs(!1MaV&kK9(DA{q*CA8-FtgaB~Uq*XL5WeBBr!KO5*{dHlprKc2WJ>u-V_a8HQq z>mNhkDn!V`I{H|)-SE>-AnvLeIe;tXH#6jmegz`rdrf^TG3WgB6N#&{Wruz#d5GI# z6Xc<$kcWEK^RZlqJT!@O0hL1?WB2?v83>pQ%^JDf4jVykbCCN3ci8b9N9KtJmVezu~vKl8I0#NCyN|Nh#^ zpZV`h;#Sbi3$8Dp7YS4R*}RxV+$A37+g_M&bzr{vZ1cAig84R^xNIJ0g;#IKZ+5 z;@N!SYU3pL-)0aek3gJU3Hc4<|o!O#ElBY{MMP}H_qkjl5NL*EoETbRuOmMHq39eSsvm!0M|RsVZDElWg0Iis4Dhvl4(qeE#4UZY zH>?p0uzA6`eBIZezAsz%tt0N#Z|kP&UWxfF9@dj9VLdsutgodstS8qKH}HSuVV$bv zH!hd2Q&0cn!`7)Ah`TZu3q_K9;Mn{@qAi|H6>plEnO$PU~v_Baq)98 z&xfy1(PfDFjjz{Vt@W|Ag7x}l;_myl1LQ25kh5OVbHLH5KI}PQ3vsXds`-tN+dz1} zNPy>y9|l0*;Q3-Jai^FzevsezbIX|yKJ2+AiMUDAv%B&e_njB?JhTGx8$J(hBW}Ju z*%gD0nm~U067mo{%z6F%wnOByohdlqaO`SS2#ub$e5zb*p8v5~OKkR?pTOPq z3EbVEz}@o++|Rt=7Nx%J<=hv?U|x!A4QPVH>@0s~&SHE%{v2xT`S@+u54chKT+!>l zO_US2eI4Sv&7|MQxrg6FY!KxJH_RHdO97i;N3$q)R2bBq3RBBsa8q4J32 zrK!h8)zE`;Dcrs(HQe>pSGUF-+c#VeDz+~5de&Nca9V}iziv%;?(~$kF>9uek?WsK zN$u21uZKydaNn%>fNQ$cIA$j7{(QOpW~wjj{)C{QaLXKaak(7^Ejbch=FK$u)sc6p zcitNH7S4Tf%*Ew>gC;o4&ZS@PS&QQaFA_eG%em7Pxz6bOvqM2H`z9_MV-Nb)0DWg= zo$NeWuVC0a_-^bGF4uz{%wUJL)5kayr}hZz+)B^BiOb}Auy0MUZ~DIB&e9j=hJBN@ z7W*bH<6<}1p+3hJf^q9PbEtDLjGJ>*4fai3lKX)_+yQ@RV@q%jOxT<%U#!KxiOabC z>mGC;x6$BdS9^_jIxe0_1wUio#AVz!D_mSY7CFIxcYQh48FA^i)YnCoZ{jj;nZqtF zx9@kMxuQ3Io9GM=&S5FFP5CA+<7P77u**1Z#{e0Z*#Q4g?XbhS29{1{XQa)?j9e#i z(^`%S)%_~IM|@LenjQX=cIS|8#zR-&-CzcBQ{VRt)0O%I+*y_TeC8fi89+?$~x zKOZ&eza;LmUvGv5&Kw+uTyBS(<)2HZeuVEd*EkRozSpEbPTU-FA$?%jY;b2)Zlm+% zqwznhpK<18NcdWl{seKSn#=1mF3tEqm7IHU6jc_7XNe#W5rnM46%S^4w++Xexudut!N>bHvNtqOiN`+kw!`OWhq|XH zHK=xY2ibL#W|qWSoc1;C@EzK>c=oL&t=zuvBFn&*ZwKd%{EEjd{6W<)GtTIRC$|khjO*`v$ksJaY4m@$qj>zTeIQ8MT`nvKZb<= z7)<^BiRY6z)6c`WeREuYPvH8ylk4wC$lCg?59;qM=e(KS zgX~7jcyQO>O0K_qk+qGpIjFyHaQ&^~`uj1mA>%hUnCtJ4Tz~f=o8fs;F~@l>V!qo* z=XXi2g6nS&uD_ok%fJ>qHI!)jo?k- z&EQ;c9(W6QD>xs#4O{>&1Q&s6a4~p0xCFcdyc4Vk?*i`z?*Z=x{{h|y{u8_(d;nYu zJ_s%Y9|9i+9|0c)mxC+7$H0}~zre@ARp1lgli+G_4fqte7F-9e2cHI?0WBh~Gqv>R z9qMmRy{&!>cVg;VZ4saXL|n3oN&zA+r7faTfQU;15tjraE=3WQx}qJTh)Ug%jUp;_ zM>dM6)B{E{>JxEE zAmUOKQR!&3Lzn>N6LCY2*C*nJwu4W^r7#i9C*o3AzxhO5>v#wdaYM(MPsAmgXcr*j zl0d{I+k6WUamhB114LXBh`3~{I{_jt2}E4737r8VF4;uU01=l2BChp(5g_7Hm@w-T zaU-4IPQ!c)+pkZ=wH|MPh-*E+1&FxT_6-nmt^F1t;zl~Z4M#iJ##w-fOHs~m>N-LF zez47p01=l2A}$F;Tx)#@5OGN$;#%ujfQZXNN5_RG0U~Z_{q>2sBoJ{)AmUQkdB`W? zMmoQ#>pC?aY$EOsEHoL$BJSk8h)XsRw``-cFsA)bXT8v*0{gXzxW_jSNiATx_KT(6 zGAnt%>KalVgImNkH+vp^%UQ@X@J(l-NhPv25x3>jV^aNDn7y~kBjS=x#J!}vS85Sw z4;FevTyl%J<`{Yw7Nq{q*>7VfXV&ILT(XI{l~;a|tY*1(MQd^9U|z%}n~1x7|Mp}f zXV;G|%aroXRdsEw+QBB`Ha*gi?9Mm3KPwoc7n-Q+XO(q}xaN3AOn5jsfwTRZsxukh zue!!oS(}KvyiaX%DQ9;Nn5-9?j6>Ef;+h*yrG1mhO`ILH>ngX1OEwX=wWx<)IM-#( z?2KACr>^JKF}Ousv)^;-H)|31jPV{3msVRu+(GMa(IRfkD;^P-Y$EQK^N-LX?utf_ zh)Y%xchx+;6_U<1t@Vhw6tjuAU(My)C+S?>s~!>8dVUKKaXne{fY>i8se2i!%>*JY z2}E2Hh`1yWaY-QJl0d{Ifrv{25tjraE(t_j5{S5TUvv?d1R^d8L|hVxxFis9Ng(2q zK*S}1h)YpKC3SC3%{PIFO9By>+`^WreE}ja2}E3S3uZ z1R^d8L|hVxxb%!mkTkVAK*S}1h)V(ymjog%*#y)85tjraE(t{3Nar_ouUXAEfrv{2 z5!c!d0U|C5L|hVxxFis9Ng(2qK*S}1h)V(y*O|xBL|hVxxFis9Ng(2S>ZF;+0U|C5 zL|ji@{~ZyR1R^d8MBGT{H}&j9%{PIFO9By>1R^d8L|hVxxFis9Ng(2qK*S}1h)V(y zmjog%2}E2Hh`1yWaY-QJl0d{Ifrv{25tjraZlv>@dKReW8$)d#5qAhgT$WYK)Azrg zRL={eX4Nyrs9E*gF=|#ln~a)$HY7WgzuN+qjMaBr%-`)flMN9A2fSO~Q$62&-efHz z?&>q27&SDtD7UKn)g=#}p3J^rvKA4ys;R8J)2s7yzZ~ouAGy3V`=ZIZL|pS5{Nh;; zmH&L|O}V#5OpG79HIaSEWGy0Y{~tD#7w*3<_vPpH@rjAz?8_$0bhiAnTfflx3I}xi zT13&)Au0`aL|p!>MaWtN)P*cStzZFFiC{`VZ7^Aj*g6Da>j4(Ql-Sy6vMv$Vw8H`j zTc5HBwugnStjUIpxJ9bp{%x|Z{hIqxN-$#)jCwgDuKts_x*aUXTMTh{vm=7(KZ&ce zmUb{g^4%QyX) z#aNL1ugQkYH;!nZpvh#_8+yyPLx6}&0uh%4A}$F;ToQ=5WD^+!L|hVxxFis9Ng(2q zK*TlY7Vf!xzo8#SLRTYwB+b^>-JtHWAlff7_9Di@2uEjF4Q<^;ZeWyOFht zxMrcrNsfq{_y}2BzxnI$9%OAIuDkxSh@04ptb3f9YrQ(u-~TuwZsKEPZR6KpfA=Bl f7IDpZXoH|WjqC4$)yc#s$TG0y=bQ6JUXuS6r8pV5 literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testentities/models/testentities_sam.png b/games/devtest/mods/testentities/models/testentities_sam.png new file mode 100644 index 0000000000000000000000000000000000000000..05021781e03fbb71cb309d5ac233c6c90f332fda GIT binary patch literal 2754 zcmV;z3O)6SP)2uX*6~`Is8-X;*&E0SAO>&cvke%!y3xOmA1X`so?O2^U+G=e9kx~mtSV|M1>{}P0 z6tr}4X|WZxTJ;a`g>NiW*4CH)5y$g6w}*Qt8RupuDVh1s@A;i`o`-wBXM29k$@kY+ zT_PRjMY1?qD2r2t(os7`&f#QNIw0MOPIVqq za1wcI%A7}z-ffUgi-4)m>>tkJ+(1o8hIKux4lh^d-C3N67}m(qk7R9TP5{mkNiv~d zqu^LlRbo!w{QYUUaruZ`d*=oD_|4t&@ugjc>z5D9tv|jpV*+rFNRkO(X-VA0Xj9Cb zobyHh5q%uR>B%7djez%$$@O;+$kjK;4FCS^e!20xqjKvHFVFY~lKMD`)045HF?J6K zNKGZ6SEEk`7y(yKYqXCz0UG_E%fH^(i3|c}+5^adDFm!+ipywY?A{PSjkhas7RPx) z2v7P08F1}a6Y|NgC*<1Od*$j|d$b((%FXwWPbq=?r7-nxpvGz)XGwdW5WqL3Lz+Iy@oQ-#Y|IeJz25a`o-;Ss@^&$$6t=63`cDj9)wfbbbf`IGhV6 z!KWXcmm43PG~E2)6d?5tw`YL>IzI&9EMz!%Up5|8p&r+nY%QSVVXk@g+{SR+G+4YurIFK2KT?|wGG)(K$ka%!BY*pKbXLnPL4Qb7otX5P%H$yXk0hev9LF=aJ?@LzHoDq#@hw zeG(u;hYhx#8JxjcoS8WrLJUrTznjkHJfNw4`j_)^`%h;)JxOtXD0S`xIFO;k#_ie5 z8JxwL4$lrR70)tsM9h$TZT0lz^1~1Pf8~n~8@G2kXZg7}=}px82Ww>Lyvv&d|9tl( zPUJeQmz)#AUuWlkUB(&_x?DooYiD@Pdv@`Js2sSC6!w~&wT|vJ&)J>{5S0sLMgY<9 zruErhU!M|foV@erv;OWthHgq$aE3Qk?+KKMmyQD&xuKnY>R&;7gnd5ncjJ1dl#zF9DzH{McEY z>72>g{uRkY@aVHfW(4@BEjK!!-`P3-Do>5HkwC-&Yh<}Lx!^22le0DebBk|y#H@USFm zzT=Sx)5?JMT`{6fLsVE(g$T=vt``#0_;lFTJ$sVUH<6P5{TX!ZNU$&O`H;9&NgI8= zN`_CT-Fbh`oPcQMH*nrah*v)%!C;WcTLzSrl;r&fM$T4B{gWZmpYHA+ zo5NE3eZ6!&6OsBKXXJHCM(@59WnuC~PXu`yNiACw1eucyG+2 zT=}q$zim-<{1{-33>`Muvd8xJ9!;8j;8dA(?ADv#p;GDDr#M(DUC$?^=fzTK*rZPH z(DTQXz}-=Mb{|mUp3R)oxH%+?$0E|YJu1CNN`*eexq~Mw@)JN57X%tI&X<49(!aF! zyEH)00waLlkXZO_D~-(hQOL0<)cznSjXw$5vteV1Xqyww>mz_QGIY7N>?NXF|8a}l zfYx{SZgu{JQp$t~T4ZY;4_JnD?o3z-4V_9;LY4_Nj|HUesi4&TFl5uAWph;e52Q@L z@?3R(0*I!kH<5P&a1?SNg=i;g9z||8j7l0Lqq60>s71A7Ph3XMr=?k=OEjA|M1_tG zSR+G+4YurIFA<|T4!&Gw5nFMwQhIf~^&L-|UFUe52;2VEmln!HSL$W$TeY(MOa&3Q z3~1AoA3B$ofulMaPo!)_uKi67cKHb)jd2tQW7_oM8fBcrQOJP+);JF!3VYTNK>g9Z zd!AQE#uBpV$r9?4PED5wtdXI^23z*9*W_*6tvPDVCv6(^?9J#~l^`;u{^<~7)FQh4 zSehq#GKmZzGZ?4Ht+(_}B;9U01gs&YamYc0y~h1Qp+cnCRqlh=JO`#!CUPc8vOpD05N8Niy+=z5$-?zctinwd`2h%QlW z-4gX^0oKUSVS_Du*vpNOu5FpJ;!LGQa`_3nP0}N{a&!H*i|t-m zcubb;FLk@D{pm7UyfupRQ@%*~;KD(lGF-HB3BYmmpZ)FPGzdsRK(@wXmFooryr^G;Xx0dc=tuvz%!14p<{Y=NZ8s_FBqz?n=1apWGL)C)xm~Cx3b) z=Z?WuJC^`H$^AV)0VV2WFuBs4b`%s8$btn6jDV8Fu-*;UxK7vf1tqOQvmmw7qB!(g z+M{Rn+&Q5WL7nCuuttW?Bg`K5c9H@6repva!~MZ;lamQhCoib(q<_WUmEXGZ5})PM zCx8!~qM{L|M~~n6 z0Wt`19Wt_lHDJx&CGq>DKQUJZllRF;`In?OK37^pbEPXfS3WtM0IZRr!vFxgk;~+!m1FZS~2?+7e@Vo^44= Date: Sun, 11 Aug 2024 21:19:14 +0300 Subject: [PATCH 37/59] Improve fs::PathStartsWith to handle empty strings (#14877) `""` does not refer to a proper path, and `fs::PathStartsWith(path, "")` should just return `false`. This is also the case in libraries in other languages where I looked, seems to be common. The new behavior: * check early, if `prefix` is empty - return if path is empty or not, * no special processing for when `path` is empty, the function meets characters in `prefix` and returns false anyway. --- src/filesys.cpp | 11 +++++++++++ src/unittest/test_filesys.cpp | 23 ++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/filesys.cpp b/src/filesys.cpp index 733a3b203..4287c8b05 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -697,32 +697,43 @@ bool MoveDir(const std::string &source, const std::string &target) bool PathStartsWith(const std::string &path, const std::string &prefix) { + if (prefix.empty()) + return path.empty(); size_t pathsize = path.size(); size_t pathpos = 0; size_t prefixsize = prefix.size(); size_t prefixpos = 0; for(;;){ + // Test if current characters at path and prefix are delimiter OR EOS bool delim1 = pathpos == pathsize || IsDirDelimiter(path[pathpos]); bool delim2 = prefixpos == prefixsize || IsDirDelimiter(prefix[prefixpos]); + // Return false if it's delimiter/EOS in one path but not in the other if(delim1 != delim2) return false; if(delim1){ + // Skip consequent delimiters in path, in prefix while(pathpos < pathsize && IsDirDelimiter(path[pathpos])) ++pathpos; while(prefixpos < prefixsize && IsDirDelimiter(prefix[prefixpos])) ++prefixpos; + // Return true if prefix has ended (at delimiter/EOS) if(prefixpos == prefixsize) return true; + // Return false if path has ended (at delimiter/EOS) + // while prefix did not. if(pathpos == pathsize) return false; } else{ + // Skip pairwise-equal characters in path and prefix until + // delimiter/EOS in path or prefix. + // Return false if differing characters are met. size_t len = 0; do{ char pathchar = path[pathpos+len]; diff --git a/src/unittest/test_filesys.cpp b/src/unittest/test_filesys.cpp index 8fc9db3d8..fd25d2de9 100644 --- a/src/unittest/test_filesys.cpp +++ b/src/unittest/test_filesys.cpp @@ -113,6 +113,7 @@ void TestFileSys::testPathStartsWith() }; /* expected fs::PathStartsWith results + (row for every path, column for every prefix) 0 = returns false 1 = returns true 2 = returns false on windows, true elsewhere @@ -122,17 +123,17 @@ void TestFileSys::testPathStartsWith() */ int expected_results[numpaths][numpaths] = { {1,2,0,0,0,0,0,0,0,0,0,0}, - {1,1,0,0,0,0,0,0,0,0,0,0}, - {1,1,1,0,0,0,0,0,0,0,0,0}, - {1,1,1,1,0,0,0,0,0,0,0,0}, - {1,1,0,0,1,0,0,0,0,0,0,0}, - {1,1,0,0,0,1,0,0,1,1,0,0}, - {1,1,0,0,0,0,1,4,1,0,0,0}, - {1,1,0,0,0,0,4,1,4,0,0,0}, - {1,1,0,0,0,0,0,0,1,0,0,0}, - {1,1,0,0,0,0,0,0,1,1,0,0}, - {1,1,0,0,0,0,0,0,0,0,1,0}, - {1,1,0,0,0,0,0,0,0,0,0,1}, + {0,1,0,0,0,0,0,0,0,0,0,0}, + {0,1,1,0,0,0,0,0,0,0,0,0}, + {0,1,1,1,0,0,0,0,0,0,0,0}, + {0,1,0,0,1,0,0,0,0,0,0,0}, + {0,1,0,0,0,1,0,0,1,1,0,0}, + {0,1,0,0,0,0,1,4,1,0,0,0}, + {0,1,0,0,0,0,4,1,4,0,0,0}, + {0,1,0,0,0,0,0,0,1,0,0,0}, + {0,1,0,0,0,0,0,0,1,1,0,0}, + {0,1,0,0,0,0,0,0,0,0,1,0}, + {0,1,0,0,0,0,0,0,0,0,0,1}, }; for (int i = 0; i < numpaths; i++) From f04cdc00a69e96d7e6253a70c8ff8e0862856acf Mon Sep 17 00:00:00 2001 From: 1F616EMO~nya Date: Mon, 12 Aug 2024 02:19:53 +0800 Subject: [PATCH 38/59] Optionally hide player names on the serverlist (#14820) This commit adds a setting to anonymize player names when sending data to the server list. --- builtin/settingtypes.txt | 3 +++ src/defaultsettings.cpp | 1 + src/server/serverlist.cpp | 7 ++++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 87c7444da..eb7eda0d7 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -825,6 +825,9 @@ server_url (Server URL) string https://minetest.net # Automatically report to the serverlist. server_announce (Announce server) bool false +# Send names of online players to the serverlist. If disabled only the player count is revealed. +server_announce_send_players (Send player names to the server list) bool true + # Announce to this serverlist. serverlist_url (Serverlist URL) string servers.minetest.net diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 9c2ade975..5fce1b0a8 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -535,6 +535,7 @@ void set_default_settings() settings->setDefault("server_address", ""); settings->setDefault("server_name", ""); settings->setDefault("server_description", ""); + settings->setDefault("server_announce_send_players", "true"); settings->setDefault("enable_console", "false"); settings->setDefault("display_density_factor", "1"); diff --git a/src/server/serverlist.cpp b/src/server/serverlist.cpp index e702ba73d..0586a1979 100644 --- a/src/server/serverlist.cpp +++ b/src/server/serverlist.cpp @@ -65,9 +65,10 @@ void sendAnnounce(AnnounceAction action, server["game_time"] = game_time; server["clients"] = (int) clients_names.size(); server["clients_max"] = g_settings->getU16("max_users"); - server["clients_list"] = Json::Value(Json::arrayValue); - for (const std::string &clients_name : clients_names) { - server["clients_list"].append(clients_name); + if (g_settings->getBool("server_announce_send_players")) { + server["clients_list"] = Json::Value(Json::arrayValue); + for (const std::string &clients_name : clients_names) + server["clients_list"].append(clients_name); } if (!gameid.empty()) server["gameid"] = gameid; From e236ad83483ec28eaff084393d88108fae92d9c3 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 11 Aug 2024 20:21:12 +0200 Subject: [PATCH 39/59] Lua API: fix OOB array access in find_nodes_near (#14948) --- src/script/lua_api/l_env.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 2b3d15bea..f5ed2804c 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -970,8 +970,8 @@ int ModApiEnvBase::findNodesInArea(lua_State *L, const NodeDefManager *ndef, }); // last filter table is at top of stack - u32 i = filter.size() - 1; - do { + u32 i = filter.size(); + while (i --> 0) { if (idx[i] == 0) { // No such node found -> drop the empty table lua_pop(L, 1); @@ -979,7 +979,7 @@ int ModApiEnvBase::findNodesInArea(lua_State *L, const NodeDefManager *ndef, // This node was found -> put table into the return table lua_setfield(L, base, ndef->get(filter[i]).name.c_str()); } - } while (i-- != 0); + } assert(lua_gettop(L) == base); return 1; From c7642c3c6c702a3265fc7228acc3c46c43b189e7 Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Mon, 12 Aug 2024 02:49:14 +0200 Subject: [PATCH 40/59] Docs: Explain how to create and remove inventory lists (#14927) --- doc/lua_api.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/lua_api.md b/doc/lua_api.md index 271022bd8..fd21fb3f1 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -3658,6 +3658,9 @@ Player Inventory lists * `hand`: list containing an override for the empty hand * Is not created automatically, use `InvRef:set_size` * Is only used to enhance the empty hand's tool capabilities + +Custom lists can be added and deleted with `InvRef:set_size(name, size)` like +any other inventory. ItemStack transaction order --------------------------- @@ -7493,6 +7496,8 @@ An `InvRef` is a reference to an inventory. * `is_empty(listname)`: return `true` if list is empty * `get_size(listname)`: get size of a list * `set_size(listname, size)`: set size of a list + * If `listname` is not known, a new list will be created + * Setting `size` to 0 deletes a list * returns `false` on error (e.g. invalid `listname` or `size`) * `get_width(listname)`: get width of a list * `set_width(listname, width)`: set width of list; currently used for crafting From a0e33ba9ea2ee4a00f671ca8877d84c837a18fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Mon, 12 Aug 2024 11:41:27 +0200 Subject: [PATCH 41/59] dev: add shell.nix (#14823) This permit to have reproducible development environment across OS (Linuxes, but maybe Mac OSX too). It makes minetest compilable directly in a nix-shell with Nix/Lix but also on NixOS --- .gitignore | 4 ++++ shell.nix | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 shell.nix diff --git a/.gitignore b/.gitignore index 047a24c70..8ff758720 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,10 @@ build/.cmake/ *.zsync appimage-build AppDir +# Direnv +.direnv/ +# Nix +/result ## Files related to Minetest development cycle /*.patch diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..ca412c38c --- /dev/null +++ b/shell.nix @@ -0,0 +1,25 @@ +{ pkgs ? import {}, }: + +pkgs.mkShell { + LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive"; + env.LANG = "C.UTF-8"; + env.LC_ALL = "C.UTF-8"; + + packages = [ + pkgs.gcc + pkgs.cmake + pkgs.zlib + pkgs.zstd + pkgs.libjpeg + pkgs.libpng + pkgs.libGL + pkgs.SDL2 + pkgs.openal + pkgs.curl + pkgs.libvorbis + pkgs.libogg + pkgs.gettext + pkgs.freetype + pkgs.sqlite + ]; +} From 85e717fcd1081278fc0c91cc4bba79e4e59d7aca Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 12 Aug 2024 15:32:18 +0200 Subject: [PATCH 42/59] Rework object attachment handling to fix bugs (#14825) --- doc/lua_api.md | 11 +- games/devtest/mods/unittests/entity.lua | 30 ++++ src/activeobject.h | 28 ++-- src/client/clientenvironment.cpp | 2 +- src/client/clientobject.h | 4 +- src/client/content_cao.cpp | 30 ++-- src/client/content_cao.h | 15 +- src/script/lua_api/l_object.cpp | 20 +-- src/server.cpp | 3 - src/server/clientiface.cpp | 20 +-- src/server/luaentity_sao.cpp | 4 +- src/server/luaentity_sao.h | 10 +- src/server/player_sao.cpp | 5 +- src/server/serveractiveobject.h | 8 +- src/server/unit_sao.cpp | 177 ++++++++++++++---------- src/server/unit_sao.h | 39 ++++-- src/util/numeric.h | 11 ++ 17 files changed, 245 insertions(+), 172 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index fd21fb3f1..e5435e273 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -5100,12 +5100,15 @@ Callbacks: to the object (not necessarily an actual rightclick) * `clicker`: an `ObjectRef` (may or may not be a player) * `on_attach_child(self, child)` - * `child`: an `ObjectRef` of the child that attaches + * Called after another object is attached to this object. + * `child`: an `ObjectRef` of the child * `on_detach_child(self, child)` - * `child`: an `ObjectRef` of the child that detaches + * Called after another object has detached from this object. + * `child`: an `ObjectRef` of the child * `on_detach(self, parent)` - * `parent`: an `ObjectRef` (can be `nil`) from where it got detached - * This happens before the parent object is removed from the world + * Called after detaching from another object. + * `parent`: an `ObjectRef` from where it got detached + * Note: this is also called before removal from the world. * `get_staticdata(self)` * Should return a string that will be passed to `on_activate` when the object is instantiated the next time. diff --git a/games/devtest/mods/unittests/entity.lua b/games/devtest/mods/unittests/entity.lua index 38d026663..8e8bd1c48 100644 --- a/games/devtest/mods/unittests/entity.lua +++ b/games/devtest/mods/unittests/entity.lua @@ -40,12 +40,36 @@ core.register_entity("unittests:callbacks", { end, on_attach_child = function(self, child) insert_log("on_attach_child(%s)", objref_str(self, child)) + assert(child:get_attach() == self.object) + local ok = false + for _, obj in ipairs(self.object:get_children()) do + if obj == child then + ok = true + end + end + assert(ok, "Child not found in get_children") end, on_detach_child = function(self, child) insert_log("on_detach_child(%s)", objref_str(self, child)) + assert(child:get_attach() == nil) + local ok = true + for _, obj in ipairs(self.object:get_children()) do + if obj == child then + ok = false + end + end + assert(ok, "Former child found in get_children") end, on_detach = function(self, parent) insert_log("on_detach(%s)", objref_str(self, parent)) + assert(self.object:get_attach() == nil) + local ok = true + for _, obj in ipairs(parent:get_children()) do + if obj == self.object then + ok = false + end + end + assert(ok, "Former child found in get_children") end, get_staticdata = function(self) assert(false) @@ -118,19 +142,25 @@ local function test_entity_attach(player, pos) -- attach player to entity player:set_attach(obj) check_log({"on_attach_child(player)"}) + assert(player:get_attach() == obj) player:set_detach() check_log({"on_detach_child(player)"}) + assert(player:get_attach() == nil) -- attach entity to player obj:set_attach(player) check_log({}) + assert(obj:get_attach() == player) obj:set_detach() check_log({"on_detach(player)"}) + assert(obj:get_attach() == nil) obj:remove() end unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true}) +--------- + core.register_entity("unittests:dummy", { initial_properties = { hp_max = 1, diff --git a/src/activeobject.h b/src/activeobject.h index 52f997fdf..989b48e91 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -152,17 +152,19 @@ typedef std::unordered_map BoneOverrideMap; class ActiveObject { public: - ActiveObject(u16 id): + typedef u16 object_t; + + ActiveObject(object_t id): m_id(id) { } - u16 getId() const + object_t getId() const { return m_id; } - void setId(u16 id) + void setId(object_t id) { m_id = id; } @@ -193,14 +195,22 @@ public: virtual bool collideWithObjects() const = 0; - virtual void setAttachment(int parent_id, const std::string &bone, v3f position, + virtual void setAttachment(object_t parent_id, const std::string &bone, v3f position, v3f rotation, bool force_visible) {} - virtual void getAttachment(int *parent_id, std::string *bone, v3f *position, + virtual void getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const {} + // Detach all children virtual void clearChildAttachments() {} - virtual void clearParentAttachment() {} - virtual void addAttachmentChild(int child_id) {} - virtual void removeAttachmentChild(int child_id) {} + // Detach from parent + virtual void clearParentAttachment() + { + setAttachment(0, "", v3f(), v3f(), false); + } + + // To be be called from setAttachment() and descendants, but not manually! + virtual void addAttachmentChild(object_t child_id) {} + virtual void removeAttachmentChild(object_t child_id) {} + protected: - u16 m_id; // 0 is invalid, "no id" + object_t m_id; // 0 is invalid, "no id" }; diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 7e1676ffe..f1ec14d3b 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -368,7 +368,7 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type, void ClientEnvironment::removeActiveObject(u16 id) { // Get current attachment childs to detach them visually - std::unordered_set attachment_childs; + std::unordered_set attachment_childs; if (auto *obj = getActiveObject(id)) attachment_childs = obj->getAttachmentChildIds(); diff --git a/src/client/clientobject.h b/src/client/clientobject.h index f63681313..f02815e04 100644 --- a/src/client/clientobject.h +++ b/src/client/clientobject.h @@ -57,8 +57,8 @@ public: virtual bool isLocalPlayer() const { return false; } virtual ClientActiveObject *getParent() const { return nullptr; }; - virtual const std::unordered_set &getAttachmentChildIds() const - { static std::unordered_set rv; return rv; } + virtual const std::unordered_set &getAttachmentChildIds() const + { static std::unordered_set rv; return rv; } virtual void updateAttachments() {}; virtual bool doShowSelectionBox() { return true; } diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 0044cc16e..d24dc8433 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -465,7 +465,7 @@ scene::IAnimatedMeshSceneNode *GenericCAO::getAnimatedMeshSceneNode() const void GenericCAO::setChildrenVisible(bool toset) { - for (u16 cao_id : m_attachment_child_ids) { + for (object_t cao_id : m_attachment_child_ids) { GenericCAO *obj = m_env->getGenericCAO(cao_id); if (obj) { // Check if the entity is forced to appear in first person. @@ -474,10 +474,10 @@ void GenericCAO::setChildrenVisible(bool toset) } } -void GenericCAO::setAttachment(int parent_id, const std::string &bone, +void GenericCAO::setAttachment(object_t parent_id, const std::string &bone, v3f position, v3f rotation, bool force_visible) { - int old_parent = m_attachment_parent_id; + const auto old_parent = m_attachment_parent_id; m_attachment_parent_id = parent_id; m_attachment_bone = bone; m_attachment_position = position; @@ -509,7 +509,7 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone, } } -void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position, +void GenericCAO::getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; @@ -523,29 +523,21 @@ void GenericCAO::clearChildAttachments() { // Cannot use for-loop here: setAttachment() modifies 'm_attachment_child_ids'! while (!m_attachment_child_ids.empty()) { - int child_id = *m_attachment_child_ids.begin(); + const auto child_id = *m_attachment_child_ids.begin(); - if (ClientActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(), v3f(), false); - - removeAttachmentChild(child_id); + if (auto *child = m_env->getActiveObject(child_id)) + child->clearParentAttachment(); + else + removeAttachmentChild(child_id); } } -void GenericCAO::clearParentAttachment() -{ - if (m_attachment_parent_id) - setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); - else - setAttachment(0, "", v3f(), v3f(), false); -} - -void GenericCAO::addAttachmentChild(int child_id) +void GenericCAO::addAttachmentChild(object_t child_id) { m_attachment_child_ids.insert(child_id); } -void GenericCAO::removeAttachmentChild(int child_id) +void GenericCAO::removeAttachmentChild(object_t child_id) { m_attachment_child_ids.erase(child_id); } diff --git a/src/client/content_cao.h b/src/client/content_cao.h index 7fdcb73da..3fdf01bc7 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -106,8 +106,8 @@ private: // stores position and rotation for each bone name BoneOverrideMap m_bone_override; - int m_attachment_parent_id = 0; - std::unordered_set m_attachment_child_ids; + object_t m_attachment_parent_id = 0; + std::unordered_set m_attachment_child_ids; std::string m_attachment_bone = ""; v3f m_attachment_position; v3f m_attachment_rotation; @@ -226,16 +226,15 @@ public: } void setChildrenVisible(bool toset); - void setAttachment(int parent_id, const std::string &bone, v3f position, + void setAttachment(object_t parent_id, const std::string &bone, v3f position, v3f rotation, bool force_visible) override; - void getAttachment(int *parent_id, std::string *bone, v3f *position, + void getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const override; void clearChildAttachments() override; - void clearParentAttachment() override; - void addAttachmentChild(int child_id) override; - void removeAttachmentChild(int child_id) override; + void addAttachmentChild(object_t child_id) override; + void removeAttachmentChild(object_t child_id) override; ClientActiveObject *getParent() const override; - const std::unordered_set &getAttachmentChildIds() const override + const std::unordered_set &getAttachmentChildIds() const override { return m_attachment_child_ids; } void updateAttachments() override; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 6baf146e5..f3aa816a5 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -37,11 +37,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/serverinventorymgr.h" #include "server/unit_sao.h" +using object_t = ServerActiveObject::object_t; + /* ObjectRef */ - ServerActiveObject* ObjectRef::getobject(ObjectRef *ref) { ServerActiveObject *sao = ref->m_object; @@ -99,9 +100,6 @@ int ObjectRef::l_remove(lua_State *L) if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; - sao->clearChildAttachments(); - sao->clearParentAttachment(); - verbosestream << "ObjectRef::l_remove(): id=" << sao->getId() << std::endl; sao->markForRemoval(); return 0; @@ -724,25 +722,17 @@ int ObjectRef::l_set_attach(lua_State *L) if (sao == parent) throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed."); - int parent_id; std::string bone; v3f position; v3f rotation; bool force_visible; - sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); - if (parent_id) { - ServerActiveObject *old_parent = env->getActiveObject(parent_id); - old_parent->removeAttachmentChild(sao->getId()); - } - bone = readParam(L, 3, ""); position = readParam(L, 4, v3f(0, 0, 0)); rotation = readParam(L, 5, v3f(0, 0, 0)); force_visible = readParam(L, 6, false); sao->setAttachment(parent->getId(), bone, position, rotation, force_visible); - parent->addAttachmentChild(sao->getId()); return 0; } @@ -755,7 +745,7 @@ int ObjectRef::l_get_attach(lua_State *L) if (sao == nullptr) return 0; - int parent_id; + object_t parent_id; std::string bone; v3f position; v3f rotation; @@ -783,11 +773,11 @@ int ObjectRef::l_get_children(lua_State *L) if (sao == nullptr) return 0; - const std::unordered_set child_ids = sao->getAttachmentChildIds(); + const auto &child_ids = sao->getAttachmentChildIds(); int i = 0; lua_createtable(L, child_ids.size(), 0); - for (const int id : child_ids) { + for (const object_t id : child_ids) { ServerActiveObject *child = env->getActiveObject(id); getScriptApiBase(L)->objectrefGetOrCreate(L, child); lua_rawseti(L, -2, ++i); diff --git a/src/server.cpp b/src/server.cpp index 6e42b22a0..86966d0ab 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2926,9 +2926,6 @@ void Server::DeleteClient(session_t peer_id, ClientDeletionReason reason) PlayerSAO *playersao = player->getPlayerSAO(); assert(playersao); - playersao->clearChildAttachments(); - playersao->clearParentAttachment(); - // inform connected clients const std::string &player_name = player->getName(); NetworkPacket notice(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT); diff --git a/src/server/clientiface.cpp b/src/server/clientiface.cpp index 451e74407..e5c07b3d8 100644 --- a/src/server/clientiface.cpp +++ b/src/server/clientiface.cpp @@ -85,23 +85,13 @@ void RemoteClient::ResendBlockIfOnWire(v3s16 p) } } -LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env) +static LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env) { - if (!sao->isAttached()) - return nullptr; + ServerActiveObject *ao = sao; + while (ao->getParent()) + ao = ao->getParent(); - int id; - std::string bone; - v3f dummy; - bool force_visible; - sao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); - ServerActiveObject *ao = env->getActiveObject(id); - while (id && ao) { - ao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); - if (id) - ao = env->getActiveObject(id); - } - return dynamic_cast(ao); + return ao == sao ? nullptr : dynamic_cast(ao); } void RemoteClient::GetNextBlocks ( diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index 020f13fa5..e932f418b 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -147,7 +147,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) } // If attached, check that our parent is still there. If it isn't, detach. - if (m_attachment_parent_id && !isAttached()) { + if (m_attachment_parent_id && !getParent()) { // This is handled when objects are removed from the map warningstream << "LuaEntitySAO::step() " << m_init_name << " at " << m_last_sent_position << ", id=" << m_id << " is attached to nonexistent parent. This is a bug." << std::endl; @@ -415,8 +415,6 @@ void LuaEntitySAO::setHP(s32 hp, const PlayerHPChangeReason &reason) sendPunchCommand(); if (m_hp == 0 && !isGone()) { - clearParentAttachment(); - clearChildAttachments(); if (m_registered) { ServerActiveObject *killer = nullptr; if (reason.type == PlayerHPChangeReason::PLAYER_PUNCH) diff --git a/src/server/luaentity_sao.h b/src/server/luaentity_sao.h index 2080df9c3..6bc7a8409 100644 --- a/src/server/luaentity_sao.h +++ b/src/server/luaentity_sao.h @@ -81,8 +81,14 @@ public: protected: void dispatchScriptDeactivate(bool removal); - virtual void onMarkedForDeactivation() { dispatchScriptDeactivate(false); } - virtual void onMarkedForRemoval() { dispatchScriptDeactivate(true); } + virtual void onMarkedForDeactivation() { + UnitSAO::onMarkedForDeactivation(); + dispatchScriptDeactivate(false); + } + virtual void onMarkedForRemoval() { + UnitSAO::onMarkedForRemoval(); + dispatchScriptDeactivate(true); + } private: std::string getPropertyPacket(); diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index b2e2351c9..4abb1f920 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -233,13 +233,12 @@ void PlayerSAO::step(float dtime, bool send_recommended) } // If attached, check that our parent is still there. If it isn't, detach. - if (m_attachment_parent_id && !isAttached()) { + if (m_attachment_parent_id && !getParent()) { // This is handled when objects are removed from the map warningstream << "PlayerSAO::step() id=" << m_id << " is attached to nonexistent parent. This is a bug." << std::endl; clearParentAttachment(); - setBasePosition(m_last_good_position); - m_env->getGameDef()->SendMovePlayer(this); + setPos(m_last_good_position); } //dstream<<"PlayerSAO::step: dtime: "< &getAttachmentChildIds() const - { static std::unordered_set rv; return rv; } + virtual const std::unordered_set &getAttachmentChildIds() const + { static std::unordered_set rv; return rv; } virtual ServerActiveObject *getParent() const { return nullptr; } virtual ObjectProperties *accessObjectProperties() { return NULL; } @@ -240,8 +240,8 @@ protected: virtual void onMarkedForDeactivation() {} virtual void onMarkedForRemoval() {} - virtual void onAttach(int parent_id) {} - virtual void onDetach(int parent_id) {} + virtual void onAttach(object_t parent_id) {} + virtual void onDetach(object_t parent_id) {} ServerEnvironment *m_env; v3f m_base_position; diff --git a/src/server/unit_sao.cpp b/src/server/unit_sao.cpp index 70594589b..d764b5d16 100644 --- a/src/server/unit_sao.cpp +++ b/src/server/unit_sao.cpp @@ -130,50 +130,92 @@ void UnitSAO::sendOutdatedData() } } -void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position, +void UnitSAO::setAttachment(const object_t new_parent, const std::string &bone, v3f position, v3f rotation, bool force_visible) { - auto *obj = parent_id ? m_env->getActiveObject(parent_id) : nullptr; - if (obj) { - // Do checks to avoid circular references - // The chain of wanted parent must not refer or contain "this" - for (obj = obj->getParent(); obj; obj = obj->getParent()) { - if (obj == this) { - warningstream << "Mod bug: Attempted to attach object " << m_id << " to parent " - << parent_id << " but former is an (in)direct parent of latter." << std::endl; - return; + const auto call_count = ++m_attachment_call_counter; + + const auto check_nesting = [&] (const char *descr) -> bool { + // The counter is never decremented, so if it differs that means + // a nested call to setAttachment() has happened. + if (m_attachment_call_counter == call_count) + return false; + verbosestream << "UnitSAO::setAttachment() id=" << m_id << + " nested call detected (" << descr << ")." << std::endl; + return true; + }; + + // Do checks to avoid circular references + { + auto *obj = new_parent ? m_env->getActiveObject(new_parent) : nullptr; + if (obj == this) { + assert(false); + return; + } + bool problem = false; + if (obj) { + // The chain of wanted parent must not refer or contain "this" + for (obj = obj->getParent(); obj; obj = obj->getParent()) { + if (obj == this) { + problem = true; + break; + } } } + if (problem) { + warningstream << "Mod bug: Attempted to attach object " << m_id << " to parent " + << new_parent << " but former is an (in)direct parent of latter." << std::endl; + return; + } } - // Attachments need to be handled on both the server and client. - // If we just attach on the server, we can only copy the position of the parent. - // Attachments are still sent to clients at an interval so players might see them - // lagging, plus we can't read and attach to skeletal bones. If we just attach on - // the client, the server still sees the child at its original location. This - // breaks some things so we also give the server the most accurate representation - // even if players only see the client changes. + // Detach first + // Note: make sure to apply data changes before running callbacks. + const auto old_parent = m_attachment_parent_id; + m_attachment_parent_id = 0; + m_attachment_sent = false; - int old_parent = m_attachment_parent_id; - m_attachment_parent_id = parent_id; + if (old_parent && old_parent != new_parent) { + auto *parent = m_env->getActiveObject(old_parent); + if (parent) { + onDetach(parent); + } else { + warningstream << "UnitSAO::setAttachment() id=" << m_id << + " is attached to nonexistent parent. This is a bug." << std::endl; + // we can pretend it never happened + } + } - // The detach callbacks might call to setAttachment() again. - // Ensure the attachment params are applied after this callback is run. - if (parent_id != old_parent) - onDetach(old_parent); + if (check_nesting("onDetach")) { + // Don't touch anything after the other call has completed. + return; + } - m_attachment_parent_id = parent_id; + if (isGone()) + return; + + // Now attach to new parent + m_attachment_parent_id = new_parent; m_attachment_bone = bone; m_attachment_position = position; m_attachment_rotation = rotation; m_force_visible = force_visible; - m_attachment_sent = false; - if (parent_id != old_parent) - onAttach(parent_id); + if (new_parent && old_parent != new_parent) { + auto *parent = m_env->getActiveObject(new_parent); + if (parent) { + onAttach(parent); + } else { + warningstream << "UnitSAO::setAttachment() id=" << m_id << + " tried to attach to nonexistent parent. This is a bug." << std::endl; + m_attachment_parent_id = 0; // detach + } + } + + check_nesting("onAttach"); } -void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, +void UnitSAO::getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; @@ -183,79 +225,70 @@ void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, *force_visible = m_force_visible; } +void UnitSAO::clearAnyAttachments() +{ + // This is called before this SAO is marked for removal/deletion and unlinks + // any parent or child relationships. + // This is done at this point and not in ~UnitSAO() so attachments to + // "phantom objects" don't stay around while we're waiting to be actually deleted. + // (which can take several server steps) + clearParentAttachment(); + clearChildAttachments(); +} + void UnitSAO::clearChildAttachments() { // Cannot use for-loop here: setAttachment() modifies 'm_attachment_child_ids'! while (!m_attachment_child_ids.empty()) { - int child_id = *m_attachment_child_ids.begin(); + const auto child_id = *m_attachment_child_ids.begin(); - // Child can be NULL if it was deleted earlier - if (ServerActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); - - removeAttachmentChild(child_id); + if (auto *child = m_env->getActiveObject(child_id)) { + child->clearParentAttachment(); + } else { + // should not happen but we need to handle it to prevent an infinite loop + removeAttachmentChild(child_id); + } } } -void UnitSAO::clearParentAttachment() -{ - ServerActiveObject *parent = nullptr; - if (m_attachment_parent_id) { - parent = m_env->getActiveObject(m_attachment_parent_id); - setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); - } else { - setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); - } - // Do it - if (parent) - parent->removeAttachmentChild(m_id); -} - -void UnitSAO::addAttachmentChild(int child_id) +void UnitSAO::addAttachmentChild(object_t child_id) { m_attachment_child_ids.insert(child_id); } -void UnitSAO::removeAttachmentChild(int child_id) +void UnitSAO::removeAttachmentChild(object_t child_id) { m_attachment_child_ids.erase(child_id); } -const std::unordered_set &UnitSAO::getAttachmentChildIds() const +void UnitSAO::onAttach(ServerActiveObject *parent) { - return m_attachment_child_ids; -} + assert(parent); -void UnitSAO::onAttach(int parent_id) -{ - if (!parent_id) - return; + parent->addAttachmentChild(m_id); - ServerActiveObject *parent = m_env->getActiveObject(parent_id); - - if (!parent || parent->isGone()) - return; // Do not try to notify soon gone parent - - if (parent->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { - // Call parent's on_attach field - m_env->getScriptIface()->luaentity_on_attach_child(parent_id, this); + // Do not try to notify soon gone parent + if (!parent->isGone()) { + if (parent->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) + m_env->getScriptIface()->luaentity_on_attach_child(parent->getId(), this); } } -void UnitSAO::onDetach(int parent_id) +void UnitSAO::onDetach(ServerActiveObject *parent) { - if (!parent_id) - return; + assert(parent); + + parent->removeAttachmentChild(m_id); - ServerActiveObject *parent = m_env->getActiveObject(parent_id); if (getType() == ACTIVEOBJECT_TYPE_LUAENTITY) m_env->getScriptIface()->luaentity_on_detach(m_id, parent); - if (!parent || parent->isGone()) - return; // Do not try to notify soon gone parent + // callback could affect the parent + if (parent->isGone()) + return; if (parent->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) - m_env->getScriptIface()->luaentity_on_detach_child(parent_id, this); + m_env->getScriptIface()->luaentity_on_detach_child(parent->getId(), this); } ObjectProperties *UnitSAO::accessObjectProperties() diff --git a/src/server/unit_sao.h b/src/server/unit_sao.h index cbd845708..c7f8c4aec 100644 --- a/src/server/unit_sao.h +++ b/src/server/unit_sao.h @@ -77,16 +77,17 @@ public: // Attachments ServerActiveObject *getParent() const; - inline bool isAttached() const { return getParent(); } - void setAttachment(int parent_id, const std::string &bone, v3f position, + inline bool isAttached() const { return m_attachment_parent_id != 0; } + void setAttachment(object_t parent_id, const std::string &bone, v3f position, v3f rotation, bool force_visible); - void getAttachment(int *parent_id, std::string *bone, v3f *position, + void getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const; - void clearChildAttachments(); - void clearParentAttachment(); - void addAttachmentChild(int child_id); - void removeAttachmentChild(int child_id); - const std::unordered_set &getAttachmentChildIds() const; + void clearChildAttachments() override; + void addAttachmentChild(object_t child_id) override; + void removeAttachmentChild(object_t child_id) override; + const std::unordered_set &getAttachmentChildIds() const { + return m_attachment_child_ids; + } // Object properties ObjectProperties *accessObjectProperties(); @@ -121,14 +122,28 @@ protected: // Stores position and rotation for each bone name std::unordered_map m_bone_override; - int m_attachment_parent_id = 0; + object_t m_attachment_parent_id = 0; + + void clearAnyAttachments(); + virtual void onMarkedForDeactivation() { + ServerActiveObject::onMarkedForDeactivation(); + clearAnyAttachments(); + } + virtual void onMarkedForRemoval() { + ServerActiveObject::onMarkedForRemoval(); + clearAnyAttachments(); + } private: - void onAttach(int parent_id); - void onDetach(int parent_id); + void onAttach(ServerActiveObject *parent); + void onDetach(ServerActiveObject *parent); std::string generatePunchCommand(u16 result_hp) const; + // Used to detect nested calls to setAttachments(), which can happen due to + // Lua callbacks + u8 m_attachment_call_counter = 0; + // Armor groups bool m_armor_groups_sent = false; @@ -144,7 +159,7 @@ private: bool m_bone_override_sent = false; // Attachments - std::unordered_set m_attachment_child_ids; + std::unordered_set m_attachment_child_ids; std::string m_attachment_bone = ""; v3f m_attachment_position; v3f m_attachment_rotation; diff --git a/src/util/numeric.h b/src/util/numeric.h index c31dcb9fb..73b4fb5cd 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -439,6 +439,17 @@ inline u32 npot2(u32 orig) { return orig + 1; } +// Distance between two values in a wrapped (circular) system +template +inline unsigned wrappedDifference(T a, T b, const T maximum) +{ + if (a > b) + std::swap(a, b); + // now b >= a + unsigned s = b - a, l = static_cast(maximum - b) + a + 1; + return std::min(s, l); +} + // Gradual steps towards the target value in a wrapped (circular) system // using the shorter of both ways template From 53a50e0b0d2bf48f78c27b1104ca228f47237aef Mon Sep 17 00:00:00 2001 From: 1F616EMO~nya Date: Mon, 12 Aug 2024 21:34:25 +0800 Subject: [PATCH 43/59] Fix warning about getVertexTypeDescription reaching its end (#14806) --- irr/src/OpenGL/Driver.cpp | 1 + irr/src/os.h | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/irr/src/OpenGL/Driver.cpp b/irr/src/OpenGL/Driver.cpp index 0dd6ea1bb..95d760548 100644 --- a/irr/src/OpenGL/Driver.cpp +++ b/irr/src/OpenGL/Driver.cpp @@ -107,6 +107,7 @@ static const VertexType &getVertexTypeDescription(E_VERTEX_TYPE type) return vtTangents; default: assert(false); + CODE_UNREACHABLE(); } } diff --git a/irr/src/os.h b/irr/src/os.h index fcbaeddd5..58699ab3e 100644 --- a/irr/src/os.h +++ b/irr/src/os.h @@ -10,6 +10,22 @@ #include "ILogger.h" #include "ITimer.h" +// CODE_UNREACHABLE(): Invokes undefined behavior for unreachable code optimization +#if defined(__cpp_lib_unreachable) +#include +#define CODE_UNREACHABLE() std::unreachable() +#elif defined(__has_builtin) +#if __has_builtin(__builtin_unreachable) +#define CODE_UNREACHABLE() __builtin_unreachable() +#endif +#elif defined(_MSC_VER) +#define CODE_UNREACHABLE() __assume(false) +#endif + +#ifndef CODE_UNREACHABLE +#define CODE_UNREACHABLE() (void)0 +#endif + namespace irr { From a3838dd0e8de73774986391c49db8ae105154f5c Mon Sep 17 00:00:00 2001 From: y5nw <37980625+y5nw@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:34:37 +0200 Subject: [PATCH 44/59] Show IME candidate list in Windows (#14942) --- irr/src/CIrrDeviceSDL.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/irr/src/CIrrDeviceSDL.cpp b/irr/src/CIrrDeviceSDL.cpp index 71573a803..ffbd81950 100644 --- a/irr/src/CIrrDeviceSDL.cpp +++ b/irr/src/CIrrDeviceSDL.cpp @@ -343,6 +343,12 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters ¶m) : SDL_SetHint(SDL_HINT_APP_NAME, "Minetest"); #endif + // Set IME hints + SDL_SetHint(SDL_HINT_IME_INTERNAL_EDITING, "1"); +#if defined(SDL_HINT_IME_SHOW_UI) + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + u32 flags = SDL_INIT_TIMER | SDL_INIT_EVENTS; if (CreationParams.DriverType != video::EDT_NULL) flags |= SDL_INIT_VIDEO; From 013c6ee1663f2bdd93a6d30690a96a5914dc27dc Mon Sep 17 00:00:00 2001 From: grorp Date: Mon, 12 Aug 2024 14:34:50 +0100 Subject: [PATCH 45/59] TouchScreenGUI: Replace buttonbars with grid menu (#14918) --- android/icons/gear_icon.svg | 194 ------- .../{rare_controls.svg => overflow_btn.svg} | 86 ++-- doc/texture_packs.md | 3 +- src/gui/guiKeyChangeMenu.cpp | 1 + src/gui/touchscreengui.cpp | 480 ++++++++---------- src/gui/touchscreengui.h | 87 +--- textures/base/pack/gear_icon.png | Bin 1786 -> 0 bytes textures/base/pack/overflow_btn.png | Bin 0 -> 235 bytes textures/base/pack/rare_controls.png | Bin 155 -> 0 bytes 9 files changed, 285 insertions(+), 566 deletions(-) delete mode 100644 android/icons/gear_icon.svg rename android/icons/{rare_controls.svg => overflow_btn.svg} (90%) delete mode 100644 textures/base/pack/gear_icon.png create mode 100644 textures/base/pack/overflow_btn.png delete mode 100644 textures/base/pack/rare_controls.png diff --git a/android/icons/gear_icon.svg b/android/icons/gear_icon.svg deleted file mode 100644 index b44685ade..000000000 --- a/android/icons/gear_icon.svg +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/icons/rare_controls.svg b/android/icons/overflow_btn.svg similarity index 90% rename from android/icons/rare_controls.svg rename to android/icons/overflow_btn.svg index c9991ec7a..455dcc35a 100644 --- a/android/icons/rare_controls.svg +++ b/android/icons/overflow_btn.svg @@ -2,23 +2,23 @@ + inkscape:export-ydpi="24.000002" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + showguides="false" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1"> + empopacity="0.25098039" + originx="0" + originy="0" + units="px" + visible="true" /> @@ -432,7 +438,6 @@ image/svg+xml - @@ -496,26 +501,27 @@ x="264.65997" y="124.10143" style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-opacity:1" /> + id="flowPara4724" /> - + width="96.212502" + height="0.61243516" + x="19.62678" + y="33.575779" /> + + diff --git a/doc/texture_packs.md b/doc/texture_packs.md index b6f9306d9..890f5a950 100644 --- a/doc/texture_packs.md +++ b/doc/texture_packs.md @@ -151,8 +151,7 @@ are placeholders intended to be overwritten by the game. * `rangeview_btn.png` * `debug_btn.png` -* `gear_icon.png` -* `rare_controls.png` +* `overflow_btn.png` * `exit_btn.png` Texture Overrides diff --git a/src/gui/guiKeyChangeMenu.cpp b/src/gui/guiKeyChangeMenu.cpp index b8c1143f2..7e6c486e0 100644 --- a/src/gui/guiKeyChangeMenu.cpp +++ b/src/gui/guiKeyChangeMenu.cpp @@ -377,6 +377,7 @@ void GUIKeyChangeMenu::add_key(int id, std::wstring button_name, const std::stri key_settings.push_back(k); } +// compare with button_titles in touchscreengui.cpp void GUIKeyChangeMenu::init_keys() { this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wstrgettext("Forward"), "keymap_forward"); diff --git a/src/gui/touchscreengui.cpp b/src/gui/touchscreengui.cpp index 2504c4eb5..c428ef52e 100644 --- a/src/gui/touchscreengui.cpp +++ b/src/gui/touchscreengui.cpp @@ -31,6 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/keycode.h" #include "client/renderingengine.h" #include "util/numeric.h" +#include "gettext.h" +#include "IGUIStaticText.h" +#include "IGUIFont.h" #include #include @@ -43,8 +46,7 @@ static const char *button_image_names[] = { "down.png", "zoom.png", "aux1_btn.png", - "gear_icon.png", - "rare_controls.png", + "overflow_btn.png", "fly_btn.png", "noclip_btn.png", @@ -65,6 +67,33 @@ static const char *button_image_names[] = { "joystick_center.png", }; +// compare with GUIKeyChangeMenu::init_keys +static const char *button_titles[] = { + N_("Jump"), + N_("Sneak"), + N_("Zoom"), + N_("Aux1"), + N_("Overflow menu"), + + N_("Toggle fly"), + N_("Toggle noclip"), + N_("Toggle fast"), + N_("Toggle debug"), + N_("Change camera"), + N_("Range select"), + N_("Toggle minimap"), + N_("Toggle chat log"), + + N_("Chat"), + N_("Inventory"), + N_("Drop"), + N_("Exit"), + + N_("Joystick"), + N_("Joystick"), + N_("Joystick"), +}; + static void load_button_texture(IGUIImage *gui_button, const std::string &path, const recti &button_rect, ISimpleTextureSource *tsrc, video::IVideoDriver *driver) { @@ -243,165 +272,6 @@ static EKEY_CODE id_to_keycode(touch_gui_button_id id) return code; } -AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSource *tsrc, - touch_gui_button_id starter_id, const std::string &starter_img, - recti starter_rect, autohide_button_bar_dir dir) : - m_driver(device->getVideoDriver()), - m_guienv(device->getGUIEnvironment()), - m_receiver(device->getEventReceiver()), - m_texturesource(tsrc) -{ - m_upper_left = starter_rect.UpperLeftCorner; - m_lower_right = starter_rect.LowerRightCorner; - - IGUIImage *starter_gui_button = m_guienv->addImage(starter_rect, nullptr, - starter_id); - load_button_texture(starter_gui_button, starter_img, starter_rect, - m_texturesource, m_driver); - - m_starter = grab_gui_element(starter_gui_button); - m_dir = dir; -} - -void AutoHideButtonBar::addButton(touch_gui_button_id id, const std::string &image) -{ - int button_size = 0; - - if (m_dir == AHBB_Dir_Top_Bottom || m_dir == AHBB_Dir_Bottom_Top) - button_size = m_lower_right.X - m_upper_left.X; - else - button_size = m_lower_right.Y - m_upper_left.Y; - - recti current_button; - - if (m_dir == AHBB_Dir_Right_Left || m_dir == AHBB_Dir_Left_Right) { - int x_start = 0; - int x_end = 0; - - if (m_dir == AHBB_Dir_Left_Right) { - x_start = m_lower_right.X + button_size * 1.25f * m_buttons.size() - + button_size * 0.25f; - x_end = x_start + button_size; - } else { - x_end = m_upper_left.X - button_size * 1.25f * m_buttons.size() - - button_size * 0.25f; - x_start = x_end - button_size; - } - - current_button = recti(x_start, m_upper_left.Y, x_end, m_lower_right.Y); - } else { - double y_start = 0; - double y_end = 0; - - if (m_dir == AHBB_Dir_Top_Bottom) { - y_start = m_lower_right.X + button_size * 1.25f * m_buttons.size() - + button_size * 0.25f; - y_end = y_start + button_size; - } else { - y_end = m_upper_left.X - button_size * 1.25f * m_buttons.size() - - button_size * 0.25f; - y_start = y_end - button_size; - } - - current_button = recti(m_upper_left.X, y_start, m_lower_right.Y, y_end); - } - - IGUIImage *btn_gui_button = m_guienv->addImage(current_button, nullptr, id); - btn_gui_button->setVisible(false); - btn_gui_button->setEnabled(false); - load_button_texture(btn_gui_button, image, current_button, m_texturesource, m_driver); - - button_info btn{}; - btn.keycode = id_to_keycode(id); - btn.gui_button = grab_gui_element(btn_gui_button); - m_buttons.push_back(btn); -} - -void AutoHideButtonBar::addToggleButton(touch_gui_button_id id, - const std::string &image_1, const std::string &image_2) -{ - addButton(id, image_1); - button_info &btn = m_buttons.back(); - btn.toggleable = button_info::FIRST_TEXTURE; - btn.toggle_textures[0] = image_1; - btn.toggle_textures[1] = image_2; -} - -bool AutoHideButtonBar::handlePress(size_t pointer_id, IGUIElement *element) -{ - if (m_active) { - return buttons_handlePress(m_buttons, pointer_id, element, m_driver, - m_receiver, m_texturesource); - } - if (m_starter.get() == element) { - activate(); - return true; - } - return false; -} - -bool AutoHideButtonBar::handleRelease(size_t pointer_id) -{ - return buttons_handleRelease(m_buttons, pointer_id, m_driver, - m_receiver, m_texturesource); -} - -void AutoHideButtonBar::step(float dtime) -{ - // Since buttons can stay pressed after the buttonbar is deactivated, - // we call the step function even if the buttonbar is inactive. - bool has_pointers = buttons_step(m_buttons, dtime, m_driver, m_receiver, - m_texturesource); - - if (m_active) { - if (!has_pointers) { - m_timeout += dtime; - if (m_timeout > BUTTONBAR_HIDE_DELAY) - deactivate(); - } else { - m_timeout = 0.0f; - } - } - -} - -void AutoHideButtonBar::updateVisibility() { - bool starter_visible = m_visible && !m_active; - bool inner_visible = m_visible && m_active; - - m_starter->setVisible(starter_visible); - m_starter->setEnabled(starter_visible); - - for (auto &button : m_buttons) { - button.gui_button->setVisible(inner_visible); - button.gui_button->setEnabled(inner_visible); - } -} - -void AutoHideButtonBar::activate() -{ - m_active = true; - m_timeout = 0.0f; - updateVisibility(); -} - -void AutoHideButtonBar::deactivate() -{ - m_active = false; - updateVisibility(); -} - -void AutoHideButtonBar::show() -{ - m_visible = true; - updateVisibility(); -} - -void AutoHideButtonBar::hide() -{ - m_visible = false; - updateVisibility(); -} TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsrc): m_device(device), @@ -421,44 +291,44 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsr // Initialize joystick display "button". // Joystick is placed on the bottom left of screen. if (m_fixed_joystick) { - m_joystick_btn_off = grab_gui_element(makeJoystickButton(joystick_off_id, + m_joystick_btn_off = grab_gui_element(makeButtonDirect(joystick_off_id, recti(m_button_size, m_screensize.Y - m_button_size * 4, m_button_size * 4, m_screensize.Y - m_button_size), true)); } else { - m_joystick_btn_off = grab_gui_element(makeJoystickButton(joystick_off_id, + m_joystick_btn_off = grab_gui_element(makeButtonDirect(joystick_off_id, recti(m_button_size, m_screensize.Y - m_button_size * 3, m_button_size * 3, m_screensize.Y - m_button_size), true)); } - m_joystick_btn_bg = grab_gui_element(makeJoystickButton(joystick_bg_id, + m_joystick_btn_bg = grab_gui_element(makeButtonDirect(joystick_bg_id, recti(m_button_size, m_screensize.Y - m_button_size * 4, m_button_size * 4, m_screensize.Y - m_button_size), false)); - m_joystick_btn_center = grab_gui_element(makeJoystickButton(joystick_center_id, + m_joystick_btn_center = grab_gui_element(makeButtonDirect(joystick_center_id, recti(0, 0, m_button_size, m_button_size), false)); // init jump button - addButton(jump_id, button_image_names[jump_id], + addButton(m_buttons, jump_id, button_image_names[jump_id], recti(m_screensize.X - 1.75f * m_button_size, m_screensize.Y - m_button_size, m_screensize.X - 0.25f * m_button_size, m_screensize.Y)); // init sneak button - addButton(sneak_id, button_image_names[sneak_id], + addButton(m_buttons, sneak_id, button_image_names[sneak_id], recti(m_screensize.X - 3.25f * m_button_size, m_screensize.Y - m_button_size, m_screensize.X - 1.75f * m_button_size, m_screensize.Y)); // init zoom button - addButton(zoom_id, button_image_names[zoom_id], + addButton(m_buttons, zoom_id, button_image_names[zoom_id], recti(m_screensize.X - 1.25f * m_button_size, m_screensize.Y - 4 * m_button_size, m_screensize.X - 0.25f * m_button_size, @@ -466,72 +336,112 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, ISimpleTextureSource *tsr // init aux1 button if (!m_joystick_triggers_aux1) - addButton(aux1_id, button_image_names[aux1_id], + addButton(m_buttons, aux1_id, button_image_names[aux1_id], recti(m_screensize.X - 1.25f * m_button_size, m_screensize.Y - 2.5f * m_button_size, m_screensize.X - 0.25f * m_button_size, m_screensize.Y - 1.5f * m_button_size)); - AutoHideButtonBar &settings_bar = m_buttonbars.emplace_back(m_device, m_texturesource, - settings_starter_id, button_image_names[settings_starter_id], - recti(m_screensize.X - 1.25f * m_button_size, - m_screensize.Y - (SETTINGS_BAR_Y_OFFSET + 1.0f) * m_button_size - + 0.5f * m_button_size, - m_screensize.X - 0.25f * m_button_size, - m_screensize.Y - SETTINGS_BAR_Y_OFFSET * m_button_size - + 0.5f * m_button_size), - AHBB_Dir_Right_Left); + // init overflow button + m_overflow_btn = grab_gui_element(makeButtonDirect(overflow_id, + recti(m_screensize.X - 1.25f * m_button_size, + m_screensize.Y - 5.5f * m_button_size, + m_screensize.X - 0.25f * m_button_size, + m_screensize.Y - 4.5f * m_button_size), true)); - const static touch_gui_button_id settings_bar_buttons[] { + const static touch_gui_button_id overflow_buttons[] { + chat_id, inventory_id, drop_id, exit_id, fly_id, noclip_id, fast_id, debug_id, camera_id, range_id, minimap_id, + toggle_chat_id, }; - for (auto id : settings_bar_buttons) { - if (id_to_keycode(id) == KEY_UNKNOWN) - continue; - settings_bar.addButton(id, button_image_names[id]); + + IGUIStaticText *background = m_guienv->addStaticText(L"", + recti(v2s32(0, 0), dimension2du(m_screensize))); + background->setBackgroundColor(video::SColor(140, 0, 0, 0)); + background->setVisible(false); + m_overflow_bg = grab_gui_element(background); + + s32 cols = 4; + s32 rows = 3; + f32 screen_aspect = (f32)m_screensize.X / (f32)m_screensize.Y; + while ((s32)ARRLEN(overflow_buttons) > cols * rows) { + f32 aspect = (f32)cols / (f32)rows; + if (aspect > screen_aspect) + rows++; + else + cols++; } - // Chat is shown by default, so chat_hide_btn.png is shown first. - settings_bar.addToggleButton(toggle_chat_id, - "chat_hide_btn.png", "chat_show_btn.png"); + v2s32 size(m_button_size, m_button_size); + v2s32 spacing(m_screensize.X / (cols + 1), m_screensize.Y / (rows + 1)); + v2s32 pos(spacing); - AutoHideButtonBar &rare_controls_bar = m_buttonbars.emplace_back(m_device, m_texturesource, - rare_controls_starter_id, button_image_names[rare_controls_starter_id], - recti(0.25f * m_button_size, - m_screensize.Y - (RARE_CONTROLS_BAR_Y_OFFSET + 1.0f) * m_button_size - + 0.5f * m_button_size, - 0.75f * m_button_size, - m_screensize.Y - RARE_CONTROLS_BAR_Y_OFFSET * m_button_size - + 0.5f * m_button_size), - AHBB_Dir_Left_Right); - - const static touch_gui_button_id rare_controls_bar_buttons[] { - chat_id, inventory_id, drop_id, exit_id, - }; - for (auto id : rare_controls_bar_buttons) { + for (auto id : overflow_buttons) { if (id_to_keycode(id) == KEY_UNKNOWN) continue; - rare_controls_bar.addButton(id, button_image_names[id]); + + recti rect(pos - size / 2, dimension2du(size.X, size.Y)); + if (rect.LowerRightCorner.X > (s32)m_screensize.X) { + pos.X = spacing.X; + pos.Y += spacing.Y; + rect = recti(pos - size / 2, dimension2du(size.X, size.Y)); + } + + if (id == toggle_chat_id) + // Chat is shown by default, so chat_hide_btn.png is shown first. + addToggleButton(m_overflow_buttons, id, "chat_hide_btn.png", + "chat_show_btn.png", rect, false); + else + addButton(m_overflow_buttons, id, button_image_names[id], rect, false); + + std::wstring str = wstrgettext(button_titles[id]); + IGUIStaticText *text = m_guienv->addStaticText(str.c_str(), recti()); + IGUIFont *font = text->getActiveFont(); + dimension2du dim = font->getDimension(str.c_str()); + dim = dimension2du(dim.Width * 1.25f, dim.Height * 1.25f); // avoid clipping + text->setRelativePosition(recti(pos.X - dim.Width / 2, pos.Y + size.Y / 2, + pos.X + dim.Width / 2, pos.Y + size.Y / 2 + dim.Height)); + text->setTextAlignment(EGUIA_CENTER, EGUIA_UPPERLEFT); + text->setVisible(false); + m_overflow_button_titles.push_back(grab_gui_element(text)); + + rect.addInternalPoint(text->getRelativePosition().UpperLeftCorner); + rect.addInternalPoint(text->getRelativePosition().LowerRightCorner); + m_overflow_button_rects.push_back(rect); + + pos.X += spacing.X; } } -void TouchScreenGUI::addButton(touch_gui_button_id id, const std::string &image, const recti &rect) +void TouchScreenGUI::addButton(std::vector &buttons, touch_gui_button_id id, + const std::string &image, const recti &rect, bool visible) { IGUIImage *btn_gui_button = m_guienv->addImage(rect, nullptr, id); + btn_gui_button->setVisible(visible); load_button_texture(btn_gui_button, image, rect, m_texturesource, m_device->getVideoDriver()); - button_info &btn = m_buttons.emplace_back(); + button_info &btn = buttons.emplace_back(); btn.keycode = id_to_keycode(id); btn.gui_button = grab_gui_element(btn_gui_button); } -IGUIImage *TouchScreenGUI::makeJoystickButton(touch_gui_button_id id, - const recti &button_rect, bool visible) +void TouchScreenGUI::addToggleButton(std::vector &buttons, touch_gui_button_id id, + const std::string &image_1, const std::string &image_2, const recti &rect, bool visible) { - IGUIImage *btn_gui_button = m_guienv->addImage(button_rect, nullptr, id); + addButton(buttons, id, image_1, rect, visible); + button_info &btn = buttons.back(); + btn.toggleable = button_info::FIRST_TEXTURE; + btn.toggle_textures[0] = image_1; + btn.toggle_textures[1] = image_2; +} + +IGUIImage *TouchScreenGUI::makeButtonDirect(touch_gui_button_id id, + const recti &rect, bool visible) +{ + IGUIImage *btn_gui_button = m_guienv->addImage(rect, nullptr, id); btn_gui_button->setVisible(visible); - load_button_texture(btn_gui_button, button_image_names[id], button_rect, + load_button_texture(btn_gui_button, button_image_names[id], rect, m_texturesource, m_device->getVideoDriver()); return btn_gui_button; @@ -566,17 +476,17 @@ void TouchScreenGUI::handleReleaseEvent(size_t pointer_id) m_pointer_downpos.erase(pointer_id); m_pointer_pos.erase(pointer_id); + if (m_overflow_open) { + buttons_handleRelease(m_overflow_buttons, pointer_id, m_device->getVideoDriver(), + m_receiver, m_texturesource); + return; + } + // handle buttons if (buttons_handleRelease(m_buttons, pointer_id, m_device->getVideoDriver(), m_receiver, m_texturesource)) return; - // handle buttonbars - for (AutoHideButtonBar &bar : m_buttonbars) { - if (bar.handleRelease(pointer_id)) - return; - } - if (m_has_move_id && pointer_id == m_move_id) { // handle the point used for moving view m_has_move_id = false; @@ -584,7 +494,8 @@ void TouchScreenGUI::handleReleaseEvent(size_t pointer_id) // If m_tap_state is already set to TapState::ShortTap, we must keep // that value. Otherwise, many short taps will be ignored if you tap // very fast. - if (!m_move_has_really_moved && m_tap_state != TapState::LongTap) { + if (!m_move_has_really_moved && !m_move_prevent_short_tap && + m_tap_state != TapState::LongTap) { m_tap_state = TapState::ShortTap; } else { m_tap_state = TapState::None; @@ -635,41 +546,48 @@ void TouchScreenGUI::translateEvent(const SEvent &event) m_pointer_downpos[pointer_id] = touch_pos; m_pointer_pos[pointer_id] = touch_pos; + bool prevent_short_tap = false; + IGUIElement *element = m_guienv->getRootGUIElement()->getElementFromPoint(touch_pos); + // handle overflow menu + if (!m_overflow_open) { + if (element == m_overflow_btn.get()) { + toggleOverflowMenu(); + return; + } + } else { + for (size_t i = 0; i < m_overflow_buttons.size(); i++) { + if (m_overflow_button_rects[i].isPointInside(touch_pos)) { + element = m_overflow_buttons[i].gui_button.get(); + break; + } + } + + if (buttons_handlePress(m_overflow_buttons, pointer_id, element, + m_device->getVideoDriver(), m_receiver, m_texturesource)) + return; + + toggleOverflowMenu(); + // refresh since visibility of buttons has changed + element = m_guienv->getRootGUIElement()->getElementFromPoint(touch_pos); + // restore after releaseAll in toggleOverflowMenu + m_pointer_downpos[pointer_id] = touch_pos; + m_pointer_pos[pointer_id] = touch_pos; + // continue processing, but avoid accidentally placing a node + // when closing the overflow menu + prevent_short_tap = true; + } + // handle buttons if (buttons_handlePress(m_buttons, pointer_id, element, - m_device->getVideoDriver(), m_receiver, m_texturesource)) { - for (AutoHideButtonBar &bar : m_buttonbars) - bar.deactivate(); + m_device->getVideoDriver(), m_receiver, m_texturesource)) return; - } - - // handle buttonbars - for (AutoHideButtonBar &bar : m_buttonbars) { - if (bar.handlePress(pointer_id, element)) { - for (AutoHideButtonBar &other : m_buttonbars) - if (other != bar) - other.deactivate(); - return; - } - } // handle hotbar - if (isHotbarButton(event)) { + if (isHotbarButton(event)) // already handled in isHotbarButton() - for (AutoHideButtonBar &bar : m_buttonbars) - bar.deactivate(); return; - } - - // handle non button events - for (AutoHideButtonBar &bar : m_buttonbars) { - if (bar.isActive()) { - bar.deactivate(); - return; - } - } // Select joystick when joystick tapped (fixed joystick position) or // when left 1/3 of screen dragged (free joystick position) @@ -704,6 +622,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) // DON'T reset m_tap_state here, otherwise many short taps // will be ignored if you tap very fast. m_had_move_id = true; + m_move_prevent_short_tap = prevent_short_tap; } } } @@ -713,6 +632,9 @@ void TouchScreenGUI::translateEvent(const SEvent &event) } else { assert(event.TouchInput.Event == ETIE_MOVED); + if (m_overflow_open) + return; + if (!(m_has_joystick_id && m_fixed_joystick) && m_pointer_pos[event.TouchInput.ID] == touch_pos) return; @@ -798,10 +720,13 @@ void TouchScreenGUI::applyJoystickStatus() void TouchScreenGUI::step(float dtime) { + if (m_overflow_open) { + buttons_step(m_overflow_buttons, dtime, m_device->getVideoDriver(), m_receiver, m_texturesource); + return; + } + // simulate keyboard repeats buttons_step(m_buttons, dtime, m_device->getVideoDriver(), m_receiver, m_texturesource); - for (AutoHideButtonBar &bar : m_buttonbars) - bar.step(dtime); // joystick applyJoystickStatus(); @@ -844,42 +769,65 @@ void TouchScreenGUI::registerHotbarRect(u16 index, const recti &rect) void TouchScreenGUI::setVisible(bool visible) { + if (m_visible == visible) + return; + m_visible = visible; - for (auto &button : m_buttons) { - if (button.gui_button) - button.gui_button->setVisible(visible); - } - - if (m_joystick_btn_off) - m_joystick_btn_off->setVisible(visible); - - // clear all active buttons + // order matters if (!visible) { - while (!m_pointer_pos.empty()) - handleReleaseEvent(m_pointer_pos.begin()->first); - for (AutoHideButtonBar &bar : m_buttonbars) { - bar.deactivate(); - bar.hide(); - } - } else { - for (AutoHideButtonBar &bar : m_buttonbars) - bar.show(); + releaseAll(); + m_overflow_open = false; + } + updateVisibility(); +} + +void TouchScreenGUI::toggleOverflowMenu() +{ + releaseAll(); // must be done first + m_overflow_open = !m_overflow_open; + updateVisibility(); +} + +void TouchScreenGUI::updateVisibility() +{ + bool regular_visible = m_visible && !m_overflow_open; + for (auto &button : m_buttons) + button.gui_button->setVisible(regular_visible); + m_overflow_btn->setVisible(regular_visible); + m_joystick_btn_off->setVisible(regular_visible); + + bool overflow_visible = m_visible && m_overflow_open; + m_overflow_bg->setVisible(overflow_visible); + for (auto &button : m_overflow_buttons) + button.gui_button->setVisible(overflow_visible); + for (auto &text : m_overflow_button_titles) + text->setVisible(overflow_visible); +} + +void TouchScreenGUI::releaseAll() +{ + while (!m_pointer_pos.empty()) + handleReleaseEvent(m_pointer_pos.begin()->first); + + // Release those manually too since the change initiated by + // handleReleaseEvent will only be applied later by applyContextControls. + if (m_dig_pressed) { + emitMouseEvent(EMIE_LMOUSE_LEFT_UP); + m_dig_pressed = false; + } + if (m_place_pressed) { + emitMouseEvent(EMIE_RMOUSE_LEFT_UP); + m_place_pressed = false; } } void TouchScreenGUI::hide() { - if (!m_visible) - return; - setVisible(false); } void TouchScreenGUI::show() { - if (m_visible) - return; - setVisible(true); } diff --git a/src/gui/touchscreengui.h b/src/gui/touchscreengui.h index ca6c05e18..2da9d8151 100644 --- a/src/gui/touchscreengui.h +++ b/src/gui/touchscreengui.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "IGUIStaticText.h" #include "irrlichttypes.h" #include #include @@ -74,8 +75,7 @@ enum touch_gui_button_id sneak_id, zoom_id, aux1_id, - settings_starter_id, - rare_controls_starter_id, + overflow_id, // usually in the "settings bar" fly_id, @@ -99,25 +99,16 @@ enum touch_gui_button_id joystick_center_id, }; -enum autohide_button_bar_dir -{ - AHBB_Dir_Top_Bottom, - AHBB_Dir_Bottom_Top, - AHBB_Dir_Left_Right, - AHBB_Dir_Right_Left -}; #define BUTTON_REPEAT_DELAY 0.5f #define BUTTON_REPEAT_INTERVAL 0.333f -#define BUTTONBAR_HIDE_DELAY 3.0f -#define SETTINGS_BAR_Y_OFFSET 5 -#define RARE_CONTROLS_BAR_Y_OFFSET 5 // Our simulated clicks last some milliseconds so that server-side mods have a // chance to detect them via l_get_player_control. // If you tap faster than this value, the simulated clicks are of course shorter. #define SIMULATED_CLICK_DURATION_MS 50 + struct button_info { float repeat_counter; @@ -136,52 +127,6 @@ struct button_info IEventReceiver *receiver, ISimpleTextureSource *tsrc); }; -class AutoHideButtonBar -{ -public: - AutoHideButtonBar(IrrlichtDevice *device, ISimpleTextureSource *tsrc, - touch_gui_button_id starter_id, const std::string &starter_image, - recti starter_rect, autohide_button_bar_dir dir); - - void addButton(touch_gui_button_id id, const std::string &image); - void addToggleButton(touch_gui_button_id id, - const std::string &image_1, const std::string &image_2); - - bool handlePress(size_t pointer_id, IGUIElement *element); - bool handleRelease(size_t pointer_id); - - void step(float dtime); - - void activate(); - void deactivate(); - bool isActive() { return m_active; } - - void show(); - void hide(); - - bool operator==(const AutoHideButtonBar &other) - { return m_starter.get() == other.m_starter.get(); } - bool operator!=(const AutoHideButtonBar &other) - { return m_starter.get() != other.m_starter.get(); } - -private: - irr::video::IVideoDriver *m_driver = nullptr; - IGUIEnvironment *m_guienv = nullptr; - IEventReceiver *m_receiver = nullptr; - ISimpleTextureSource *m_texturesource = nullptr; - std::shared_ptr m_starter; - std::vector m_buttons; - - v2s32 m_upper_left; - v2s32 m_lower_right; - - bool m_active = false; - bool m_visible = true; - float m_timeout = 0.0f; - autohide_button_bar_dir m_dir = AHBB_Dir_Right_Left; - - void updateVisibility(); -}; class TouchScreenGUI { @@ -262,6 +207,7 @@ private: // This is needed so that we don't miss if m_has_move_id is true for less // than one client step, i.e. press and release happen in the same step. bool m_had_move_id = false; + bool m_move_prevent_short_tap = false; bool m_has_joystick_id = false; size_t m_joystick_id; @@ -277,13 +223,28 @@ private: std::shared_ptr m_joystick_btn_center; std::vector m_buttons; + std::shared_ptr m_overflow_btn; + + bool m_overflow_open = false; + std::shared_ptr m_overflow_bg; + std::vector m_overflow_buttons; + std::vector> m_overflow_button_titles; + std::vector m_overflow_button_rects; + + void toggleOverflowMenu(); + void updateVisibility(); + void releaseAll(); // initialize a button - void addButton(touch_gui_button_id id, const std::string &image, - const recti &rect); + void addButton(std::vector &buttons, + touch_gui_button_id id, const std::string &image, + const recti &rect, bool visible=true); + void addToggleButton(std::vector &buttons, + touch_gui_button_id id, + const std::string &image_1, const std::string &image_2, + const recti &rect, bool visible=true); - // initialize a joystick button - IGUIImage *makeJoystickButton(touch_gui_button_id id, + IGUIImage *makeButtonDirect(touch_gui_button_id id, const recti &rect, bool visible); // handle pressing hotbar items @@ -300,8 +261,6 @@ private: // map to store the IDs and positions of currently pressed pointers std::unordered_map m_pointer_pos; - std::vector m_buttonbars; - v2s32 getPointerPos(); void emitMouseEvent(EMOUSE_INPUT_EVENT type); TouchInteractionMode m_last_mode = TouchInteractionMode_END; diff --git a/textures/base/pack/gear_icon.png b/textures/base/pack/gear_icon.png deleted file mode 100644 index 6ca45104628ba65bd618e57399b9b4c6310fdd83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1786 zcmV z0}qWZjx9VpqW?QJh!`u9Q${dejAT1rWTwzOPA&v%euy!YI5+k0-$y*;(( z^O48n@pwEQkH_Qjcsw4D$K&y22XAnWi(KR!Z)oA6ls>-IN2wMXjuY#s78Z)=B32ha z)b|NKe3}LaFgu`W;K!%=f*gKNJ@xEUQq*8pqomkJJ@x#79JwEB_==m{F~%thWq|^E zFzcZ}7AWL@jB&?JPP0aCMd`@kO>C=)O^5FLS#aSrJ5gD zO*c;KW3A>7%5hq`<`eedv=`+btfq-pnhEj+AF!PzibFAtIIWRl#bF8C`G7A7(o8E& ztX6iALy%ZE>EsZFx{G2O$b<%pbr*#kqLZ7%3X-F2U_Vh3)v;c;QA`7w(m=6pV?FgG zin3pshmTsU4RDbCG>}OR?B^f@SgXaS%p=6?-C~dnga{HO#09?Q7PA*pHc-Y@(l^05 zKIB&vD+a}safEYBkiM&wDLXiVK{~Ed#diEk0zc1E%~jH2a75Wc9!=OaMVMbG1w2a_ z1G}2YQ}(cd2zGqKVHPVzEa4-rVMl}w$}WCN2dNt7kFtqBGfb-5*`VxW6_s3OX2a}N z8u$&v%I^XaorHQ|Ajp+<$dMbcjWMhR!C?*i$115yYMjIgJkNsgZ*SVo!&hMichb$wAa( zPotd1tMp(;n;e6WcI@ckRXL9m4imv3HA5_yLs-EjQezO|FeSTgWD|d9gj99%u(FFybYaIRC&^ce zDBu&uv7?Jk${zALi(LlIyr2~D5-r$wmV9Lk$1zC97^m4qu99F8FA`#$bQm00cCedK z(ii1CCwPexe7XxCCG6uQ7l@L+QFbfy@KMX`O>vnH8VC}kfle-CFnhK5lzD`()=N3N zsUwr>*iAXTSPLl|c$pg{I>Q>>MiF&nN*zVIjWwJh(G6Z!HsB{ftV!B%W(8?Gy8Kad72C>r4 zBDoz;af3vIY?kn|nQ|)W$4Wnyl(QMX#AXIbbc3hlcD#?3j}?RGxQ^L%o>L4y#>)G0 zJ3c4T2oEX_5zHcr!-I^F=ySOp0TKlihsE?_*2`kWAwZ&l+>S72ojjm8+{Z9x!`!Dh zJU}OAVYwYG#Jk8QneYq-W(Lp5giTx|UW?q02EJnu<{>3u3sKCXY*7LpB87lk>ixmjU_)H0Ig&2boFyt=akR{04sKIGXMYp literal 0 HcmV?d00001 diff --git a/textures/base/pack/rare_controls.png b/textures/base/pack/rare_controls.png deleted file mode 100644 index 16bf61a8fa1be66c415526724c50162de0d506ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!2%=&JC;8LQc0dJjv*Dd-rl&#$)LdD8u+~M zU_sSvMU6!k*ICc4*LS)kUHUCz&mHa+achC9VZe_0PMwd6=cE*EHkc3t!v<0BNh&A9 gcn~59+S5wbak}kO*E=oq`xZ#t)78&qol`;+0A<)IP5=M^ From 39c2af97105142c44195093cfc4b809bde70681a Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 12 Aug 2024 15:35:00 +0200 Subject: [PATCH 46/59] Render clouds as flat when thickness is zero (#14897) --- doc/lua_api.md | 3 ++- src/client/clouds.cpp | 8 ++++---- src/client/clouds.h | 5 +++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index e5435e273..22a3361ed 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -8404,7 +8404,8 @@ child will follow movement and rotation of that bone. ColorSpec (alpha ignored, default `#000000`) * `height`: cloud height, i.e. y of cloud base (default per conf, usually `120`) - * `thickness`: cloud thickness in nodes (default `16`) + * `thickness`: cloud thickness in nodes (default `16`). + if set to zero the clouds are rendered flat. * `speed`: 2D cloud speed + direction in nodes per second (default `{x=0, z=-2}`). * `get_clouds()`: returns a table with the current cloud parameters as in diff --git a/src/client/clouds.cpp b/src/client/clouds.cpp index 3ab504371..d53d52957 100644 --- a/src/client/clouds.cpp +++ b/src/client/clouds.cpp @@ -127,7 +127,7 @@ void Clouds::updateMesh() m_last_noise_center = center_of_drawing_in_noise_i; m_mesh_valid = true; - const u32 num_faces_to_draw = m_enable_3d ? 6 : 1; + const u32 num_faces_to_draw = is3D() ? 6 : 1; // The world position of the integer center point of drawing in the noise v2f world_center_of_drawing_in_noise_f = v2f( @@ -220,7 +220,7 @@ void Clouds::updateMesh() const f32 rx = cloud_size / 2.0f; // if clouds are flat, the top layer should be at the given height - const f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; + const f32 ry = is3D() ? m_params.thickness * BS : 0.0f; const f32 rz = cloud_size / 2; for(u32 i = 0; i < num_faces_to_draw; i++) @@ -363,7 +363,7 @@ void Clouds::render() updateAbsolutePosition(); } - m_material.BackfaceCulling = m_enable_3d; + m_material.BackfaceCulling = is3D(); if (m_enable_shaders) m_material.EmissiveColor = m_color.toSColor(); @@ -413,7 +413,7 @@ void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse) // is the camera inside the cloud mesh? m_camera_pos = camera_p; m_camera_inside_cloud = false; // default - if (m_enable_3d) { + if (is3D()) { float camera_height = camera_p.Y - BS * m_camera_offset.Y; if (camera_height >= m_box.MinEdge.Y && camera_height <= m_box.MaxEdge.Y) { diff --git a/src/client/clouds.h b/src/client/clouds.h index 23273a3c9..d93fa9b43 100644 --- a/src/client/clouds.h +++ b/src/client/clouds.h @@ -145,6 +145,11 @@ private: bool gridFilled(int x, int y) const; + // Are the clouds 3D? + inline bool is3D() const { + return m_enable_3d && m_params.thickness >= 0.01f; + } + video::SMaterial m_material; irr_ptr m_meshbuffer; // Value of m_origin at the time the mesh was last updated From 98e51a01590129c2e0cda420ac461c2d25e35433 Mon Sep 17 00:00:00 2001 From: 1F616EMO~nya Date: Mon, 12 Aug 2024 21:35:13 +0800 Subject: [PATCH 47/59] Clamp hotbar selection to slots that exist (#14869) --- doc/lua_api.md | 2 ++ games/devtest/mods/unittests/player.lua | 22 ++++++++++++++++++++++ src/client/game.cpp | 10 ++++++---- src/client/hud.cpp | 2 +- src/network/serverpackethandler.cpp | 8 ++++---- src/player.cpp | 11 +++++++++++ src/player.h | 5 ++++- src/script/lua_api/l_object.cpp | 2 +- 8 files changed, 51 insertions(+), 11 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index 22a3361ed..f892e0a5c 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -8225,7 +8225,9 @@ child will follow movement and rotation of that bone. * See `hud_set_flags` for a list of flags that can be toggled. * `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar * `count`: number of items, must be between `1` and `32` + * If `count` exceeds the `"main"` list size, the list size will be used instead. * `hud_get_hotbar_itemcount()`: returns number of visible items + * This value is also clamped by the `"main"` list size. * `hud_set_hotbar_image(texturename)` * sets background image for hotbar * `hud_get_hotbar_image()`: returns texturename diff --git a/games/devtest/mods/unittests/player.lua b/games/devtest/mods/unittests/player.lua index 70b3b6cae..0dbe450b0 100644 --- a/games/devtest/mods/unittests/player.lua +++ b/games/devtest/mods/unittests/player.lua @@ -84,3 +84,25 @@ local function run_player_add_pos_tests(player) end unittests.register("test_player_add_pos", run_player_add_pos_tests, {player=true}) +-- +-- Hotbar selection clamp +-- +local function run_player_hotbar_clamp_tests(player) + local inv = player:get_inventory() + local old_inv_size = inv:get_size("main") + local old_inv_list = inv:get_list("main") -- Avoid accidentally removing item + local old_bar_size = player:hud_get_hotbar_itemcount() + + inv:set_size("main", 5) + + player:hud_set_hotbar_itemcount(2) + assert(player:hud_get_hotbar_itemcount() == 2) + + player:hud_set_hotbar_itemcount(6) + assert(player:hud_get_hotbar_itemcount() == 5) + + inv:set_size("main", old_inv_size) + inv:set_list("main", old_inv_list) + player:hud_set_hotbar_itemcount(old_bar_size) +end +unittests.register("test_player_hotbar_clamp", run_player_hotbar_clamp_tests, {player=true}) diff --git a/src/client/game.cpp b/src/client/game.cpp index 3dd829d53..0906e9ca9 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2188,12 +2188,14 @@ void Game::processItemSelection(u16 *new_playeritem) { LocalPlayer *player = client->getEnv().getLocalPlayer(); + *new_playeritem = player->getWieldIndex(); + u16 max_item = player->getMaxHotbarItemcount(); + if (max_item == 0) + return; + max_item -= 1; + /* Item selection using mouse wheel */ - *new_playeritem = player->getWieldIndex(); - u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1, - player->hud_hotbar_itemcount - 1); - s32 wheel = input->getMouseWheel(); if (!m_enable_hotbar_mouse_wheel) wheel = 0; diff --git a/src/client/hud.cpp b/src/client/hud.cpp index c5e71b853..3a0e25a07 100644 --- a/src/client/hud.cpp +++ b/src/client/hud.cpp @@ -783,7 +783,7 @@ void Hud::drawHotbar(u16 playeritem) v2s32 centerlowerpos(m_displaycenter.X, m_screensize.Y); - s32 hotbar_itemcount = player->hud_hotbar_itemcount; + s32 hotbar_itemcount = player->getMaxHotbarItemcount(); s32 width = hotbar_itemcount * (m_hotbar_imagesize + m_padding * 2); v2s32 pos = centerlowerpos - v2s32(width / 2, m_hotbar_imagesize + m_padding * 3); diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 2c6f024ee..c1ac821d3 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -852,11 +852,11 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt) *pkt >> item; - if (item >= player->getHotbarItemcount()) { + if (item >= player->getMaxHotbarItemcount()) { actionstream << "Player: " << player->getName() << " tried to access item=" << item << " out of hotbar_itemcount=" - << player->getHotbarItemcount() + << player->getMaxHotbarItemcount() << "; ignoring." << std::endl; return; } @@ -983,11 +983,11 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Update wielded item - if (item_i >= player->getHotbarItemcount()) { + if (item_i >= player->getMaxHotbarItemcount()) { actionstream << "Player: " << player->getName() << " tried to access item=" << item_i << " out of hotbar_itemcount=" - << player->getHotbarItemcount() + << player->getMaxHotbarItemcount() << "; ignoring." << std::endl; return; } diff --git a/src/player.cpp b/src/player.cpp index c876b6948..282246a6a 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -88,6 +88,11 @@ void Player::setWieldIndex(u16 index) m_wield_index = MYMIN(index, mlist ? mlist->getSize() : 0); } +u16 Player::getWieldIndex() +{ + return std::min(m_wield_index, getMaxHotbarItemcount()); +} + ItemStack &Player::getWieldedItem(ItemStack *selected, ItemStack *hand) const { assert(selected); @@ -157,6 +162,12 @@ void Player::clearHud() } } +u16 Player::getMaxHotbarItemcount() +{ + InventoryList *mainlist = inventory.getList("main"); + return mainlist ? std::min(mainlist->getSize(), (u32) hud_hotbar_itemcount) : 0; +} + #ifndef SERVER u32 PlayerControl::getKeysPressed() const diff --git a/src/player.h b/src/player.h index 373c81780..797b79eb1 100644 --- a/src/player.h +++ b/src/player.h @@ -223,7 +223,7 @@ public: // Returns non-empty `selected` ItemStack. `hand` is a fallback, if specified ItemStack &getWieldedItem(ItemStack *selected, ItemStack *hand) const; void setWieldIndex(u16 index); - u16 getWieldIndex() const { return m_wield_index; } + u16 getWieldIndex(); bool setFov(const PlayerFovSpec &spec) { @@ -247,6 +247,9 @@ public: u32 hud_flags; s32 hud_hotbar_itemcount; + // Get actual usable number of hotbar items (clamped to size of "main" list) + u16 getMaxHotbarItemcount(); + protected: char m_name[PLAYERNAME_SIZE]; v3f m_speed; // velocity; in BS-space diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index f3aa816a5..bdb2d97e5 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1842,7 +1842,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L) if (player == nullptr) return 0; - lua_pushinteger(L, player->getHotbarItemcount()); + lua_pushinteger(L, player->getMaxHotbarItemcount()); return 1; } From cb0bbea2a597192ab339f3298dccef97622a7039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Mon, 12 Aug 2024 18:52:33 +0200 Subject: [PATCH 48/59] refacto: rework the GUI element handler function (#14793) We have a very very old way to perform this handling. With this new method, we have a more proper and flexible way to extend our UI with comprehensible handlers with common interface parameters In terms of performance, it took very few more more memory and scraping is more faster, using the unordered_map benefits --- src/gui/guiFormSpecMenu.cpp | 293 +++++++++++------------------------- src/gui/guiFormSpecMenu.h | 20 +-- 2 files changed, 97 insertions(+), 216 deletions(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 99a93e051..a2982fdd2 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -342,7 +342,7 @@ void GUIFormSpecMenu::parseContainer(parserData* data, const std::string &elemen errorstream<< "Invalid container start element (" << parts.size() << "): '" << element << "'" << std::endl; } -void GUIFormSpecMenu::parseContainerEnd(parserData* data) +void GUIFormSpecMenu::parseContainerEnd(parserData* data, const std::string &) { if (container_stack.empty()) { errorstream<< "Invalid container end element, no matching container start element" << std::endl; @@ -419,7 +419,7 @@ void GUIFormSpecMenu::parseScrollContainer(parserData *data, const std::string & pos_offset.Y = 0.0f; } -void GUIFormSpecMenu::parseScrollContainerEnd(parserData *data) +void GUIFormSpecMenu::parseScrollContainerEnd(parserData *data, const std::string &) { if (data->current_parent == this || data->current_parent->getParent() == this || container_stack.empty()) { @@ -641,6 +641,11 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element m_fields.push_back(spec); } +void GUIFormSpecMenu::parseRealCoordinates(parserData* data, const std::string &element) +{ + data->real_coordinates = is_yes(element); +} + void GUIFormSpecMenu::parseScrollBar(parserData* data, const std::string &element) { std::vector parts; @@ -973,10 +978,9 @@ void GUIFormSpecMenu::parseItemImage(parserData* data, const std::string &elemen m_fields.push_back(spec); } -void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, - const std::string &type) +void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element) { - int expected_parts = (type == "button_url" || type == "button_url_exit") ? 5 : 4; + int expected_parts = (data->type == "button_url" || data->type == "button_url_exit") ? 5 : 4; std::vector parts; if (!precheckElement("button", element, expected_parts, expected_parts, parts)) return; @@ -986,7 +990,7 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, std::string name = parts[2]; std::string label = parts[3]; std::string url; - if (type == "button_url" || type == "button_url_exit") + if (data->type == "button_url" || data->type == "button_url_exit") url = parts[4]; MY_CHECKPOS("button",0); @@ -1022,15 +1026,15 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, 258 + m_fields.size() ); spec.ftype = f_Button; - if (type == "button_exit" || type == "button_url_exit") + if (data->type == "button_exit" || data->type == "button_url_exit") spec.is_exit = true; - if (type == "button_url" || type == "button_url_exit") + if (data->type == "button_url" || data->type == "button_url_exit") spec.url = url; GUIButton *e = GUIButton::addButton(Environment, rect, m_tsrc, data->current_parent, spec.fid, spec.flabel.c_str()); - auto style = getStyleForElement(type, name, (type != "button") ? "button" : ""); + auto style = getStyleForElement(data->type, name, (data->type != "button") ? "button" : ""); spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); @@ -1690,11 +1694,10 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector& m_fields.push_back(spec); } -void GUIFormSpecMenu::parseField(parserData* data, const std::string &element, - const std::string &type) +void GUIFormSpecMenu::parseField(parserData* data, const std::string &element) { std::vector parts; - if (!precheckElement(type, element, 3, 5, parts)) + if (!precheckElement(data->type, element, 3, 5, parts)) return; if (parts.size() == 3 || parts.size() == 4) { @@ -1703,7 +1706,7 @@ void GUIFormSpecMenu::parseField(parserData* data, const std::string &element, } // Else: >= 5 arguments in "parts" - parseTextArea(data, parts, type); + parseTextArea(data, parts, data->type); } void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &element) @@ -1926,8 +1929,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &elemen m_clickthrough_elements.push_back(e); } -void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element, - const std::string &type) +void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element) { std::vector parts; if (!precheckElement("image_button", element, 5, 8, parts)) @@ -1984,7 +1986,8 @@ void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &elem 258 + m_fields.size() ); spec.ftype = f_Button; - if (type == "image_button_exit") + + if (data->type == "image_button_exit") spec.is_exit = true; GUIButtonImage *e = GUIButtonImage::addButton(Environment, rect, m_tsrc, @@ -2584,14 +2587,21 @@ void GUIFormSpecMenu::parsePadding(parserData *data, const std::string &element) << "'" << std::endl; } -bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, bool style_type) +void GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element) { + if (data->type != "style" && data->type != "style_type") { + errorstream << "Invalid style element type: '" << data->type << "'" << std::endl; + return; + } + + bool style_type = (data->type == "style_type"); + std::vector parts = split(element, ';'); if (parts.size() < 2) { errorstream << "Invalid style element (" << parts.size() << "): '" << element << "'" << std::endl; - return false; + return; } StyleSpec spec; @@ -2602,7 +2612,7 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b if (equal_pos == std::string::npos) { errorstream << "Invalid style element (Property missing value): '" << element << "'" << std::endl; - return false; + return; } std::string propname = trim(parts[i].substr(0, equal_pos)); @@ -2717,10 +2727,10 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b } } - return true; + return; } -void GUIFormSpecMenu::parseSetFocus(const std::string &element) +void GUIFormSpecMenu::parseSetFocus(parserData*, const std::string &element) { std::vector parts; if (!precheckElement("set_focus", element, 1, 2, parts)) @@ -2846,6 +2856,55 @@ void GUIFormSpecMenu::removeAll() scroll_container_it.second->drop(); } +const std::unordered_map> GUIFormSpecMenu::element_parsers = { + {"container", &GUIFormSpecMenu::parseContainer}, + {"container_end", &GUIFormSpecMenu::parseContainerEnd}, + {"list", &GUIFormSpecMenu::parseList}, + {"listring", &GUIFormSpecMenu::parseListRing}, + {"checkbox", &GUIFormSpecMenu::parseCheckbox}, + {"image", &GUIFormSpecMenu::parseImage}, + {"animated_image", &GUIFormSpecMenu::parseAnimatedImage}, + {"item_image", &GUIFormSpecMenu::parseItemImage}, + {"button", &GUIFormSpecMenu::parseButton}, + {"button_exit", &GUIFormSpecMenu::parseButton}, + {"button_url", &GUIFormSpecMenu::parseButton}, + {"button_url_exit", &GUIFormSpecMenu::parseButton}, + {"background", &GUIFormSpecMenu::parseBackground}, + {"background9", &GUIFormSpecMenu::parseBackground}, + {"tableoptions", &GUIFormSpecMenu::parseTableOptions}, + {"tablecolumns", &GUIFormSpecMenu::parseTableColumns}, + {"table", &GUIFormSpecMenu::parseTable}, + {"textlist", &GUIFormSpecMenu::parseTextList}, + {"dropdown", &GUIFormSpecMenu::parseDropDown}, + {"field_enter_after_edit", &GUIFormSpecMenu::parseFieldEnterAfterEdit}, + {"field_close_on_enter", &GUIFormSpecMenu::parseFieldCloseOnEnter}, + {"pwdfield", &GUIFormSpecMenu::parsePwdField}, + {"field", &GUIFormSpecMenu::parseField}, + {"textarea", &GUIFormSpecMenu::parseField}, + {"hypertext", &GUIFormSpecMenu::parseHyperText}, + {"label", &GUIFormSpecMenu::parseLabel}, + {"vertlabel", &GUIFormSpecMenu::parseVertLabel}, + {"item_image_button", &GUIFormSpecMenu::parseItemImageButton}, + {"image_button", &GUIFormSpecMenu::parseImageButton}, + {"image_button_exit", &GUIFormSpecMenu::parseImageButton}, + {"tabheader", &GUIFormSpecMenu::parseTabHeader}, + {"box", &GUIFormSpecMenu::parseBox}, + {"bgcolor", &GUIFormSpecMenu::parseBackgroundColor}, + {"listcolors", &GUIFormSpecMenu::parseListColors}, + {"tooltip", &GUIFormSpecMenu::parseTooltip}, + {"scrollbar", &GUIFormSpecMenu::parseScrollBar}, + {"real_coordinates", &GUIFormSpecMenu::parseRealCoordinates}, + {"style", &GUIFormSpecMenu::parseStyle}, + {"style_type", &GUIFormSpecMenu::parseStyle}, + {"scrollbaroptions", &GUIFormSpecMenu::parseScrollBarOptions}, + {"scroll_container", &GUIFormSpecMenu::parseScrollContainer}, + {"scroll_container_end", &GUIFormSpecMenu::parseScrollContainerEnd}, + {"set_focus", &GUIFormSpecMenu::parseSetFocus}, + {"model", &GUIFormSpecMenu::parseModel}, +}; + + void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) { //some prechecks @@ -2862,195 +2921,15 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) std::string type = trim(element.substr(0, pos)); std::string description = element.substr(pos+1); - if (type == "container") { - parseContainer(data, description); + // They remain here due to bool flags, for now + data->type = type; + + auto it = element_parsers.find(type); + if (it != element_parsers.end()) { + it->second(this, data, description); return; } - if (type == "container_end") { - parseContainerEnd(data); - return; - } - - if (type == "list") { - parseList(data, description); - return; - } - - if (type == "listring") { - parseListRing(data, description); - return; - } - - if (type == "checkbox") { - parseCheckbox(data, description); - return; - } - - if (type == "image") { - parseImage(data, description); - return; - } - - if (type == "animated_image") { - parseAnimatedImage(data, description); - return; - } - - if (type == "item_image") { - parseItemImage(data, description); - return; - } - - if (type == "button" || type == "button_exit" || type == "button_url" || type == "button_url_exit") { - parseButton(data, description, type); - return; - } - - if (type == "background" || type == "background9") { - parseBackground(data, description); - return; - } - - if (type == "tableoptions"){ - parseTableOptions(data,description); - return; - } - - if (type == "tablecolumns"){ - parseTableColumns(data,description); - return; - } - - if (type == "table"){ - parseTable(data,description); - return; - } - - if (type == "textlist"){ - parseTextList(data,description); - return; - } - - if (type == "dropdown"){ - parseDropDown(data,description); - return; - } - - if (type == "field_enter_after_edit") { - parseFieldEnterAfterEdit(data, description); - return; - } - - if (type == "field_close_on_enter") { - parseFieldCloseOnEnter(data, description); - return; - } - - if (type == "pwdfield") { - parsePwdField(data,description); - return; - } - - if ((type == "field") || (type == "textarea")){ - parseField(data,description,type); - return; - } - - if (type == "hypertext") { - parseHyperText(data,description); - return; - } - - if (type == "label") { - parseLabel(data,description); - return; - } - - if (type == "vertlabel") { - parseVertLabel(data,description); - return; - } - - if (type == "item_image_button") { - parseItemImageButton(data,description); - return; - } - - if ((type == "image_button") || (type == "image_button_exit")) { - parseImageButton(data,description,type); - return; - } - - if (type == "tabheader") { - parseTabHeader(data,description); - return; - } - - if (type == "box") { - parseBox(data,description); - return; - } - - if (type == "bgcolor") { - parseBackgroundColor(data,description); - return; - } - - if (type == "listcolors") { - parseListColors(data,description); - return; - } - - if (type == "tooltip") { - parseTooltip(data,description); - return; - } - - if (type == "scrollbar") { - parseScrollBar(data, description); - return; - } - - if (type == "real_coordinates") { - data->real_coordinates = is_yes(description); - return; - } - - if (type == "style") { - parseStyle(data, description, false); - return; - } - - if (type == "style_type") { - parseStyle(data, description, true); - return; - } - - if (type == "scrollbaroptions") { - parseScrollBarOptions(data, description); - return; - } - - if (type == "scroll_container") { - parseScrollContainer(data, description); - return; - } - - if (type == "scroll_container_end") { - parseScrollContainerEnd(data); - return; - } - - if (type == "set_focus") { - parseSetFocus(description); - return; - } - - if (type == "model") { - parseModel(data, description); - return; - } // Ignore others infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\"" diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 9ded4c7a8..8c4fda32e 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -423,8 +423,11 @@ private: // used to restore table selection/scroll/treeview state std::unordered_map table_dyndata; + std::string type; }; + static const std::unordered_map> element_parsers; + struct fs_key_pending { bool key_up; bool key_down; @@ -442,17 +445,16 @@ private: void parseSize(parserData* data, const std::string &element); void parseContainer(parserData* data, const std::string &element); - void parseContainerEnd(parserData* data); + void parseContainerEnd(parserData* data, const std::string &element); void parseScrollContainer(parserData *data, const std::string &element); - void parseScrollContainerEnd(parserData *data); + void parseScrollContainerEnd(parserData *data, const std::string &element); void parseList(parserData* data, const std::string &element); void parseListRing(parserData* data, const std::string &element); void parseCheckbox(parserData* data, const std::string &element); void parseImage(parserData* data, const std::string &element); void parseAnimatedImage(parserData *data, const std::string &element); void parseItemImage(parserData* data, const std::string &element); - void parseButton(parserData* data, const std::string &element, - const std::string &typ); + void parseButton(parserData* data, const std::string &element); void parseBackground(parserData* data, const std::string &element); void parseTableOptions(parserData* data, const std::string &element); void parseTableColumns(parserData* data, const std::string &element); @@ -462,7 +464,7 @@ private: void parseFieldEnterAfterEdit(parserData *data, const std::string &element); void parseFieldCloseOnEnter(parserData *data, const std::string &element); void parsePwdField(parserData* data, const std::string &element); - void parseField(parserData* data, const std::string &element, const std::string &type); + void parseField(parserData* data, const std::string &element); void createTextField(parserData *data, FieldSpec &spec, core::rect &rect, bool is_multiline); void parseSimpleField(parserData* data,std::vector &parts); @@ -471,8 +473,7 @@ private: void parseHyperText(parserData *data, const std::string &element); void parseLabel(parserData* data, const std::string &element); void parseVertLabel(parserData* data, const std::string &element); - void parseImageButton(parserData* data, const std::string &element, - const std::string &type); + void parseImageButton(parserData* data, const std::string &element); void parseItemImageButton(parserData* data, const std::string &element); void parseTabHeader(parserData* data, const std::string &element); void parseBox(parserData* data, const std::string &element); @@ -481,6 +482,7 @@ private: void parseTooltip(parserData* data, const std::string &element); bool parseVersionDirect(const std::string &data); bool parseSizeDirect(parserData* data, const std::string &element); + void parseRealCoordinates(parserData* data, const std::string &element); void parseScrollBar(parserData* data, const std::string &element); void parseScrollBarOptions(parserData *data, const std::string &element); bool parsePositionDirect(parserData *data, const std::string &element); @@ -489,8 +491,8 @@ private: void parseAnchor(parserData *data, const std::string &element); bool parsePaddingDirect(parserData *data, const std::string &element); void parsePadding(parserData *data, const std::string &element); - bool parseStyle(parserData *data, const std::string &element, bool style_type); - void parseSetFocus(const std::string &element); + void parseStyle(parserData *data, const std::string &element); + void parseSetFocus(parserData *, const std::string &element); void parseModel(parserData *data, const std::string &element); bool parseMiddleRect(const std::string &value, core::rect *parsed_rect); From e6f77b95f3d419fecb2bc7ac9f5c6099660ac791 Mon Sep 17 00:00:00 2001 From: Erich Schubert Date: Tue, 13 Aug 2024 18:38:07 +0200 Subject: [PATCH 49/59] Add `vector.random_direction()` (#14784) Generate a random vector of unit length. Useful for many mods. --- builtin/common/vector.lua | 12 ++++++++++++ doc/lua_api.md | 2 ++ 2 files changed, 14 insertions(+) diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index e2008a9d7..be82401c3 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -375,6 +375,18 @@ function vector.in_area(pos, min, max) (pos.z >= min.z) and (pos.z <= max.z) end +function vector.random_direction() + -- Generate a random direction of unit length, via rejection sampling + local x, y, z, l2 + repeat -- expected less than two attempts on average (volume sphere vs. cube) + x, y, z = math.random() * 2 - 1, math.random() * 2 - 1, math.random() * 2 - 1 + l2 = x*x + y*y + z*z + until l2 <= 1 and l2 >= 1e-6 + -- normalize + local l = math.sqrt(l2) + return fast_new(x/l, y/l, z/l) +end + if rawget(_G, "core") and core.set_read_vector and core.set_push_vector then local function read_vector(v) return v.x, v.y, v.z diff --git a/doc/lua_api.md b/doc/lua_api.md index f892e0a5c..34e9c190a 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -3820,6 +3820,8 @@ vectors are written like this: `(x, y, z)`: `vector.new(v)` does the same as `vector.copy(v)` * `vector.zero()`: * Returns a new vector `(0, 0, 0)`. +* `vector.random_direction()`: + * Returns a new vector of length 1, pointing into a direction chosen uniformly at random. * `vector.copy(v)`: * Returns a copy of the vector `v`. * `vector.from_string(s[, init])`: From 0fb67ccb340fd223339810f6fc2f62799fbc6c6f Mon Sep 17 00:00:00 2001 From: Gregor Parzefall Date: Fri, 12 Jul 2024 17:27:21 +0200 Subject: [PATCH 50/59] Add setting to disable smooth scrolling --- builtin/settingtypes.txt | 3 +++ src/defaultsettings.cpp | 1 + src/gui/guiScrollBar.cpp | 44 ++++++++++++++++++++-------------------- src/gui/guiScrollBar.h | 2 ++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index eb7eda0d7..8828fc1df 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -694,6 +694,9 @@ language (Language) enum ,be,bg,ca,cs,da,de,el,en,eo,es,et,eu,fi,fr,gd,gl,hu,i # edge pixels when images are scaled by non-integer sizes. gui_scaling (GUI scaling) float 1.0 0.5 20 +# Enables smooth scrolling. +smooth_scrolling (Smooth scrolling) bool true + # Enables animation of inventory items. inventory_items_animations (Inventory items animations) bool false diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 5fce1b0a8..f8cfd18b4 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -299,6 +299,7 @@ void set_default_settings() settings->setDefault("gui_scaling", "1.0"); settings->setDefault("gui_scaling_filter", "false"); settings->setDefault("gui_scaling_filter_txr2img", "true"); + settings->setDefault("smooth_scrolling", "true"); settings->setDefault("desynchronize_mapblock_texture_animation", "false"); settings->setDefault("hud_hotbar_max_width", "1.0"); settings->setDefault("enable_local_map_saving", "false"); diff --git a/src/gui/guiScrollBar.cpp b/src/gui/guiScrollBar.cpp index 8e8935b2d..01a7af8c9 100644 --- a/src/gui/guiScrollBar.cpp +++ b/src/gui/guiScrollBar.cpp @@ -13,6 +13,7 @@ the arrow buttons where there is insufficient space. #include "guiScrollBar.h" #include "guiButton.h" #include "porting.h" +#include "settings.h" #include GUIScrollBar::GUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s32 id, @@ -101,19 +102,9 @@ bool GUIScrollBar::OnEvent(const SEvent &event) tray_clicked = !dragged_by_slider; if (tray_clicked) { const s32 new_pos = getPosFromMousePos(p); - const s32 old_pos = scroll_pos; - setPos(new_pos); + setPosAndSend(new_pos); // drag in the middle drag_offset = thumb_size / 2; - // report the scroll event - if (scroll_pos != old_pos && Parent) { - SEvent e; - e.EventType = EET_GUI_EVENT; - e.GUIEvent.Caller = this; - e.GUIEvent.Element = nullptr; - e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; - Parent->OnEvent(e); - } } Environment->setFocus(this); return true; @@ -147,18 +138,8 @@ bool GUIScrollBar::OnEvent(const SEvent &event) } const s32 new_pos = getPosFromMousePos(p); - const s32 old_pos = scroll_pos; + setPosAndSend(new_pos); - setPos(new_pos); - - if (scroll_pos != old_pos && Parent) { - SEvent e; - e.EventType = EET_GUI_EVENT; - e.GUIEvent.Caller = this; - e.GUIEvent.Element = nullptr; - e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; - Parent->OnEvent(e); - } return is_inside; } default: @@ -300,8 +281,27 @@ void GUIScrollBar::setPos(const s32 &pos) target_pos = std::nullopt; } +void GUIScrollBar::setPosAndSend(const s32 &pos) +{ + const s32 old_pos = scroll_pos; + setPos(pos); + if (scroll_pos != old_pos && Parent) { + SEvent e; + e.EventType = EET_GUI_EVENT; + e.GUIEvent.Caller = this; + e.GUIEvent.Element = nullptr; + e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED; + Parent->OnEvent(e); + } +} + void GUIScrollBar::setPosInterpolated(const s32 &pos) { + if (!g_settings->getBool("smooth_scrolling")) { + setPosAndSend(pos); + return; + } + s32 clamped = core::s32_clamp(pos, min_pos, max_pos); if (scroll_pos != clamped) { target_pos = clamped; diff --git a/src/gui/guiScrollBar.h b/src/gui/guiScrollBar.h index a976d1a59..05e195aed 100644 --- a/src/gui/guiScrollBar.h +++ b/src/gui/guiScrollBar.h @@ -53,6 +53,8 @@ public: //! Sets a position immediately, aborting any ongoing interpolation. // setPos does not send EGET_SCROLL_BAR_CHANGED events for you. void setPos(const s32 &pos); + //! The same as setPos, but it takes care of sending EGET_SCROLL_BAR_CHANGED events. + void setPosAndSend(const s32 &pos); //! Sets a target position for interpolation. // If you want to do an interpolated addition, use // setPosInterpolated(getTargetPos() + x). From a677d33bdffa110fe611e49e346c0bd99dafb5ca Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Mon, 12 Aug 2024 15:25:57 +0300 Subject: [PATCH 51/59] Include unistd.h for getpid() when _IRR_COMPILE_WITH_X11_ --- irr/src/CIrrDeviceLinux.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/irr/src/CIrrDeviceLinux.cpp b/irr/src/CIrrDeviceLinux.cpp index 71eb0f260..5491d2037 100644 --- a/irr/src/CIrrDeviceLinux.cpp +++ b/irr/src/CIrrDeviceLinux.cpp @@ -45,9 +45,12 @@ #include #endif +#if defined(_IRR_COMPILE_WITH_X11_) || defined(_IRR_COMPILE_WITH_JOYSTICK_EVENTS_) +#include +#endif + #if defined _IRR_COMPILE_WITH_JOYSTICK_EVENTS_ #include -#include #ifdef __FreeBSD__ #include From dc7a7a0ed98e10f80c7ca5ce071300ada7922eab Mon Sep 17 00:00:00 2001 From: 1F616EMO~nya Date: Wed, 14 Aug 2024 00:39:50 +0800 Subject: [PATCH 52/59] Add `table.keyof()` (#14910) --- .luacheckrc | 2 +- builtin/common/misc_helpers.lua | 10 ++++++++++ builtin/common/tests/misc_helpers_spec.lua | 10 ++++++++++ doc/lua_api.md | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.luacheckrc b/.luacheckrc index fcc04cab3..f184e6d59 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -20,7 +20,7 @@ read_globals = { "PerlinNoise", "PerlinNoiseMap", string = {fields = {"split", "trim"}}, - table = {fields = {"copy", "getn", "indexof", "insert_all"}}, + table = {fields = {"copy", "getn", "indexof", "keyof", "insert_all"}}, math = {fields = {"hypot", "round"}}, } diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index 5e550348d..fb38c1b35 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -205,6 +205,16 @@ function table.indexof(list, val) return -1 end +-------------------------------------------------------------------------------- +function table.keyof(tb, val) + for k, v in pairs(tb) do + if v == val then + return k + end + end + return nil +end + -------------------------------------------------------------------------------- function string:trim() return self:match("^%s*(.-)%s*$") diff --git a/builtin/common/tests/misc_helpers_spec.lua b/builtin/common/tests/misc_helpers_spec.lua index 65549c2e3..611c4b20f 100644 --- a/builtin/common/tests/misc_helpers_spec.lua +++ b/builtin/common/tests/misc_helpers_spec.lua @@ -166,6 +166,16 @@ describe("table", function() it("indexof()", function() assert.equal(1, table.indexof({"foo", "bar"}, "foo")) assert.equal(-1, table.indexof({"foo", "bar"}, "baz")) + assert.equal(-1, table.indexof({[2] = "foo", [3] = "bar"}, "foo")) + assert.equal(-1, table.indexof({[1] = "foo", [3] = "bar"}, "bar")) + end) + + it("keyof()", function() + assert.equal("a", table.keyof({a = "foo", b = "bar"}, "foo")) + assert.equal(nil, table.keyof({a = "foo", b = "bar"}, "baz")) + assert.equal(1, table.keyof({"foo", "bar"}, "foo")) + assert.equal(2, table.keyof({[2] = "foo", [3] = "bar"}, "foo")) + assert.equal(3, table.keyof({[1] = "foo", [3] = "bar"}, "bar")) end) end) diff --git a/doc/lua_api.md b/doc/lua_api.md index 34e9c190a..836044a34 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -4025,6 +4025,10 @@ Helper functions the value `val` in the table `list`. Non-numerical indices are ignored. If `val` could not be found, `-1` is returned. `list` must not have negative indices. +* `table.keyof(table, val)`: returns the key containing + the value `val` in the table `table`. If multiple keys contain `val`, + it is unspecified which key will be returned. + If `val` could not be found, `nil` is returned. * `table.insert_all(table, other_table)`: * Appends all values in `other_table` to `table` - uses `#table + 1` to find new indices. From ea96f6e1e37b4528668c084b036265354cf7d2c0 Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:59:20 +0200 Subject: [PATCH 53/59] DOCS: state that `initial_properties` are shared between entity instances --- doc/lua_api.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index 836044a34..eed63862a 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -8915,7 +8915,10 @@ Player properties need to be saved manually. Entity definition ----------------- -Used by `minetest.register_entity`. +Used by `minetest.register_entity`. +The entity definition table becomes a metatable of a newly created per-entity +luaentity table, meaning its fields (e.g. `initial_properties`) will be shared +between all instances of an entity. ```lua { From 9046379b30b4eae28f72fa96c7d84f6053db2cd9 Mon Sep 17 00:00:00 2001 From: Erich Schubert Date: Fri, 16 Aug 2024 21:59:36 +0200 Subject: [PATCH 54/59] Fix chance/probability wording in lua_api.md --- doc/lua_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index eed63862a..74728a018 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -8975,7 +8975,7 @@ Used by `minetest.register_abm`. -- Operation interval in seconds chance = 50, - -- Chance of triggering `action` per-node per-interval is 1.0 / chance + -- Probability of triggering `action` per-node per-interval is 1.0 / chance (integers only) min_y = -32768, max_y = 32767, From 603eb579431bf366f8186ea5d11eb6f2f35f746f Mon Sep 17 00:00:00 2001 From: DS Date: Fri, 16 Aug 2024 22:01:16 +0200 Subject: [PATCH 55/59] Fix comment and alpha test node oopsies from #14852 --- games/devtest/mods/testnodes/textures.lua | 8 +++++--- .../testnodes_alpha_compositing_bottom.png | Bin 251 -> 265 bytes src/client/imagesource.cpp | 12 +++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/games/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua index 86bc3e343..96f291d6a 100644 --- a/games/devtest/mods/testnodes/textures.lua +++ b/games/devtest/mods/testnodes/textures.lua @@ -89,10 +89,12 @@ for a=1,#alphas do end minetest.register_node("testnodes:alpha_compositing", { - description = S("Alpha Compositing Test Node") .. "\n" .. + description = S("Texture Overlay Test Node") .. "\n" .. S("A regular grid should be visible where each cell contains two " .. - "texels with the same colour.") .. "\n" .. - S("Alpha compositing is gamma-incorrect for backwards compatibility."), + "texels with the same color.") .. "\n" .. + S("Texture overlay is gamma-incorrect, " .. + "and in general it does not do alpha compositing, " .. + "both for backwards compatibility."), drawtype = "glasslike", paramtype = "light", tiles = {"testnodes_alpha_compositing_bottom.png^" .. diff --git a/games/devtest/mods/testnodes/textures/testnodes_alpha_compositing_bottom.png b/games/devtest/mods/testnodes/textures/testnodes_alpha_compositing_bottom.png index 83447e42309a9c7433a74662b39fb40175bb74a9..40d9f53dea9a98a249ba624c9a39f778ddc2bdd2 100644 GIT binary patch delta 248 zcmey(*vT|OvYwfNfk8u;KNv{)1^9%x0%_6WY_Y=3d|8KGi%>gRp zEeY}qW?*LK;&KTD8nI%*?y}vd$@?2>?*OT`~Xw delta 234 zcmV>+AnNo19bT z;^M#tl6Q7>6oJbF36P&K6(9`2FAoDi0l1TqC1Gq_@)R3DFdYDyWTpdz0Yg0<0BOq7 k0g$FF9l*qJ$y00q0DfS@_D8%Q_y7O^07*qoM6N<$f(SBZ9{>OV diff --git a/src/client/imagesource.cpp b/src/client/imagesource.cpp index 696159408..adc39f130 100644 --- a/src/client/imagesource.cpp +++ b/src/client/imagesource.cpp @@ -371,14 +371,12 @@ void blitBaseImage(video::IImage* &src, video::IImage* &dst) namespace { -/** Calculate the color of a single pixel drawn on top of another pixel without - * gamma correction +/** Calculate the result of the overlay texture modifier (`^`) for a single + * pixel * - * The color mixing is a little more complicated than just - * video::SColor::getInterpolated because getInterpolated does not handle alpha - * correctly. - * For example, a pixel with alpha=64 drawn atop a pixel with alpha=128 should - * yield a pixel with alpha=160, while getInterpolated would yield alpha=96. + * This is not alpha blending if both src and dst are semi-transparent. The + * reason this is that an old implementation did it wrong, and fixing it would + * break backwards compatibility (see #14847). * * \tparam overlay If enabled, only modify dst_col if it is fully opaque * \param src_col Color of the top pixel From cc8e7a569e9cf3e532b76a92aa4d1620857fe3b1 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Sun, 12 Nov 2023 15:25:46 +0100 Subject: [PATCH 56/59] Switch player names to `std::string` --- src/client/client.cpp | 2 +- src/client/content_cao.cpp | 2 +- src/client/localplayer.cpp | 3 ++- src/client/localplayer.h | 4 +++- src/database/database-files.cpp | 9 ++++----- src/database/database-postgresql.cpp | 14 +++++++------- src/network/serverpackethandler.cpp | 6 +++--- src/player.cpp | 4 ++-- src/player.h | 7 ++++--- src/remoteplayer.cpp | 2 +- src/remoteplayer.h | 2 +- src/script/cpp_api/s_server.cpp | 4 ++-- src/script/cpp_api/s_server.h | 2 +- src/script/lua_api/l_localplayer.cpp | 2 +- src/script/lua_api/l_object.cpp | 2 +- src/server.cpp | 4 ++-- src/serverenvironment.cpp | 4 ++-- src/serverenvironment.h | 2 +- 18 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 61140d87a..af32b6db8 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -1594,7 +1594,7 @@ Inventory* Client::getInventory(const InventoryLocation &loc) { // Check if we are working with local player inventory LocalPlayer *player = m_env.getLocalPlayer(); - if (!player || strcmp(player->getName(), loc.name.c_str()) != 0) + if (!player || player->getName() != loc.name) return NULL; return &player->inventory; } diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index d24dc8433..7913e477a 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -385,7 +385,7 @@ void GenericCAO::processInitData(const std::string &data) if (m_is_player) { // Check if it's the current player LocalPlayer *player = m_env->getLocalPlayer(); - if (player && strcmp(player->getName(), m_name.c_str()) == 0) { + if (player && player->getName() == m_name) { m_is_local_player = true; m_is_visible = false; player->setCAO(this); diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index da87e9b17..2329dd2c0 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include +#include #include "mtevent.h" #include "collision.h" #include "nodedef.h" @@ -75,7 +76,7 @@ void PlayerSettings::settingsChangedCallback(const std::string &name, void *data LocalPlayer */ -LocalPlayer::LocalPlayer(Client *client, const char *name): +LocalPlayer::LocalPlayer(Client *client, const std::string &name): Player(name, client->idef()), m_client(client) { diff --git a/src/client/localplayer.h b/src/client/localplayer.h index fbccb1591..815fafa8b 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "settings.h" #include "lighting.h" +#include class Client; class Environment; @@ -63,7 +64,8 @@ private: class LocalPlayer : public Player { public: - LocalPlayer(Client *client, const char *name); + + LocalPlayer(Client *client, const std::string &name); virtual ~LocalPlayer(); // Initialize hp to 0, so that no hearts will be shown if server diff --git a/src/database/database-files.cpp b/src/database/database-files.cpp index 27f42fc97..612fed6c6 100644 --- a/src/database/database-files.cpp +++ b/src/database/database-files.cpp @@ -48,8 +48,7 @@ void PlayerDatabaseFiles::deSerialize(RemotePlayer *p, std::istream &is, p->m_dirty = true; //args.getS32("version"); // Version field value not used - const std::string &name = args.get("name"); - strlcpy(p->m_name, name.c_str(), PLAYERNAME_SIZE); + p->m_name = args.get("name"); if (sao) { try { @@ -96,7 +95,7 @@ void PlayerDatabaseFiles::deSerialize(RemotePlayer *p, std::istream &is, p->inventory.deSerialize(is); } catch (SerializationError &e) { errorstream << "Failed to deserialize player inventory. player_name=" - << name << " " << e.what() << std::endl; + << p->getName() << " " << e.what() << std::endl; } if (!p->inventory.getList("craftpreview") && p->inventory.getList("craftresult")) { @@ -119,7 +118,7 @@ void PlayerDatabaseFiles::serialize(RemotePlayer *p, std::ostream &os) // Utilize a Settings object for storing values Settings args("PlayerArgsEnd"); args.setS32("version", 1); - args.set("name", p->m_name); + args.set("name", p->getName()); PlayerSAO *sao = p->getPlayerSAO(); // This should not happen @@ -171,7 +170,7 @@ void PlayerDatabaseFiles::savePlayer(RemotePlayer *player) deSerialize(&testplayer, is, path, NULL); is.close(); - if (strcmp(testplayer.getName(), player->getName()) == 0) { + if (testplayer.getName() == player->getName()) { path_found = true; continue; } diff --git a/src/database/database-postgresql.cpp b/src/database/database-postgresql.cpp index 667d7afbb..7c464c81a 100644 --- a/src/database/database-postgresql.cpp +++ b/src/database/database-postgresql.cpp @@ -468,7 +468,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) std::string hp = itos(sao->getHP()); std::string breath = itos(sao->getBreath()); const char *values[] = { - player->getName(), + player->getName().c_str(), pitch.c_str(), yaw.c_str(), posx.c_str(), posy.c_str(), posz.c_str(), @@ -476,7 +476,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) breath.c_str() }; - const char* rmvalues[] = { player->getName() }; + const char* rmvalues[] = { player->getName().c_str() }; beginSave(); if (getPGVersion() < 90500) { @@ -501,7 +501,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) inv_id = itos(i), lsize = itos(list->getSize()); const char* inv_values[] = { - player->getName(), + player->getName().c_str(), inv_id.c_str(), width.c_str(), name.c_str(), @@ -516,7 +516,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) std::string itemStr = oss.str(), slotId = itos(j); const char* invitem_values[] = { - player->getName(), + player->getName().c_str(), inv_id.c_str(), slotId.c_str(), itemStr.c_str() @@ -529,7 +529,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) const StringMap &attrs = sao->getMeta().getStrings(); for (const auto &attr : attrs) { const char *meta_values[] = { - player->getName(), + player->getName().c_str(), attr.first.c_str(), attr.second.c_str() }; @@ -545,7 +545,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao) sanity_check(sao); verifyDatabase(); - const char *values[] = { player->getName() }; + const char *values[] = { player->getName().c_str() }; PGresult *results = execPrepared("load_player", 1, values, false, false); // Player not found, return not found @@ -580,7 +580,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao) std::string invIdStr = itos(invId); const char* values2[] = { - player->getName(), + player->getName().c_str(), invIdStr.c_str() }; PGresult *results2 = execPrepared("load_player_inventory_items", 2, diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index c1ac821d3..9de39229b 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -615,7 +615,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) // If something goes wrong, this player is to blame RollbackScopeActor rollback_scope(m_rollback, - std::string("player:")+player->getName()); + "player:" + player->getName()); /* Note: Always set inventory not sent, to repair cases @@ -1069,7 +1069,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) If something goes wrong, this player is to blame */ RollbackScopeActor rollback_scope(m_rollback, - std::string("player:")+player->getName()); + "player:" + player->getName()); switch (action) { // Start digging or punch object @@ -1400,7 +1400,7 @@ void Server::handleCommand_NodeMetaFields(NetworkPacket* pkt) // If something goes wrong, this player is to blame RollbackScopeActor rollback_scope(m_rollback, - std::string("player:")+player->getName()); + "player:" + player->getName()); // Check the target node for rollback data; leave others unnoticed RollbackNode rn_old(&m_env->getMap(), p, this); diff --git a/src/player.cpp b/src/player.cpp index 282246a6a..021a96db6 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -30,10 +30,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" // strlcpy -Player::Player(const char *name, IItemDefManager *idef): +Player::Player(const std::string name, IItemDefManager *idef): inventory(idef) { - strlcpy(m_name, name, PLAYERNAME_SIZE); + m_name = name; inventory.clear(); inventory.addList("main", PLAYER_INVENTORY_SIZE); diff --git a/src/player.h b/src/player.h index 797b79eb1..9991dd774 100644 --- a/src/player.h +++ b/src/player.h @@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #define PLAYERNAME_SIZE 20 @@ -158,7 +159,7 @@ class Player { public: - Player(const char *name, IItemDefManager *idef); + Player(const std::string &name, IItemDefManager *idef); virtual ~Player() = 0; DISABLE_CLASS_COPY(Player); @@ -178,7 +179,7 @@ public: // in BS-space v3f getSpeed() const { return m_speed; } - const char *getName() const { return m_name; } + const std::string& getName() const { return m_name; } u32 getFreeHudID() { @@ -251,7 +252,7 @@ public: u16 getMaxHotbarItemcount(); protected: - char m_name[PLAYERNAME_SIZE]; + std::string m_name; v3f m_speed; // velocity; in BS-space u16 m_wield_index = 0; PlayerFovSpec m_fov_override_spec = { 0.0f, false, 0.0f }; diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index 9658dca06..6cffa534f 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -37,7 +37,7 @@ bool RemotePlayer::m_setting_cache_loaded = false; float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f; u16 RemotePlayer::m_setting_chat_message_limit_trigger_kick = 0; -RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): +RemotePlayer::RemotePlayer(const std::string &name, IItemDefManager *idef): Player(name, idef) { if (!RemotePlayer::m_setting_cache_loaded) { diff --git a/src/remoteplayer.h b/src/remoteplayer.h index a38f31731..e0c7ab744 100644 --- a/src/remoteplayer.h +++ b/src/remoteplayer.h @@ -41,7 +41,7 @@ class RemotePlayer : public Player friend class PlayerDatabaseFiles; public: - RemotePlayer(const char *name, IItemDefManager *idef); + RemotePlayer(const std::string &name, IItemDefManager *idef); virtual ~RemotePlayer(); PlayerSAO *getPlayerSAO() { return m_sao; } diff --git a/src/script/cpp_api/s_server.cpp b/src/script/cpp_api/s_server.cpp index c255b0c71..d8282998d 100644 --- a/src/script/cpp_api/s_server.cpp +++ b/src/script/cpp_api/s_server.cpp @@ -246,7 +246,7 @@ void ScriptApiServer::freeDynamicMediaCallback(u32 token) lua_pop(L, 2); } -void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername) +void ScriptApiServer::on_dynamic_media_added(u32 token, const std::string &playername) { SCRIPTAPI_PRECHECKHEADER @@ -257,6 +257,6 @@ void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername) lua_rawgeti(L, -1, token); luaL_checktype(L, -1, LUA_TFUNCTION); - lua_pushstring(L, playername); + lua_pushstring(L, playername.c_str()); PCALL_RES(lua_pcall(L, 1, 0, error_handler)); } diff --git a/src/script/cpp_api/s_server.h b/src/script/cpp_api/s_server.h index 58c8c0e48..bb1289dd9 100644 --- a/src/script/cpp_api/s_server.h +++ b/src/script/cpp_api/s_server.h @@ -53,7 +53,7 @@ public: /* dynamic media handling */ static u32 allocateDynamicMediaCallback(lua_State *L, int f_idx); void freeDynamicMediaCallback(u32 token); - void on_dynamic_media_added(u32 token, const char *playername); + void on_dynamic_media_added(u32 token, const std::string &playername); private: void getAuthHandler(); diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp index 72913161d..cfb7484df 100644 --- a/src/script/lua_api/l_localplayer.cpp +++ b/src/script/lua_api/l_localplayer.cpp @@ -72,7 +72,7 @@ int LuaLocalPlayer::l_get_name(lua_State *L) { LocalPlayer *player = getobject(L, 1); - lua_pushstring(L, player->getName()); + lua_pushstring(L, player->getName().c_str()); return 1; } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index bdb2d97e5..c6d4bb71a 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1166,7 +1166,7 @@ int ObjectRef::l_get_player_name(lua_State *L) return 1; } - lua_pushstring(L, player->getName()); + lua_pushstring(L, player->getName().c_str()); return 1; } diff --git a/src/server.cpp b/src/server.cpp index 86966d0ab..f6268402d 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1153,7 +1153,7 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id) */ { NetworkPacket notice_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT); - notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(player->getName()); + notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << player->getName(); m_clients.sendToAll(¬ice_pkt); } { @@ -3176,7 +3176,7 @@ std::string Server::getStatusString() RemotePlayer *player = m_env->getPlayer(client_id); // Get name of player - const char *name = player ? player->getName() : ""; + const std::string name = player ? player->getName() : ""; // Add name to information string if (!first) diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 87bb39d4c..d19019fff 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -575,10 +575,10 @@ RemotePlayer *ServerEnvironment::getPlayer(const session_t peer_id) return NULL; } -RemotePlayer *ServerEnvironment::getPlayer(const char* name, bool match_invalid_peer) +RemotePlayer *ServerEnvironment::getPlayer(const std::string &name, bool match_invalid_peer) { for (RemotePlayer *player : m_players) { - if (strcmp(player->getName(), name) != 0) + if (player->getName() != name) continue; if (match_invalid_peer || player->getPeerId() != PEER_ID_INEXISTENT) diff --git a/src/serverenvironment.h b/src/serverenvironment.h index d5d45d0f4..e02bd86b2 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -379,7 +379,7 @@ public: bool static_exists, v3s16 static_block=v3s16(0,0,0)); RemotePlayer *getPlayer(const session_t peer_id); - RemotePlayer *getPlayer(const char* name, bool match_invalid_peer = false); + RemotePlayer *getPlayer(const std::string &name, bool match_invalid_peer = false); const std::vector getPlayers() const { return m_players; } u32 getPlayerCount() const { return m_players.size(); } From 6874c358ea885beada89ff0ad54de4049799def9 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Sun, 12 Nov 2023 15:28:29 +0100 Subject: [PATCH 57/59] Allow managing object observers ----- Co-authored-by: sfan5 Co-authored-by: SmallJoker --- doc/lua_api.md | 23 +++++ games/devtest/mods/testentities/init.lua | 1 + games/devtest/mods/testentities/observers.lua | 37 ++++++++ src/client/localplayer.cpp | 1 - src/player.cpp | 2 +- src/script/lua_api/l_object.cpp | 85 +++++++++++++++++++ src/script/lua_api/l_object.h | 9 ++ src/server.cpp | 10 +++ src/server/activeobjectmgr.cpp | 22 ++++- src/server/activeobjectmgr.h | 9 +- src/server/serveractiveobject.cpp | 47 +++++++++- src/server/serveractiveobject.h | 19 +++++ src/serverenvironment.cpp | 35 +++++--- src/serverenvironment.h | 2 + src/unittest/test_serveractiveobjectmgr.cpp | 4 +- 15 files changed, 284 insertions(+), 22 deletions(-) create mode 100644 games/devtest/mods/testentities/observers.lua diff --git a/doc/lua_api.md b/doc/lua_api.md index 74728a018..5713e8696 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -7986,6 +7986,29 @@ child will follow movement and rotation of that bone. * `get_bone_overrides()`: returns all bone overrides as table `{[bonename] = override, ...}` * `set_properties(object property table)` * `get_properties()`: returns a table of all object properties +* `set_observers(observers)`: sets observers (players this object is sent to) + * If `observers` is `nil`, the object's observers are "unmanaged": + The object is sent to all players as governed by server settings. This is the default. + * `observers` is a "set" of player names: `{[player name] = true, [other player name] = true, ...}` + * A set is a table where the keys are the elements of the set (in this case, player names) + and the values are all `true`. + * Attachments: The *effective observers* of an object are made up of + all players who can observe the object *and* are also effective observers + of its parent object (if there is one). + * Players are automatically added to their own observer sets. + Players **must** effectively observe themselves. + * Object activation and deactivation are unaffected by observability. + * Attached sounds do not work correctly and thus should not be used + on objects with managed observers yet. +* `get_observers()`: + * throws an error if the object is invalid + * returns `nil` if the observers are unmanaged + * returns a table with all observer names as keys and `true` values (a "set") otherwise +* `get_effective_observers()`: + * Like `get_observers()`, but returns the "effective" observers, taking into account attachments + * Time complexity: O(nm) + * n: number of observers of the involved entities + * m: number of ancestors along the attachment chain * `is_player()`: returns true for players, false otherwise * `get_nametag_attributes()` * returns a table with the attributes of the nametag of an object diff --git a/games/devtest/mods/testentities/init.lua b/games/devtest/mods/testentities/init.lua index 9ab54f5ab..659febe20 100644 --- a/games/devtest/mods/testentities/init.lua +++ b/games/devtest/mods/testentities/init.lua @@ -1,4 +1,5 @@ dofile(minetest.get_modpath("testentities").."/visuals.lua") +dofile(minetest.get_modpath("testentities").."/observers.lua") dofile(minetest.get_modpath("testentities").."/selectionbox.lua") dofile(minetest.get_modpath("testentities").."/armor.lua") dofile(minetest.get_modpath("testentities").."/pointable.lua") diff --git a/games/devtest/mods/testentities/observers.lua b/games/devtest/mods/testentities/observers.lua new file mode 100644 index 000000000..6dbbeba42 --- /dev/null +++ b/games/devtest/mods/testentities/observers.lua @@ -0,0 +1,37 @@ +local function player_names_excluding(exclude_player_name) + local player_names = {} + for _, player in ipairs(minetest.get_connected_players()) do + player_names[player:get_player_name()] = true + end + player_names[exclude_player_name] = nil + return player_names +end + +minetest.register_entity("testentities:observable", { + initial_properties = { + visual = "sprite", + textures = { "testentities_sprite.png" }, + static_save = false, + infotext = "Punch to set observers to anyone but you" + }, + on_activate = function(self) + self.object:set_armor_groups({punch_operable = 1}) + assert(self.object:get_observers() == nil) + -- Using a value of `false` in the table should error. + assert(not pcall(self.object, self.object.set_observers, self.object, {test = false})) + end, + on_punch = function(self, puncher) + local puncher_name = puncher:get_player_name() + local observers = player_names_excluding(puncher_name) + self.object:set_observers(observers) + local got_observers = self.object:get_observers() + for name in pairs(observers) do + assert(got_observers[name]) + end + for name in pairs(got_observers) do + assert(observers[name]) + end + self.object:set_properties({infotext = "Excluding " .. puncher_name}) + return true + end +}) diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index 2329dd2c0..aa335e90e 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include -#include #include "mtevent.h" #include "collision.h" #include "nodedef.h" diff --git a/src/player.cpp b/src/player.cpp index 021a96db6..e55de5937 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" // strlcpy -Player::Player(const std::string name, IItemDefManager *idef): +Player::Player(const std::string &name, IItemDefManager *idef): inventory(idef) { m_name = name; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index c6d4bb71a..89974fb0e 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -27,6 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_converter.h" #include "common/c_content.h" #include "log.h" +#include "player.h" +#include "server/serveractiveobject.h" #include "tool.h" #include "remoteplayer.h" #include "server.h" @@ -36,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/player_sao.h" #include "server/serverinventorymgr.h" #include "server/unit_sao.h" +#include "util/string.h" using object_t = ServerActiveObject::object_t; @@ -837,6 +840,85 @@ int ObjectRef::l_get_properties(lua_State *L) return 1; } +// set_observers(self, observers) +int ObjectRef::l_set_observers(lua_State *L) +{ + GET_ENV_PTR; + ObjectRef *ref = checkObject(L, 1); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + throw LuaError("Invalid ObjectRef"); + + // Reset object to "unmanaged" (sent to everyone)? + if (lua_isnoneornil(L, 2)) { + sao->m_observers.reset(); + return 0; + } + + std::unordered_set observer_names; + lua_pushnil(L); + while (lua_next(L, 2) != 0) { + std::string name = readParam(L, -2); + if (name.empty()) + throw LuaError("Observer name is empty"); + if (name.size() > PLAYERNAME_SIZE) + throw LuaError("Observer name is too long"); + if (!string_allowed(name, PLAYERNAME_ALLOWED_CHARS)) + throw LuaError("Observer name contains invalid characters"); + if (!lua_toboolean(L, -1)) // falsy value? + throw LuaError("Values in the `observers` table need to be true"); + observer_names.insert(std::move(name)); + lua_pop(L, 1); // pop value, keep key + } + + RemotePlayer *player = getplayer(ref); + if (player != nullptr) { + observer_names.insert(player->getName()); + } + + sao->m_observers = std::move(observer_names); + return 0; +} + +template +static int get_observers(lua_State *L, F observer_getter) +{ + ObjectRef *ref = ObjectRef::checkObject(L, 1); + ServerActiveObject *sao = ObjectRef::getobject(ref); + if (sao == nullptr) + throw LuaError("invalid ObjectRef"); + + const auto observers = observer_getter(sao); + if (!observers) { + lua_pushnil(L); + return 1; + } + // Push set of observers {[name] = true} + lua_createtable(L, 0, observers->size()); + for (auto &name : *observers) { + lua_pushboolean(L, true); + lua_setfield(L, -2, name.c_str()); + } + return 1; +} + +// get_observers(self) +int ObjectRef::l_get_observers(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + return get_observers(L, [](auto sao) { return sao->m_observers; }); +} + +// get_effective_observers(self) +int ObjectRef::l_get_effective_observers(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + return get_observers(L, [](auto sao) { + // The cache may be outdated, so we always have to recalculate. + return sao->recalculateEffectiveObservers(); + }); +} + // is_player(self) int ObjectRef::l_is_player(lua_State *L) { @@ -2676,6 +2758,9 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_properties), luamethod(ObjectRef, set_nametag_attributes), luamethod(ObjectRef, get_nametag_attributes), + luamethod(ObjectRef, set_observers), + luamethod(ObjectRef, get_observers), + luamethod(ObjectRef, get_effective_observers), luamethod_aliased(ObjectRef, set_velocity, setvelocity), luamethod_aliased(ObjectRef, add_velocity, add_player_velocity), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 3e6d01201..ace19e1f0 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -163,6 +163,15 @@ private: // get_properties(self) static int l_get_properties(lua_State *L); + // set_observers(self, observers) + static int l_set_observers(lua_State *L); + + // get_observers(self) + static int l_get_observers(lua_State *L); + + // get_effective_observers(self) + static int l_get_effective_observers(lua_State *L); + // is_player(self) static int l_is_player(lua_State *L); diff --git a/src/server.cpp b/src/server.cpp index f6268402d..0b0786209 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -116,6 +116,8 @@ void *ServerThread::run() m_server->setAsyncFatalError(e.what()); } catch (LuaError &e) { m_server->setAsyncFatalError(e); + } catch (ModError &e) { + m_server->setAsyncFatalError(e.what()); } float dtime = 0.0f; @@ -142,6 +144,8 @@ void *ServerThread::run() m_server->setAsyncFatalError(e.what()); } catch (LuaError &e) { m_server->setAsyncFatalError(e); + } catch (ModError &e) { + m_server->setAsyncFatalError(e.what()); } dtime = 1e-6f * (porting::getTimeUs() - t0); @@ -781,6 +785,12 @@ void Server::AsyncRunStep(float dtime, bool initial_step) //infostream<<"Server: Checking added and deleted active objects"<invalidateActiveObjectObserverCaches(); + { ClientInterface::AutoLock clientlock(m_clients); const RemoteClientMap &clients = m_clients.getClientList(); diff --git a/src/server/activeobjectmgr.cpp b/src/server/activeobjectmgr.cpp index 983fc0d95..c6f1010ea 100644 --- a/src/server/activeobjectmgr.cpp +++ b/src/server/activeobjectmgr.cpp @@ -118,6 +118,16 @@ void ActiveObjectMgr::removeObject(u16 id) } } +void ActiveObjectMgr::invalidateActiveObjectObserverCaches() +{ + for (auto &active_object : m_active_objects.iter()) { + ServerActiveObject *obj = active_object.second.get(); + if (!obj) + continue; + obj->invalidateEffectiveObservers(); + } +} + void ActiveObjectMgr::getObjectsInsideRadius(const v3f &pos, float radius, std::vector &result, std::function include_obj_cb) @@ -153,15 +163,18 @@ void ActiveObjectMgr::getObjectsInArea(const aabb3f &box, } } -void ActiveObjectMgr::getAddedActiveObjectsAroundPos(v3f player_pos, f32 radius, - f32 player_radius, const std::set ¤t_objects, +void ActiveObjectMgr::getAddedActiveObjectsAroundPos( + const v3f &player_pos, const std::string &player_name, + f32 radius, f32 player_radius, + const std::set ¤t_objects, std::vector &added_objects) { /* Go through the object list, - discard removed/deactivated objects, - discard objects that are too far away, - - discard objects that are found in current_objects. + - discard objects that are found in current_objects, + - discard objects that are not observed by the player. - add remaining objects to added_objects */ for (auto &ao_it : m_active_objects.iter()) { @@ -183,6 +196,9 @@ void ActiveObjectMgr::getAddedActiveObjectsAroundPos(v3f player_pos, f32 radius, } else if (distance_f > radius) continue; + if (!object->isEffectivelyObservedBy(player_name)) + continue; + // Discard if already on current_objects auto n = current_objects.find(id); if (n != current_objects.end()) diff --git a/src/server/activeobjectmgr.h b/src/server/activeobjectmgr.h index dab795e8c..82c0ab3ad 100644 --- a/src/server/activeobjectmgr.h +++ b/src/server/activeobjectmgr.h @@ -38,15 +38,18 @@ public: bool registerObject(std::unique_ptr obj) override; void removeObject(u16 id) override; + void invalidateActiveObjectObserverCaches(); + void getObjectsInsideRadius(const v3f &pos, float radius, std::vector &result, std::function include_obj_cb); void getObjectsInArea(const aabb3f &box, std::vector &result, std::function include_obj_cb); - - void getAddedActiveObjectsAroundPos(v3f player_pos, f32 radius, - f32 player_radius, const std::set ¤t_objects, + void getAddedActiveObjectsAroundPos( + const v3f &player_pos, const std::string &player_name, + f32 radius, f32 player_radius, + const std::set ¤t_objects, std::vector &added_objects); }; } // namespace server diff --git a/src/server/serveractiveobject.cpp b/src/server/serveractiveobject.cpp index fb09464cf..c660b5a69 100644 --- a/src/server/serveractiveobject.cpp +++ b/src/server/serveractiveobject.cpp @@ -18,11 +18,9 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "serveractiveobject.h" -#include #include "inventory.h" #include "inventorymanager.h" #include "constants.h" // BS -#include "log.h" ServerActiveObject::ServerActiveObject(ServerEnvironment *env, v3f pos): ActiveObject(0), @@ -95,3 +93,48 @@ InventoryLocation ServerActiveObject::getInventoryLocation() const { return InventoryLocation(); } + +void ServerActiveObject::invalidateEffectiveObservers() +{ + m_effective_observers.reset(); +} + +using Observers = ServerActiveObject::Observers; + +const Observers &ServerActiveObject::getEffectiveObservers() +{ + if (m_effective_observers) // cached + return *m_effective_observers; + + auto parent = getParent(); + if (parent == nullptr) + return *(m_effective_observers = m_observers); + auto parent_observers = parent->getEffectiveObservers(); + if (!parent_observers) // parent is unmanaged + return *(m_effective_observers = m_observers); + if (!m_observers) // we are unmanaged + return *(m_effective_observers = parent_observers); + // Set intersection between parent_observers and m_observers + // Avoid .clear() to free the allocated memory. + m_effective_observers = std::unordered_set(); + for (const auto &observer_name : *m_observers) { + if (parent_observers->count(observer_name) > 0) + (*m_effective_observers)->insert(observer_name); + } + return *m_effective_observers; +} + +const Observers& ServerActiveObject::recalculateEffectiveObservers() +{ + // Invalidate final observers for this object and all of its parents. + for (auto obj = this; obj != nullptr; obj = obj->getParent()) + obj->invalidateEffectiveObservers(); + // getEffectiveObservers will now be forced to recalculate. + return getEffectiveObservers(); +} + +bool ServerActiveObject::isEffectivelyObservedBy(const std::string &player_name) +{ + auto effective_observers = getEffectiveObservers(); + return !effective_observers || effective_observers->count(player_name) > 0; +} diff --git a/src/server/serveractiveobject.h b/src/server/serveractiveobject.h index a94c2df9c..d734b8469 100644 --- a/src/server/serveractiveobject.h +++ b/src/server/serveractiveobject.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +#include #include "irrlichttypes_bloated.h" #include "activeobject.h" #include "itemgroup.h" @@ -236,7 +237,25 @@ public: */ v3s16 m_static_block = v3s16(1337,1337,1337); + // Names of players to whom the object is to be sent, not considering parents. + using Observers = std::optional>; + Observers m_observers; + + /// Invalidate final observer cache. This needs to be done whenever + /// the observers of this object or any of its ancestors may have changed. + void invalidateEffectiveObservers(); + /// Cache `m_effective_observers` with the names of all observers, + /// also indirect observers (object attachment chain). + const Observers &getEffectiveObservers(); + /// Force a recalculation of final observers (including all parents). + const Observers &recalculateEffectiveObservers(); + /// Whether the object is sent to `player_name` + bool isEffectivelyObservedBy(const std::string &player_name); + protected: + // Cached intersection of m_observers of this object and all its parents. + std::optional m_effective_observers; + virtual void onMarkedForDeactivation() {} virtual void onMarkedForRemoval() {} diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index d19019fff..24e4a587e 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1711,6 +1711,11 @@ u16 ServerEnvironment::addActiveObject(std::unique_ptr objec return id; } +void ServerEnvironment::invalidateActiveObjectObserverCaches() +{ + m_ao_manager.invalidateActiveObjectObserverCaches(); +} + /* Finds out what new objects have been added to inside a radius around a position @@ -1726,8 +1731,13 @@ void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius, if (player_radius_f < 0.0f) player_radius_f = 0.0f; - m_ao_manager.getAddedActiveObjectsAroundPos(playersao->getBasePosition(), radius_f, - player_radius_f, current_objects, added_objects); + if (!playersao->isEffectivelyObservedBy(playersao->getPlayer()->getName())) + throw ModError("Player does not observe itself"); + + m_ao_manager.getAddedActiveObjectsAroundPos( + playersao->getBasePosition(), playersao->getPlayer()->getName(), + radius_f, player_radius_f, + current_objects, added_objects); } /* @@ -1744,13 +1754,20 @@ void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius if (player_radius_f < 0) player_radius_f = 0; + + const std::string &player_name = playersao->getPlayer()->getName(); + + if (!playersao->isEffectivelyObservedBy(player_name)) + throw ModError("Player does not observe itself"); + /* Go through current_objects; object is removed if: - object is not found in m_active_objects (this is actually an error condition; objects should be removed only after all clients have been informed about removal), or - object is to be removed or deactivated, or - - object is too far away + - object is too far away, or + - object is marked as not observable by the client */ for (u16 id : current_objects) { ServerActiveObject *object = getActiveObject(id); @@ -1768,14 +1785,12 @@ void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius } f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition()); - if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - if (distance_f <= player_radius_f || player_radius_f == 0) - continue; - } else if (distance_f <= radius_f) - continue; + bool in_range = object->getType() == ACTIVEOBJECT_TYPE_PLAYER + ? distance_f <= player_radius_f || player_radius_f == 0 + : distance_f <= radius_f; - // Object is no longer visible - removed_objects.emplace_back(false, id); + if (!in_range || !object->isEffectivelyObservedBy(player_name)) + removed_objects.emplace_back(false, id); // out of range or not observed anymore } } diff --git a/src/serverenvironment.h b/src/serverenvironment.h index e02bd86b2..7a388d21c 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -277,6 +277,8 @@ public: */ u16 addActiveObject(std::unique_ptr object); + void invalidateActiveObjectObserverCaches(); + /* Find out what new objects have been added to inside a radius around a position diff --git a/src/unittest/test_serveractiveobjectmgr.cpp b/src/unittest/test_serveractiveobjectmgr.cpp index 7f0ca84cb..cbfd1b859 100644 --- a/src/unittest/test_serveractiveobjectmgr.cpp +++ b/src/unittest/test_serveractiveobjectmgr.cpp @@ -175,12 +175,12 @@ void TestServerActiveObjectMgr::testGetAddedActiveObjectsAroundPos() std::vector result; std::set cur_objects; - saomgr.getAddedActiveObjectsAroundPos(v3f(), 100, 50, cur_objects, result); + saomgr.getAddedActiveObjectsAroundPos(v3f(), "singleplayer", 100, 50, cur_objects, result); UASSERTCMP(int, ==, result.size(), 1); result.clear(); cur_objects.clear(); - saomgr.getAddedActiveObjectsAroundPos(v3f(), 740, 50, cur_objects, result); + saomgr.getAddedActiveObjectsAroundPos(v3f(), "singleplayer", 740, 50, cur_objects, result); UASSERTCMP(int, ==, result.size(), 2); saomgr.clear(); From 44db47e64ac095af62026aff14303c7834a87bb1 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Tue, 13 Aug 2024 02:53:04 +0200 Subject: [PATCH 58/59] Fix `.editorconfig` mandating tabs for Markdown --- .editorconfig | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index e273afa92..a2cc31dc1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,9 +1,16 @@ [*] end_of_line = lf -[*.{cpp,h,lua,txt,glsl,md,c,cmake,java,gradle}] +[*.{cpp,h,lua,txt,glsl,c,cmake,java,gradle}] charset = utf-8 indent_size = 4 indent_style = tab insert_final_newline = true trim_trailing_whitespace = true + +[*.md] +charset = utf-8 +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true From d3ca269c79aec18a8c6d938b13af5896ed978136 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Tue, 13 Aug 2024 02:50:36 +0200 Subject: [PATCH 59/59] Add `minetest.is_valid_player_name` utility --- doc/lua_api.md | 8 +++++--- src/main.cpp | 9 +++------ src/player.cpp | 4 ++++ src/player.h | 3 +++ src/script/lua_api/l_object.cpp | 8 ++------ src/script/lua_api/l_util.cpp | 12 ++++++++++++ src/script/lua_api/l_util.h | 3 +++ 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index 5713e8696..389ea73f2 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -7097,6 +7097,8 @@ Misc. * `minetest.is_player(obj)`: boolean, whether `obj` is a player * `minetest.player_exists(name)`: boolean, whether player exists (regardless of online status) +* `minetest.is_valid_player_name(name)`: boolean, whether the given name + could be used as a player name (regardless of whether said player exists). * `minetest.hud_replace_builtin(name, hud_definition)` * Replaces definition of a builtin hud element * `name`: `"breath"`, `"health"` or `"minimap"` @@ -7989,9 +7991,9 @@ child will follow movement and rotation of that bone. * `set_observers(observers)`: sets observers (players this object is sent to) * If `observers` is `nil`, the object's observers are "unmanaged": The object is sent to all players as governed by server settings. This is the default. - * `observers` is a "set" of player names: `{[player name] = true, [other player name] = true, ...}` - * A set is a table where the keys are the elements of the set (in this case, player names) - and the values are all `true`. + * `observers` is a "set" of player names: `{name1 = true, name2 = true, ...}` + * A set is a table where the keys are the elements of the set + (in this case, *valid* player names) and the values are all `true`. * Attachments: The *effective observers* of an object are made up of all players who can observe the object *and* are also effective observers of its parent object (if there is one). diff --git a/src/main.cpp b/src/main.cpp index 7474ae84c..9f358bb66 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1095,13 +1095,9 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & if (cmd_args.exists("terminal")) { #if USE_CURSES - bool name_ok = true; std::string admin_nick = g_settings->get("name"); - name_ok = name_ok && !admin_nick.empty(); - name_ok = name_ok && string_allowed(admin_nick, PLAYERNAME_ALLOWED_CHARS); - - if (!name_ok) { + if (!is_valid_player_name(admin_nick)) { if (admin_nick.empty()) { errorstream << "No name given for admin. " << "Please check your minetest.conf that it " @@ -1110,7 +1106,8 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & } else { errorstream << "Name for admin '" << admin_nick << "' is not valid. " - << "Please check that it only contains allowed characters. " + << "Please check that it only contains allowed characters " + << "and that it is at most 20 characters long. " << "Valid characters are: " << PLAYERNAME_ALLOWED_CHARS_USER_EXPL << std::endl; } diff --git a/src/player.cpp b/src/player.cpp index e55de5937..fd902aa83 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -30,6 +30,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" // strlcpy +bool is_valid_player_name(std::string_view name) { + return !name.empty() && name.size() <= PLAYERNAME_SIZE && string_allowed(name, PLAYERNAME_ALLOWED_CHARS); +} + Player::Player(const std::string &name, IItemDefManager *idef): inventory(idef) { diff --git a/src/player.h b/src/player.h index 9991dd774..dd2be4986 100644 --- a/src/player.h +++ b/src/player.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "network/networkprotocol.h" #include "util/basic_macros.h" +#include "util/string.h" #include #include #include @@ -35,6 +36,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #define PLAYERNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_" #define PLAYERNAME_ALLOWED_CHARS_USER_EXPL "'a' to 'z', 'A' to 'Z', '0' to '9', '-', '_'" +bool is_valid_player_name(std::string_view name); + struct PlayerFovSpec { f32 fov; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 89974fb0e..00c825ddc 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -859,12 +859,8 @@ int ObjectRef::l_set_observers(lua_State *L) lua_pushnil(L); while (lua_next(L, 2) != 0) { std::string name = readParam(L, -2); - if (name.empty()) - throw LuaError("Observer name is empty"); - if (name.size() > PLAYERNAME_SIZE) - throw LuaError("Observer name is too long"); - if (!string_allowed(name, PLAYERNAME_ALLOWED_CHARS)) - throw LuaError("Observer name contains invalid characters"); + if (!is_valid_player_name(name)) + throw LuaError("Observer name is not a valid player name"); if (!lua_toboolean(L, -1)) // falsy value? throw LuaError("Values in the `observers` table need to be true"); observer_names.insert(std::move(name)); diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp index 883b9480c..fac3e54d1 100644 --- a/src/script/lua_api/l_util.cpp +++ b/src/script/lua_api/l_util.cpp @@ -44,6 +44,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/sha1.h" #include "my_sha256.h" #include "util/png.h" +#include "player.h" #include // only available in zstd 1.3.5+ @@ -674,6 +675,16 @@ int ModApiUtil::l_urlencode(lua_State *L) return 1; } +// is_valid_player_name(name) +int ModApiUtil::l_is_valid_player_name(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + auto s = readParam(L, 1); + lua_pushboolean(L, is_valid_player_name(s)); + return 1; +} + void ModApiUtil::Initialize(lua_State *L, int top) { API_FCT(log); @@ -722,6 +733,7 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(set_last_run_mod); API_FCT(urlencode); + API_FCT(is_valid_player_name); LuaSettings::create(L, g_settings, g_settings_path); lua_setfield(L, top, "settings"); diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h index 056e09090..e0daf3e79 100644 --- a/src/script/lua_api/l_util.h +++ b/src/script/lua_api/l_util.h @@ -134,6 +134,9 @@ private: // urlencode(value) static int l_urlencode(lua_State *L); + // is_valid_player_name(name) + static int l_is_valid_player_name(lua_State *L); + public: static void Initialize(lua_State *L, int top); static void InitializeAsync(lua_State *L, int top);