aboutsummaryrefslogtreecommitdiff
path: root/build/android
diff options
context:
space:
mode:
Diffstat (limited to 'build/android')
0 files changed, 0 insertions, 0 deletions
ref='/minetest.git/diff/.github/workflows/build.yml?h=gpcf&id=f035fe9336f80bfc9423e7ee0b1fde128844dbe6&id2=44c2e33c78b54835c153d100487600348bd6dee7'>.github/workflows/build.yml59
-rw-r--r--.github/workflows/cpp_lint.yml14
-rw-r--r--.github/workflows/lua.yml72
-rw-r--r--.github/workflows/lua_lint.yml32
-rw-r--r--.github/workflows/macos.yml21
-rw-r--r--.gitlab-ci.yml12
-rw-r--r--.mailmap8
-rw-r--r--CMakeLists.txt36
-rw-r--r--Dockerfile19
-rw-r--r--LICENSE.txt9
-rw-r--r--README.md28
-rw-r--r--android/app/src/main/AndroidManifest.xml13
-rw-r--r--android/app/src/main/java/net/minetest/minetest/GameActivity.java25
-rw-r--r--android/app/src/main/res/xml/filepaths.xml3
-rw-r--r--android/build.gradle7
-rw-r--r--android/native/build.gradle3
-rw-r--r--android/native/jni/Android.mk61
-rw-r--r--android/native/jni/Application.mk2
-rw-r--r--builtin/async/game.lua59
-rw-r--r--builtin/async/mainmenu.lua (renamed from builtin/async/init.lua)4
-rw-r--r--builtin/client/init.lua2
-rw-r--r--builtin/client/misc.lua7
-rw-r--r--builtin/common/information_formspecs.lua4
-rw-r--r--builtin/common/misc_helpers.lua161
-rw-r--r--builtin/common/mod_storage.lua19
-rw-r--r--builtin/common/serialize.lua353
-rw-r--r--builtin/common/strict.lua37
-rw-r--r--builtin/common/tests/misc_helpers_spec.lua99
-rw-r--r--builtin/common/tests/serialize_spec.lua158
-rw-r--r--builtin/common/tests/vector_spec.lua10
-rw-r--r--builtin/common/vector.lua14
-rw-r--r--builtin/game/async.lua22
-rw-r--r--builtin/game/chat.lua119
-rw-r--r--builtin/game/falling.lua12
-rw-r--r--builtin/game/features.lua2
-rw-r--r--builtin/game/init.lua4
-rw-r--r--builtin/game/item.lua178
-rw-r--r--builtin/game/item_entity.lua13
-rw-r--r--builtin/game/item_s.lua156
-rw-r--r--builtin/game/misc.lua101
-rw-r--r--builtin/game/misc_s.lua93
-rw-r--r--builtin/game/register.lua2
-rw-r--r--builtin/game/statbars.lua5
-rw-r--r--builtin/game/voxelarea.lua22
-rw-r--r--builtin/init.lua6
-rw-r--r--builtin/locale/__builtin.de.tr5
-rw-r--r--builtin/locale/__builtin.it.tr5
-rw-r--r--builtin/locale/template.txt5
-rw-r--r--builtin/mainmenu/common.lua18
-rw-r--r--builtin/mainmenu/dlg_config_world.lua117
-rw-r--r--builtin/mainmenu/dlg_contentstore.lua28
-rw-r--r--builtin/mainmenu/dlg_create_world.lua89
-rw-r--r--builtin/mainmenu/dlg_delete_content.lua13
-rw-r--r--builtin/mainmenu/dlg_delete_world.lua12
-rw-r--r--builtin/mainmenu/dlg_register.lua123
-rw-r--r--builtin/mainmenu/dlg_settings_advanced.lua105
-rw-r--r--builtin/mainmenu/dlg_version_info.lua172
-rw-r--r--builtin/mainmenu/generate_from_settingtypes.lua17
-rw-r--r--builtin/mainmenu/init.lua7
-rw-r--r--builtin/mainmenu/pkgmgr.lua165
-rw-r--r--builtin/mainmenu/tab_about.lua144
-rw-r--r--builtin/mainmenu/tab_content.lua35
-rw-r--r--builtin/mainmenu/tab_local.lua167
-rw-r--r--builtin/mainmenu/tab_online.lua57
-rw-r--r--builtin/mainmenu/tab_settings.lua49
-rw-r--r--builtin/mainmenu/tests/serverlistmgr_spec.lua1
-rw-r--r--builtin/settingtypes.txt2274
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl288
-rw-r--r--client/shaders/nodes_shader/opengl_vertex.glsl92
-rw-r--r--client/shaders/object_shader/opengl_fragment.glsl373
-rw-r--r--client/shaders/object_shader/opengl_vertex.glsl124
-rw-r--r--client/shaders/shadow_shaders/pass1_trans_vertex.glsl35
-rw-r--r--client/shaders/shadow_shaders/pass1_vertex.glsl37
-rw-r--r--clientmods/preview/init.lua3
-rw-r--r--clientmods/preview/mod.conf2
-rw-r--r--clientmods/preview/settingtypes.txt1
-rw-r--r--cmake/Modules/FindOpenGLES2.cmake73
-rw-r--r--cmake/Modules/FindSQLite3.cmake2
-rw-r--r--cmake/Modules/FindVorbis.cmake17
-rw-r--r--cmake/Modules/MinetestFindIrrlichtHeaders.cmake26
-rw-r--r--doc/breakages.md8
-rw-r--r--doc/client_lua_api.txt11
-rw-r--r--doc/lgpl-2.1.txt18
-rw-r--r--doc/lua_api.txt1412
-rw-r--r--doc/menu_lua_api.txt38
-rw-r--r--doc/minetest.62
-rw-r--r--doc/world_format.txt32
-rw-r--r--games/devtest/.luacheckrc43
-rw-r--r--games/devtest/game.conf2
-rw-r--r--games/devtest/mods/basetools/init.lua105
-rw-r--r--games/devtest/mods/basetools/textures/basetools_bloodsword.pngbin0 -> 165 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_elementalsword.pngbin0 -> 177 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_firesword.pngbin190 -> 166 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_healdagger.pngbin0 -> 162 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_healsword.pngbin0 -> 170 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_icesword.pngbin190 -> 170 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_mesepick.pngbin155 -> 156 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_mesesword.pngbin0 -> 163 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_superhealsword.pngbin0 -> 192 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_titaniumsword.pngbin0 -> 160 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_usespick.pngbin0 -> 161 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_usessword.pngbin0 -> 133 bytes-rw-r--r--games/devtest/mods/basetools/textures/basetools_wooddagger.pngbin0 -> 139 bytes-rw-r--r--games/devtest/mods/testentities/armor.lua32
-rw-r--r--games/devtest/mods/testentities/callbacks.lua4
-rw-r--r--games/devtest/mods/testentities/textures/testentities_armorball.pngbin561 -> 1385 bytes-rw-r--r--games/devtest/mods/testformspec/formspec.lua41
-rw-r--r--games/devtest/mods/testformspec/textures/testformspec_9slice.pngbin0 -> 5935 bytes-rw-r--r--games/devtest/mods/testitems/init.lua55
-rw-r--r--games/devtest/mods/testitems/mod.conf2
-rw-r--r--games/devtest/mods/testitems/textures/testitems_overlay_base.pngbin0 -> 106 bytes-rw-r--r--games/devtest/mods/testitems/textures/testitems_overlay_overlay.pngbin0 -> 220 bytes-rw-r--r--games/devtest/mods/testnodes/init.lua1
-rw-r--r--games/devtest/mods/testnodes/overlays.lua93
-rw-r--r--games/devtest/mods/testnodes/properties.lua18
-rw-r--r--games/devtest/mods/testnodes/textures.lua117
-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_overlay.pngbin0 -> 153 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_overlayable.pngbin0 -> 87 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tgabin0 -> 179 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tgabin0 -> 179 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tgabin0 -> 120 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tgabin0 -> 120 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tgabin0 -> 172 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tgabin0 -> 172 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tgabin0 -> 300 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tgabin0 -> 300 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tgabin0 -> 172 bytes-rw-r--r--games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tgabin0 -> 172 bytes-rw-r--r--games/devtest/mods/testtools/README.md8
-rw-r--r--games/devtest/mods/testtools/init.lua125
-rw-r--r--games/devtest/mods/testtools/textures/testtools_item_meta_editor.pngbin0 -> 114 bytes-rw-r--r--games/devtest/mods/unittests/async_env.lua168
-rw-r--r--games/devtest/mods/unittests/entity.lua132
-rw-r--r--games/devtest/mods/unittests/init.lua9
-rw-r--r--games/devtest/mods/unittests/inside_async_env.lua25
-rw-r--r--games/devtest/mods/unittests/itemdescription.lua28
-rw-r--r--games/devtest/mods/unittests/misc.lua46
-rw-r--r--games/devtest/mods/unittests/textures/unittests_description_test.pngbin0 -> 268 bytes-rw-r--r--games/devtest/mods/util_commands/init.lua61
-rw-r--r--lib/catch2/CMakeLists.txt16
-rw-r--r--lib/catch2/catch.hpp17970
-rw-r--r--lib/lua/CMakeLists.txt25
-rw-r--r--lib/lua/src/CMakeLists.txt18
-rw-r--r--lib/lua/src/lgc.c9
-rw-r--r--lib/lua/src/luaconf.h14
-rw-r--r--minetest.conf.example2883
-rw-r--r--misc/irrlichtmt_tag.txt1
-rw-r--r--misc/net.minetest.minetest.appdata.xml34
-rw-r--r--mods/mods_here.txt8
-rw-r--r--po/ar/minetest.po558
-rw-r--r--po/be/minetest.po637
-rw-r--r--po/bg/minetest.po625
-rw-r--r--po/ca/minetest.po534
-rw-r--r--po/cs/minetest.po624
-rw-r--r--po/da/minetest.po581
-rw-r--r--po/de/minetest.po683
-rw-r--r--po/dv/minetest.po509
-rw-r--r--po/el/minetest.po1051
-rw-r--r--po/eo/minetest.po624
-rw-r--r--po/es/minetest.po1030
-rw-r--r--po/et/minetest.po560
-rw-r--r--po/eu/minetest.po856
-rw-r--r--po/fi/minetest.po601
-rw-r--r--po/fil/minetest.po1812
-rw-r--r--po/fr/minetest.po778
-rw-r--r--po/gd/minetest.po484
-rw-r--r--po/gl/minetest.po3782
-rw-r--r--po/he/minetest.po548
-rw-r--r--po/hi/minetest.po552
-rw-r--r--po/hu/minetest.po1070
-rw-r--r--po/id/minetest.po679
-rw-r--r--po/it/minetest.po1317
-rw-r--r--po/ja/minetest.po862
-rw-r--r--po/jbo/minetest.po533
-rw-r--r--po/kk/minetest.po482
-rw-r--r--po/kn/minetest.po486
-rw-r--r--po/ko/minetest.po637
-rw-r--r--po/ky/minetest.po515
-rw-r--r--po/lt/minetest.po542
-rw-r--r--po/lv/minetest.po567
-rw-r--r--po/lzh/minetest.po471
-rw-r--r--po/minetest.pot3585
-rw-r--r--po/mr/minetest.po488
-rw-r--r--po/ms/minetest.po705
-rw-r--r--po/ms_Arab/minetest.po613
-rw-r--r--po/nb/minetest.po1002
-rw-r--r--po/nl/minetest.po639
-rw-r--r--po/nn/minetest.po764
-rw-r--r--po/oc/minetest.po6859
-rw-r--r--po/pl/minetest.po1210
-rw-r--r--po/pt/minetest.po867
-rw-r--r--po/pt_BR/minetest.po795
-rw-r--r--po/ro/minetest.po576
-rw-r--r--po/ru/minetest.po1155
-rw-r--r--po/sk/minetest.po750
-rw-r--r--po/sl/minetest.po581
-rw-r--r--po/sr_Cyrl/minetest.po573
-rw-r--r--po/sr_Latn/minetest.po482
-rw-r--r--po/sv/minetest.po726
-rw-r--r--po/sw/minetest.po582
-rw-r--r--po/th/minetest.po2287
-rw-r--r--po/tr/minetest.po635
-rw-r--r--po/tt/minetest.po471
-rw-r--r--po/uk/minetest.po568
-rw-r--r--po/vi/minetest.po1257
-rw-r--r--po/yue/minetest.po471
-rw-r--r--po/zh_CN/minetest.po656
-rw-r--r--po/zh_TW/minetest.po626
-rw-r--r--src/CMakeLists.txt76
-rw-r--r--src/benchmark/CMakeLists.txt7
-rw-r--r--src/benchmark/benchmark.cpp32
-rw-r--r--src/benchmark/benchmark.h26
-rw-r--r--src/benchmark/benchmark_serialize.cpp71
-rw-r--r--src/benchmark/benchmark_setup.h22
-rw-r--r--src/client/CMakeLists.txt4
-rw-r--r--src/client/camera.cpp16
-rw-r--r--src/client/camera.h3
-rw-r--r--src/client/client.cpp64
-rw-r--r--src/client/client.h11
-rw-r--r--src/client/clientenvironment.cpp1
-rw-r--r--src/client/clientevent.h1
-rw-r--r--src/client/clientlauncher.cpp3
-rw-r--r--src/client/clientmap.cpp315
-rw-r--r--src/client/clientmap.h74
-rw-r--r--src/client/clouds.cpp3
-rw-r--r--src/client/content_cao.cpp111
-rw-r--r--src/client/content_cao.h12
-rw-r--r--src/client/content_mapblock.cpp143
-rw-r--r--src/client/content_mapblock.h5
-rw-r--r--src/client/fontengine.cpp12
-rw-r--r--src/client/game.cpp181
-rw-r--r--src/client/gameui.cpp12
-rw-r--r--src/client/guiscalingfilter.cpp49
-rw-r--r--src/client/guiscalingfilter.h8
-rw-r--r--src/client/hud.cpp71
-rw-r--r--src/client/imagefilters.cpp2
-rw-r--r--src/client/joystick_controller.cpp12
-rw-r--r--src/client/localplayer.cpp23
-rw-r--r--src/client/localplayer.h5
-rw-r--r--src/client/mapblock_mesh.cpp326
-rw-r--r--src/client/mapblock_mesh.h125
-rw-r--r--src/client/mesh.cpp1
-rw-r--r--src/client/mesh_generator_thread.cpp22
-rw-r--r--src/client/mesh_generator_thread.h7
-rw-r--r--src/client/minimap.cpp2
-rw-r--r--src/client/particles.cpp440
-rw-r--r--src/client/particles.h68
-rw-r--r--src/client/render/core.cpp16
-rw-r--r--src/client/render/stereo.cpp2
-rw-r--r--src/client/renderingengine.cpp32
-rw-r--r--src/client/renderingengine.h5
-rw-r--r--src/client/shader.cpp97
-rw-r--r--src/client/shadows/dynamicshadows.cpp80
-rw-r--r--src/client/shadows/dynamicshadows.h21
-rw-r--r--src/client/shadows/dynamicshadowsrender.cpp201
-rw-r--r--src/client/shadows/dynamicshadowsrender.h21
-rw-r--r--src/client/shadows/shadowsshadercallbacks.cpp12
-rw-r--r--src/client/shadows/shadowsshadercallbacks.h12
-rw-r--r--src/client/sky.cpp9
-rw-r--r--src/client/sky.h3
-rw-r--r--src/client/sound.h28
-rw-r--r--src/client/sound_openal.cpp82
-rw-r--r--src/client/tile.cpp2
-rw-r--r--src/client/tile.h14
-rw-r--r--src/client/wieldmesh.cpp21
-rw-r--r--src/clientiface.cpp16
-rw-r--r--src/clientiface.h13
-rw-r--r--src/cmake_config.h.in3
-rw-r--r--src/collision.cpp4
-rw-r--r--src/config.h17
-rw-r--r--src/content/CMakeLists.txt1
-rw-r--r--src/content/content.cpp7
-rw-r--r--src/content/content.h7
-rw-r--r--src/content/mod_configuration.cpp255
-rw-r--r--src/content/mod_configuration.h111
-rw-r--r--src/content/mods.cpp362
-rw-r--r--src/content/mods.h119
-rw-r--r--src/content/subgames.cpp57
-rw-r--r--src/content/subgames.h20
-rw-r--r--src/database/database-leveldb.cpp2
-rw-r--r--src/database/database-postgresql.cpp2
-rw-r--r--src/database/database-postgresql.h3
-rw-r--r--src/database/database-sqlite3.cpp4
-rw-r--r--src/defaultsettings.cpp22
-rw-r--r--src/emerge.cpp27
-rw-r--r--src/emerge.h16
-rw-r--r--src/filesys.cpp1
-rw-r--r--src/filesys.h5
-rw-r--r--src/gamedef.h2
-rw-r--r--src/gameparams.h11
-rw-r--r--src/gettime.h32
-rw-r--r--src/gui/CMakeLists.txt1
-rw-r--r--src/gui/StyleSpec.h3
-rw-r--r--src/gui/guiAnimatedImage.cpp59
-rw-r--r--src/gui/guiAnimatedImage.h25
-rw-r--r--src/gui/guiBackgroundImage.cpp18
-rw-r--r--src/gui/guiButton.cpp8
-rw-r--r--src/gui/guiButtonImage.cpp27
-rw-r--r--src/gui/guiButtonImage.h10
-rw-r--r--src/gui/guiChatConsole.cpp4
-rw-r--r--src/gui/guiConfirmRegistration.cpp281
-rw-r--r--src/gui/guiConfirmRegistration.h68
-rw-r--r--src/gui/guiEngine.cpp4
-rw-r--r--src/gui/guiEngine.h2
-rw-r--r--src/gui/guiFormSpecMenu.cpp327
-rw-r--r--src/gui/guiFormSpecMenu.h9
-rw-r--r--src/gui/guiKeyChangeMenu.cpp22
-rw-r--r--src/gui/guiKeyChangeMenu.h1
-rw-r--r--src/gui/guiMainMenu.h3
-rw-r--r--src/gui/guiPasswordChange.cpp19
-rw-r--r--src/gui/guiPasswordChange.h2
-rw-r--r--src/gui/guiPathSelectMenu.cpp3
-rw-r--r--src/gui/guiScrollContainer.cpp9
-rw-r--r--src/gui/guiTable.cpp2
-rw-r--r--src/gui/guiVolumeChange.cpp22
-rw-r--r--src/gui/guiVolumeChange.h3
-rw-r--r--src/gui/mainmenumanager.h4
-rw-r--r--src/gui/modalMenu.cpp22
-rw-r--r--src/gui/modalMenu.h1
-rw-r--r--src/gui/touchscreengui.cpp2
-rw-r--r--src/hud.cpp1
-rw-r--r--src/hud.h1
-rw-r--r--src/inventory.cpp42
-rw-r--r--src/inventory.h26
-rw-r--r--src/inventorymanager.cpp2
-rw-r--r--src/irrlicht_changes/CGUITTFont.cpp60
-rw-r--r--src/irrlicht_changes/CGUITTFont.h43
-rw-r--r--src/irrlicht_changes/static_text.cpp2
-rw-r--r--src/irrlicht_changes/static_text.h2
-rw-r--r--src/itemdef.cpp21
-rw-r--r--src/itemdef.h4
-rw-r--r--src/lighting.h27
-rw-r--r--src/log.cpp195
-rw-r--r--src/log.h214
-rw-r--r--src/main.cpp31
-rw-r--r--src/map.cpp175
-rw-r--r--src/map.h104
-rw-r--r--src/mapblock.cpp34
-rw-r--r--src/mapgen/dungeongen.cpp2
-rw-r--r--src/mapgen/mapgen.cpp13
-rw-r--r--src/mapgen/mapgen.h42
-rw-r--r--src/mapgen/mapgen_flat.cpp2
-rw-r--r--src/mapgen/mapgen_fractal.cpp1
-rw-r--r--src/mapgen/mg_biome.cpp2
-rw-r--r--src/mapgen/mg_ore.cpp4
-rw-r--r--src/mapnode.cpp62
-rw-r--r--src/modchannels.cpp3
-rw-r--r--src/network/address.cpp8
-rw-r--r--src/network/address.h2
-rw-r--r--src/network/clientopcodes.cpp1
-rw-r--r--src/network/clientpackethandler.cpp175
-rw-r--r--src/network/connection.cpp17
-rw-r--r--src/network/connection.h6
-rw-r--r--src/network/connectionthreads.cpp10
-rw-r--r--src/network/networkprotocol.h128
-rw-r--r--src/network/serveropcodes.cpp2
-rw-r--r--src/network/serverpackethandler.cpp29
-rw-r--r--src/network/socket.cpp8
-rw-r--r--src/nodedef.cpp188
-rw-r--r--src/nodedef.h63
-rw-r--r--src/noise.cpp92
-rw-r--r--src/particles.cpp127
-rw-r--r--src/particles.h373
-rw-r--r--src/player.cpp2
-rw-r--r--src/player.h4
-rw-r--r--src/porting.cpp2
-rw-r--r--src/porting_android.cpp12
-rw-r--r--src/porting_android.h7
-rw-r--r--src/remoteplayer.h7
-rw-r--r--src/script/common/CMakeLists.txt1
-rw-r--r--src/script/common/c_content.cpp176
-rw-r--r--src/script/common/c_content.h19
-rw-r--r--src/script/common/c_converter.cpp99
-rw-r--r--src/script/common/c_converter.h21
-rw-r--r--src/script/common/c_internal.cpp14
-rw-r--r--src/script/common/c_internal.h6
-rw-r--r--src/script/common/c_packer.cpp596
-rw-r--r--src/script/common/c_packer.h126
-rw-r--r--src/script/common/helper.cpp80
-rw-r--r--src/script/common/helper.h3
-rw-r--r--src/script/cpp_api/s_async.cpp183
-rw-r--r--src/script/cpp_api/s_async.h54
-rw-r--r--src/script/cpp_api/s_base.cpp8
-rw-r--r--src/script/cpp_api/s_client.cpp10
-rw-r--r--src/script/cpp_api/s_entity.cpp13
-rw-r--r--src/script/cpp_api/s_entity.h2
-rw-r--r--src/script/cpp_api/s_env.cpp4
-rw-r--r--src/script/cpp_api/s_security.cpp14
-rw-r--r--src/script/lua_api/l_areastore.cpp49
-rw-r--r--src/script/lua_api/l_client.cpp26
-rw-r--r--src/script/lua_api/l_craft.cpp32
-rw-r--r--src/script/lua_api/l_craft.h1
-rw-r--r--src/script/lua_api/l_env.cpp11
-rw-r--r--src/script/lua_api/l_env.h2
-rw-r--r--src/script/lua_api/l_internal.h2
-rw-r--r--src/script/lua_api/l_inventory.cpp23
-rw-r--r--src/script/lua_api/l_item.cpp56
-rw-r--r--src/script/lua_api/l_item.h18
-rw-r--r--src/script/lua_api/l_mainmenu.cpp142
-rw-r--r--src/script/lua_api/l_mainmenu.h4
-rw-r--r--src/script/lua_api/l_nodemeta.cpp27
-rw-r--r--src/script/lua_api/l_nodemeta.h6
-rw-r--r--src/script/lua_api/l_noise.cpp67
-rw-r--r--src/script/lua_api/l_noise.h17
-rw-r--r--src/script/lua_api/l_object.cpp214
-rw-r--r--src/script/lua_api/l_object.h12
-rw-r--r--src/script/lua_api/l_particleparams.h282
-rw-r--r--src/script/lua_api/l_particles.cpp214
-rw-r--r--src/script/lua_api/l_particles_local.cpp114
-rw-r--r--src/script/lua_api/l_server.cpp131
-rw-r--r--src/script/lua_api/l_server.h10
-rw-r--r--src/script/lua_api/l_settings.cpp21
-rw-r--r--src/script/lua_api/l_sound.cpp4
-rw-r--r--src/script/lua_api/l_storage.cpp8
-rw-r--r--src/script/lua_api/l_util.cpp22
-rw-r--r--src/script/lua_api/l_util.h5
-rw-r--r--src/script/lua_api/l_vmanip.cpp51
-rw-r--r--src/script/lua_api/l_vmanip.h5
-rw-r--r--src/script/scripting_client.cpp2
-rw-r--r--src/script/scripting_server.cpp68
-rw-r--r--src/script/scripting_server.h17
-rw-r--r--src/serialization.cpp35
-rw-r--r--src/server.cpp720
-rw-r--r--src/server.h74
-rw-r--r--src/server/luaentity_sao.cpp30
-rw-r--r--src/server/luaentity_sao.h13
-rw-r--r--src/server/mods.cpp31
-rw-r--r--src/server/mods.h23
-rw-r--r--src/server/player_sao.cpp8
-rw-r--r--src/server/player_sao.h52
-rw-r--r--src/serverenvironment.cpp71
-rw-r--r--src/serverenvironment.h27
-rw-r--r--src/settings.cpp8
-rw-r--r--src/settings.h1
-rw-r--r--src/settings_translation_file.cpp1136
-rw-r--r--src/skyparams.h2
-rw-r--r--src/sound.h25
-rw-r--r--src/staticobject.cpp4
-rw-r--r--src/staticobject.h2
-rw-r--r--src/terminal_chat_console.cpp3
-rw-r--r--src/tileanimation.cpp4
-rw-r--r--src/tileanimation.h4
-rw-r--r--src/tool.cpp2
-rw-r--r--src/tool.h1
-rw-r--r--src/translation.cpp2
-rw-r--r--src/translation.h2
-rw-r--r--src/unittest/CMakeLists.txt1
-rw-r--r--src/unittest/test.cpp10
-rw-r--r--src/unittest/test.h2
-rw-r--r--src/unittest/test_address.cpp2
-rw-r--r--src/unittest/test_eventmanager.cpp4
-rw-r--r--src/unittest/test_irrptr.cpp4
-rw-r--r--src/unittest/test_lua.cpp79
-rw-r--r--src/unittest/test_nodedef.cpp2
-rw-r--r--src/unittest/test_noise.cpp54
-rw-r--r--src/unittest/test_serialization.cpp78
-rw-r--r--src/unittest/test_server_shutdown_state.cpp4
-rw-r--r--src/unittest/test_servermodmanager.cpp8
-rw-r--r--src/unittest/test_utilities.cpp28
-rw-r--r--src/unittest/test_voxelarea.cpp4
-rw-r--r--src/util/basic_macros.h8
-rw-r--r--src/util/enriched_string.cpp2
-rw-r--r--src/util/enriched_string.h2
-rw-r--r--src/util/ieee_float.cpp2
-rw-r--r--src/util/metricsbackend.cpp96
-rw-r--r--src/util/metricsbackend.h84
-rw-r--r--src/util/numeric.cpp11
-rw-r--r--src/util/numeric.h23
-rw-r--r--src/util/pointer.h13
-rw-r--r--src/util/serialize.cpp220
-rw-r--r--src/util/serialize.h10
-rw-r--r--src/util/srp.cpp4
-rw-r--r--src/util/stream.h70
-rw-r--r--src/util/string.cpp55
-rw-r--r--src/util/string.h4
-rw-r--r--textures/base/pack/checkbox_16_white.pngbin0 -> 173 bytes-rw-r--r--textures/base/pack/error_icon_orange.pngbin0 -> 133 bytes-rw-r--r--textures/base/pack/error_icon_red.pngbin0 -> 133 bytes-rw-r--r--textures/base/pack/no_screenshot.pngbin586 -> 2043 bytes-rw-r--r--textures/base/pack/server_favorite_delete.pngbin0 -> 748 bytes-rwxr-xr-xutil/buildbot/buildwin32.sh46
-rwxr-xr-xutil/buildbot/buildwin64.sh33
-rwxr-xr-xutil/bump_version.sh2
-rwxr-xr-xutil/ci/build.sh14
-rwxr-xr-xutil/ci/build_prometheus_cpp.sh2
-rwxr-xr-xutil/ci/clang-tidy.sh12
-rw-r--r--util/ci/common.sh9
-rwxr-xr-xutil/generate-texture-normals.sh255
-rw-r--r--util/helper_mod/init.lua51
-rw-r--r--util/helper_mod/mod.conf3
-rwxr-xr-xutil/stress_mapgen.sh30
-rwxr-xr-xutil/test_multiplayer.sh45
494 files changed, 75089 insertions, 25057 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index b6f351c15..7cf34bd4a 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -8,8 +8,8 @@ assignees: ''
##### Minetest version
<!--
-Paste Minetest version between quotes below
-If you are on a devel version, please add git commit hash
+Paste Minetest version between quotes below.
+If you are on a devel version, please add git commit hash.
You can use `minetest --version` to find it.
-->
```
@@ -29,4 +29,4 @@ OpenGL version:
<!-- Describe your problem here -->
##### Steps to reproduce
-<!-- For bug reports or build issues, explain how the problem happened -->
+<!-- Explain how the problem has happened, providing a minimal test (i.e. a code snippet reduced to the bone) where possible -->
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index cc5fe83ef..20411a332 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -23,7 +23,7 @@ jobs:
build:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
sudo apt-get update
@@ -31,12 +31,12 @@ jobs:
- name: Build with Gradle
run: cd android; ./gradlew assemblerelease
- name: Save armeabi artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
name: Minetest-armeabi-v7a.apk
path: android/app/build/outputs/apk/release/app-armeabi-v7a-release-unsigned.apk
- name: Save arm64 artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
name: Minetest-arm64-v8a.apk
path: android/app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 79f9af5c7..d578c3d9f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -34,7 +34,7 @@ jobs:
gcc_5:
runs-on: ubuntu-18.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
source ./util/ci/common.sh
@@ -55,7 +55,7 @@ jobs:
gcc_10:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
source ./util/ci/common.sh
@@ -76,7 +76,7 @@ jobs:
clang_3_9:
runs-on: ubuntu-18.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
source ./util/ci/common.sh
@@ -101,7 +101,7 @@ jobs:
clang_10:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
source ./util/ci/common.sh
@@ -126,13 +126,13 @@ jobs:
# Build with prometheus-cpp (server-only)
clang_9_prometheus:
name: "clang_9 (PROMETHEUS=1)"
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
source ./util/ci/common.sh
- install_linux_deps --old-irr clang-9
+ install_linux_deps clang-9
- name: Build prometheus-cpp
run: |
@@ -152,9 +152,9 @@ jobs:
docker:
name: "Docker image"
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Build docker image
run: |
docker build . -t minetest:latest
@@ -162,13 +162,13 @@ jobs:
win32:
name: "MinGW cross-compiler (32-bit)"
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install compiler
run: |
- sudo apt-get update -q && sudo apt-get install gettext -qyy
- wget http://minetest.kitsunemimi.pw/mingw-w64-i686_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
+ sudo apt-get update && sudo apt-get install -y gettext
+ wget http://minetest.kitsunemimi.pw/mingw-w64-i686_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
sudo tar -xaf mingw.tar.xz -C /usr
- name: Build
@@ -180,13 +180,13 @@ jobs:
win64:
name: "MinGW cross-compiler (64-bit)"
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install compiler
run: |
- sudo apt-get update -q && sudo apt-get install gettext -qyy
- wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
+ sudo apt-get update && sudo apt-get install -y gettext
+ wget http://minetest.kitsunemimi.pw/mingw-w64-x86_64_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
sudo tar -xaf mingw.tar.xz -C /usr
- name: Build
@@ -199,13 +199,10 @@ jobs:
msvc:
name: VS 2019 ${{ matrix.config.arch }}-${{ matrix.type }}
runs-on: windows-2019
- #### Disabled due to Irrlicht switch
- if: false
- #### Disabled due to Irrlicht switch
env:
- VCPKG_VERSION: 0bf3923f9fab4001c00f0f429682a0853b5749e0
-# 2020.11
- vcpkg_packages: irrlicht zlib zstd curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit
+ VCPKG_VERSION: 5cf60186a241e84e8232641ee973395d4fde90e1
+ # 2022.02
+ vcpkg_packages: zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp opengl-registry
strategy:
fail-fast: false
matrix:
@@ -226,11 +223,15 @@ jobs:
# Enable it, when working on the installer.
steps:
- - name: Checkout
- uses: actions/checkout@v2
+ - uses: actions/checkout@v3
+
+ - name: Checkout IrrlichtMt
+ run: |
+ $ref = @(Get-Content misc\irrlichtmt_tag.txt)
+ git clone https://github.com/minetest/irrlicht lib\irrlichtmt --depth 1 -b $ref[0]
- name: Restore from cache and run vcpkg
- uses: lukka/run-vcpkg@v5
+ uses: lukka/run-vcpkg@v7
with:
vcpkgArguments: ${{env.vcpkg_packages}}
vcpkgDirectory: '${{ github.workspace }}\vcpkg'
@@ -238,7 +239,7 @@ jobs:
vcpkgGitCommitId: ${{ env.VCPKG_VERSION }}
vcpkgTriplet: ${{ matrix.config.vcpkg_triplet }}
- - name: CMake
+ - name: Minetest CMake
run: |
cmake ${{matrix.config.generator}} `
-DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" `
@@ -246,7 +247,7 @@ jobs:
-DENABLE_POSTGRESQL=OFF `
-DRUN_IN_PLACE=${{ contains(matrix.type, 'portable') }} .
- - name: Build
+ - name: Build Minetest
run: cmake --build . --config Release
- name: CPack
@@ -265,7 +266,7 @@ jobs:
- name: Package Clean
run: rm -r $env:GITHUB_WORKSPACE\Package\_CPack_Packages
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v3
with:
name: msvc-${{ matrix.config.arch }}-${{ matrix.type }}
path: .\Package\
diff --git a/.github/workflows/cpp_lint.yml b/.github/workflows/cpp_lint.yml
index 2bd884c7a..581ee06d6 100644
--- a/.github/workflows/cpp_lint.yml
+++ b/.github/workflows/cpp_lint.yml
@@ -26,12 +26,13 @@ on:
jobs:
# clang_format:
-# runs-on: ubuntu-18.04
+# runs-on: ubuntu-20.04
# steps:
-# - uses: actions/checkout@v2
+# - uses: actions/checkout@v3
# - name: Install clang-format
# run: |
-# sudo apt-get install clang-format-9 -qyy
+# sudo apt-get update
+# sudo apt-get install -y clang-format-9
#
# - name: Run clang-format
# run: |
@@ -41,14 +42,13 @@ jobs:
# CLANG_FORMAT: clang-format-9
clang_tidy:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
- sudo apt-get install clang-tidy-9 -qyy
source ./util/ci/common.sh
- install_linux_deps
+ install_linux_deps clang-tidy-9
- name: Run clang-tidy
run: |
diff --git a/.github/workflows/lua.yml b/.github/workflows/lua.yml
new file mode 100644
index 000000000..21cbbdcee
--- /dev/null
+++ b/.github/workflows/lua.yml
@@ -0,0 +1,72 @@
+name: lua_lint
+
+# Lint on lua changes on builtin or if workflow changed
+on:
+ push:
+ paths:
+ - 'builtin/**.lua'
+ - 'games/devtest/**.lua'
+ - '.github/workflows/**.yml'
+ pull_request:
+ paths:
+ - 'builtin/**.lua'
+ - 'games/devtest/**.lua'
+ - '.github/workflows/**.yml'
+
+jobs:
+ # Note that the integration tests are also run build.yml, but only when C++ code is changed.
+ integration_tests:
+ name: "Compile and run multiplayer tests"
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v3
+ - name: Install deps
+ run: |
+ source ./util/ci/common.sh
+ install_linux_deps clang-10 gdb libluajit-5.1-dev
+
+ - name: Build
+ run: |
+ ./util/ci/build.sh
+ env:
+ CC: clang-10
+ CXX: clang++-10
+ CMAKE_FLAGS: "-DENABLE_GETTEXT=0 -DBUILD_SERVER=0"
+
+ - name: Integration test + devtest
+ run: |
+ ./util/test_multiplayer.sh
+
+ luacheck:
+ name: "Builtin Luacheck and Unit Tests"
+ runs-on: ubuntu-20.04
+
+ steps:
+
+ - uses: actions/checkout@v3
+ - uses: leafo/gh-actions-lua@v9
+ with:
+ luaVersion: "5.1.5"
+ - uses: leafo/gh-actions-luarocks@v4
+
+ - name: Install LuaJIT
+ run: |
+ cd $HOME
+ git clone https://github.com/LuaJIT/LuaJIT/
+ cd LuaJIT
+ make -j$(nproc)
+
+ - name: Install luarocks tools
+ run: |
+ luarocks install --local luacheck
+ luarocks install --local busted
+
+ - name: Run checks (builtin)
+ run: |
+ $HOME/.luarocks/bin/luacheck builtin
+ $HOME/.luarocks/bin/busted builtin
+ $HOME/.luarocks/bin/busted builtin --lua=$HOME/LuaJIT/src/luajit
+
+ - name: Run checks (devtest)
+ run: |
+ $HOME/.luarocks/bin/luacheck --config=games/devtest/.luacheckrc games/devtest
diff --git a/.github/workflows/lua_lint.yml b/.github/workflows/lua_lint.yml
deleted file mode 100644
index 738e5afff..000000000
--- a/.github/workflows/lua_lint.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: lua_lint
-
-# Lint on lua changes on builtin or if workflow changed
-on:
- push:
- paths:
- - 'builtin/**.lua'
- - '.github/workflows/**.yml'
- pull_request:
- paths:
- - 'builtin/**.lua'
- - '.github/workflows/**.yml'
-
-jobs:
- luacheck:
- name: "Builtin Luacheck and Unit Tests"
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - name: Install luarocks
- run: |
- sudo apt-get install luarocks -qyy
-
- - name: Install luarocks tools
- run: |
- luarocks install --local luacheck
- luarocks install --local busted
-
- - name: Run checks
- run: |
- $HOME/.luarocks/bin/luacheck builtin
- $HOME/.luarocks/bin/busted builtin
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 69253b70a..038765494 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -22,7 +22,6 @@ on:
- '.github/workflows/macos.yml'
env:
- IRRLICHT_TAG: 1.9.0mt4
MINETEST_GAME_REPO: https://github.com/minetest/minetest_game.git
MINETEST_GAME_BRANCH: master
MINETEST_GAME_NAME: minetest_game
@@ -31,7 +30,7 @@ jobs:
build:
runs-on: macos-10.15
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Install deps
run: |
pkgs=(cmake freetype gettext gmp hiredis jpeg jsoncpp leveldb libogg libpng libvorbis luajit zstd)
@@ -43,10 +42,9 @@ jobs:
- name: Build
run: |
git clone -b $MINETEST_GAME_BRANCH $MINETEST_GAME_REPO games/$MINETEST_GAME_NAME
- rm -rvf games/$MINETEST_GAME_NAME/.git
- git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
- mkdir cmakebuild
- cd cmakebuild
+ git clone https://github.com/minetest/irrlicht lib/irrlichtmt --depth 1 -b $(cat misc/irrlichtmt_tag.txt)
+ mkdir build
+ cd build
cmake .. \
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \
-DCMAKE_FIND_FRAMEWORK=LAST \
@@ -60,7 +58,14 @@ jobs:
run: |
./build/macos/minetest.app/Contents/MacOS/minetest --run-unittests
- - uses: actions/upload-artifact@v2
+ # Zipping the built .app preserves permissions on the contained files,
+ # which the GitHub artifact pipeline would otherwise strip away.
+ - name: CPack
+ run: |
+ cd build
+ cpack -G ZIP -B macos
+
+ - uses: actions/upload-artifact@v3
with:
name: minetest-macos
- path: ./build/macos/
+ path: ./build/macos/*.zip
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5d2600364..28e35a971 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,7 +9,6 @@ stages:
- deploy
variables:
- IRRLICHT_TAG: "1.9.0mt4"
MINETEST_GAME_REPO: "https://github.com/minetest/minetest_game.git"
CONTAINER_IMAGE: registry.gitlab.com/$CI_PROJECT_PATH
@@ -19,11 +18,10 @@ variables:
- apt-get update
- DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential git cmake libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libleveldb-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev
script:
- - git clone https://github.com/minetest/irrlicht -b $IRRLICHT_TAG lib/irrlichtmt
- - mkdir cmakebuild
- - cd cmakebuild
- - cmake -DCMAKE_INSTALL_PREFIX=../artifact/minetest/usr/ -DCMAKE_BUILD_TYPE=Release -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE -DBUILD_SERVER=TRUE ..
- - make -j2
+ - git clone https://github.com/minetest/irrlicht lib/irrlichtmt --depth 1 -b $(cat misc/irrlichtmt_tag.txt)
+ - mkdir build && cd build
+ - cmake -DCMAKE_INSTALL_PREFIX=../artifact/minetest/usr/ -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE -DBUILD_SERVER=TRUE ..
+ - make -j $(($(nproc) + 1))
- make install
artifacts:
when: on_success
@@ -198,7 +196,7 @@ build:fedora-28:
before_script:
- apt-get update
- DEBIAN_FRONTEND=noninteractive apt-get install -y wget xz-utils unzip git cmake gettext
- - wget -nv http://minetest.kitsunemimi.pw/mingw-w64-${WIN_ARCH}_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz
+ - wget -nv http://minetest.kitsunemimi.pw/mingw-w64-${WIN_ARCH}_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz
- tar -xaf mingw.tar.xz -C /usr
.build_win_template:
diff --git a/.mailmap b/.mailmap
index fcc763411..76190d078 100644
--- a/.mailmap
+++ b/.mailmap
@@ -49,14 +49,15 @@ ClobberXD <ClobberXD@gmail.com> <36130650+ClobberXD@users.noreply.github.com>
Auke Kok <sofar+github@foo-projects.org>
Auke Kok <sofar+github@foo-projects.org> <sofar@foo-projects.org>
Desour <vorunbekannt75@web.de>
-Nathanaël Courant <Ekdohibs@users.noreply.github.com> <nathanael.courant@laposte.net>
+Nathanaëlle Courant <Ekdohibs@users.noreply.github.com> <nathanael.courant@laposte.net>
Ezhh <owlecho@live.com>
paramat <paramat@users.noreply.github.com>
paramat <paramat@users.noreply.github.com> <mat.gregory@virginmedia.com>
lhofhansl <lhofhansl@yahoo.com> <larsh@apache.org>
red-001 <red-001@outlook.ie> <red-001@openmailbox.org>
-Wuzzy <wuzzy2@mail.ru> <Wuzzy2@mail.ru>
-Wuzzy <wuzzy2@mail.ru> <almikes@aol.com>
+Wuzzy <Wuzzy@disroot.org> <wuzzy2@mail.ru>
+Wuzzy <Wuzzy@disroot.org> <Wuzzy2@mail.ru>
+Wuzzy <Wuzzy@disroot.org> <almikes@aol.com>
Jordach <jordach.snelling@gmail.com>
MoNTE48 <MoNTE48@mail.ua>
v-rob <robinsonvincent89@gmail.com>
@@ -65,3 +66,4 @@ EvidenceB <49488517+EvidenceBKidscode@users.noreply.github.com>
gregorycu <gregory.currie@gmail.com>
Rogier <rogier777@gmail.com>
Rogier <rogier777@gmail.com> <Rogier-5@users.noreply.github.com>
+x2048 <codeforsmile@gmail.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 40cf6504b..94efc4ec3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,14 +11,15 @@ endif()
project(minetest)
set(PROJECT_NAME_CAPITALIZED "Minetest")
-set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(GCC_MINIMUM_VERSION "5.1")
set(CLANG_MINIMUM_VERSION "3.5")
# Also remember to set PROTOCOL_VERSION in network/networkprotocol.h when releasing
set(VERSION_MAJOR 5)
-set(VERSION_MINOR 5)
-set(VERSION_PATCH 1)
+set(VERSION_MINOR 6)
+set(VERSION_PATCH 0)
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
# Change to false for releases
@@ -51,6 +52,7 @@ set(RUN_IN_PLACE ${DEFAULT_RUN_IN_PLACE} CACHE BOOL
set(BUILD_CLIENT TRUE CACHE BOOL "Build client")
set(BUILD_SERVER FALSE CACHE BOOL "Build server")
set(BUILD_UNITTESTS TRUE CACHE BOOL "Build unittests")
+set(BUILD_BENCHMARKS FALSE CACHE BOOL "Build benchmarks")
set(WARN_ALL TRUE CACHE BOOL "Enable -Wall for Release build")
@@ -59,6 +61,9 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type: Debug or Release" FORCE)
endif()
+set(ENABLE_UPDATE_CHECKER (NOT ${DEVELOPMENT_BUILD}) CACHE BOOL
+ "Whether to enable update checks by default")
+
# Included stuff
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
@@ -68,7 +73,7 @@ if(NOT "${IRRLICHTMT_BUILD_DIR}" STREQUAL "")
find_package(IrrlichtMt QUIET
PATHS "${IRRLICHTMT_BUILD_DIR}"
NO_DEFAULT_PATH
-)
+ )
if(NOT TARGET IrrlichtMt::IrrlichtMt)
# find_package() searches certain subdirectories. ${PATH}/cmake is not
@@ -76,7 +81,6 @@ if(NOT "${IRRLICHTMT_BUILD_DIR}" STREQUAL "")
# IrrlichtMtConfig.cmake
message(FATAL_ERROR "Could not find IrrlichtMtConfig.cmake in ${IRRLICHTMT_BUILD_DIR}/cmake.")
endif()
-# This is done here so that relative search paths are more reasonable
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt")
message(STATUS "Using user-provided IrrlichtMt at subdirectory 'lib/irrlichtmt'")
if(BUILD_CLIENT)
@@ -106,9 +110,9 @@ else()
include(MinetestFindIrrlichtHeaders)
if(NOT IRRLICHT_INCLUDE_DIR)
- message(FATAL_ERROR "Irrlicht or IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}")
+ message(FATAL_ERROR "IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}")
endif()
- message(STATUS "Found Irrlicht headers: ${IRRLICHT_INCLUDE_DIR}")
+ message(STATUS "Found IrrlichtMt headers: ${IRRLICHT_INCLUDE_DIR}")
add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED)
# Note that we can't use target_include_directories() since that doesn't work for IMPORTED targets before CMake 3.11
set_target_properties(IrrlichtMt::IrrlichtMt PROPERTIES
@@ -116,8 +120,20 @@ else()
endif()
endif()
-if(TARGET IrrlichtMt::IrrlichtMt)
+if(BUILD_CLIENT AND TARGET IrrlichtMt::IrrlichtMt)
+ # retrieve version somehow
+ if(NOT IrrlichtMt_VERSION)
+ get_target_property(IrrlichtMt_VERSION IrrlichtMt VERSION)
+ endif()
message(STATUS "Found IrrlichtMt ${IrrlichtMt_VERSION}")
+
+ set(TARGET_VER_S 1.9.0mt7)
+ string(REPLACE "mt" "." TARGET_VER ${TARGET_VER_S})
+ if(IrrlichtMt_VERSION VERSION_LESS ${TARGET_VER})
+ message(FATAL_ERROR "At least IrrlichtMt ${TARGET_VER_S} is required to build")
+ elseif(NOT DEVELOPMENT_BUILD AND IrrlichtMt_VERSION VERSION_GREATER ${TARGET_VER})
+ message(FATAL_ERROR "IrrlichtMt ${TARGET_VER_S} is required to build")
+ endif()
endif()
@@ -279,6 +295,10 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang")
endif()
endif()
+if(BUILD_BENCHMARKS)
+ add_subdirectory(lib/catch2)
+endif()
+
# Subdirectories
# Be sure to add all relevant definitions above this
add_subdirectory(src)
diff --git a/Dockerfile b/Dockerfile
index 93f6b982b..3dd82e772 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -26,24 +26,21 @@ RUN apk add --no-cache git build-base cmake sqlite-dev curl-dev zlib-dev zstd-de
rm -fr ./games/minetest_game/.git
WORKDIR /usr/src/
-RUN git clone --recursive https://github.com/jupp0r/prometheus-cpp/ -b v1.0.0 && \
- mkdir prometheus-cpp/build && \
- cd prometheus-cpp/build && \
- cmake .. \
+RUN git clone --recursive https://github.com/jupp0r/prometheus-cpp/ && \
+ cd prometheus-cpp && \
+ cmake -B build \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_TESTING=0 \
-GNinja && \
- ninja && \
- ninja install
+ cmake --build build && \
+ cmake --install build
RUN git clone --depth=1 https://github.com/minetest/irrlicht/ -b ${IRRLICHT_VERSION} && \
cp -r irrlicht/include /usr/include/irrlichtmt
WORKDIR /usr/src/minetest
-RUN mkdir build && \
- cd build && \
- cmake .. \
+RUN cmake -B build \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SERVER=TRUE \
@@ -51,8 +48,8 @@ RUN mkdir build && \
-DBUILD_UNITTESTS=FALSE \
-DBUILD_CLIENT=FALSE \
-GNinja && \
- ninja && \
- ninja install
+ cmake --build build && \
+ cmake --install build
ARG DOCKER_IMAGE=alpine:3.14
FROM $DOCKER_IMAGE AS runtime
diff --git a/LICENSE.txt b/LICENSE.txt
index ab44488a7..1f2c6c38d 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -63,6 +63,15 @@ Zughy:
appgurueu:
textures/base/pack/server_incompatible.png
+
+erlehmann, Warr1024, rollerozxa:
+ textures/base/pack/no_screenshot.png
+
+kilbith:
+ textures/base/pack/server_favorite.png
+
+SmallJoker
+ textures/base/pack/server_favorite_delete.png (based on server_favorite.png)
License of Minetest source code
-------------------------------
diff --git a/README.md b/README.md
index b3d2981f6..0bc5d4b42 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Minetest
Minetest is a free open-source voxel game engine with easy modding and game creation.
-Copyright (C) 2010-2020 Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2010-2022 Perttu Ahola <celeron55@gmail.com>
and contributors (see source file comments and the version control log)
In case you downloaded the source code
@@ -144,19 +144,19 @@ Compiling
For Debian/Ubuntu users:
- sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libxxf86vm-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
+ 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
For Fedora users:
- sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-devel libvorbis-devel libXxf86vm-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
+ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl-devel openal-soft-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
For Arch users:
- sudo pacman -S base-devel libcurl-gnutls cmake libxxf86vm libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd
+ sudo pacman -S base-devel libcurl-gnutls cmake libxi libpng sqlite libogg libvorbis openal freetype2 jsoncpp gmp luajit leveldb ncurses zstd
For Alpine users:
- sudo apk add build-base cmake libpng-dev jpeg-dev libxxf86vm-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
+ 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
#### Download
@@ -223,8 +223,8 @@ Run it:
- You can disable the client build by specifying `-DBUILD_CLIENT=FALSE`.
- You can select between Release and Debug build by `-DCMAKE_BUILD_TYPE=<Debug or Release>`.
- Debug build is slower, but gives much more useful output in a debugger.
-- If you build a bare server you don't need to have the Irrlicht or IrrlichtMt library installed.
- - In that case use `-DIRRLICHT_INCLUDE_DIR=/some/where/irrlicht/include`.
+- If you build a bare server you don't need to compile IrrlichtMt, just the headers suffice.
+ - In that case use `-DIRRLICHT_INCLUDE_DIR=/some/where/irrlichtmt/include`.
- Minetest will use the IrrlichtMt package that is found first, given by the following order:
1. Specified `IRRLICHTMT_BUILD_DIR` CMake variable
@@ -240,6 +240,7 @@ General options and their default values:
BUILD_CLIENT=TRUE - Build Minetest client
BUILD_SERVER=FALSE - Build Minetest server
BUILD_UNITTESTS=TRUE - Build unittest sources
+ BUILD_BENCHMARKS=FALSE - Build benchmark sources
CMAKE_BUILD_TYPE=Release - Type of build (Release vs. Debug)
Release - Release build
Debug - Debug build
@@ -249,7 +250,7 @@ General options and their default values:
ENABLE_CURL=ON - Build with cURL; Enables use of online mod repo, public serverlist and remote media fetching via http
ENABLE_CURSES=ON - Build with (n)curses; Enables a server side terminal (command line option: --terminal)
ENABLE_GETTEXT=ON - Build with Gettext; Allows using translations
- ENABLE_GLES=OFF - Build for OpenGL ES instead of OpenGL (requires support by IrrlichtMt)
+ ENABLE_GLES=OFF - Enable extra support code for OpenGL ES (requires support by IrrlichtMt)
ENABLE_LEVELDB=ON - Build with LevelDB; Enables use of LevelDB map backend
ENABLE_POSTGRESQL=ON - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater recommended)
ENABLE_REDIS=ON - Build with libhiredis; Enables use of Redis map backend
@@ -259,8 +260,8 @@ General options and their default values:
ENABLE_PROMETHEUS=OFF - Build with Prometheus metrics exporter (listens on tcp/30000 by default)
ENABLE_SYSTEM_GMP=ON - Use GMP from system (much faster than bundled mini-gmp)
ENABLE_SYSTEM_JSONCPP=ON - Use JsonCPP from system
- OPENGL_GL_PREFERENCE=LEGACY - Linux client build only; See CMake Policy CMP0072 for reference
RUN_IN_PLACE=FALSE - Create a portable install (worlds, settings etc. in current directory)
+ ENABLE_UPDATE_CHECKER=TRUE - Whether to enable update checks by default
USE_GPROF=FALSE - Enable profiling using GProf
VERSION_EXTRA= - Text to append to version (e.g. VERSION_EXTRA=foobar -> Minetest 0.4.9-foobar)
ENABLE_TOUCH=FALSE - Enable Touchscreen support (requires support by IrrlichtMt)
@@ -300,15 +301,12 @@ Library specific options:
OPENAL_DLL - Only if building with sound on Windows; path to OpenAL32.dll
OPENAL_INCLUDE_DIR - Only if building with sound; directory where al.h is located
OPENAL_LIBRARY - Only if building with sound; path to libopenal.a/libopenal.so/OpenAL32.lib
- OPENGLES2_INCLUDE_DIR - Only if building with GLES; directory that contains gl2.h
- OPENGLES2_LIBRARY - Only if building with GLES; path to libGLESv2.a/libGLESv2.so
SQLITE3_INCLUDE_DIR - Directory that contains sqlite3.h
SQLITE3_LIBRARY - Path to libsqlite3.a/libsqlite3.so/sqlite3.lib
VORBISFILE_LIBRARY - Only if building with sound; path to libvorbisfile.a/libvorbisfile.so/libvorbisfile.dll.a
VORBIS_DLL - Only if building with sound on Windows; paths to vorbis DLLs
VORBIS_INCLUDE_DIR - Only if building with sound; directory that contains a directory vorbis with vorbisenc.h inside
VORBIS_LIBRARY - Only if building with sound; path to libvorbis.a/libvorbis.so/libvorbis.dll.a
- XXF86VM_LIBRARY - Only on Linux; path to libXXf86vm.a/libXXf86vm.so
ZLIB_DLL - Only on Windows; path to zlib1.dll
ZLIB_INCLUDE_DIR - Directory that contains zlib.h
ZLIB_LIBRARY - Path to libz.a/libz.so/zlib.lib
@@ -421,8 +419,8 @@ git clone --depth 1 https://github.com/minetest/irrlicht.git lib/irrlichtmt
#### Build
```bash
-mkdir cmakebuild
-cd cmakebuild
+mkdir build
+cd build
cmake .. \
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \
@@ -430,7 +428,7 @@ cmake .. \
-DCMAKE_INSTALL_PREFIX=../build/macos/ \
-DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE
-make -j$(nproc)
+make -j$(sysctl -n hw.logicalcpu)
make install
```
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 6ea677cb9..11c868622 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -59,6 +59,17 @@
android:name=".UnzipService"
android:enabled="true"
android:exported="false" />
- </application>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="net.minetest.minetest.fileprovider"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/filepaths" />
+ </provider>
+
+</application>
</manifest>
diff --git a/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/android/app/src/main/java/net/minetest/minetest/GameActivity.java
index 46fc9b1de..f5e9fd6d0 100644
--- a/android/app/src/main/java/net/minetest/minetest/GameActivity.java
+++ b/android/app/src/main/java/net/minetest/minetest/GameActivity.java
@@ -26,6 +26,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.InputType;
+import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
@@ -34,10 +35,16 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
+import androidx.annotation.Keep;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.FileProvider;
+import java.io.File;
import java.util.Objects;
+// Native code finds these methods by name (see porting_android.cpp).
+// This annotation prevents the minifier/Proguard from mangling them.
+@Keep
public class GameActivity extends NativeActivity {
static {
System.loadLibrary("c++_shared");
@@ -179,4 +186,22 @@ public class GameActivity extends NativeActivity {
public String getCachePath() {
return Utils.getCacheDirectory(this).getAbsolutePath();
}
+
+ public void shareFile(String path) {
+ File file = new File(path);
+ if (!file.exists()) {
+ Log.e("GameActivity", "File " + file.getAbsolutePath() + " doesn't exist");
+ return;
+ }
+
+ Uri fileUri = FileProvider.getUriForFile(this, "net.minetest.minetest.fileprovider", file);
+
+ Intent intent = new Intent(Intent.ACTION_SEND, fileUri);
+ intent.setDataAndType(fileUri, getContentResolver().getType(fileUri));
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ intent.putExtra(Intent.EXTRA_STREAM, fileUri);
+
+ Intent shareIntent = Intent.createChooser(intent, null);
+ startActivity(shareIntent);
+ }
}
diff --git a/android/app/src/main/res/xml/filepaths.xml b/android/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 000000000..2fff06908
--- /dev/null
+++ b/android/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,3 @@
+<paths>
+ <external-files-path path="Minetest/" name="minetest" />
+</paths>
diff --git a/android/build.gradle b/android/build.gradle
index a4c0e7535..7113dc7ad 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,16 +1,17 @@
// 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", 5) // Version Minor
-project.ext.set("versionPatch", 1) // Version Patch
+project.ext.set("versionMinor", 6) // Version Minor
+project.ext.set("versionPatch", 0) // Version Patch
project.ext.set("versionExtra", "") // Version Extra
project.ext.set("versionCode", 40) // Android Version Code
+project.ext.set("developmentBuild", 0) // Whether it is a development build, or a release
// 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
buildscript {
- ext.ndk_version = '23.0.7599858'
+ ext.ndk_version = '23.2.8568313'
repositories {
google()
jcenter()
diff --git a/android/native/build.gradle b/android/native/build.gradle
index 2ddc77135..2254aab3a 100644
--- a/android/native/build.gradle
+++ b/android/native/build.gradle
@@ -14,7 +14,8 @@ android {
"versionMajor=${versionMajor}",
"versionMinor=${versionMinor}",
"versionPatch=${versionPatch}",
- "versionExtra=${versionExtra}"
+ "versionExtra=${versionExtra}",
+ "developmentBuild=${developmentBuild}"
}
}
}
diff --git a/android/native/jni/Android.mk b/android/native/jni/Android.mk
index f8ca74d3c..50651d5ba 100644
--- a/android/native/jni/Android.mk
+++ b/android/native/jni/Android.mk
@@ -1,6 +1,7 @@
LOCAL_PATH := $(call my-dir)/..
#LOCAL_ADDRESS_SANITIZER:=true
+#USE_BUILTIN_LUA:=true
include $(CLEAR_VARS)
LOCAL_MODULE := Curl
@@ -42,11 +43,15 @@ LOCAL_MODULE := Irrlicht
LOCAL_SRC_FILES := deps/$(APP_ABI)/Irrlicht/libIrrlichtMt.a
include $(PREBUILT_STATIC_LIBRARY)
+ifndef USE_BUILTIN_LUA
+
include $(CLEAR_VARS)
LOCAL_MODULE := LuaJIT
LOCAL_SRC_FILES := deps/$(APP_ABI)/LuaJIT/libluajit.a
include $(PREBUILT_STATIC_LIBRARY)
+endif
+
include $(CLEAR_VARS)
LOCAL_MODULE := OpenAL
LOCAL_SRC_FILES := deps/$(APP_ABI)/OpenAL-Soft/libopenal.a
@@ -92,14 +97,20 @@ LOCAL_CFLAGS += \
-DUSE_CURL=1 \
-DUSE_SOUND=1 \
-DUSE_LEVELDB=0 \
- -DUSE_LUAJIT=1 \
-DUSE_GETTEXT=1 \
-DVERSION_MAJOR=${versionMajor} \
-DVERSION_MINOR=${versionMinor} \
-DVERSION_PATCH=${versionPatch} \
-DVERSION_EXTRA=${versionExtra} \
+ -DDEVELOPMENT_BUILD=${developmentBuild} \
$(GPROF_DEF)
+ifdef USE_BUILTIN_LUA
+ LOCAL_CFLAGS += -DUSE_LUAJIT=0
+else
+ LOCAL_CFLAGS += -DUSE_LUAJIT=1
+endif
+
ifdef NDEBUG
LOCAL_CFLAGS += -DNDEBUG=1
endif
@@ -120,12 +131,19 @@ LOCAL_C_INCLUDES := \
deps/$(APP_ABI)/Irrlicht/include \
deps/$(APP_ABI)/Gettext/include \
deps/$(APP_ABI)/Iconv/include \
- deps/$(APP_ABI)/LuaJIT/include \
deps/$(APP_ABI)/OpenAL-Soft/include \
deps/$(APP_ABI)/SQLite/include \
deps/$(APP_ABI)/Vorbis/include \
deps/$(APP_ABI)/Zstd/include
+ifdef USE_BUILTIN_LUA
+ LOCAL_C_INCLUDES += \
+ ../../lib/lua/src \
+ ../../lib/bitop
+else
+ LOCAL_C_INCLUDES += deps/$(APP_ABI)/LuaJIT/include
+endif
+
LOCAL_SRC_FILES := \
$(wildcard ../../src/client/*.cpp) \
$(wildcard ../../src/client/*/*.cpp) \
@@ -207,6 +225,41 @@ LOCAL_SRC_FILES := \
../../src/voxel.cpp \
../../src/voxelalgorithms.cpp
+# Built-in Lua
+ifdef USE_BUILTIN_LUA
+ LOCAL_SRC_FILES += \
+ ../../lib/lua/src/lapi.c \
+ ../../lib/lua/src/lauxlib.c \
+ ../../lib/lua/src/lbaselib.c \
+ ../../lib/lua/src/lcode.c \
+ ../../lib/lua/src/ldblib.c \
+ ../../lib/lua/src/ldebug.c \
+ ../../lib/lua/src/ldo.c \
+ ../../lib/lua/src/ldump.c \
+ ../../lib/lua/src/lfunc.c \
+ ../../lib/lua/src/lgc.c \
+ ../../lib/lua/src/linit.c \
+ ../../lib/lua/src/liolib.c \
+ ../../lib/lua/src/llex.c \
+ ../../lib/lua/src/lmathlib.c \
+ ../../lib/lua/src/lmem.c \
+ ../../lib/lua/src/loadlib.c \
+ ../../lib/lua/src/lobject.c \
+ ../../lib/lua/src/lopcodes.c \
+ ../../lib/lua/src/loslib.c \
+ ../../lib/lua/src/lparser.c \
+ ../../lib/lua/src/lstate.c \
+ ../../lib/lua/src/lstring.c \
+ ../../lib/lua/src/lstrlib.c \
+ ../../lib/lua/src/ltable.c \
+ ../../lib/lua/src/ltablib.c \
+ ../../lib/lua/src/ltm.c \
+ ../../lib/lua/src/lundump.c \
+ ../../lib/lua/src/lvm.c \
+ ../../lib/lua/src/lzio.c \
+ ../../lib/bitop/bit.c
+endif
+
# GMP
LOCAL_SRC_FILES += ../../lib/gmp/mini-gmp.c
@@ -218,12 +271,14 @@ LOCAL_STATIC_LIBRARIES += \
Freetype \
Iconv libcharset \
Irrlicht \
- LuaJIT \
OpenAL \
Gettext \
SQLite3 \
Vorbis libvorbisfile libogg \
Zstd
+ifndef USE_BUILTIN_LUA
+ LOCAL_STATIC_LIBRARIES += LuaJIT
+endif
LOCAL_STATIC_LIBRARIES += android_native_app_glue $(PROFILER_LIBS)
LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
diff --git a/android/native/jni/Application.mk b/android/native/jni/Application.mk
index e21bca61c..9d9596137 100644
--- a/android/native/jni/Application.mk
+++ b/android/native/jni/Application.mk
@@ -20,7 +20,7 @@ APP_CPPFLAGS := -g -Og -fno-omit-frame-pointer
endif
APP_CFLAGS := $(APP_CPPFLAGS) -Wno-inconsistent-missing-override -Wno-parentheses-equality
-APP_CXXFLAGS := $(APP_CPPFLAGS) -fexceptions -frtti -std=gnu++17
+APP_CXXFLAGS := $(APP_CPPFLAGS) -fexceptions -frtti -std=gnu++14
APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe
ifeq ($(APP_ABI),arm64-v8a)
diff --git a/builtin/async/game.lua b/builtin/async/game.lua
new file mode 100644
index 000000000..6512f0706
--- /dev/null
+++ b/builtin/async/game.lua
@@ -0,0 +1,59 @@
+core.log("info", "Initializing asynchronous environment (game)")
+
+local function pack2(...)
+ return {n=select('#', ...), ...}
+end
+
+-- Entrypoint to run async jobs, called by C++
+function core.job_processor(func, params)
+ local retval = pack2(func(unpack(params, 1, params.n)))
+
+ return retval
+end
+
+-- Import a bunch of individual files from builtin/game/
+local gamepath = core.get_builtin_path() .. "game" .. DIR_DELIM
+
+dofile(gamepath .. "constants.lua")
+dofile(gamepath .. "item_s.lua")
+dofile(gamepath .. "misc_s.lua")
+dofile(gamepath .. "features.lua")
+dofile(gamepath .. "voxelarea.lua")
+
+-- Transfer of globals
+do
+ local all = assert(core.transferred_globals)
+ core.transferred_globals = nil
+
+ all.registered_nodes = {}
+ all.registered_craftitems = {}
+ all.registered_tools = {}
+ for k, v in pairs(all.registered_items) do
+ -- Disable further modification
+ setmetatable(v, {__newindex = {}})
+ -- Reassemble the other tables
+ if v.type == "node" then
+ all.registered_nodes[k] = v
+ elseif v.type == "craftitem" then
+ all.registered_craftitems[k] = v
+ elseif v.type == "tool" then
+ all.registered_tools[k] = v
+ end
+ end
+
+ for k, v in pairs(all) do
+ core[k] = v
+ end
+end
+
+-- For tables that are indexed by item name:
+-- If table[X] does not exist, default to table[core.registered_aliases[X]]
+local alias_metatable = {
+ __index = function(t, name)
+ return rawget(t, core.registered_aliases[name])
+ end
+}
+setmetatable(core.registered_items, alias_metatable)
+setmetatable(core.registered_nodes, alias_metatable)
+setmetatable(core.registered_craftitems, alias_metatable)
+setmetatable(core.registered_tools, alias_metatable)
diff --git a/builtin/async/init.lua b/builtin/async/mainmenu.lua
index 3803994d6..0e9c222d1 100644
--- a/builtin/async/init.lua
+++ b/builtin/async/mainmenu.lua
@@ -1,5 +1,4 @@
-
-core.log("info", "Initializing Asynchronous environment")
+core.log("info", "Initializing asynchronous environment")
function core.job_processor(func, serialized_param)
local param = core.deserialize(serialized_param)
@@ -8,4 +7,3 @@ function core.job_processor(func, serialized_param)
return retval or core.serialize(nil)
end
-
diff --git a/builtin/client/init.lua b/builtin/client/init.lua
index 589fe8f24..3719a90ee 100644
--- a/builtin/client/init.lua
+++ b/builtin/client/init.lua
@@ -5,6 +5,8 @@ local commonpath = scriptpath.."common"..DIR_DELIM
dofile(clientpath .. "register.lua")
dofile(commonpath .. "after.lua")
+dofile(commonpath .. "mod_storage.lua")
dofile(commonpath .. "chatcommands.lua")
dofile(clientpath .. "chatcommands.lua")
dofile(clientpath .. "death_formspec.lua")
+dofile(clientpath .. "misc.lua")
diff --git a/builtin/client/misc.lua b/builtin/client/misc.lua
new file mode 100644
index 000000000..80e0f2904
--- /dev/null
+++ b/builtin/client/misc.lua
@@ -0,0 +1,7 @@
+function core.setting_get_pos(name)
+ local value = core.settings:get(name)
+ if not value then
+ return nil
+ end
+ return core.string_to_pos(value)
+end
diff --git a/builtin/common/information_formspecs.lua b/builtin/common/information_formspecs.lua
index 3405263bf..1445a017c 100644
--- a/builtin/common/information_formspecs.lua
+++ b/builtin/common/information_formspecs.lua
@@ -22,7 +22,6 @@ local LIST_FORMSPEC_DESCRIPTION = [[
local F = core.formspec_escape
local S = core.get_translator("__builtin")
-local check_player_privs = core.check_player_privs
-- CHAT COMMANDS FORMSPEC
@@ -58,10 +57,11 @@ local function build_chatcommands_formspec(name, sel, copy)
.. "any entry in the list.").. "\n" ..
S("Double-click to copy the entry to the chat history.")
+ local privs = core.get_player_privs(name)
for i, data in ipairs(mod_cmds) do
rows[#rows + 1] = COLOR_BLUE .. ",0," .. F(data[1]) .. ","
for j, cmds in ipairs(data[2]) do
- local has_priv = check_player_privs(name, cmds[2].privs)
+ local has_priv = privs[cmds[2].privs]
rows[#rows + 1] = ("%s,1,%s,%s"):format(
has_priv and COLOR_GREEN or COLOR_GRAY,
cmds[1], F(cmds[2].params))
diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua
index f5f89acd7..467f18804 100644
--- a/builtin/common/misc_helpers.lua
+++ b/builtin/common/misc_helpers.lua
@@ -204,7 +204,7 @@ end
--------------------------------------------------------------------------------
function string:trim()
- return (self:gsub("^%s*(.-)%s*$", "%1"))
+ return self:match("^%s*(.-)%s*$")
end
--------------------------------------------------------------------------------
@@ -245,16 +245,16 @@ function math.round(x)
return math.ceil(x - 0.5)
end
-
+local formspec_escapes = {
+ ["\\"] = "\\\\",
+ ["["] = "\\[",
+ ["]"] = "\\]",
+ [";"] = "\\;",
+ [","] = "\\,"
+}
function core.formspec_escape(text)
- if text ~= nil then
- text = string.gsub(text,"\\","\\\\")
- text = string.gsub(text,"%]","\\]")
- text = string.gsub(text,"%[","\\[")
- text = string.gsub(text,";","\\;")
- text = string.gsub(text,",","\\,")
- end
- return text
+ -- Use explicit character set instead of dot here because it doubles the performance
+ return text and string.gsub(text, "[\\%[%];,]", formspec_escapes)
end
@@ -265,18 +265,21 @@ function core.wrap_text(text, max_length, as_table)
return as_table and {text} or text
end
- for word in text:gmatch('%S+') do
- local cur_length = #table.concat(line, ' ')
- if cur_length > 0 and cur_length + #word + 1 >= max_length then
+ local line_length = 0
+ for word in text:gmatch("%S+") do
+ if line_length > 0 and line_length + #word + 1 >= max_length then
-- word wouldn't fit on current line, move to next line
- table.insert(result, table.concat(line, ' '))
- line = {}
+ table.insert(result, table.concat(line, " "))
+ line = {word}
+ line_length = #word
+ else
+ table.insert(line, word)
+ line_length = line_length + 1 + #word
end
- table.insert(line, word)
end
- table.insert(result, table.concat(line, ' '))
- return as_table and result or table.concat(result, '\n')
+ table.insert(result, table.concat(line, " "))
+ return as_table and result or table.concat(result, "\n")
end
--------------------------------------------------------------------------------
@@ -425,54 +428,50 @@ function core.string_to_pos(value)
return nil
end
- local x, y, z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
- if x and y and z then
- x = tonumber(x)
- y = tonumber(y)
- z = tonumber(z)
- return vector.new(x, y, z)
- end
- x, y, z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
+ value = value:match("^%((.-)%)$") or value -- strip parentheses
+
+ local x, y, z = value:trim():match("^([%d.-]+)[,%s]%s*([%d.-]+)[,%s]%s*([%d.-]+)$")
if x and y and z then
x = tonumber(x)
y = tonumber(y)
z = tonumber(z)
return vector.new(x, y, z)
end
+
return nil
end
--------------------------------------------------------------------------------
-function core.string_to_area(value)
- local p1, p2 = unpack(value:split(") ("))
- if p1 == nil or p2 == nil then
- return nil
- end
- p1 = core.string_to_pos(p1 .. ")")
- p2 = core.string_to_pos("(" .. p2)
- if p1 == nil or p2 == nil then
- return nil
+do
+ local rel_num_cap = "(~?-?%d*%.?%d*)" -- may be overly permissive as this will be tonumber'ed anyways
+ local num_delim = "[,%s]%s*"
+ local pattern = "^" .. table.concat({rel_num_cap, rel_num_cap, rel_num_cap}, num_delim) .. "$"
+
+ local function parse_area_string(pos, relative_to)
+ local pp = {}
+ pp.x, pp.y, pp.z = pos:trim():match(pattern)
+ return core.parse_coordinates(pp.x, pp.y, pp.z, relative_to)
end
- return p1, p2
-end
+ function core.string_to_area(value, relative_to)
+ local p1, p2 = value:match("^%((.-)%)%s*%((.-)%)$")
+ if not p1 then
+ return
+ end
-local function test_string_to_area()
- local p1, p2 = core.string_to_area("(10.0, 5, -2) ( 30.2, 4, -12.53)")
- assert(p1.x == 10.0 and p1.y == 5 and p1.z == -2)
- assert(p2.x == 30.2 and p2.y == 4 and p2.z == -12.53)
+ p1 = parse_area_string(p1, relative_to)
+ p2 = parse_area_string(p2, relative_to)
- p1, p2 = core.string_to_area("(10.0, 5, -2 30.2, 4, -12.53")
- assert(p1 == nil and p2 == nil)
+ if p1 == nil or p2 == nil then
+ return
+ end
- p1, p2 = core.string_to_area("(10.0, 5,) -2 fgdf2, 4, -12.53")
- assert(p1 == nil and p2 == nil)
+ return p1, p2
+ end
end
-test_string_to_area()
-
--------------------------------------------------------------------------------
function table.copy(t, seen)
local n = {}
@@ -701,3 +700,71 @@ end
function core.is_nan(number)
return number ~= number
end
+
+--[[ Helper function for parsing an optionally relative number
+of a chat command parameter, using the chat command tilde notation.
+
+Parameters:
+* arg: String snippet containing the number; possible values:
+ * "<number>": return as number
+ * "~<number>": return relative_to + <number>
+ * "~": return relative_to
+ * Anything else will return `nil`
+* relative_to: Number to which the `arg` number might be relative to
+
+Returns:
+A number or `nil`, depending on `arg.
+
+Examples:
+* `core.parse_relative_number("5", 10)` returns 5
+* `core.parse_relative_number("~5", 10)` returns 15
+* `core.parse_relative_number("~", 10)` returns 10
+]]
+function core.parse_relative_number(arg, relative_to)
+ if not arg then
+ return nil
+ elseif arg == "~" then
+ return relative_to
+ elseif string.sub(arg, 1, 1) == "~" then
+ local number = tonumber(string.sub(arg, 2))
+ if not number then
+ return nil
+ end
+ if core.is_nan(number) or number == math.huge or number == -math.huge then
+ return nil
+ end
+ return relative_to + number
+ else
+ local number = tonumber(arg)
+ if core.is_nan(number) or number == math.huge or number == -math.huge then
+ return nil
+ end
+ return number
+ end
+end
+
+--[[ Helper function to parse coordinates that might be relative
+to another position; supports chat command tilde notation.
+Intended to be used in chat command parameter parsing.
+
+Parameters:
+* x, y, z: Parsed x, y, and z coordinates as strings
+* relative_to: Position to which to compare the position
+
+Syntax of x, y and z:
+* "<number>": return as number
+* "~<number>": return <number> + player position on this axis
+* "~": return player position on this axis
+
+Returns: a vector or nil for invalid input or if player does not exist
+]]
+function core.parse_coordinates(x, y, z, relative_to)
+ if not relative_to then
+ x, y, z = tonumber(x), tonumber(y), tonumber(z)
+ return x and y and z and { x = x, y = y, z = z }
+ end
+ local rx = core.parse_relative_number(x, relative_to.x)
+ local ry = core.parse_relative_number(y, relative_to.y)
+ local rz = core.parse_relative_number(z, relative_to.z)
+ return rx and ry and rz and { x = rx, y = ry, z = rz }
+end
diff --git a/builtin/common/mod_storage.lua b/builtin/common/mod_storage.lua
new file mode 100644
index 000000000..7ccf62900
--- /dev/null
+++ b/builtin/common/mod_storage.lua
@@ -0,0 +1,19 @@
+-- Modify core.get_mod_storage to return the storage for the current mod.
+
+local get_current_modname = core.get_current_modname
+
+local old_get_mod_storage = core.get_mod_storage
+
+local storages = setmetatable({}, {
+ __mode = "v", -- values are weak references (can be garbage-collected)
+ __index = function(self, modname)
+ local storage = old_get_mod_storage(modname)
+ self[modname] = storage
+ return storage
+ end,
+})
+
+function core.get_mod_storage()
+ local modname = get_current_modname()
+ return modname and storages[modname]
+end
diff --git a/builtin/common/serialize.lua b/builtin/common/serialize.lua
index 300b394c6..caf989e69 100644
--- a/builtin/common/serialize.lua
+++ b/builtin/common/serialize.lua
@@ -1,205 +1,224 @@
--- Lua module to serialize values as Lua code.
--- From: https://github.com/fab13n/metalua/blob/no-dll/src/lib/serialize.lua
+-- From: https://github.com/appgurueu/modlib/blob/master/luon.lua
-- License: MIT
--- @copyright 2006-2997 Fabien Fleutot <metalua@gmail.com>
--- @author Fabien Fleutot <metalua@gmail.com>
--- @author ShadowNinja <shadowninja@minetest.net>
---------------------------------------------------------------------------------
---- Serialize an object into a source code string. This string, when passed as
--- an argument to deserialize(), returns an object structurally identical to
--- the original one. The following are currently supported:
--- * Booleans, numbers, strings, and nil.
--- * Functions; uses interpreter-dependent (and sometimes platform-dependent) bytecode!
--- * Tables; they can cantain multiple references and can be recursive, but metatables aren't saved.
--- This works in two phases:
--- 1. Recursively find and record multiple references and recursion.
--- 2. Recursively dump the value into a string.
--- @param x Value to serialize (nil is allowed).
--- @return load()able string containing the value.
-function core.serialize(x)
- local local_index = 1 -- Top index of the "_" local table in the dump
- -- table->nil/1/2 set of tables seen.
- -- nil = not seen, 1 = seen once, 2 = seen multiple times.
- local seen = {}
+local next, rawget, pairs, pcall, error, type, setfenv, loadstring
+ = next, rawget, pairs, pcall, error, type, setfenv, loadstring
- -- nest_points are places where a table appears within itself, directly
- -- or not. For instance, all of these chunks create nest points in
- -- table x: "x = {}; x[x] = 1", "x = {}; x[1] = x",
- -- "x = {}; x[1] = {y = {x}}".
- -- To handle those, two tables are used by mark_nest_point:
- -- * nested - Transient set of tables being currently traversed.
- -- Used for detecting nested tables.
- -- * nest_points - parent->{key=value, ...} table cantaining the nested
- -- keys and values in the parent. They're all dumped after all the
- -- other table operations have been performed.
- --
- -- mark_nest_point(p, k, v) fills nest_points with information required
- -- to remember that key/value (k, v) creates a nest point in table
- -- parent. It also marks "parent" and the nested item(s) as occuring
- -- multiple times, since several references to it will be required in
- -- order to patch the nest points.
- local nest_points = {}
- local nested = {}
- local function mark_nest_point(parent, k, v)
- local nk, nv = nested[k], nested[v]
- local np = nest_points[parent]
- if not np then
- np = {}
- nest_points[parent] = np
- end
- np[k] = v
- seen[parent] = 2
- if nk then seen[k] = 2 end
- if nv then seen[v] = 2 end
- end
+local table_concat, string_dump, string_format, string_match, math_huge
+ = table.concat, string.dump, string.format, string.match, math.huge
- -- First phase, list the tables and functions which appear more than
- -- once in x.
- local function mark_multiple_occurences(x)
- local tp = type(x)
- if tp ~= "table" and tp ~= "function" then
- -- No identity (comparison is done by value, not by instance)
+-- Recursively counts occurences of objects (non-primitives including strings) in a table.
+local function count_objects(value)
+ local counts = {}
+ if value == nil then
+ -- Early return for nil; tables can't contain nil
+ return counts
+ end
+ local function count_values(val)
+ local type_ = type(val)
+ if type_ == "boolean" or type_ == "number" then
return
end
- if seen[x] == 1 then
- seen[x] = 2
- elseif seen[x] ~= 2 then
- seen[x] = 1
- end
-
- if tp == "table" then
- nested[x] = true
- for k, v in pairs(x) do
- if nested[k] or nested[v] then
- mark_nest_point(x, k, v)
- else
- mark_multiple_occurences(k)
- mark_multiple_occurences(v)
+ local count = counts[val]
+ counts[val] = (count or 0) + 1
+ if type_ == "table" then
+ if not count then
+ for k, v in pairs(val) do
+ count_values(k)
+ count_values(v)
end
end
- nested[x] = nil
+ elseif type_ ~= "string" and type_ ~= "function" then
+ error("unsupported type: " .. type_)
end
end
+ count_values(value)
+ return counts
+end
- local dumped = {} -- object->varname set
- local local_defs = {} -- Dumped local definitions as source code lines
+-- Build a "set" of Lua keywords. These can't be used as short key names.
+-- See https://www.lua.org/manual/5.1/manual.html#2.1
+local keywords = {}
+for _, keyword in pairs({
+ "and", "break", "do", "else", "elseif",
+ "end", "false", "for", "function", "if",
+ "in", "local", "nil", "not", "or",
+ "repeat", "return", "then", "true", "until", "while",
+ "goto" -- LuaJIT, Lua 5.2+
+}) do
+ keywords[keyword] = true
+end
- -- Mutually recursive local functions:
- local dump_val, dump_or_ref_val
+local function quote(string)
+ return string_format("%q", string)
+end
- -- If x occurs multiple times, dump the local variable rather than
- -- the value. If it's the first time it's dumped, also dump the
- -- content in local_defs.
- function dump_or_ref_val(x)
- if seen[x] ~= 2 then
- return dump_val(x)
- end
- local var = dumped[x]
- if var then -- Already referenced
- return var
+local function dump_func(func)
+ return string_format("loadstring(%q)", string_dump(func))
+end
+
+-- Serializes Lua nil, booleans, numbers, strings, tables and even functions
+-- Tables are referenced by reference, strings are referenced by value. Supports circular tables.
+local function serialize(value, write)
+ local reference, refnum = "r1", 1
+ -- [object] = reference string
+ local references = {}
+ -- Circular tables that must be filled using `table[key] = value` statements
+ local to_fill = {}
+ for object, count in pairs(count_objects(value)) do
+ local type_ = type(object)
+ -- Object must appear more than once. If it is a string, the reference has to be shorter than the string.
+ if count >= 2 and (type_ ~= "string" or #reference + 2 < #object) then
+ write(reference)
+ write("=")
+ if type_ == "table" then
+ write("{}")
+ elseif type_ == "function" then
+ write(dump_func(object))
+ elseif type_ == "string" then
+ write(quote(object))
+ end
+ write(";")
+ references[object] = reference
+ if type_ == "table" then
+ to_fill[object] = reference
+ end
+ refnum = refnum + 1
+ reference = ("r%X"):format(refnum)
end
- -- First occurence, create and register reference
- local val = dump_val(x)
- local i = local_index
- local_index = local_index + 1
- var = "_["..i.."]"
- local_defs[#local_defs + 1] = var.." = "..val
- dumped[x] = var
- return var
end
-
- -- Second phase. Dump the object; subparts occuring multiple times
- -- are dumped in local variables which can be referenced multiple
- -- times. Care is taken to dump local vars in a sensible order.
- function dump_val(x)
- local tp = type(x)
- if x == nil then return "nil"
- elseif tp == "string" then return string.format("%q", x)
- elseif tp == "boolean" then return x and "true" or "false"
- elseif tp == "function" then
- return string.format("loadstring(%q)", string.dump(x))
- elseif tp == "number" then
- -- Serialize numbers reversibly with string.format
- return string.format("%.17g", x)
- elseif tp == "table" then
- local vals = {}
- local idx_dumped = {}
- local np = nest_points[x]
- for i, v in ipairs(x) do
- if not np or not np[i] then
- vals[#vals + 1] = dump_or_ref_val(v)
- end
- idx_dumped[i] = true
+ -- Used to decide whether we should do "key=..."
+ local function use_short_key(key)
+ return not references[key] and type(key) == "string" and (not keywords[key]) and string_match(key, "^[%a_][%a%d_]*$")
+ end
+ local function dump(value)
+ -- Primitive types
+ if value == nil then
+ return write("nil")
+ end
+ if value == true then
+ return write("true")
+ end
+ if value == false then
+ return write("false")
+ end
+ local type_ = type(value)
+ if type_ == "number" then
+ return write(string_format("%.17g", value))
+ end
+ -- Reference types: table, function and string
+ local ref = references[value]
+ if ref then
+ return write(ref)
+ end
+ if type_ == "string" then
+ return write(quote(value))
+ end
+ if type_ == "function" then
+ return write(dump_func(value))
+ end
+ if type_ == "table" then
+ write("{")
+ -- First write list keys:
+ -- Don't use the table length #value here as it may horribly fail
+ -- for tables which use large integers as keys in the hash part;
+ -- stop at the first "hole" (nil value) instead
+ local len = 0
+ local first = true -- whether this is the first entry, which may not have a leading comma
+ while true do
+ local v = rawget(value, len + 1) -- use rawget to avoid metatables like the vector metatable
+ if v == nil then break end
+ if first then first = false else write(",") end
+ dump(v)
+ len = len + 1
end
- for k, v in pairs(x) do
- if (not np or not np[k]) and
- not idx_dumped[k] then
- vals[#vals + 1] = "["..dump_or_ref_val(k).."] = "
- ..dump_or_ref_val(v)
+ -- Now write map keys ([key] = value)
+ for k, v in next, value do
+ -- We have written all non-float keys in [1, len] already
+ if type(k) ~= "number" or k % 1 ~= 0 or k < 1 or k > len then
+ if first then first = false else write(",") end
+ if use_short_key(k) then
+ write(k)
+ else
+ write("[")
+ dump(k)
+ write("]")
+ end
+ write("=")
+ dump(v)
end
end
- return "{"..table.concat(vals, ", ").."}"
- else
- error("Can't serialize data of type "..tp)
+ write("}")
+ return
end
end
-
- local function dump_nest_points()
- for parent, vals in pairs(nest_points) do
- for k, v in pairs(vals) do
- local_defs[#local_defs + 1] = dump_or_ref_val(parent)
- .."["..dump_or_ref_val(k).."] = "
- ..dump_or_ref_val(v)
+ -- Write the statements to fill circular tables
+ for table, ref in pairs(to_fill) do
+ for k, v in pairs(table) do
+ write(ref)
+ if use_short_key(k) then
+ write(".")
+ write(k)
+ else
+ write("[")
+ dump(k)
+ write("]")
end
+ write("=")
+ dump(v)
+ write(";")
end
end
-
- mark_multiple_occurences(x)
- local top_level = dump_or_ref_val(x)
- dump_nest_points()
-
- if next(local_defs) then
- return "local _ = {}\n"
- ..table.concat(local_defs, "\n")
- .."\nreturn "..top_level
- else
- return "return "..top_level
- end
+ write("return ")
+ dump(value)
end
--- Deserialization
-
-local function safe_loadstring(...)
- local func, err = loadstring(...)
- if func then
- setfenv(func, {})
- return func
- end
- return nil, err
+function core.serialize(value)
+ local rope = {}
+ serialize(value, function(text)
+ -- Faster than table.insert(rope, text) on PUC Lua 5.1
+ rope[#rope + 1] = text
+ end)
+ return table_concat(rope)
end
local function dummy_func() end
+local nan = (0/0)^1 -- +nan
+
function core.deserialize(str, safe)
- if type(str) ~= "string" then
- return nil, "Cannot deserialize type '"..type(str)
- .."'. Argument must be a string."
+ -- Backwards compatibility
+ if str == nil then
+ core.log("deprecated", "minetest.deserialize called with nil (expected string).")
+ return nil, "Invalid type: Expected a string, got nil"
end
- if str:byte(1) == 0x1B then
- return nil, "Bytecode prohibited"
+ local t = type(str)
+ if t ~= "string" then
+ error(("minetest.deserialize called with %s (expected string)."):format(t))
end
- local f, err = loadstring(str)
- if not f then return nil, err end
- -- The environment is recreated every time so deseralized code cannot
- -- pollute it with permanent references.
- setfenv(f, {loadstring = safe and dummy_func or safe_loadstring})
+ local func, err = loadstring(str)
+ if not func then return nil, err end
- local good, data = pcall(f)
- if good then
- return data
+ -- math.huge is serialized to inf, NaNs are serialized to nan by Lua
+ local env = {inf = math_huge, nan = nan}
+ if safe then
+ env.loadstring = dummy_func
else
- return nil, data
+ env.loadstring = function(str, ...)
+ local func, err = loadstring(str, ...)
+ if func then
+ setfenv(func, env)
+ return func
+ end
+ return nil, err
+ end
+ end
+ setfenv(func, env)
+ local success, value_or_err = pcall(func)
+ if success then
+ return value_or_err
end
+ return nil, value_or_err
end
diff --git a/builtin/common/strict.lua b/builtin/common/strict.lua
index ccde9676b..936ebb37b 100644
--- a/builtin/common/strict.lua
+++ b/builtin/common/strict.lua
@@ -1,9 +1,4 @@
-
--- Always warn when creating a global variable, even outside of a function.
--- This ignores mod namespaces (variables with the same name as the current mod).
-local WARN_INIT = false
-
-local getinfo = debug.getinfo
+local getinfo, rawget, rawset = debug.getinfo, rawget, rawset
function core.global_exists(name)
if type(name) ~= "string" then
@@ -19,39 +14,33 @@ local declared = {}
local warned = {}
function meta:__newindex(name, value)
+ if declared[name] then
+ return
+ end
local info = getinfo(2, "Sl")
local desc = ("%s:%d"):format(info.short_src, info.currentline)
- if not declared[name] then
- local warn_key = ("%s\0%d\0%s"):format(info.source,
- info.currentline, name)
- if not warned[warn_key] and info.what ~= "main" and
- info.what ~= "C" then
- core.log("warning", ("Assignment to undeclared "..
- "global %q inside a function at %s.")
+ local warn_key = ("%s\0%d\0%s"):format(info.source, info.currentline, name)
+ if not warned[warn_key] and info.what ~= "main" and info.what ~= "C" then
+ core.log("warning", ("Assignment to undeclared global %q inside a function at %s.")
:format(name, desc))
- warned[warn_key] = true
- end
- declared[name] = true
- end
- -- Ignore mod namespaces
- if WARN_INIT and name ~= core.get_current_modname() then
- core.log("warning", ("Global variable %q created at %s.")
- :format(name, desc))
+ warned[warn_key] = true
end
rawset(self, name, value)
+ declared[name] = true
end
function meta:__index(name)
+ if declared[name] then
+ return
+ end
local info = getinfo(2, "Sl")
local warn_key = ("%s\0%d\0%s"):format(info.source, info.currentline, name)
- if not declared[name] and not warned[warn_key] and info.what ~= "C" then
+ if not warned[warn_key] and info.what ~= "C" then
core.log("warning", ("Undeclared global variable %q accessed at %s:%s")
:format(name, info.short_src, info.currentline))
warned[warn_key] = true
end
- return rawget(self, name)
end
setmetatable(_G, meta)
-
diff --git a/builtin/common/tests/misc_helpers_spec.lua b/builtin/common/tests/misc_helpers_spec.lua
index b16987f0b..7d046d5b7 100644
--- a/builtin/common/tests/misc_helpers_spec.lua
+++ b/builtin/common/tests/misc_helpers_spec.lua
@@ -1,4 +1,5 @@
_G.core = {}
+_G.vector = {metatable = {}}
dofile("builtin/common/vector.lua")
dofile("builtin/common/misc_helpers.lua")
@@ -66,9 +67,107 @@ describe("pos", function()
end)
end)
+describe("area parsing", function()
+ describe("valid inputs", function()
+ it("accepts absolute numbers", function()
+ local p1, p2 = core.string_to_area("(10.0, 5, -2) ( 30.2 4 -12.53)")
+ assert(p1.x == 10 and p1.y == 5 and p1.z == -2)
+ assert(p2.x == 30.2 and p2.y == 4 and p2.z == -12.53)
+ end)
+
+ it("accepts relative numbers", function()
+ local p1, p2 = core.string_to_area("(1,2,3) (~5,~-5,~)", {x=10,y=10,z=10})
+ assert(type(p1) == "table" and type(p2) == "table")
+ assert(p1.x == 1 and p1.y == 2 and p1.z == 3)
+ assert(p2.x == 15 and p2.y == 5 and p2.z == 10)
+
+ p1, p2 = core.string_to_area("(1 2 3) (~5 ~-5 ~)", {x=10,y=10,z=10})
+ assert(type(p1) == "table" and type(p2) == "table")
+ assert(p1.x == 1 and p1.y == 2 and p1.z == 3)
+ assert(p2.x == 15 and p2.y == 5 and p2.z == 10)
+ end)
+ end)
+ describe("invalid inputs", function()
+ it("rejects too few numbers", function()
+ local p1, p2 = core.string_to_area("(1,1) (1,1,1,1)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+ end)
+
+ it("rejects too many numbers", function()
+ local p1, p2 = core.string_to_area("(1,1,1,1) (1,1,1,1)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+ end)
+
+ it("rejects nan & inf", function()
+ local p1, p2 = core.string_to_area("(1,1,1) (1,1,nan)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(1,1,1) (1,1,~nan)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(1,1,1) (1,~nan,1)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(1,1,1) (1,1,inf)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(1,1,1) (1,1,~inf)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(1,1,1) (1,~inf,1)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(nan,nan,nan) (nan,nan,nan)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(nan,nan,nan) (nan,nan,nan)")
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(inf,inf,inf) (-inf,-inf,-inf)", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(inf,inf,inf) (-inf,-inf,-inf)")
+ assert(p1 == nil and p2 == nil)
+ end)
+
+ it("rejects words", function()
+ local p1, p2 = core.string_to_area("bananas", {x=1,y=1,z=1})
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("bananas", "foobar")
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("bananas")
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(bananas,bananas,bananas)")
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(bananas,bananas,bananas) (bananas,bananas,bananas)")
+ assert(p1 == nil and p2 == nil)
+ end)
+
+ it("requires parenthesis & valid numbers", function()
+ local p1, p2 = core.string_to_area("(10.0, 5, -2 30.2, 4, -12.53")
+ assert(p1 == nil and p2 == nil)
+
+ p1, p2 = core.string_to_area("(10.0, 5,) -2 fgdf2, 4, -12.53")
+ assert(p1 == nil and p2 == nil)
+ end)
+ end)
+end)
+
describe("table", function()
it("indexof()", function()
assert.equal(1, table.indexof({"foo", "bar"}, "foo"))
assert.equal(-1, table.indexof({"foo", "bar"}, "baz"))
end)
end)
+
+describe("formspec_escape", function()
+ it("escapes", function()
+ assert.equal(nil, core.formspec_escape(nil))
+ assert.equal("", core.formspec_escape(""))
+ assert.equal("\\[Hello\\\\\\[", core.formspec_escape("[Hello\\["))
+ end)
+end)
diff --git a/builtin/common/tests/serialize_spec.lua b/builtin/common/tests/serialize_spec.lua
index e46b7dcc5..340e226ee 100644
--- a/builtin/common/tests/serialize_spec.lua
+++ b/builtin/common/tests/serialize_spec.lua
@@ -1,42 +1,97 @@
_G.core = {}
+_G.vector = {metatable = {}}
_G.setfenv = require 'busted.compatibility'.setfenv
dofile("builtin/common/serialize.lua")
dofile("builtin/common/vector.lua")
+-- Supports circular tables; does not support table keys
+-- Correctly checks whether a mapping of references ("same") exists
+-- Is significantly more efficient than assert.same
+local function assert_same(a, b, same)
+ same = same or {}
+ if same[a] or same[b] then
+ assert(same[a] == b and same[b] == a)
+ return
+ end
+ if a == b then
+ return
+ end
+ if type(a) ~= "table" or type(b) ~= "table" then
+ assert(a == b)
+ return
+ end
+ same[a] = b
+ same[b] = a
+ local count = 0
+ for k, v in pairs(a) do
+ count = count + 1
+ assert(type(k) ~= "table")
+ assert_same(v, b[k], same)
+ end
+ for _ in pairs(b) do
+ count = count - 1
+ end
+ assert(count == 0)
+end
+
+local x, y = {}, {}
+local t1, t2 = {x, x, y, y}, {x, y, x, y}
+assert.same(t1, t2) -- will succeed because it only checks whether the depths match
+assert(not pcall(assert_same, t1, t2)) -- will correctly fail because it checks whether the refs match
+
describe("serialize", function()
+ local function assert_preserves(value)
+ local preserved_value = core.deserialize(core.serialize(value))
+ assert_same(value, preserved_value)
+ end
it("works", function()
- local test_in = {cat={sound="nyan", speed=400}, dog={sound="woof"}}
- local test_out = core.deserialize(core.serialize(test_in))
-
- assert.same(test_in, test_out)
+ assert_preserves({cat={sound="nyan", speed=400}, dog={sound="woof"}})
end)
it("handles characters", function()
- local test_in = {escape_chars="\n\r\t\v\\\"\'", non_european="θשׁ٩∂"}
- local test_out = core.deserialize(core.serialize(test_in))
- assert.same(test_in, test_out)
+ assert_preserves({escape_chars="\n\r\t\v\\\"\'", non_european="θשׁ٩∂"})
+ end)
+
+ it("handles NaN & infinities", function()
+ local nan = core.deserialize(core.serialize(0/0))
+ assert(nan ~= nan)
+ assert_preserves(math.huge)
+ assert_preserves(-math.huge)
end)
it("handles precise numbers", function()
- local test_in = 0.2695949158945771
- local test_out = core.deserialize(core.serialize(test_in))
- assert.same(test_in, test_out)
+ assert_preserves(0.2695949158945771)
end)
it("handles big integers", function()
- local test_in = 269594915894577
- local test_out = core.deserialize(core.serialize(test_in))
- assert.same(test_in, test_out)
+ assert_preserves(269594915894577)
end)
it("handles recursive structures", function()
local test_in = { hello = "world" }
test_in.foo = test_in
+ assert_preserves(test_in)
+ end)
+
+ it("handles cross-referencing structures", function()
+ local test_in = {
+ foo = {
+ baz = {
+ {}
+ },
+ },
+ bar = {
+ baz = {},
+ },
+ }
- local test_out = core.deserialize(core.serialize(test_in))
- assert.same(test_in, test_out)
+ test_in.foo.baz[1].foo = test_in.foo
+ test_in.foo.baz[1].bar = test_in.bar
+ test_in.bar.baz[1] = test_in.foo.baz[1]
+
+ assert_preserves(test_in)
end)
it("strips functions in safe mode", function()
@@ -46,6 +101,7 @@ describe("serialize", function()
end,
foo = "bar"
}
+ setfenv(test_in.func, _G)
local str = core.serialize(test_in)
assert.not_nil(str:find("loadstring"))
@@ -57,13 +113,77 @@ describe("serialize", function()
it("vectors work", function()
local v = vector.new(1, 2, 3)
- assert.same({{x = 1, y = 2, z = 3}}, core.deserialize(core.serialize({v})))
- assert.same({x = 1, y = 2, z = 3}, core.deserialize(core.serialize(v)))
+ assert_preserves({v})
+ assert_preserves(v)
-- abuse
v = vector.new(1, 2, 3)
v.a = "bla"
- assert.same({x = 1, y = 2, z = 3, a = "bla"},
- core.deserialize(core.serialize(v)))
+ assert_preserves(v)
+ end)
+
+ it("handles keywords as keys", function()
+ assert_preserves({["and"] = "keyword", ["for"] = "keyword"})
+ end)
+
+ describe("fuzzing", function()
+ local atomics = {true, false, math.huge, -math.huge} -- no NaN or nil
+ local function atomic()
+ return atomics[math.random(1, #atomics)]
+ end
+ local function num()
+ local sign = math.random() < 0.5 and -1 or 1
+ -- HACK math.random(a, b) requires a, b & b - a to fit within a 32-bit int
+ -- Use two random calls to generate a random number from 0 - 2^50 as lower & upper 25 bits
+ local val = math.random(0, 2^25) * 2^25 + math.random(0, 2^25 - 1)
+ local exp = math.random() < 0.5 and 1 or 2^(math.random(-120, 120))
+ return sign * val * exp
+ end
+ local function charcodes(count)
+ if count == 0 then return end
+ return math.random(0, 0xFF), charcodes(count - 1)
+ end
+ local function str()
+ return string.char(charcodes(math.random(0, 100)))
+ end
+ local primitives = {atomic, num, str}
+ local function primitive()
+ return primitives[math.random(1, #primitives)]()
+ end
+ local function tab(max_actions)
+ local root = {}
+ local tables = {root}
+ local function random_table()
+ return tables[math.random(1, #tables)]
+ end
+ for _ = 1, math.random(1, max_actions) do
+ local tab = random_table()
+ local value
+ if math.random() < 0.5 then
+ if math.random() < 0.5 then
+ value = random_table()
+ else
+ value = {}
+ table.insert(tables, value)
+ end
+ else
+ value = primitive()
+ end
+ tab[math.random() < 0.5 and (#tab + 1) or primitive()] = value
+ end
+ return root
+ end
+ it("primitives work", function()
+ for _ = 1, 1e3 do
+ assert_preserves(primitive())
+ end
+ end)
+ it("tables work", function()
+ for _ = 1, 100 do
+ local fuzzed_table = tab(1e3)
+ assert_same(fuzzed_table, table.copy(fuzzed_table))
+ assert_preserves(fuzzed_table)
+ end
+ end)
end)
end)
diff --git a/builtin/common/tests/vector_spec.lua b/builtin/common/tests/vector_spec.lua
index 2f72f3383..6a0b81a89 100644
--- a/builtin/common/tests/vector_spec.lua
+++ b/builtin/common/tests/vector_spec.lua
@@ -1,4 +1,4 @@
-_G.vector = {}
+_G.vector = {metatable = {}}
dofile("builtin/common/vector.lua")
describe("vector", function()
@@ -128,6 +128,14 @@ describe("vector", function()
assert.equal(vector.new(4.1, 5.9, 5.5), a:apply(f))
end)
+ it("combine()", function()
+ local a = vector.new(1, 2, 3)
+ local b = vector.new(3, 2, 1)
+ assert.equal(vector.add(a, b), vector.combine(a, b, function(x, y) return x + y end))
+ assert.equal(vector.new(3, 2, 3), vector.combine(a, b, math.max))
+ assert.equal(vector.new(1, 2, 1), vector.combine(a, b, math.min))
+ end)
+
it("equals()", function()
local function assertE(a, b)
assert.is_true(vector.equals(a, b))
diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua
index 581d014e0..a08472e32 100644
--- a/builtin/common/vector.lua
+++ b/builtin/common/vector.lua
@@ -6,10 +6,8 @@ Note: The vector.*-functions must be able to accept old vectors that had no meta
-- localize functions
local setmetatable = setmetatable
-vector = {}
-
-local metatable = {}
-vector.metatable = metatable
+-- vector.metatable is set by C++.
+local metatable = vector.metatable
local xyz = {"x", "y", "z"}
@@ -112,6 +110,14 @@ function vector.apply(v, func)
)
end
+function vector.combine(a, b, func)
+ return fast_new(
+ func(a.x, b.x),
+ func(a.y, b.y),
+ func(a.z, b.z)
+ )
+end
+
function vector.distance(a, b)
local x = a.x - b.x
local y = a.y - b.y
diff --git a/builtin/game/async.lua b/builtin/game/async.lua
new file mode 100644
index 000000000..469f179d7
--- /dev/null
+++ b/builtin/game/async.lua
@@ -0,0 +1,22 @@
+
+core.async_jobs = {}
+
+function core.async_event_handler(jobid, retval)
+ local callback = core.async_jobs[jobid]
+ assert(type(callback) == "function")
+ callback(unpack(retval, 1, retval.n))
+ core.async_jobs[jobid] = nil
+end
+
+function core.handle_async(func, callback, ...)
+ assert(type(func) == "function" and type(callback) == "function",
+ "Invalid minetest.handle_async invocation")
+ local args = {n = select("#", ...), ...}
+ local mod_origin = core.get_last_run_mod()
+
+ local jobid = core.do_async_callback(func, args, mod_origin)
+ core.async_jobs[jobid] = callback
+
+ return true
+end
+
diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua
index 493bb92c0..bbcdcf2d0 100644
--- a/builtin/game/chat.lua
+++ b/builtin/game/chat.lua
@@ -130,8 +130,13 @@ local function parse_range_str(player_name, str)
return false, S("Unable to get position of player @1.", player_name)
end
else
- p1, p2 = core.string_to_area(str)
- if p1 == nil then
+ local player = core.get_player_by_name(player_name)
+ local relpos
+ if player then
+ relpos = player:get_pos()
+ end
+ p1, p2 = core.string_to_area(str, relpos)
+ if p1 == nil or p2 == nil then
return false, S("Incorrect area format. "
.. "Expected: (x1,y1,z1) (x2,y2,z2)")
end
@@ -310,12 +315,7 @@ local function handle_revoke_command(caller, revokename, revokeprivstr)
and revokename == core.settings:get("name")
and revokename ~= ""
if revokeprivstr == "all" then
- revokeprivs = privs
- privs = {}
- else
- for priv, _ in pairs(revokeprivs) do
- privs[priv] = nil
- end
+ revokeprivs = table.copy(privs)
end
local privs_unknown = ""
@@ -332,7 +332,10 @@ local function handle_revoke_command(caller, revokename, revokeprivstr)
end
local def = core.registered_privileges[priv]
if not def then
- privs_unknown = privs_unknown .. S("Unknown privilege: @1", priv) .. "\n"
+ -- Old/removed privileges might still be granted to certain players
+ if not privs[priv] then
+ privs_unknown = privs_unknown .. S("Unknown privilege: @1", priv) .. "\n"
+ end
elseif is_singleplayer and def.give_to_singleplayer then
irrevokable[priv] = true
elseif is_admin and def.give_to_admin then
@@ -359,19 +362,22 @@ local function handle_revoke_command(caller, revokename, revokeprivstr)
end
local revokecount = 0
-
- core.set_player_privs(revokename, privs)
for priv, _ in pairs(revokeprivs) do
- -- call the on_revoke callbacks
- core.run_priv_callbacks(revokename, priv, caller, "revoke")
+ privs[priv] = nil
revokecount = revokecount + 1
end
- local new_privs = core.get_player_privs(revokename)
if revokecount == 0 then
return false, S("No privileges were revoked.")
end
+ core.set_player_privs(revokename, privs)
+ for priv, _ in pairs(revokeprivs) do
+ -- call the on_revoke callbacks
+ core.run_priv_callbacks(revokename, priv, caller, "revoke")
+ end
+ local new_privs = core.get_player_privs(revokename)
+
core.log("action", caller..' revoked ('
..core.privs_to_string(revokeprivs, ', ')
..') privileges from '..revokename)
@@ -569,10 +575,15 @@ core.register_chatcommand("teleport", {
description = S("Teleport to position or player"),
privs = {teleport=true},
func = function(name, param)
+ local player = core.get_player_by_name(name)
+ local relpos
+ if player then
+ relpos = player:get_pos()
+ end
local p = {}
- p.x, p.y, p.z = param:match("^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
- p = vector.apply(p, tonumber)
- if p.x and p.y and p.z then
+ p.x, p.y, p.z = string.match(param, "^([%d.~-]+)[, ] *([%d.~-]+)[, ] *([%d.~-]+)$")
+ p = core.parse_coordinates(p.x, p.y, p.z, relpos)
+ if p and p.x and p.y and p.z then
return teleport_to_pos(name, p)
end
@@ -586,9 +597,19 @@ core.register_chatcommand("teleport", {
"other players (missing privilege: @1).", "bring")
local teleportee_name
+ p = {}
teleportee_name, p.x, p.y, p.z = param:match(
- "^([^ ]+) +([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
+ "^([^ ]+) +([%d.~-]+)[, ] *([%d.~-]+)[, ] *([%d.~-]+)$")
+ if teleportee_name then
+ local teleportee = core.get_player_by_name(teleportee_name)
+ if not teleportee then
+ return
+ end
+ relpos = teleportee:get_pos()
+ p = core.parse_coordinates(p.x, p.y, p.z, relpos)
+ end
p = vector.apply(p, tonumber)
+
if teleportee_name and p.x and p.y and p.z then
if not has_bring_priv then
return false, missing_bring_msg
@@ -621,6 +642,10 @@ core.register_chatcommand("set", {
setname, setvalue = string.match(param, "([^ ]+) (.+)")
if setname and setvalue then
+ if setname:sub(1, 7) == "secure." then
+ return false, S("Failed. Cannot modify secure settings. "
+ .. "Edit the settings file manually.")
+ end
if not core.settings:get(setname) then
return false, S("Failed. Use '/set -n <name> <value>' "
.. "to create a new setting.")
@@ -837,7 +862,7 @@ core.register_chatcommand("spawnentity", {
description = S("Spawn entity at given (or your) position"),
privs = {give=true, interact=true},
func = function(name, param)
- local entityname, p = string.match(param, "^([^ ]+) *(.*)$")
+ local entityname, pstr = string.match(param, "^([^ ]+) *(.*)$")
if not entityname then
return false, S("EntityName required.")
end
@@ -851,11 +876,15 @@ core.register_chatcommand("spawnentity", {
if not core.registered_entities[entityname] then
return false, S("Cannot spawn an unknown entity.")
end
- if p == "" then
+ local p
+ if pstr == "" then
p = player:get_pos()
else
- p = core.string_to_pos(p)
- if p == nil then
+ p = {}
+ p.x, p.y, p.z = string.match(pstr, "^([%d.~-]+)[, ] *([%d.~-]+)[, ] *([%d.~-]+)$")
+ local relpos = player:get_pos()
+ p = core.parse_coordinates(p.x, p.y, p.z, relpos)
+ if not (p and p.x and p.y and p.z) then
return false, S("Invalid parameters (@1).", param)
end
end
@@ -1014,6 +1043,13 @@ core.register_chatcommand("status", {
end,
})
+local function get_time(timeofday)
+ local time = math.floor(timeofday * 1440)
+ local minute = time % 60
+ local hour = (time - minute) / 60
+ return time, hour, minute
+end
+
core.register_chatcommand("time", {
params = S("[<0..23>:<0..59> | <0..24000>]"),
description = S("Show or set time of day"),
@@ -1032,9 +1068,14 @@ core.register_chatcommand("time", {
return false, S("You don't have permission to run "
.. "this command (missing privilege: @1).", "settime")
end
- local hour, minute = param:match("^(%d+):(%d+)$")
- if not hour then
- local new_time = tonumber(param) or -1
+ local relative, negative, hour, minute = param:match("^(~?)(%-?)(%d+):(%d+)$")
+ if not relative then -- checking the first capture against nil suffices
+ local new_time = core.parse_relative_number(param, core.get_timeofday() * 24000)
+ if not new_time then
+ new_time = tonumber(param) or -1
+ else
+ new_time = new_time % 24000
+ end
if new_time ~= new_time or new_time < 0 or new_time > 24000 then
return false, S("Invalid time (must be between 0 and 24000).")
end
@@ -1042,14 +1083,29 @@ core.register_chatcommand("time", {
core.log("action", name .. " sets time to " .. new_time)
return true, S("Time of day changed.")
end
+ local new_time
hour = tonumber(hour)
minute = tonumber(minute)
- if hour < 0 or hour > 23 then
- return false, S("Invalid hour (must be between 0 and 23 inclusive).")
- elseif minute < 0 or minute > 59 then
- return false, S("Invalid minute (must be between 0 and 59 inclusive).")
+ if relative == "" then
+ if hour < 0 or hour > 23 then
+ return false, S("Invalid hour (must be between 0 and 23 inclusive).")
+ elseif minute < 0 or minute > 59 then
+ return false, S("Invalid minute (must be between 0 and 59 inclusive).")
+ end
+ new_time = (hour * 60 + minute) / 1440
+ else
+ if minute < 0 or minute > 59 then
+ return false, S("Invalid minute (must be between 0 and 59 inclusive).")
+ end
+ local current_time = core.get_timeofday()
+ if negative == "-" then -- negative time
+ hour, minute = -hour, -minute
+ end
+ new_time = (current_time + (hour * 60 + minute) / 1440) % 1
+ local _
+ _, hour, minute = get_time(new_time)
end
- core.set_timeofday((hour * 60 + minute) / 1440)
+ core.set_timeofday(new_time)
core.log("action", ("%s sets time to %d:%02d"):format(name, hour, minute))
return true, S("Time of day changed.")
end,
@@ -1131,6 +1187,9 @@ core.register_chatcommand("ban", {
return true, S("Ban list: @1", ban_list)
end
end
+ if core.is_singleplayer() then
+ return false, S("You cannot ban players in singleplayer!")
+ end
if not core.get_player_by_name(param) then
return false, S("Player is not online.")
end
diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua
index 29cb56aae..d5727f2a7 100644
--- a/builtin/game/falling.lua
+++ b/builtin/game/falling.lua
@@ -158,12 +158,10 @@ core.register_entity(":__builtin:falling_node", {
or def.drawtype == "normal"
or def.drawtype == "nodebox" then
if (def.paramtype2 == "facedir" or def.paramtype2 == "colorfacedir") then
- local fdir = node.param2 % 32
+ local fdir = node.param2 % 32 % 24
-- Get rotation from a precalculated lookup table
local euler = facedir_to_euler[fdir + 1]
- if euler then
- self.object:set_rotation(euler)
- end
+ self.object:set_rotation(euler)
elseif (def.drawtype ~= "plantlike" and def.drawtype ~= "plantlike_rooted" and
(def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" or def.drawtype == "signlike")) then
local rot = node.param2 % 8
@@ -264,7 +262,7 @@ core.register_entity(":__builtin:falling_node", {
end
-- Decide if we're replacing the node or placing on top
- local np = vector.new(bcp)
+ local np = vector.copy(bcp)
if bcd and bcd.buildable_to and
(not self.floats or bcd.liquidtype == "none") then
core.remove_node(bcp)
@@ -436,7 +434,7 @@ local function drop_attached_node(p)
if def and def.preserve_metadata then
local oldmeta = core.get_meta(p):to_table().fields
-- Copy pos and node because the callback can modify them.
- local pos_copy = vector.new(p)
+ local pos_copy = vector.copy(p)
local node_copy = {name=n.name, param1=n.param1, param2=n.param2}
local drop_stacks = {}
for k, v in pairs(drops) do
@@ -461,7 +459,7 @@ end
function builtin_shared.check_attached_node(p, n)
local def = core.registered_nodes[n.name]
- local d = vector.new()
+ local d = vector.zero()
if def.paramtype2 == "wallmounted" or
def.paramtype2 == "colorwallmounted" then
-- The fallback vector here is in case 'wallmounted to dir' is nil due
diff --git a/builtin/game/features.lua b/builtin/game/features.lua
index 583ef5092..73b16361e 100644
--- a/builtin/game/features.lua
+++ b/builtin/game/features.lua
@@ -21,7 +21,9 @@ core.features = {
use_texture_alpha_string_modes = true,
degrotate_240_steps = true,
abm_min_max_y = true,
+ particlespawner_tweenable = true,
dynamic_add_media_table = true,
+ get_sky_as_table = true,
}
function core.has_feature(arg)
diff --git a/builtin/game/init.lua b/builtin/game/init.lua
index bb007fabd..d7606f357 100644
--- a/builtin/game/init.lua
+++ b/builtin/game/init.lua
@@ -8,6 +8,7 @@ local gamepath = scriptpath .. "game".. DIR_DELIM
local builtin_shared = {}
dofile(gamepath .. "constants.lua")
+dofile(gamepath .. "item_s.lua")
assert(loadfile(gamepath .. "item.lua"))(builtin_shared)
dofile(gamepath .. "register.lua")
@@ -16,8 +17,10 @@ if core.settings:get_bool("profiler.load") then
end
dofile(commonpath .. "after.lua")
+dofile(commonpath .. "mod_storage.lua")
dofile(gamepath .. "item_entity.lua")
dofile(gamepath .. "deprecated.lua")
+dofile(gamepath .. "misc_s.lua")
dofile(gamepath .. "misc.lua")
dofile(gamepath .. "privileges.lua")
dofile(gamepath .. "auth.lua")
@@ -32,5 +35,6 @@ dofile(gamepath .. "voxelarea.lua")
dofile(gamepath .. "forceloading.lua")
dofile(gamepath .. "statbars.lua")
dofile(gamepath .. "knockback.lua")
+dofile(gamepath .. "async.lua")
profiler = nil
diff --git a/builtin/game/item.lua b/builtin/game/item.lua
index 2a4b4e38f..b49787987 100644
--- a/builtin/game/item.lua
+++ b/builtin/game/item.lua
@@ -5,8 +5,8 @@ local builtin_shared = ...
local function copy_pointed_thing(pointed_thing)
return {
type = pointed_thing.type,
- above = vector.new(pointed_thing.above),
- under = vector.new(pointed_thing.under),
+ above = pointed_thing.above and vector.copy(pointed_thing.above),
+ under = pointed_thing.under and vector.copy(pointed_thing.under),
ref = pointed_thing.ref,
}
end
@@ -15,15 +15,6 @@ end
-- Item definition helpers
--
-function core.inventorycube(img1, img2, img3)
- img2 = img2 or img1
- img3 = img3 or img1
- return "[inventorycube"
- .. "{" .. img1:gsub("%^", "&")
- .. "{" .. img2:gsub("%^", "&")
- .. "{" .. img3:gsub("%^", "&")
-end
-
function core.get_pointed_thing_position(pointed_thing, above)
if pointed_thing.type == "node" then
if above then
@@ -37,144 +28,6 @@ function core.get_pointed_thing_position(pointed_thing, above)
end
end
-function core.dir_to_facedir(dir, is6d)
- --account for y if requested
- if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then
-
- --from above
- if dir.y < 0 then
- if math.abs(dir.x) > math.abs(dir.z) then
- if dir.x < 0 then
- return 19
- else
- return 13
- end
- else
- if dir.z < 0 then
- return 10
- else
- return 4
- end
- end
-
- --from below
- else
- if math.abs(dir.x) > math.abs(dir.z) then
- if dir.x < 0 then
- return 15
- else
- return 17
- end
- else
- if dir.z < 0 then
- return 6
- else
- return 8
- end
- end
- end
-
- --otherwise, place horizontally
- elseif math.abs(dir.x) > math.abs(dir.z) then
- if dir.x < 0 then
- return 3
- else
- return 1
- end
- else
- if dir.z < 0 then
- return 2
- else
- return 0
- end
- end
-end
-
--- Table of possible dirs
-local facedir_to_dir = {
- vector.new( 0, 0, 1),
- vector.new( 1, 0, 0),
- vector.new( 0, 0, -1),
- vector.new(-1, 0, 0),
- vector.new( 0, -1, 0),
- vector.new( 0, 1, 0),
-}
--- Mapping from facedir value to index in facedir_to_dir.
-local facedir_to_dir_map = {
- [0]=1, 2, 3, 4,
- 5, 2, 6, 4,
- 6, 2, 5, 4,
- 1, 5, 3, 6,
- 1, 6, 3, 5,
- 1, 4, 3, 2,
-}
-function core.facedir_to_dir(facedir)
- return facedir_to_dir[facedir_to_dir_map[facedir % 32]]
-end
-
-function core.dir_to_wallmounted(dir)
- if math.abs(dir.y) > math.max(math.abs(dir.x), math.abs(dir.z)) then
- if dir.y < 0 then
- return 1
- else
- return 0
- end
- elseif math.abs(dir.x) > math.abs(dir.z) then
- if dir.x < 0 then
- return 3
- else
- return 2
- end
- else
- if dir.z < 0 then
- return 5
- else
- return 4
- end
- end
-end
-
--- table of dirs in wallmounted order
-local wallmounted_to_dir = {
- [0] = vector.new( 0, 1, 0),
- vector.new( 0, -1, 0),
- vector.new( 1, 0, 0),
- vector.new(-1, 0, 0),
- vector.new( 0, 0, 1),
- vector.new( 0, 0, -1),
-}
-function core.wallmounted_to_dir(wallmounted)
- return wallmounted_to_dir[wallmounted % 8]
-end
-
-function core.dir_to_yaw(dir)
- return -math.atan2(dir.x, dir.z)
-end
-
-function core.yaw_to_dir(yaw)
- return vector.new(-math.sin(yaw), 0, math.cos(yaw))
-end
-
-function core.is_colored_paramtype(ptype)
- return (ptype == "color") or (ptype == "colorfacedir") or
- (ptype == "colorwallmounted") or (ptype == "colordegrotate")
-end
-
-function core.strip_param2_color(param2, paramtype2)
- if not core.is_colored_paramtype(paramtype2) then
- return nil
- end
- if paramtype2 == "colorfacedir" then
- param2 = math.floor(param2 / 32) * 32
- elseif paramtype2 == "colorwallmounted" then
- param2 = math.floor(param2 / 8) * 8
- elseif paramtype2 == "colordegrotate" then
- param2 = math.floor(param2 / 32) * 32
- end
- -- paramtype2 == "color" requires no modification.
- return param2
-end
-
local function has_all_groups(tbl, required_groups)
if type(required_groups) == "string" then
return (tbl[required_groups] or 0) ~= 0
@@ -323,12 +176,12 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
end
-- Place above pointed node
- local place_to = vector.new(above)
+ local place_to = vector.copy(above)
-- If node under is buildable_to, place into it instead (eg. snow)
if olddef_under.buildable_to then
log("info", "node under is buildable to")
- place_to = vector.new(under)
+ place_to = vector.copy(under)
end
if core.is_protected(place_to, playername) then
@@ -409,7 +262,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
-- Run callback
if def.after_place_node and not prevent_after_place then
-- Deepcopy place_to and pointed_thing because callback can modify it
- local place_to_copy = vector.new(place_to)
+ local place_to_copy = vector.copy(place_to)
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
if def.after_place_node(place_to_copy, placer, itemstack,
pointed_thing_copy) then
@@ -420,7 +273,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2,
-- Run script hook
for _, callback in ipairs(core.registered_on_placenodes) do
-- Deepcopy pos, node and pointed_thing because callback can modify them
- local place_to_copy = vector.new(place_to)
+ local place_to_copy = vector.copy(place_to)
local newnode_copy = {name=newnode.name, param1=newnode.param1, param2=newnode.param2}
local oldnode_copy = {name=oldnode.name, param1=oldnode.param1, param2=oldnode.param2}
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
@@ -548,7 +401,7 @@ function core.node_punch(pos, node, puncher, pointed_thing)
-- Run script hook
for _, callback in ipairs(core.registered_on_punchnodes) do
-- Copy pos and node because callback can modify them
- local pos_copy = vector.new(pos)
+ local pos_copy = vector.copy(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
local pointed_thing_copy = pointed_thing and copy_pointed_thing(pointed_thing) or nil
callback(pos_copy, node_copy, puncher, pointed_thing_copy)
@@ -589,7 +442,7 @@ function core.node_dig(pos, node, digger)
local def = core.registered_nodes[node.name]
-- Copy pos because the callback could modify it
if def and (not def.diggable or
- (def.can_dig and not def.can_dig(vector.new(pos), digger))) then
+ (def.can_dig and not def.can_dig(vector.copy(pos), digger))) then
log("info", diggername .. " tried to dig "
.. node.name .. " which is not diggable "
.. core.pos_to_string(pos))
@@ -636,7 +489,7 @@ function core.node_dig(pos, node, digger)
if def and def.preserve_metadata then
local oldmeta = core.get_meta(pos):to_table().fields
-- Copy pos and node because the callback can modify them.
- local pos_copy = vector.new(pos)
+ local pos_copy = vector.copy(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
local drop_stacks = {}
for k, v in pairs(drops) do
@@ -668,7 +521,7 @@ function core.node_dig(pos, node, digger)
-- Run callback
if def and def.after_dig_node then
-- Copy pos and node because callback can modify them
- local pos_copy = vector.new(pos)
+ local pos_copy = vector.copy(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
def.after_dig_node(pos_copy, node_copy, oldmetadata, digger)
end
@@ -679,7 +532,7 @@ function core.node_dig(pos, node, digger)
core.set_last_run_mod(origin.mod)
-- Copy pos and node because callback can modify them
- local pos_copy = vector.new(pos)
+ local pos_copy = vector.copy(pos)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
callback(pos_copy, node_copy, digger)
end
@@ -744,13 +597,8 @@ core.nodedef_default = {
-- Node properties
drawtype = "normal",
visual_scale = 1.0,
- -- Don't define these because otherwise the old tile_images and
- -- special_materials wouldn't be read
- --tiles ={""},
- --special_tiles = {
- -- {name="", backface_culling=true},
- -- {name="", backface_culling=true},
- --},
+ tiles = {},
+ special_tiles = {},
post_effect_color = {a=0, r=0, g=0, b=0},
paramtype = "none",
paramtype2 = "none",
diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua
index 9b1b23bfd..53f98a7c7 100644
--- a/builtin/game/item_entity.lua
+++ b/builtin/game/item_entity.lua
@@ -58,17 +58,21 @@ core.register_entity(":__builtin:item", {
local glow = def and def.light_source and
math.floor(def.light_source / 2 + 0.5)
+ local size_bias = 1e-3 * math.random() -- small random bias to counter Z-fighting
+ local c = {-size, -size, -size, size, size, size}
self.object:set_properties({
is_visible = true,
visual = "wielditem",
textures = {itemname},
- visual_size = {x = size, y = size},
- collisionbox = {-size, -size, -size, size, size, size},
+ visual_size = {x = size + size_bias, y = size + size_bias},
+ collisionbox = c,
automatic_rotate = math.pi * 0.5 * 0.2 / size,
wield_item = self.itemstring,
glow = glow,
})
+ -- cache for usage in on_step
+ self._collisionbox = c
end,
get_staticdata = function(self)
@@ -93,6 +97,7 @@ core.register_entity(":__builtin:item", {
self.object:set_armor_groups({immortal = 1})
self.object:set_velocity({x = 0, y = 2, z = 0})
self.object:set_acceleration({x = 0, y = -gravity, z = 0})
+ self._collisionbox = self.initial_properties.collisionbox
self:set_item()
end,
@@ -163,7 +168,7 @@ core.register_entity(":__builtin:item", {
local pos = self.object:get_pos()
local node = core.get_node_or_nil({
x = pos.x,
- y = pos.y + self.object:get_properties().collisionbox[2] - 0.05,
+ y = pos.y + self._collisionbox[2] - 0.05,
z = pos.z
})
-- Delete in 'ignore' nodes
@@ -176,7 +181,7 @@ core.register_entity(":__builtin:item", {
if self.force_out then
-- This code runs after the entity got a push from the is_stuck code.
-- It makes sure the entity is entirely outside the solid node
- local c = self.object:get_properties().collisionbox
+ local c = self._collisionbox
local s = self.force_out_start
local f = self.force_out
local ok = (f.x > 0 and pos.x + c[1] > s.x + 0.5) or
diff --git a/builtin/game/item_s.lua b/builtin/game/item_s.lua
new file mode 100644
index 000000000..a51cd0a1c
--- /dev/null
+++ b/builtin/game/item_s.lua
@@ -0,0 +1,156 @@
+-- Minetest: builtin/item_s.lua
+-- The distinction of what goes here is a bit tricky, basically it's everything
+-- that does not (directly or indirectly) need access to ServerEnvironment,
+-- Server or writable access to IGameDef on the engine side.
+-- (The '_s' stands for standalone.)
+
+--
+-- Item definition helpers
+--
+
+function core.inventorycube(img1, img2, img3)
+ img2 = img2 or img1
+ img3 = img3 or img1
+ return "[inventorycube"
+ .. "{" .. img1:gsub("%^", "&")
+ .. "{" .. img2:gsub("%^", "&")
+ .. "{" .. img3:gsub("%^", "&")
+end
+
+function core.dir_to_facedir(dir, is6d)
+ --account for y if requested
+ if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then
+
+ --from above
+ if dir.y < 0 then
+ if math.abs(dir.x) > math.abs(dir.z) then
+ if dir.x < 0 then
+ return 19
+ else
+ return 13
+ end
+ else
+ if dir.z < 0 then
+ return 10
+ else
+ return 4
+ end
+ end
+
+ --from below
+ else
+ if math.abs(dir.x) > math.abs(dir.z) then
+ if dir.x < 0 then
+ return 15
+ else
+ return 17
+ end
+ else
+ if dir.z < 0 then
+ return 6
+ else
+ return 8
+ end
+ end
+ end
+
+ --otherwise, place horizontally
+ elseif math.abs(dir.x) > math.abs(dir.z) then
+ if dir.x < 0 then
+ return 3
+ else
+ return 1
+ end
+ else
+ if dir.z < 0 then
+ return 2
+ else
+ return 0
+ end
+ end
+end
+
+-- Table of possible dirs
+local facedir_to_dir = {
+ vector.new( 0, 0, 1),
+ vector.new( 1, 0, 0),
+ vector.new( 0, 0, -1),
+ vector.new(-1, 0, 0),
+ vector.new( 0, -1, 0),
+ vector.new( 0, 1, 0),
+}
+-- Mapping from facedir value to index in facedir_to_dir.
+local facedir_to_dir_map = {
+ [0]=1, 2, 3, 4,
+ 5, 2, 6, 4,
+ 6, 2, 5, 4,
+ 1, 5, 3, 6,
+ 1, 6, 3, 5,
+ 1, 4, 3, 2,
+}
+function core.facedir_to_dir(facedir)
+ return facedir_to_dir[facedir_to_dir_map[facedir % 32]]
+end
+
+function core.dir_to_wallmounted(dir)
+ if math.abs(dir.y) > math.max(math.abs(dir.x), math.abs(dir.z)) then
+ if dir.y < 0 then
+ return 1
+ else
+ return 0
+ end
+ elseif math.abs(dir.x) > math.abs(dir.z) then
+ if dir.x < 0 then
+ return 3
+ else
+ return 2
+ end
+ else
+ if dir.z < 0 then
+ return 5
+ else
+ return 4
+ end
+ end
+end
+
+-- table of dirs in wallmounted order
+local wallmounted_to_dir = {
+ [0] = vector.new( 0, 1, 0),
+ vector.new( 0, -1, 0),
+ vector.new( 1, 0, 0),
+ vector.new(-1, 0, 0),
+ vector.new( 0, 0, 1),
+ vector.new( 0, 0, -1),
+}
+function core.wallmounted_to_dir(wallmounted)
+ return wallmounted_to_dir[wallmounted % 8]
+end
+
+function core.dir_to_yaw(dir)
+ return -math.atan2(dir.x, dir.z)
+end
+
+function core.yaw_to_dir(yaw)
+ return vector.new(-math.sin(yaw), 0, math.cos(yaw))
+end
+
+function core.is_colored_paramtype(ptype)
+ return (ptype == "color") or (ptype == "colorfacedir") or
+ (ptype == "colorwallmounted") or (ptype == "colordegrotate")
+end
+
+function core.strip_param2_color(param2, paramtype2)
+ if not core.is_colored_paramtype(paramtype2) then
+ return nil
+ end
+ if paramtype2 == "colorfacedir" then
+ param2 = math.floor(param2 / 32) * 32
+ elseif paramtype2 == "colorwallmounted" then
+ param2 = math.floor(param2 / 8) * 8
+ elseif paramtype2 == "colordegrotate" then
+ param2 = math.floor(param2 / 32) * 32
+ end
+ -- paramtype2 == "color" requires no modification.
+ return param2
+end
diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index e86efc50c..997b1894a 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -121,53 +121,6 @@ function core.get_player_radius_area(player_name, radius)
end
-function core.hash_node_position(pos)
- return (pos.z + 32768) * 65536 * 65536
- + (pos.y + 32768) * 65536
- + pos.x + 32768
-end
-
-
-function core.get_position_from_hash(hash)
- local x = (hash % 65536) - 32768
- hash = math.floor(hash / 65536)
- local y = (hash % 65536) - 32768
- hash = math.floor(hash / 65536)
- local z = (hash % 65536) - 32768
- return vector.new(x, y, z)
-end
-
-
-function core.get_item_group(name, group)
- if not core.registered_items[name] or not
- core.registered_items[name].groups[group] then
- return 0
- end
- return core.registered_items[name].groups[group]
-end
-
-
-function core.get_node_group(name, group)
- core.log("deprecated", "Deprecated usage of get_node_group, use get_item_group instead")
- return core.get_item_group(name, group)
-end
-
-
-function core.setting_get_pos(name)
- local value = core.settings:get(name)
- if not value then
- return nil
- end
- return core.string_to_pos(value)
-end
-
-
--- See l_env.cpp for the other functions
-function core.get_artificial_light(param1)
- return math.floor(param1 / 16)
-end
-
-
-- To be overriden by protection mods
function core.is_protected(pos, name)
@@ -284,40 +237,30 @@ end
core.dynamic_media_callbacks = {}
--- PNG encoder safety wrapper
+-- Transfer of certain globals into async environment
+-- see builtin/async/game.lua for the other side
-local o_encode_png = core.encode_png
-function core.encode_png(width, height, data, compression)
- if type(width) ~= "number" then
- error("Incorrect type for 'width', expected number, got " .. type(width))
- end
- if type(height) ~= "number" then
- error("Incorrect type for 'height', expected number, got " .. type(height))
+local function copy_filtering(t, seen)
+ if type(t) == "userdata" or type(t) == "function" then
+ return true -- don't use nil so presence can still be detected
+ elseif type(t) ~= "table" then
+ return t
end
-
- local expected_byte_count = width * height * 4
-
- if type(data) ~= "table" and type(data) ~= "string" then
- error("Incorrect type for 'data', expected table or string, got " .. type(data))
- end
-
- local data_length = type(data) == "table" and #data * 4 or string.len(data)
-
- if data_length ~= expected_byte_count then
- error(string.format(
- "Incorrect length of 'data', width and height imply %d bytes but %d were provided",
- expected_byte_count,
- data_length
- ))
- end
-
- if type(data) == "table" then
- local dataBuf = {}
- for i = 1, #data do
- dataBuf[i] = core.colorspec_to_bytes(data[i])
- end
- data = table.concat(dataBuf)
+ local n = {}
+ seen = seen or {}
+ seen[t] = n
+ for k, v in pairs(t) do
+ local k_ = seen[k] or copy_filtering(k, seen)
+ local v_ = seen[v] or copy_filtering(v, seen)
+ n[k_] = v_
end
+ return n
+end
- return o_encode_png(width, height, data, compression or 6)
+function core.get_globals_to_transfer()
+ local all = {
+ registered_items = copy_filtering(core.registered_items),
+ registered_aliases = core.registered_aliases,
+ }
+ return all
end
diff --git a/builtin/game/misc_s.lua b/builtin/game/misc_s.lua
new file mode 100644
index 000000000..67a0ec684
--- /dev/null
+++ b/builtin/game/misc_s.lua
@@ -0,0 +1,93 @@
+-- Minetest: builtin/misc_s.lua
+-- The distinction of what goes here is a bit tricky, basically it's everything
+-- that does not (directly or indirectly) need access to ServerEnvironment,
+-- Server or writable access to IGameDef on the engine side.
+-- (The '_s' stands for standalone.)
+
+--
+-- Misc. API functions
+--
+
+function core.hash_node_position(pos)
+ return (pos.z + 32768) * 65536 * 65536
+ + (pos.y + 32768) * 65536
+ + pos.x + 32768
+end
+
+
+function core.get_position_from_hash(hash)
+ local x = (hash % 65536) - 32768
+ hash = math.floor(hash / 65536)
+ local y = (hash % 65536) - 32768
+ hash = math.floor(hash / 65536)
+ local z = (hash % 65536) - 32768
+ return vector.new(x, y, z)
+end
+
+
+function core.get_item_group(name, group)
+ if not core.registered_items[name] or not
+ core.registered_items[name].groups[group] then
+ return 0
+ end
+ return core.registered_items[name].groups[group]
+end
+
+
+function core.get_node_group(name, group)
+ core.log("deprecated", "Deprecated usage of get_node_group, use get_item_group instead")
+ return core.get_item_group(name, group)
+end
+
+
+function core.setting_get_pos(name)
+ local value = core.settings:get(name)
+ if not value then
+ return nil
+ end
+ return core.string_to_pos(value)
+end
+
+
+-- See l_env.cpp for the other functions
+function core.get_artificial_light(param1)
+ return math.floor(param1 / 16)
+end
+
+-- PNG encoder safety wrapper
+
+local o_encode_png = core.encode_png
+function core.encode_png(width, height, data, compression)
+ if type(width) ~= "number" then
+ error("Incorrect type for 'width', expected number, got " .. type(width))
+ end
+ if type(height) ~= "number" then
+ error("Incorrect type for 'height', expected number, got " .. type(height))
+ end
+
+ local expected_byte_count = width * height * 4
+
+ if type(data) ~= "table" and type(data) ~= "string" then
+ error("Incorrect type for 'data', expected table or string, got " .. type(data))
+ end
+
+ local data_length = type(data) == "table" and #data * 4 or string.len(data)
+
+ if data_length ~= expected_byte_count then
+ error(string.format(
+ "Incorrect length of 'data', width and height imply %d bytes but %d were provided",
+ expected_byte_count,
+ data_length
+ ))
+ end
+
+ if type(data) == "table" then
+ local dataBuf = {}
+ for i = 1, #data do
+ dataBuf[i] = core.colorspec_to_bytes(data[i])
+ end
+ data = table.concat(dataBuf)
+ end
+
+ return o_encode_png(width, height, data, compression or 6)
+end
diff --git a/builtin/game/register.lua b/builtin/game/register.lua
index 0be107c36..ee4edabbf 100644
--- a/builtin/game/register.lua
+++ b/builtin/game/register.lua
@@ -1,4 +1,4 @@
--- Minetest: builtin/misc_register.lua
+-- Minetest: builtin/register.lua
local S = core.get_translator("__builtin")
diff --git a/builtin/game/statbars.lua b/builtin/game/statbars.lua
index cb7ff7b76..78d1d2728 100644
--- a/builtin/game/statbars.lua
+++ b/builtin/game/statbars.lua
@@ -138,13 +138,15 @@ local function player_event_handler(player,eventname)
end
function core.hud_replace_builtin(hud_name, definition)
-
if type(definition) ~= "table" or
definition.hud_elem_type ~= "statbar" then
return false
end
+ definition = table.copy(definition)
+
if hud_name == "health" then
+ definition.item = definition.item or definition.number or core.PLAYER_MAX_HP_DEFAULT
bar_definitions.hp = definition
for name, ids in pairs(hud_ids) do
@@ -159,6 +161,7 @@ function core.hud_replace_builtin(hud_name, definition)
end
if hud_name == "breath" then
+ definition.item = definition.item or definition.number or core.PLAYER_MAX_BREATH_DEFAULT
bar_definitions.breath = definition
for name, ids in pairs(hud_ids) do
diff --git a/builtin/game/voxelarea.lua b/builtin/game/voxelarea.lua
index 64436bf1a..62f07d928 100644
--- a/builtin/game/voxelarea.lua
+++ b/builtin/game/voxelarea.lua
@@ -1,6 +1,9 @@
+local math_floor = math.floor
+local vector_new = vector.new
+
VoxelArea = {
- MinEdge = vector.new(1, 1, 1),
- MaxEdge = vector.new(0, 0, 0),
+ MinEdge = vector_new(1, 1, 1),
+ MaxEdge = vector_new(0, 0, 0),
ystride = 0,
zstride = 0,
}
@@ -19,7 +22,7 @@ end
function VoxelArea:getExtent()
local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge
- return vector.new(
+ return vector_new(
MaxEdge.x - MinEdge.x + 1,
MaxEdge.y - MinEdge.y + 1,
MaxEdge.z - MinEdge.z + 1
@@ -36,7 +39,7 @@ function VoxelArea:index(x, y, z)
local i = (z - MinEdge.z) * self.zstride +
(y - MinEdge.y) * self.ystride +
(x - MinEdge.x) + 1
- return math.floor(i)
+ return math_floor(i)
end
function VoxelArea:indexp(p)
@@ -44,24 +47,23 @@ function VoxelArea:indexp(p)
local i = (p.z - MinEdge.z) * self.zstride +
(p.y - MinEdge.y) * self.ystride +
(p.x - MinEdge.x) + 1
- return math.floor(i)
+ return math_floor(i)
end
function VoxelArea:position(i)
- local p = {}
local MinEdge = self.MinEdge
i = i - 1
- p.z = math.floor(i / self.zstride) + MinEdge.z
+ local z = math_floor(i / self.zstride) + MinEdge.z
i = i % self.zstride
- p.y = math.floor(i / self.ystride) + MinEdge.y
+ local y = math_floor(i / self.ystride) + MinEdge.y
i = i % self.ystride
- p.x = math.floor(i) + MinEdge.x
+ local x = math_floor(i) + MinEdge.x
- return p
+ return vector_new(x, y, z)
end
function VoxelArea:contains(x, y, z)
diff --git a/builtin/init.lua b/builtin/init.lua
index 7a9b5c427..869136016 100644
--- a/builtin/init.lua
+++ b/builtin/init.lua
@@ -56,8 +56,10 @@ elseif INIT == "mainmenu" then
if not custom_loaded then
dofile(core.get_mainmenu_path() .. DIR_DELIM .. "init.lua")
end
-elseif INIT == "async" then
- dofile(asyncpath .. "init.lua")
+elseif INIT == "async" then
+ dofile(asyncpath .. "mainmenu.lua")
+elseif INIT == "async_game" then
+ dofile(asyncpath .. "game.lua")
elseif INIT == "client" then
dofile(clientpath .. "init.lua")
else
diff --git a/builtin/locale/__builtin.de.tr b/builtin/locale/__builtin.de.tr
index 1b29f81e7..4a17f7a4b 100644
--- a/builtin/locale/__builtin.de.tr
+++ b/builtin/locale/__builtin.de.tr
@@ -72,6 +72,7 @@ Teleport to position or player=Zu Position oder Spieler teleportieren
You don't have permission to teleport other players (missing privilege: @1).=Sie haben nicht die Erlaubnis, andere Spieler zu teleportieren (fehlendes Privileg: @1).
([-n] <name> <value>) | <name>=([-n] <Name> <Wert>) | <Name>
Set or read server configuration setting=Serverkonfigurationseinstellung setzen oder lesen
+Failed. Cannot modify secure settings. Edit the settings file manually.=Fehlgeschlagen. Sicherheitseinstellungen können nicht modifiziert werden. Bearbeiten Sie die Einstellungsdatei manuell.
Failed. Use '/set -n <name> <value>' to create a new setting.=Fehlgeschlagen. Benutzen Sie „/set -n <Name> <Wert>“, um eine neue Einstellung zu erstellen.
@1 @= @2=@1 @= @2
<not set>=<nicht gesetzt>
@@ -151,6 +152,7 @@ Server shutting down (operator request).=Server wird heruntergefahren (Betreiber
Ban the IP of a player or show the ban list=Die IP eines Spielers verbannen oder die Bannliste anzeigen
The ban list is empty.=Die Bannliste ist leer.
Ban list: @1=Bannliste: @1
+You cannot ban players in singleplayer!=Im Einzelspielermodus können Sie keine Spieler verbannen!
Player is not online.=Spieler ist nicht online.
Failed to ban player.=Konnte Spieler nicht verbannen.
Banned @1.=@1 verbannt.
@@ -195,7 +197,6 @@ Available commands:=Verfügbare Befehle:
Command not available: @1=Befehl nicht verfügbar: @1
[all | privs | <cmd>] [-t]=[all | privs | <Befehl>] [-t]
Get help for commands or list privileges (-t: output in chat)=Hilfe für Befehle erhalten oder Privilegien auflisten (-t: Ausgabe im Chat)
-Available privileges:=Verfügbare Privilegien:
Command=Befehl
Parameters=Parameter
For more information, click on any entry in the list.=Für mehr Informationen klicken Sie auf einen beliebigen Eintrag in der Liste.
@@ -205,6 +206,7 @@ Available commands: (see also: /help <cmd>)=Verfügbare Befehle: (siehe auch: /h
Close=Schließen
Privilege=Privileg
Description=Beschreibung
+Available privileges:=Verfügbare Privilegien:
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<Filter>] | dump [<Filter>] | save [<Format> [<Filter>]]
Handle the profiler and profiling data=Den Profiler und Profilingdaten verwalten
Statistics written to action log.=Statistiken zum Aktionsprotokoll geschrieben.
@@ -232,7 +234,6 @@ Can use fly mode=Kann den Flugmodus benutzen
Can use fast mode=Kann den Schnellmodus benutzen
Can fly through solid nodes using noclip mode=Kann durch feste Blöcke mit dem Geistmodus fliegen
Can use the rollback functionality=Kann die Rollback-Funktionalität benutzen
-Can view more debug info that might give a gameplay advantage=Kann zusätzliche Debuginformationen betrachten, welche einen spielerischen Vorteil geben könnten
Can enable wireframe=Kann Drahtmodell aktivieren
Unknown Item=Unbekannter Gegenstand
Air=Luft
diff --git a/builtin/locale/__builtin.it.tr b/builtin/locale/__builtin.it.tr
index 77f85c766..b04b48926 100644
--- a/builtin/locale/__builtin.it.tr
+++ b/builtin/locale/__builtin.it.tr
@@ -72,6 +72,7 @@ Teleport to position or player=Teletrasporta a una posizione o da un giocatore
You don't have permission to teleport other players (missing privilege: @1).=Non hai il permesso di teletrasportare altri giocatori (privilegio mancante: @1).
([-n] <name> <value>) | <name>=([-n] <nome> <valore>) | <nome>
Set or read server configuration setting=Imposta o ottieni le configurazioni del server
+Failed. Cannot modify secure settings. Edit the settings file manually.=
Failed. Use '/set -n <name> <value>' to create a new setting.=Errore. Usa 'set -n <nome> <valore>' per creare una nuova impostazione
@1 @= @2=@1 @= @2
<not set>=<non impostato>
@@ -151,6 +152,7 @@ Server shutting down (operator request).=Arresto del server in corso (per richie
Ban the IP of a player or show the ban list=Bandisce l'IP del giocatore o mostra la lista di quelli banditi
The ban list is empty.=La lista banditi è vuota.
Ban list: @1=Lista banditi: @1
+You cannot ban players in singleplayer!=
Player is not online.=Il giocatore non è connesso.
Failed to ban player.=Errore nel bandire il giocatore.
Banned @1.=@1 banditǝ.
@@ -195,7 +197,6 @@ Available commands:=Comandi disponibili:
Command not available: @1=Comando non disponibile: @1
[all | privs | <cmd>] [-t]=
Get help for commands or list privileges (-t: output in chat)=
-Available privileges:=Privilegi disponibili:
Command=Comando
Parameters=Parametri
For more information, click on any entry in the list.=Per più informazioni, clicca su una qualsiasi voce dell'elenco.
@@ -205,6 +206,7 @@ Available commands: (see also: /help <cmd>)=Comandi disponibili: (vedi anche /he
Close=Chiudi
Privilege=Privilegio
Description=Descrizione
+Available privileges:=Privilegi disponibili:
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<filtro>] | dump [<filtro>] | save [<formato> [<filtro>]] | reset
Handle the profiler and profiling data=Gestisce il profiler e i dati da esso elaborati
Statistics written to action log.=Statistiche scritte nel log delle azioni.
@@ -232,7 +234,6 @@ Can use fly mode=Si può usare la modalità volo
Can use fast mode=Si può usare la modalità rapida
Can fly through solid nodes using noclip mode=Si può volare attraverso i nodi solidi con la modalità incorporea
Can use the rollback functionality=Si può usare la funzione di rollback
-Can view more debug info that might give a gameplay advantage=
Can enable wireframe=
Unknown Item=Oggetto sconosciuto
Air=Aria
diff --git a/builtin/locale/template.txt b/builtin/locale/template.txt
index 308d17f37..fa7352317 100644
--- a/builtin/locale/template.txt
+++ b/builtin/locale/template.txt
@@ -72,6 +72,7 @@ Teleport to position or player=
You don't have permission to teleport other players (missing privilege: @1).=
([-n] <name> <value>) | <name>=
Set or read server configuration setting=
+Failed. Cannot modify secure settings. Edit the settings file manually.=
Failed. Use '/set -n <name> <value>' to create a new setting.=
@1 @= @2=
<not set>=
@@ -151,6 +152,7 @@ Server shutting down (operator request).=
Ban the IP of a player or show the ban list=
The ban list is empty.=
Ban list: @1=
+You cannot ban players in singleplayer!=
Player is not online.=
Failed to ban player.=
Banned @1.=
@@ -195,7 +197,6 @@ Available commands:=
Command not available: @1=
[all | privs | <cmd>] [-t]=
Get help for commands or list privileges (-t: output in chat)=
-Available privileges:=
Command=
Parameters=
For more information, click on any entry in the list.=
@@ -205,6 +206,7 @@ Available commands: (see also: /help <cmd>)=
Close=
Privilege=
Description=
+Available privileges:=
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=
Handle the profiler and profiling data=
Statistics written to action log.=
@@ -232,7 +234,6 @@ Can use fly mode=
Can use fast mode=
Can fly through solid nodes using noclip mode=
Can use the rollback functionality=
-Can view more debug info that might give a gameplay advantage=
Can enable wireframe=
Unknown Item=
Air=
diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua
index 8db8bb8d1..81e28f2bb 100644
--- a/builtin/mainmenu/common.lua
+++ b/builtin/mainmenu/common.lua
@@ -125,18 +125,12 @@ os.tmpname = function()
end
--------------------------------------------------------------------------------
-function menu_render_worldlist(show_gameid)
+function menu_render_worldlist()
local retval = {}
local current_worldlist = menudata.worldlist:get_list()
- local row
for i, v in ipairs(current_worldlist) do
- row = v.name
- if show_gameid == nil or show_gameid == true then
- row = row .. " [" .. v.gameid .. "]"
- end
- retval[#retval+1] = core.formspec_escape(row)
-
+ retval[#retval+1] = core.formspec_escape(v.name)
end
return table.concat(retval, ",")
@@ -242,3 +236,11 @@ function menu_worldmt_legacy(selected)
end
end
end
+
+function confirmation_formspec(message, confirm_id, confirm_label, cancel_id, cancel_label)
+ return "size[10,2.5,true]" ..
+ "label[0.5,0.5;" .. message .. "]" ..
+ "style[" .. confirm_id .. ";bgcolor=red]" ..
+ "button[0.5,1.5;2.5,0.5;" .. confirm_id .. ";" .. confirm_label .. "]" ..
+ "button[7.0,1.5;2.5,0.5;" .. cancel_id .. ";" .. cancel_label .. "]"
+end
diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua
index 9bdf92a74..e76e10ef7 100644
--- a/builtin/mainmenu/dlg_config_world.lua
+++ b/builtin/mainmenu/dlg_config_world.lua
@@ -61,12 +61,68 @@ local function init_data(data)
data.list:set_sortmode("alphabetic")
end
+
+-- Returns errors errors and a list of all enabled mods (inc. game and world mods)
+--
+-- `with_errors` is a table from mod virtual path to `{ type = "error" | "warning" }`.
+-- `enabled_mods_by_name` is a table from mod virtual path to `true`.
+--
+-- @param world_path Path to the world
+-- @param all_mods List of mods, with `enabled` property.
+-- @returns with_errors, enabled_mods_by_name
+local function check_mod_configuration(world_path, all_mods)
+ -- Build up lookup tables for enabled mods and all mods by vpath
+ local enabled_mod_paths = {}
+ local all_mods_by_vpath = {}
+ for _, mod in ipairs(all_mods) do
+ if mod.type == "mod" then
+ all_mods_by_vpath[mod.virtual_path] = mod
+ end
+ if mod.enabled then
+ enabled_mod_paths[mod.virtual_path] = mod.path
+ end
+ end
+
+ -- Use the engine's mod configuration code to resolve dependencies and return any errors
+ local config_status = core.check_mod_configuration(world_path, enabled_mod_paths)
+
+ -- Build the list of enabled mod virtual paths
+ local enabled_mods_by_name = {}
+ for _, mod in ipairs(config_status.satisfied_mods) do
+ assert(mod.virtual_path ~= "")
+ enabled_mods_by_name[mod.name] = all_mods_by_vpath[mod.virtual_path] or mod
+ end
+ for _, mod in ipairs(config_status.unsatisfied_mods) do
+ assert(mod.virtual_path ~= "")
+ enabled_mods_by_name[mod.name] = all_mods_by_vpath[mod.virtual_path] or mod
+ end
+
+ -- Build the table of errors
+ local with_error = {}
+ for _, mod in ipairs(config_status.unsatisfied_mods) do
+ local error = { type = "warning" }
+ with_error[mod.virtual_path] = error
+
+ for _, depname in ipairs(mod.unsatisfied_depends) do
+ if not enabled_mods_by_name[depname] then
+ error.type = "error"
+ break
+ end
+ end
+ end
+
+ return with_error, enabled_mods_by_name
+end
+
local function get_formspec(data)
if not data.list then
init_data(data)
end
- local mod = data.list:get_list()[data.selected_mod] or {name = ""}
+ local all_mods = data.list:get_list()
+ local with_error, enabled_mods_by_name = check_mod_configuration(data.worldspec.path, all_mods)
+
+ local mod = all_mods[data.selected_mod] or {name = ""}
local retval =
"size[11.5,7.5,true]" ..
@@ -87,6 +143,29 @@ local function get_formspec(data)
"textarea[0.25,0.7;5.75,7.2;;" .. info .. ";]"
else
local hard_deps, soft_deps = pkgmgr.get_dependencies(mod.path)
+
+ -- Add error messages to dep lists
+ if mod.enabled or mod.is_game_content then
+ for i, dep_name in ipairs(hard_deps) do
+ local dep = enabled_mods_by_name[dep_name]
+ if not dep then
+ hard_deps[i] = mt_color_red .. dep_name .. " " .. fgettext("(Unsatisfied)")
+ elseif with_error[dep.virtual_path] then
+ hard_deps[i] = mt_color_orange .. dep_name .. " " .. fgettext("(Enabled, has error)")
+ else
+ hard_deps[i] = mt_color_green .. dep_name
+ end
+ end
+ for i, dep_name in ipairs(soft_deps) do
+ local dep = enabled_mods_by_name[dep_name]
+ if dep and with_error[dep.virtual_path] then
+ soft_deps[i] = mt_color_orange .. dep_name .. " " .. fgettext("(Enabled, has error)")
+ elseif dep then
+ soft_deps[i] = mt_color_green .. dep_name
+ end
+ end
+ end
+
local hard_deps_str = table.concat(hard_deps, ",")
local soft_deps_str = table.concat(soft_deps, ",")
@@ -138,7 +217,6 @@ local function get_formspec(data)
if mod.name ~= "" and not mod.is_game_content then
if mod.is_modpack then
-
if pkgmgr.is_modpack_entirely_enabled(data, mod.name) then
retval = retval ..
"button[5.5,0.125;3,0.5;btn_mp_disable;" ..
@@ -163,10 +241,16 @@ local function get_formspec(data)
"button[8.95,0.125;2.5,0.5;btn_enable_all_mods;" ..
fgettext("Enable all") .. "]"
end
+
+ local use_technical_names = core.settings:get_bool("show_technical_names")
+
return retval ..
- "tablecolumns[color;tree;text]" ..
+ "tablecolumns[color;tree;image,align=inline,width=1.5,0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") ..
+ ",1=" .. core.formspec_escape(defaulttexturedir .. "checkbox_16_white.png") ..
+ ",2=" .. core.formspec_escape(defaulttexturedir .. "error_icon_orange.png") ..
+ ",3=" .. core.formspec_escape(defaulttexturedir .. "error_icon_red.png") .. ";text]" ..
"table[5.5,0.75;5.75,6;world_config_modlist;" ..
- pkgmgr.render_packagelist(data.list) .. ";" .. data.selected_mod .."]"
+ pkgmgr.render_packagelist(data.list, use_technical_names, with_error) .. ";" .. data.selected_mod .."]"
end
local function handle_buttons(this, fields)
@@ -205,14 +289,19 @@ local function handle_buttons(this, fields)
local mods = worldfile:to_table()
local rawlist = this.data.list:get_raw_list()
+ local was_set = {}
for i = 1, #rawlist do
local mod = rawlist[i]
if not mod.is_modpack and
not mod.is_game_content then
if modname_valid(mod.name) then
- worldfile:set("load_mod_" .. mod.name,
- mod.enabled and "true" or "false")
+ if mod.enabled then
+ worldfile:set("load_mod_" .. mod.name, mod.virtual_path)
+ was_set[mod.name] = true
+ elseif not was_set[mod.name] then
+ worldfile:set("load_mod_" .. mod.name, "false")
+ end
elseif mod.enabled then
gamedata.errormessage = fgettext_ne("Failed to enable mo" ..
"d \"$1\" as it contains disallowed characters. " ..
@@ -256,12 +345,26 @@ local function handle_buttons(this, fields)
if fields.btn_enable_all_mods then
local list = this.data.list:get_raw_list()
+ -- When multiple copies of a mod are installed, we need to avoid enabling multiple of them
+ -- at a time. So lets first collect all the enabled mods, and then use this to exclude
+ -- multiple enables.
+
+ local was_enabled = {}
for i = 1, #list do
if not list[i].is_game_content
- and not list[i].is_modpack then
+ and not list[i].is_modpack and list[i].enabled then
+ was_enabled[list[i].name] = true
+ end
+ end
+
+ for i = 1, #list do
+ if not list[i].is_game_content and not list[i].is_modpack and
+ not was_enabled[list[i].name] then
list[i].enabled = true
+ was_enabled[list[i].name] = true
end
end
+
enabled_all = true
return true
end
diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua
index 276a7b096..2152b8a39 100644
--- a/builtin/mainmenu/dlg_contentstore.lua
+++ b/builtin/mainmenu/dlg_contentstore.lua
@@ -151,11 +151,9 @@ local function start_install(package, reason)
if conf_path then
local conf = Settings(conf_path)
- if name_is_title then
- conf:set("name", package.title)
- else
- conf:set("title", package.title)
- conf:set("name", package.name)
+ conf:set("title", package.title)
+ if not name_is_title then
+ conf:set("name", package.name)
end
if not conf:get("description") then
conf:set("description", package.short_description)
@@ -193,7 +191,7 @@ end
local function queue_download(package, reason)
local max_concurrent_downloads = tonumber(core.settings:get("contentdb_max_concurrent_downloads"))
- if number_downloading < max_concurrent_downloads then
+ if number_downloading < math.max(max_concurrent_downloads, 1) then
start_install(package, reason)
else
table.insert(download_queue, { package = package, reason = reason })
@@ -360,7 +358,7 @@ function install_dialog.get_formspec()
selected_game_idx = i
end
- games[i] = core.formspec_escape(games[i].name)
+ games[i] = core.formspec_escape(games[i].title)
end
local selected_game = pkgmgr.games[selected_game_idx]
@@ -410,7 +408,7 @@ function install_dialog.get_formspec()
"container[0.375,0.70]",
"label[0,0.25;", fgettext("Base Game:"), "]",
- "dropdown[2,0;4.25,0.5;gameid;", table.concat(games, ","), ";", selected_game_idx, "]",
+ "dropdown[2,0;4.25,0.5;selected_game;", table.concat(games, ","), ";", selected_game_idx, "]",
"label[0,0.8;", fgettext("Dependencies:"), "]",
@@ -461,9 +459,9 @@ function install_dialog.handle_submit(this, fields)
return true
end
- if fields.gameid then
+ if fields.selected_game then
for _, game in pairs(pkgmgr.games) do
- if game.name == fields.gameid then
+ if game.title == fields.selected_game then
core.settings:set("menu_last_game", game.id)
break
end
@@ -490,12 +488,10 @@ local confirm_overwrite = {}
function confirm_overwrite.get_formspec()
local package = confirm_overwrite.package
- return "size[11.5,4.5,true]" ..
- "label[2,2;" ..
- fgettext("\"$1\" already exists. Would you like to overwrite it?", package.name) .. "]"..
- "style[install;bgcolor=red]" ..
- "button[3.25,3.5;2.5,0.5;install;" .. fgettext("Overwrite") .. "]" ..
- "button[5.75,3.5;2.5,0.5;cancel;" .. fgettext("Cancel") .. "]"
+ return confirmation_formspec(
+ fgettext("\"$1\" already exists. Would you like to overwrite it?", package.name),
+ 'install', fgettext("Overwrite"),
+ 'cancel', fgettext("Cancel"))
end
function confirm_overwrite.handle_submit(this, fields)
diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua
index 8d1509f33..806e019a9 100644
--- a/builtin/mainmenu/dlg_create_world.lua
+++ b/builtin/mainmenu/dlg_create_world.lua
@@ -15,9 +15,6 @@
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--- cf. tab_local, the gamebar already provides game selection so we hide the list from here
-local hide_gamelist = PLATFORM ~= "Android"
-
local function table_to_flags(ftable)
-- Convert e.g. { jungles = true, caves = false } to "jungles,nocaves"
local str = {}
@@ -94,14 +91,14 @@ local mgv6_biomes = {
local function create_world_formspec(dialogdata)
- -- Error out when no games found
+ -- Point the player to ContentDB when no games are found
if #pkgmgr.games == 0 then
- return "size[12.25,3,true]" ..
- "box[0,0;12,2;" .. mt_color_orange .. "]" ..
- "textarea[0.3,0;11.7,2;;;"..
- fgettext("You have no games installed.") .. "\n" ..
- fgettext("Download one from minetest.net") .. "]" ..
- "button[4.75,2.5;3,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]"
+ return "size[8,2.5,true]" ..
+ "style[label_button;border=false]" ..
+ "button[0.5,0.5;7,0.5;label_button;" ..
+ fgettext("You have no games installed.") .. "]" ..
+ "button[0.5,1.5;2.5,0.5;world_create_open_cdb;" .. fgettext("Install a game") .. "]" ..
+ "button[5.0,1.5;2.5,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]"
end
local current_mg = dialogdata.mg
@@ -111,14 +108,11 @@ local function create_world_formspec(dialogdata)
local flags = dialogdata.flags
- local game, gameidx = pkgmgr.find_by_gameid(gameid)
- if game == nil and hide_gamelist then
+ local game = pkgmgr.find_by_gameid(gameid)
+ if game == nil then
-- should never happen but just pick the first game
game = pkgmgr.get_game(1)
- gameidx = 1
core.settings:set("menu_last_game", game.id)
- elseif game == nil then
- gameidx = 0
end
local disallowed_mapgen_settings = {}
@@ -296,17 +290,6 @@ local function create_world_formspec(dialogdata)
label_spflags = "label[0,"..y_start..";" .. fgettext("Mapgen-specific flags") .. "]"
end
- -- Warning if only devtest is installed
- local devtest_only = ""
- local gamelist_height = 2.3
- if #pkgmgr.games == 1 and pkgmgr.games[1].id == "devtest" then
- devtest_only = "box[0,0;5.8,1.7;#ff8800]" ..
- "textarea[0.3,0;6,1.8;;;"..
- fgettext("Warning: The Development Test is meant for developers.") .. "\n" ..
- fgettext("Download a game, such as Minetest Game, from minetest.net") .. "]"
- gamelist_height = 0.5
- end
-
local retval =
"size[12.25,7,true]" ..
@@ -315,22 +298,28 @@ local function create_world_formspec(dialogdata)
"field[0.3,0.6;6,0.5;te_world_name;" ..
fgettext("World name") ..
";" .. core.formspec_escape(dialogdata.worldname) .. "]" ..
- "set_focus[te_world_name;false]" ..
+ "set_focus[te_world_name;false]"
- "field[0.3,1.7;6,0.5;te_seed;" ..
- fgettext("Seed") ..
- ";".. core.formspec_escape(dialogdata.seed) .. "]" ..
+ if not disallowed_mapgen_settings["seed"] then
+ retval = retval .. "field[0.3,1.7;6,0.5;te_seed;" ..
+ fgettext("Seed") ..
+ ";".. core.formspec_escape(dialogdata.seed) .. "]"
+
+ end
+
+ retval = retval ..
"label[0,2;" .. fgettext("Mapgen") .. "]"..
"dropdown[0,2.5;6.3;dd_mapgen;" .. mglist .. ";" .. selindex .. "]"
- if not hide_gamelist or devtest_only ~= "" then
+ -- Warning if only devtest is installed
+ if #pkgmgr.games == 1 and pkgmgr.games[1].id == "devtest" then
retval = retval ..
- "label[0,3.35;" .. fgettext("Game") .. "]"..
- "textlist[0,3.85;5.8,"..gamelist_height..";games;" ..
- pkgmgr.gamelist() .. ";" .. gameidx .. ";false]" ..
- "container[0,4.5]" ..
- devtest_only ..
+ "container[0,3.5]" ..
+ "box[0,0;5.8,1.7;#ff8800]" ..
+ "textarea[0.4,0.1;6,1.8;;;"..
+ fgettext("Development Test is meant for developers.") .. "]" ..
+ "button[1,1;4,0.5;world_create_open_cdb;" .. fgettext("Install another game") .. "]" ..
"container_end[]"
end
@@ -353,17 +342,20 @@ end
local function create_world_buttonhandler(this, fields)
+ if fields["world_create_open_cdb"] then
+ local dlg = create_store_dlg("game")
+ dlg:set_parent(this.parent)
+ this:delete()
+ this.parent:hide()
+ dlg:show()
+ return true
+ end
+
if fields["world_create_confirm"] or
fields["key_enter"] then
local worldname = fields["te_world_name"]
- local game, gameindex
- if hide_gamelist then
- game, gameindex = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
- else
- gameindex = core.get_textlist_index("games")
- game = pkgmgr.get_game(gameindex)
- end
+ local game, gameindex = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
local message
if game == nil then
@@ -391,7 +383,7 @@ local function create_world_buttonhandler(this, fields)
end
if message == nil then
- this.data.seed = fields["te_seed"]
+ this.data.seed = fields["te_seed"] or ""
this.data.mg = fields["dd_mapgen"]
-- actual names as used by engine
@@ -412,9 +404,7 @@ local function create_world_buttonhandler(this, fields)
if message == nil then
core.settings:set("menu_last_game", game.id)
- if this.data.update_worldlist_filter then
- menudata.worldlist:set_filtercriteria(game.id)
- end
+ menudata.worldlist:set_filtercriteria(game.id)
menudata.worldlist:refresh()
core.settings:set("mainmenu_last_selected_world",
menudata.worldlist:raw_index_by_uid(worldname))
@@ -426,7 +416,7 @@ local function create_world_buttonhandler(this, fields)
end
this.data.worldname = fields["te_world_name"]
- this.data.seed = fields["te_seed"]
+ this.data.seed = fields["te_seed"] or ""
if fields["games"] then
local gameindex = core.get_textlist_index("games")
@@ -472,13 +462,12 @@ local function create_world_buttonhandler(this, fields)
end
-function create_create_world_dlg(update_worldlistfilter)
+function create_create_world_dlg()
local retval = dialog_create("sp_create_world",
create_world_formspec,
create_world_buttonhandler,
nil)
retval.data = {
- update_worldlist_filter = update_worldlistfilter,
worldname = "",
-- settings the world is created with:
seed = core.settings:get("fixed_map_seed") or "",
diff --git a/builtin/mainmenu/dlg_delete_content.lua b/builtin/mainmenu/dlg_delete_content.lua
index a24171541..4463825f7 100644
--- a/builtin/mainmenu/dlg_delete_content.lua
+++ b/builtin/mainmenu/dlg_delete_content.lua
@@ -18,15 +18,10 @@
--------------------------------------------------------------------------------
local function delete_content_formspec(dialogdata)
- local retval =
- "size[11.5,4.5,true]" ..
- "label[2,2;" ..
- fgettext("Are you sure you want to delete \"$1\"?", dialogdata.content.name) .. "]"..
- "style[dlg_delete_content_confirm;bgcolor=red]" ..
- "button[3.25,3.5;2.5,0.5;dlg_delete_content_confirm;" .. fgettext("Delete") .. "]" ..
- "button[5.75,3.5;2.5,0.5;dlg_delete_content_cancel;" .. fgettext("Cancel") .. "]"
-
- return retval
+ return confirmation_formspec(
+ fgettext("Are you sure you want to delete \"$1\"?", dialogdata.content.name),
+ 'dlg_delete_content_confirm', fgettext("Delete"),
+ 'dlg_delete_content_cancel', fgettext("Cancel"))
end
--------------------------------------------------------------------------------
diff --git a/builtin/mainmenu/dlg_delete_world.lua b/builtin/mainmenu/dlg_delete_world.lua
index 33e7bc945..67c0612bd 100644
--- a/builtin/mainmenu/dlg_delete_world.lua
+++ b/builtin/mainmenu/dlg_delete_world.lua
@@ -17,14 +17,10 @@
local function delete_world_formspec(dialogdata)
- local retval =
- "size[10,2.5,true]" ..
- "label[0.5,0.5;" ..
- fgettext("Delete World \"$1\"?", dialogdata.delete_name) .. "]" ..
- "style[world_delete_confirm;bgcolor=red]" ..
- "button[0.5,1.5;2.5,0.5;world_delete_confirm;" .. fgettext("Delete") .. "]" ..
- "button[7.0,1.5;2.5,0.5;world_delete_cancel;" .. fgettext("Cancel") .. "]"
- return retval
+ return confirmation_formspec(
+ fgettext("Delete World \"$1\"?", dialogdata.delete_name),
+ 'world_delete_confirm', fgettext("Delete"),
+ 'world_delete_cancel', fgettext("Cancel"))
end
local function delete_world_buttonhandler(this, fields)
diff --git a/builtin/mainmenu/dlg_register.lua b/builtin/mainmenu/dlg_register.lua
new file mode 100644
index 000000000..a7658249c
--- /dev/null
+++ b/builtin/mainmenu/dlg_register.lua
@@ -0,0 +1,123 @@
+--Minetest
+--Copyright (C) 2022 rubenwardy
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+--------------------------------------------------------------------------------
+
+local function register_formspec(dialogdata)
+ local title = fgettext("Joining $1", dialogdata.server and dialogdata.server.name or dialogdata.address)
+ local buttons_y = 4 + 1.3
+ if dialogdata.error then
+ buttons_y = buttons_y + 0.8
+ end
+
+ local retval = {
+ "formspec_version[4]",
+ "size[8,", tostring(buttons_y + 1.175), "]",
+ "set_focus[", (dialogdata.name ~= "" and "password" or "name"), "]",
+ "label[0.375,0.8;", title, "]",
+ "field[0.375,1.575;7.25,0.8;name;", core.formspec_escape(fgettext("Name")), ";",
+ core.formspec_escape(dialogdata.name), "]",
+ "pwdfield[0.375,2.875;7.25,0.8;password;", core.formspec_escape(fgettext("Password")), "]",
+ "pwdfield[0.375,4.175;7.25,0.8;password_2;", core.formspec_escape(fgettext("Confirm Password")), "]"
+ }
+
+ if dialogdata.error then
+ table.insert_all(retval, {
+ "box[0.375,", tostring(buttons_y - 0.9), ";7.25,0.6;darkred]",
+ "label[0.625,", tostring(buttons_y - 0.6), ";", core.formspec_escape(dialogdata.error), "]",
+ })
+ end
+
+ table.insert_all(retval, {
+ "container[0.375,", tostring(buttons_y), "]",
+ "button[0,0;2.5,0.8;dlg_register_confirm;", fgettext("Register"), "]",
+ "button[4.75,0;2.5,0.8;dlg_register_cancel;", fgettext("Cancel"), "]",
+ "container_end[]",
+ })
+
+ return table.concat(retval, "")
+end
+
+--------------------------------------------------------------------------------
+local function register_buttonhandler(this, fields)
+ this.data.name = fields.name
+ this.data.error = nil
+
+ if fields.dlg_register_confirm or fields.key_enter then
+ if fields.name == "" then
+ this.data.error = fgettext("Missing name")
+ return true
+ end
+ if fields.password ~= fields.password_2 then
+ this.data.error = fgettext("Passwords do not match")
+ return true
+ end
+
+ gamedata.playername = fields.name
+ gamedata.password = fields.password
+ gamedata.address = this.data.address
+ gamedata.port = this.data.port
+ gamedata.allow_login_or_register = "register"
+ gamedata.selected_world = 0
+
+ assert(gamedata.address and gamedata.port)
+
+ local server = this.data.server
+ if server then
+ serverlistmgr.add_favorite(server)
+ gamedata.servername = server.name
+ gamedata.serverdescription = server.description
+ else
+ gamedata.servername = ""
+ gamedata.serverdescription = ""
+
+ serverlistmgr.add_favorite({
+ address = gamedata.address,
+ port = gamedata.port,
+ })
+ end
+
+ core.settings:set("name", fields.name)
+ core.settings:set("address", gamedata.address)
+ core.settings:set("remote_port", gamedata.port)
+
+ core.start()
+ end
+
+ if fields["dlg_register_cancel"] then
+ this:delete()
+ return true
+ end
+
+ return false
+end
+
+--------------------------------------------------------------------------------
+function create_register_dialog(address, port, server)
+ assert(address)
+ assert(type(port) == "number")
+
+ local retval = dialog_create("dlg_register",
+ register_formspec,
+ register_buttonhandler,
+ nil)
+ retval.data.address = address
+ retval.data.port = port
+ retval.data.server = server
+ retval.data.name = core.settings:get("name") or ""
+ return retval
+end
diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua
index 06fd32d84..69562e6a5 100644
--- a/builtin/mainmenu/dlg_settings_advanced.lua
+++ b/builtin/mainmenu/dlg_settings_advanced.lua
@@ -351,9 +351,9 @@ local function parse_config_file(read_all, parse_mods)
local file = io.open(path, "r")
if file then
if not games_category_initialized then
- fgettext_ne("Games") -- not used, but needed for xgettext
+ fgettext_ne("Content: Games") -- not used, but needed for xgettext
table.insert(settings, {
- name = "Games",
+ name = "Content: Games",
level = 0,
type = "category",
})
@@ -378,15 +378,15 @@ local function parse_config_file(read_all, parse_mods)
-- Parse mods
local mods_category_initialized = false
local mods = {}
- get_mods(core.get_modpath(), mods)
+ get_mods(core.get_modpath(), "mods", mods)
for _, mod in ipairs(mods) do
local path = mod.path .. DIR_DELIM .. FILENAME
local file = io.open(path, "r")
if file then
if not mods_category_initialized then
- fgettext_ne("Mods") -- not used, but needed for xgettext
+ fgettext_ne("Content: Mods") -- not used, but needed for xgettext
table.insert(settings, {
- name = "Mods",
+ name = "Content: Mods",
level = 0,
type = "category",
})
@@ -395,6 +395,37 @@ local function parse_config_file(read_all, parse_mods)
table.insert(settings, {
name = mod.name,
+ readable_name = mod.title,
+ level = 1,
+ type = "category",
+ })
+
+ parse_single_file(file, path, read_all, settings, 2, false)
+
+ file:close()
+ end
+ end
+
+ -- Parse client mods
+ local clientmods_category_initialized = false
+ local clientmods = {}
+ get_mods(core.get_clientmodpath(), "clientmods", clientmods)
+ for _, mod in ipairs(clientmods) do
+ local path = mod.path .. DIR_DELIM .. FILENAME
+ local file = io.open(path, "r")
+ if file then
+ if not clientmods_category_initialized then
+ fgettext_ne("Client Mods") -- not used, but needed for xgettext
+ table.insert(settings, {
+ name = "Client Mods",
+ level = 0,
+ type = "category",
+ })
+ clientmods_category_initialized = true
+ end
+
+ table.insert(settings, {
+ name = mod.name,
level = 1,
type = "category",
})
@@ -497,44 +528,40 @@ end
local function get_current_np_group(setting)
local value = core.settings:get_np_group(setting.name)
- local t = {}
if value == nil then
- t = setting.values
- else
- table.insert(t, value.offset)
- table.insert(t, value.scale)
- table.insert(t, value.spread.x)
- table.insert(t, value.spread.y)
- table.insert(t, value.spread.z)
- table.insert(t, value.seed)
- table.insert(t, value.octaves)
- table.insert(t, value.persistence)
- table.insert(t, value.lacunarity)
- table.insert(t, value.flags)
+ return setting.values
end
- return t
+ local p = "%g"
+ return {
+ p:format(value.offset),
+ p:format(value.scale),
+ p:format(value.spread.x),
+ p:format(value.spread.y),
+ p:format(value.spread.z),
+ p:format(value.seed),
+ p:format(value.octaves),
+ p:format(value.persistence),
+ p:format(value.lacunarity),
+ value.flags
+ }
end
local function get_current_np_group_as_string(setting)
local value = core.settings:get_np_group(setting.name)
- local t
if value == nil then
- t = setting.default
- else
- t = value.offset .. ", " ..
- value.scale .. ", (" ..
- value.spread.x .. ", " ..
- value.spread.y .. ", " ..
- value.spread.z .. "), " ..
- value.seed .. ", " ..
- value.octaves .. ", " ..
- value.persistence .. ", " ..
- value.lacunarity
- if value.flags ~= "" then
- t = t .. ", " .. value.flags
- end
+ return setting.default
end
- return t
+ return ("%g, %g, (%g, %g, %g), %g, %g, %g, %g"):format(
+ value.offset,
+ value.scale,
+ value.spread.x,
+ value.spread.y,
+ value.spread.z,
+ value.seed,
+ value.octaves,
+ value.persistence,
+ value.lacunarity
+ ) .. (value.flags ~= "" and (", " .. value.flags) or "")
end
local checkboxes = {} -- handle checkboxes events
@@ -667,7 +694,7 @@ local function create_change_setting_formspec(dialogdata)
elseif setting.type == "v3f" then
local val = get_current_value(setting)
local v3f = {}
- for line in val:gmatch("[+-]?[%d.-e]+") do -- All numeric characters
+ for line in val:gmatch("[+-]?[%d.+-eE]+") do -- All numeric characters
table.insert(v3f, line)
end
@@ -960,7 +987,7 @@ local function create_settings_formspec(tabview, _, tabdata)
local current_level = 0
for _, entry in ipairs(settings) do
local name
- if not core.settings:get_bool("main_menu_technical_settings") and entry.readable_name then
+ if not core.settings:get_bool("show_technical_names") and entry.readable_name then
name = fgettext_ne(entry.readable_name)
else
name = entry.name
@@ -1001,7 +1028,7 @@ local function create_settings_formspec(tabview, _, tabdata)
"button[10,4.9;2,1;btn_edit;" .. fgettext("Edit") .. "]" ..
"button[7,4.9;3,1;btn_restore;" .. fgettext("Restore Default") .. "]" ..
"checkbox[0,4.3;cb_tech_settings;" .. fgettext("Show technical names") .. ";"
- .. dump(core.settings:get_bool("main_menu_technical_settings")) .. "]"
+ .. dump(core.settings:get_bool("show_technical_names")) .. "]"
return formspec
end
@@ -1084,7 +1111,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
end
if fields["cb_tech_settings"] then
- core.settings:set("main_menu_technical_settings", fields["cb_tech_settings"])
+ core.settings:set("show_technical_names", fields["cb_tech_settings"])
core.settings:write()
core.update_formspec(this:get_formspec())
return true
diff --git a/builtin/mainmenu/dlg_version_info.lua b/builtin/mainmenu/dlg_version_info.lua
new file mode 100644
index 000000000..568fca3f4
--- /dev/null
+++ b/builtin/mainmenu/dlg_version_info.lua
@@ -0,0 +1,172 @@
+--[[
+Minetest
+Copyright (C) 2018-2020 SmallJoker, 2022 rubenwardy
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+]]
+
+if not core.get_http_api then
+ function check_new_version()
+ end
+ return
+end
+
+local function version_info_formspec(data)
+ local cur_ver = core.get_version()
+ local title = fgettext("A new $1 version is available", cur_ver.project)
+ local message =
+ fgettext("Installed version: $1\nNew version: $2\n" ..
+ "Visit $3 to find out how to get the newest version and stay up to date" ..
+ " with features and bugfixes.",
+ cur_ver.string, data.new_version or "", data.url or "")
+
+ local fs = {
+ "formspec_version[3]",
+ "size[12.8,7]",
+ "style_type[label;textcolor=#0E0]",
+ "label[0.5,0.8;", core.formspec_escape(title), "]",
+ "textarea[0.4,1.6;12,3.4;;;",
+ core.formspec_escape(message), "]",
+ "container[0.4,5.8]",
+ "button[0.0,0;4.0,0.8;version_check_visit;", fgettext("Visit website"), "]",
+ "button[4.5,0;3.5,0.8;version_check_remind;", fgettext("Later"), "]",
+ "button[8.5.5,0;3.5,0.8;version_check_never;", fgettext("Never"), "]",
+ "container_end[]",
+ }
+
+ return table.concat(fs, "")
+end
+
+local function version_info_buttonhandler(this, fields)
+ if fields.version_check_remind then
+ -- Erase last known, user will be reminded again at next check
+ core.settings:set("update_last_known", "")
+ this:delete()
+ return true
+ end
+ if fields.version_check_never then
+ core.settings:set("update_last_checked", "disabled")
+ this:delete()
+ return true
+ end
+ if fields.version_check_visit then
+ if type(this.data.url) == "string" then
+ core.open_url(this.data.url)
+ end
+ this:delete()
+ return true
+ end
+
+ return false
+end
+
+local function create_version_info_dlg(new_version, url)
+ assert(type(new_version) == "string")
+ assert(type(url) == "string")
+
+ local retval = dialog_create("version_info",
+ version_info_formspec,
+ version_info_buttonhandler,
+ nil)
+
+ retval.data.new_version = new_version
+ retval.data.url = url
+
+ return retval
+end
+
+local function get_current_version_code()
+ -- Format: Major.Minor.Patch
+ -- Convert to MMMNNNPPP
+ local cur_string = core.get_version().string
+ local cur_major, cur_minor, cur_patch = cur_string:match("^(%d+).(%d+).(%d+)")
+
+ if not cur_patch then
+ core.log("error", "Failed to parse version numbers (invalid tag format?)")
+ return
+ end
+
+ return (cur_major * 1000 + cur_minor) * 1000 + cur_patch
+end
+
+local function on_version_info_received(json)
+ local maintab = ui.find_by_name("maintab")
+ if maintab.hidden then
+ -- Another dialog is open, abort.
+ return
+ end
+
+ local known_update = tonumber(core.settings:get("update_last_known")) or 0
+
+ -- Format: MMNNPPP (Major, Minor, Patch)
+ local new_number = type(json.latest) == "table" and json.latest.version_code
+ if type(new_number) ~= "number" then
+ core.log("error", "Failed to read version number (invalid response?)")
+ return
+ end
+
+ local cur_number = get_current_version_code()
+ if new_number <= known_update or new_number < cur_number then
+ return
+ end
+
+ -- Also consider updating from 1.2.3-dev to 1.2.3
+ if new_number == cur_number and not core.get_version().is_dev then
+ return
+ end
+
+ core.settings:set("update_last_known", tostring(new_number))
+
+ -- Show version info dialog (once)
+ maintab:hide()
+
+ local version_info_dlg = create_version_info_dlg(json.latest.version, json.latest.url)
+ version_info_dlg:set_parent(maintab)
+ version_info_dlg:show()
+
+ ui.update()
+end
+
+function check_new_version()
+ local url = core.settings:get("update_information_url")
+ if core.settings:get("update_last_checked") == "disabled" or
+ url == "" then
+ -- Never show any updates
+ return
+ end
+
+ local time_now = os.time()
+ local time_checked = tonumber(core.settings:get("update_last_checked")) or 0
+ if time_now - time_checked < 2 * 24 * 3600 then
+ -- Check interval of 2 entire days
+ return
+ end
+
+ core.settings:set("update_last_checked", tostring(time_now))
+
+ core.handle_async(function(params)
+ local http = core.get_http_api()
+ return http.fetch_sync(params)
+ end, { url = url }, function(result)
+ local json = result.succeeded and core.parse_json(result.data)
+ if type(json) ~= "table" or not json.latest then
+ core.log("error", "Failed to read JSON output from " .. url ..
+ ", status code = " .. result.code)
+ return
+ end
+
+ on_version_info_received(json)
+ end)
+end
diff --git a/builtin/mainmenu/generate_from_settingtypes.lua b/builtin/mainmenu/generate_from_settingtypes.lua
index 43fc57bb9..0f551fbb1 100644
--- a/builtin/mainmenu/generate_from_settingtypes.lua
+++ b/builtin/mainmenu/generate_from_settingtypes.lua
@@ -31,7 +31,7 @@ local group_format_template = [[
# octaves = %s,
# persistence = %s,
# lacunarity = %s,
-# flags = %s
+# flags =%s
# }
]]
@@ -55,7 +55,11 @@ local function create_minetest_conf_example()
end
if entry.comment ~= "" then
for _, comment_line in ipairs(entry.comment:split("\n", true)) do
- insert(result, "# " .. comment_line .. "\n")
+ if comment_line == "" then
+ insert(result, "#\n")
+ else
+ insert(result, "# " .. comment_line .. "\n")
+ end
end
end
insert(result, "# type: " .. entry.type)
@@ -73,10 +77,14 @@ local function create_minetest_conf_example()
end
insert(result, "\n")
if group_format == true then
+ local flags = entry.values[10]
+ if flags ~= "" then
+ flags = " "..flags
+ end
insert(result, sprintf(group_format_template, entry.name, entry.values[1],
entry.values[2], entry.values[3], entry.values[4], entry.values[5],
entry.values[6], entry.values[7], entry.values[8], entry.values[9],
- entry.values[10]))
+ flags))
else
local append
if entry.default ~= "" then
@@ -91,7 +99,7 @@ end
local translation_file_header = [[
// This file is automatically generated
-// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files
+// It contains a bunch of fake gettext calls, to tell xgettext about the strings in config files
// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
fake_function() {]]
@@ -126,4 +134,3 @@ file = assert(io.open("src/settings_translation_file.cpp", "w"))
--file = assert(io.open("settings_translation_file.cpp", "w"))
file:write(create_translation_file())
file:close()
-
diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua
index 8e716c2eb..c3a28a570 100644
--- a/builtin/mainmenu/init.lua
+++ b/builtin/mainmenu/init.lua
@@ -17,9 +17,11 @@
mt_color_grey = "#AAAAAA"
mt_color_blue = "#6389FF"
+mt_color_lightblue = "#99CCFF"
mt_color_green = "#72FF63"
mt_color_dark_green = "#25C191"
mt_color_orange = "#FF8800"
+mt_color_red = "#FF3300"
local menupath = core.get_mainmenu_path()
local basepath = core.get_builtin_path()
@@ -43,7 +45,9 @@ dofile(menupath .. DIR_DELIM .. "dlg_contentstore.lua")
dofile(menupath .. DIR_DELIM .. "dlg_create_world.lua")
dofile(menupath .. DIR_DELIM .. "dlg_delete_content.lua")
dofile(menupath .. DIR_DELIM .. "dlg_delete_world.lua")
+dofile(menupath .. DIR_DELIM .. "dlg_register.lua")
dofile(menupath .. DIR_DELIM .. "dlg_rename_modpack.lua")
+dofile(menupath .. DIR_DELIM .. "dlg_version_info.lua")
local tabs = {}
@@ -91,6 +95,7 @@ local function init_globals()
-- Create main tabview
local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0})
+ -- note: size would be 15.5,7.1 in real coordinates mode
tv_main:set_autosave_tab(true)
tv_main:add(tabs.local_game)
@@ -118,8 +123,8 @@ local function init_globals()
end
ui.set_default("maintab")
+ check_new_version()
tv_main:show()
-
ui.update()
end
diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua
index 23f24d617..32a65fd08 100644
--- a/builtin/mainmenu/pkgmgr.lua
+++ b/builtin/mainmenu/pkgmgr.lua
@@ -78,34 +78,35 @@ local function load_texture_packs(txtpath, retval)
for _, item in ipairs(list) do
if item ~= "base" then
- local name = item
-
local path = txtpath .. DIR_DELIM .. item .. DIR_DELIM
- if path == current_texture_path then
- name = fgettext("$1 (Enabled)", name)
- end
-
local conf = Settings(path .. "texture_pack.conf")
+ local enabled = path == current_texture_path
+ local title = conf:get("title") or item
+
+ -- list_* is only used if non-nil, else the regular versions are used.
retval[#retval + 1] = {
name = item,
+ title = title,
+ list_name = enabled and fgettext("$1 (Enabled)", item) or nil,
+ list_title = enabled and fgettext("$1 (Enabled)", title) or nil,
author = conf:get("author"),
release = tonumber(conf:get("release")) or 0,
- list_name = name,
type = "txp",
path = path,
- enabled = path == current_texture_path,
+ enabled = enabled,
}
end
end
end
-function get_mods(path,retval,modpack)
+function get_mods(path, virtual_path, retval, modpack)
local mods = core.get_dir_list(path, true)
for _, name in ipairs(mods) do
if name:sub(1, 1) ~= "." then
- local prefix = path .. DIR_DELIM .. name
+ local mod_path = path .. DIR_DELIM .. name
+ local mod_virtual_path = virtual_path .. "/" .. name
local toadd = {
dir_name = name,
parent_dir = path,
@@ -114,18 +115,18 @@ function get_mods(path,retval,modpack)
-- Get config file
local mod_conf
- local modpack_conf = io.open(prefix .. DIR_DELIM .. "modpack.conf")
+ local modpack_conf = io.open(mod_path .. DIR_DELIM .. "modpack.conf")
if modpack_conf then
toadd.is_modpack = true
modpack_conf:close()
- mod_conf = Settings(prefix .. DIR_DELIM .. "modpack.conf"):to_table()
+ mod_conf = Settings(mod_path .. DIR_DELIM .. "modpack.conf"):to_table()
if mod_conf.name then
name = mod_conf.name
toadd.is_name_explicit = true
end
else
- mod_conf = Settings(prefix .. DIR_DELIM .. "mod.conf"):to_table()
+ mod_conf = Settings(mod_path .. DIR_DELIM .. "mod.conf"):to_table()
if mod_conf.name then
name = mod_conf.name
toadd.is_name_explicit = true
@@ -134,14 +135,16 @@ function get_mods(path,retval,modpack)
-- Read from config
toadd.name = name
+ toadd.title = mod_conf.title
toadd.author = mod_conf.author
toadd.release = tonumber(mod_conf.release) or 0
- toadd.path = prefix
+ toadd.path = mod_path
+ toadd.virtual_path = mod_virtual_path
toadd.type = "mod"
-- Check modpack.txt
-- Note: modpack.conf is already checked above
- local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt")
+ local modpackfile = io.open(mod_path .. DIR_DELIM .. "modpack.txt")
if modpackfile then
modpackfile:close()
toadd.is_modpack = true
@@ -153,7 +156,7 @@ function get_mods(path,retval,modpack)
elseif toadd.is_modpack then
toadd.type = "modpack"
toadd.is_modpack = true
- get_mods(prefix, retval, name)
+ get_mods(mod_path, mod_virtual_path, retval, name)
end
end
end
@@ -334,7 +337,7 @@ function pkgmgr.identify_modname(modpath,filename)
return nil
end
--------------------------------------------------------------------------------
-function pkgmgr.render_packagelist(render_list)
+function pkgmgr.render_packagelist(render_list, use_technical_names, with_error)
if not render_list then
if not pkgmgr.global_mods then
pkgmgr.refresh_globals()
@@ -346,31 +349,75 @@ function pkgmgr.render_packagelist(render_list)
local retval = {}
for i, v in ipairs(list) do
local color = ""
+ local icon = 0
+ local error = with_error and with_error[v.virtual_path]
+ local function update_error(val)
+ if val and (not error or (error.type == "warning" and val.type == "error")) then
+ error = val
+ end
+ end
+
if v.is_modpack then
local rawlist = render_list:get_raw_list()
color = mt_color_dark_green
- for j = 1, #rawlist, 1 do
- if rawlist[j].modpack == list[i].name and
- not rawlist[j].enabled then
- -- Modpack not entirely enabled so showing as grey
- color = mt_color_grey
- break
+ for j = 1, #rawlist do
+ if rawlist[j].modpack == list[i].name then
+ if with_error then
+ update_error(with_error[rawlist[j].virtual_path])
+ end
+
+ if rawlist[j].enabled then
+ icon = 1
+ else
+ -- Modpack not entirely enabled so showing as grey
+ color = mt_color_grey
+ end
end
end
elseif v.is_game_content or v.type == "game" then
+ icon = 1
color = mt_color_blue
+
+ local rawlist = render_list:get_raw_list()
+ if v.type == "game" and with_error then
+ for j = 1, #rawlist do
+ if rawlist[j].is_game_content then
+ update_error(with_error[rawlist[j].virtual_path])
+ end
+ end
+ end
elseif v.enabled or v.type == "txp" then
+ icon = 1
color = mt_color_green
end
+ if error then
+ if error.type == "warning" then
+ color = mt_color_orange
+ icon = 2
+ else
+ color = mt_color_red
+ icon = 3
+ end
+ end
+
retval[#retval + 1] = color
if v.modpack ~= nil or v.loc == "game" then
retval[#retval + 1] = "1"
else
retval[#retval + 1] = "0"
end
- retval[#retval + 1] = core.formspec_escape(v.list_name or v.name)
+
+ if with_error then
+ retval[#retval + 1] = icon
+ end
+
+ if use_technical_names then
+ retval[#retval + 1] = core.formspec_escape(v.list_name or v.name)
+ else
+ retval[#retval + 1] = core.formspec_escape(v.list_title or v.list_name or v.title or v.name)
+ end
end
return table.concat(retval, ",")
@@ -397,6 +444,14 @@ function pkgmgr.is_modpack_entirely_enabled(data, name)
return true
end
+local function disable_all_by_name(list, name, except)
+ for i=1, #list do
+ if list[i].name == name and list[i] ~= except then
+ list[i].enabled = false
+ end
+ end
+end
+
---------- toggles or en/disables a mod or modpack and its dependencies --------
local function toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, mod)
if not mod.is_modpack then
@@ -405,13 +460,16 @@ local function toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, mo
toset = not mod.enabled
end
if mod.enabled ~= toset then
- mod.enabled = toset
toggled_mods[#toggled_mods+1] = mod.name
end
if toset then
-- Mark this mod for recursive dependency traversal
enabled_mods[mod.name] = true
+
+ -- Disable other mods with the same name
+ disable_all_by_name(list, mod.name, mod)
end
+ mod.enabled = toset
else
-- Toggle or en/disable every mod in the modpack,
-- interleaved unsupported
@@ -472,6 +530,7 @@ function pkgmgr.enable_mod(this, toset)
end
end
end
+
-- If sp is 0, every dependency is already activated
while sp > 0 do
local name = to_enable[sp]
@@ -483,8 +542,8 @@ function pkgmgr.enable_mod(this, toset)
if not mod_to_enable then
core.log("warning", "Mod dependency \"" .. name ..
"\" not found!")
- else
- if not mod_to_enable.enabled then
+ elseif not mod_to_enable.is_game_content then
+ if not mod_to_enable.enabled then
mod_to_enable.enabled = true
toggled_mods[#toggled_mods+1] = mod_to_enable.name
end
@@ -626,6 +685,8 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
else
targetpath = core.get_gamepath() .. DIR_DELIM .. basename
end
+ else
+ error("basefolder didn't return a recognised type, this shouldn't happen")
end
-- Copy it
@@ -652,13 +713,14 @@ function pkgmgr.preparemodlist(data)
--read global mods
local modpaths = core.get_modpaths()
- for _, modpath in ipairs(modpaths) do
- get_mods(modpath, global_mods)
+ for key, modpath in pairs(modpaths) do
+ get_mods(modpath, key, global_mods)
end
for i=1,#global_mods,1 do
global_mods[i].type = "mod"
global_mods[i].loc = "global"
+ global_mods[i].enabled = false
retval[#retval + 1] = global_mods[i]
end
@@ -671,7 +733,7 @@ function pkgmgr.preparemodlist(data)
retval[#retval + 1] = {
type = "game",
is_game_content = true,
- name = fgettext("$1 mods", gamespec.name),
+ name = fgettext("$1 mods", gamespec.title),
path = gamespec.path
}
end
@@ -692,22 +754,37 @@ function pkgmgr.preparemodlist(data)
DIR_DELIM .. "world.mt"
local worldfile = Settings(filename)
-
- for key,value in pairs(worldfile:to_table()) do
+ for key, value in pairs(worldfile:to_table()) do
if key:sub(1, 9) == "load_mod_" then
key = key:sub(10)
- local element = nil
- for i=1,#retval,1 do
+ local mod_found = false
+
+ local fallback_found = false
+ local fallback_mod = nil
+
+ for i=1, #retval do
if retval[i].name == key and
- not retval[i].is_modpack then
- element = retval[i]
- break
+ not retval[i].is_modpack then
+ if core.is_yes(value) or retval[i].virtual_path == value then
+ retval[i].enabled = true
+ mod_found = true
+ break
+ elseif fallback_found then
+ -- Only allow fallback if only one mod matches
+ fallback_mod = nil
+ else
+ fallback_found = true
+ fallback_mod = retval[i]
+ end
end
end
- if element ~= nil then
- element.enabled = value ~= "false" and value ~= "nil" and value
- else
- core.log("info", "Mod: " .. key .. " " .. dump(value) .. " but not found")
+
+ if not mod_found then
+ if fallback_mod and value:find("/") then
+ fallback_mod.enabled = true
+ else
+ core.log("info", "Mod: " .. key .. " " .. dump(value) .. " but not found")
+ end
end
end
end
@@ -801,7 +878,7 @@ function pkgmgr.get_game_mods(gamespec, retval)
if gamespec ~= nil and
gamespec.gamemods_path ~= nil and
gamespec.gamemods_path ~= "" then
- get_mods(gamespec.gamemods_path, retval)
+ get_mods(gamespec.gamemods_path, ("games/%s/mods"):format(gamespec.id), retval)
end
end
@@ -837,10 +914,10 @@ end
function pkgmgr.gamelist()
local retval = ""
if #pkgmgr.games > 0 then
- retval = retval .. core.formspec_escape(pkgmgr.games[1].name)
+ retval = retval .. core.formspec_escape(pkgmgr.games[1].title)
for i=2,#pkgmgr.games,1 do
- retval = retval .. "," .. core.formspec_escape(pkgmgr.games[i].name)
+ retval = retval .. "," .. core.formspec_escape(pkgmgr.games[i].title)
end
end
return retval
diff --git a/builtin/mainmenu/tab_about.lua b/builtin/mainmenu/tab_about.lua
index ba258fd2d..a84ebce3f 100644
--- a/builtin/mainmenu/tab_about.lua
+++ b/builtin/mainmenu/tab_about.lua
@@ -15,48 +15,46 @@
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
---------------------------------------------------------------------------------
+-- https://github.com/orgs/minetest/teams/engine/members
local core_developers = {
- "Perttu Ahola (celeron55) <celeron55@gmail.com>",
+ "Perttu Ahola (celeron55) <celeron55@gmail.com> [Project founder]",
"sfan5 <sfan5@live.de>",
- "Nathanaël Courant (Nore/Ekdohibs) <nore@mesecons.net>",
+ "ShadowNinja <shadowninja@minetest.net>",
+ "Nathanaëlle Courant (Nore/Ekdohibs) <nore@mesecons.net>",
"Loic Blot (nerzhul/nrz) <loic.blot@unix-experience.fr>",
- "paramat",
"Andrew Ward (rubenwardy) <rw@rubenwardy.com>",
"Krock/SmallJoker <mk939@ymail.com>",
"Lars Hofhansl <larsh@apache.org>",
- "Pierre-Yves Rollo <dev@pyrollo.com>",
"v-rob <robinsonvincent89@gmail.com>",
"hecks",
"Hugues Ross <hugues.ross@gmail.com>",
"Dmitry Kostenko (x2048) <codeforsmile@gmail.com>",
}
+local core_team = {
+ "Zughy [Issue triager]",
+}
+
-- For updating active/previous contributors, see the script in ./util/gather_git_credits.py
local active_contributors = {
- "Wuzzy [I18n for builtin, liquid features, fixes]",
- "Zughy [Various features and fixes]",
- "numzero [Graphics and rendering]",
- "Desour [Internal fixes, Clipboard on X11]",
- "Lars Müller [Various internal fixes]",
- "JosiahWI [CMake, cleanups and fixes]",
- "HybridDog [builtin, documentation]",
- "Jude Melton-Houghton [Database implementation]",
- "savilli [Fixes]",
+ "Wuzzy [Features, translations, devtest]",
+ "Lars Müller [Lua optimizations and fixes]",
+ "Jude Melton-Houghton [Optimizations, bugfixes]",
+ "paradust7 [Performance, fixes, Irrlicht refactoring]",
+ "Desour [Fixes]",
+ "ROllerozxa [Main menu]",
+ "savilli [Bugfixes]",
+ "Lexi Hale [Particlespawner animation]",
"Liso [Shadow Mapping]",
- "MoNTE48 [Build fix]",
- "Jean-Patrick Guerrero (kilbith) [Fixes]",
- "ROllerozxa [Code cleanups]",
- "Lejo [bitop library integration]",
- "LoneWolfHT [Build fixes]",
+ "JosiahWI [Fixes, build system]",
+ "numzero [Graphics and rendering]",
+ "HybridDog [Fixes]",
"NeroBurner [Joystick]",
- "Elias Fleckenstein [Internal fixes]",
- "David CARLIER [Unix & Haiku build fixes]",
"pecksin [Clickable web links]",
- "srfqi [Android & rendering fixes]",
- "EvidenceB [Formspec]",
+ "Daroc Alden [Fixes]",
+ "Jean-Patrick Guerrero (kilbith) [Fixes]",
}
local previous_core_developers = {
@@ -71,33 +69,50 @@ local previous_core_developers = {
"Ryan Kwolek (kwolekr) <kwolekr@minetest.net>",
"sapier",
"Zeno",
- "ShadowNinja <shadowninja@minetest.net>",
"Auke Kok (sofar) <sofar@foo-projects.org>",
"Aaron Suen <warr1024@gmail.com>",
+ "paramat",
+ "Pierre-Yves Rollo <dev@pyrollo.com>",
}
local previous_contributors = {
- "Nils Dagsson Moskopp (erlehmann) <nils@dieweltistgarnichtso.net> [Minetest Logo]",
+ "Nils Dagsson Moskopp (erlehmann) <nils@dieweltistgarnichtso.net> [Minetest logo]",
"red-001 <red-001@outlook.ie>",
"Giuseppe Bilotta",
+ "ClobberXD",
"Dániel Juhász (juhdanad) <juhdanad@gmail.com>",
"MirceaKitsune <mirceakitsune@gmail.com>",
+ "MoNTE48",
"Constantin Wenger (SpeedProg)",
"Ciaran Gultnieks (CiaranG)",
"Paul Ouellette (pauloue)",
"stujones11",
+ "srifqi",
"Rogier <rogier777@gmail.com>",
"Gregory Currie (gregorycu)",
"JacobF",
- "Jeija <jeija@mesecons.net> [HTTP, particles]",
+ "Jeija <jeija@mesecons.net>",
}
-local function buildCreditList(source)
+local function prepare_credits(dest, source)
+ for _, s in ipairs(source) do
+ -- if there's text inside brackets make it gray-ish
+ s = s:gsub("%[.-%]", core.colorize("#aaa", "%1"))
+ dest[#dest+1] = s
+ end
+end
+
+local function build_hacky_list(items, spacing)
+ spacing = spacing or 0.5
+ local y = spacing / 2
local ret = {}
- for i = 1, #source do
- ret[i] = core.formspec_escape(source[i])
+ for _, item in ipairs(items) do
+ if item ~= "" then
+ ret[#ret+1] = ("label[0,%f;%s]"):format(y, core.formspec_escape(item))
+ end
+ y = y + spacing
end
- return table.concat(ret, ",,")
+ return table.concat(ret, ""), y
end
return {
@@ -106,42 +121,73 @@ return {
cbf_formspec = function(tabview, name, tabdata)
local logofile = defaulttexturedir .. "logo.png"
local version = core.get_version()
- local fs = "image[0.75,0.5;2.2,2.2;" .. core.formspec_escape(logofile) .. "]" ..
+
+ local credit_list = {}
+ table.insert_all(credit_list, {
+ core.colorize("#ff0", fgettext("Core Developers"))
+ })
+ prepare_credits(credit_list, core_developers)
+ table.insert_all(credit_list, {
+ "",
+ core.colorize("#ff0", fgettext("Core Team"))
+ })
+ prepare_credits(credit_list, core_team)
+ table.insert_all(credit_list, {
+ "",
+ core.colorize("#ff0", fgettext("Active Contributors"))
+ })
+ prepare_credits(credit_list, active_contributors)
+ table.insert_all(credit_list, {
+ "",
+ core.colorize("#ff0", fgettext("Previous Core Developers"))
+ })
+ prepare_credits(credit_list, previous_core_developers)
+ table.insert_all(credit_list, {
+ "",
+ core.colorize("#ff0", fgettext("Previous Contributors"))
+ })
+ prepare_credits(credit_list, previous_contributors)
+ local credit_fs, scroll_height = build_hacky_list(credit_list)
+ -- account for the visible portion
+ scroll_height = math.max(0, scroll_height - 6.9)
+
+ local fs = "image[1.5,0.6;2.5,2.5;" .. core.formspec_escape(logofile) .. "]" ..
"style[label_button;border=false]" ..
- "button[0.5,2;2.5,2;label_button;" .. version.project .. " " .. version.string .. "]" ..
- "button[0.75,2.75;2,2;homepage;minetest.net]" ..
- "tablecolumns[color;text]" ..
- "tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
- "table[3.5,-0.25;8.5,6.05;list_credits;" ..
- "#FFFF00," .. fgettext("Core Developers") .. ",," ..
- buildCreditList(core_developers) .. ",,," ..
- "#FFFF00," .. fgettext("Active Contributors") .. ",," ..
- buildCreditList(active_contributors) .. ",,," ..
- "#FFFF00," .. fgettext("Previous Core Developers") ..",," ..
- buildCreditList(previous_core_developers) .. ",,," ..
- "#FFFF00," .. fgettext("Previous Contributors") .. ",," ..
- buildCreditList(previous_contributors) .. "," ..
- ";1]"
+ "button[0.1,3.4;5.3,0.5;label_button;" ..
+ core.formspec_escape(version.project .. " " .. version.string) .. "]" ..
+ "button[1.5,4.1;2.5,0.8;homepage;minetest.net]" ..
+ "scroll_container[5.5,0.1;9.5,6.9;scroll_credits;vertical;" ..
+ tostring(scroll_height / 1000) .. "]" .. credit_fs ..
+ "scroll_container_end[]"..
+ "scrollbar[15,0.1;0.4,6.9;vertical;scroll_credits;0]"
-- Render information
- fs = fs .. "label[0.75,4.9;" ..
+ fs = fs .. "style[label_button2;border=false]" ..
+ "button[0.1,6;5.3,1;label_button2;" ..
fgettext("Active renderer:") .. "\n" ..
core.formspec_escape(core.get_screen_info().render_info) .. "]"
- if PLATFORM ~= "Android" then
+ if PLATFORM == "Android" then
+ fs = fs .. "button[0.5,5.1;4.5,0.8;share_debug;" .. fgettext("Share debug log") .. "]"
+ else
fs = fs .. "tooltip[userdata;" ..
fgettext("Opens the directory that contains user-provided worlds, games, mods,\n" ..
"and texture packs in a file manager / explorer.") .. "]"
- fs = fs .. "button[0,4;3.5,1;userdata;" .. fgettext("Open User Data Directory") .. "]"
+ fs = fs .. "button[0.5,5.1;4.5,0.8;userdata;" .. fgettext("Open User Data Directory") .. "]"
end
- return fs
+ return fs, "size[15.5,7.1,false]real_coordinates[true]"
end,
cbf_button_handler = function(this, fields, name, tabdata)
if fields.homepage then
core.open_url("https://www.minetest.net")
end
+ if fields.share_debug then
+ local path = core.get_user_path() .. DIR_DELIM .. "debug.txt"
+ core.share_file(path)
+ end
+
if fields.userdata then
core.open_dir(core.get_user_path())
end
diff --git a/builtin/mainmenu/tab_content.lua b/builtin/mainmenu/tab_content.lua
index fb7f121f8..5e14d1902 100644
--- a/builtin/mainmenu/tab_content.lua
+++ b/builtin/mainmenu/tab_content.lua
@@ -51,12 +51,14 @@ local function get_formspec(tabview, name, tabdata)
tabdata.selected_pkg = 1
end
+ local use_technical_names = core.settings:get_bool("show_technical_names")
+
local retval =
"label[0.05,-0.25;".. fgettext("Installed Packages:") .. "]" ..
"tablecolumns[color;tree;text]" ..
"table[0,0.25;5.1,4.3;pkglist;" ..
- pkgmgr.render_packagelist(packages) ..
+ pkgmgr.render_packagelist(packages, use_technical_names) ..
";" .. tabdata.selected_pkg .. "]" ..
"button[0,4.85;5.25,0.5;btn_contentdb;".. fgettext("Browse online content") .. "]"
@@ -87,9 +89,17 @@ local function get_formspec(tabview, name, tabdata)
desc = info.description
end
+ local title_and_name
+ if selected_pkg.type == "game" then
+ title_and_name = selected_pkg.name
+ else
+ title_and_name = (selected_pkg.title or selected_pkg.name) .. "\n" ..
+ core.colorize("#BFBFBF", selected_pkg.name)
+ end
+
retval = retval ..
"image[5.5,0;3,2;" .. core.formspec_escape(modscreenshot) .. "]" ..
- "label[8.25,0.6;" .. core.formspec_escape(selected_pkg.name) .. "]" ..
+ "label[8.25,0.6;" .. core.formspec_escape(title_and_name) .. "]" ..
"box[5.5,2.2;6.15,2.35;#000]"
if selected_pkg.type == "mod" then
@@ -154,6 +164,9 @@ local function handle_doubleclick(pkg)
core.settings:set("texture_path", pkg.path)
end
packages = nil
+
+ mm_game_theme.init()
+ mm_game_theme.reset()
end
end
@@ -197,17 +210,17 @@ local function handle_buttons(tabview, fields, tabname, tabdata)
return true
end
- if fields.btn_mod_mgr_use_txp then
- local txp = packages:get_list()[tabdata.selected_pkg]
- core.settings:set("texture_path", txp.path)
- packages = nil
- return true
- end
-
+ if fields.btn_mod_mgr_use_txp or fields.btn_mod_mgr_disable_txp then
+ local txp_path = ""
+ if fields.btn_mod_mgr_use_txp then
+ txp_path = packages:get_list()[tabdata.selected_pkg].path
+ end
- if fields.btn_mod_mgr_disable_txp then
- core.settings:set("texture_path", "")
+ core.settings:set("texture_path", txp_path)
packages = nil
+
+ mm_game_theme.init()
+ mm_game_theme.reset()
return true
end
diff --git a/builtin/mainmenu/tab_local.lua b/builtin/mainmenu/tab_local.lua
index e77c6f04d..f8de10db6 100644
--- a/builtin/mainmenu/tab_local.lua
+++ b/builtin/mainmenu/tab_local.lua
@@ -16,7 +16,6 @@
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-local enable_gamebar = PLATFORM ~= "Android"
local current_game, singleplayer_refresh_gamebar
local valid_disabled_settings = {
["enable_damage"]=true,
@@ -24,95 +23,88 @@ local valid_disabled_settings = {
["enable_server"]=true,
}
-if enable_gamebar then
- -- Currently chosen game in gamebar for theming and filtering
- function current_game()
- local last_game_id = core.settings:get("menu_last_game")
- local game = pkgmgr.find_by_gameid(last_game_id)
+-- Currently chosen game in gamebar for theming and filtering
+function current_game()
+ local last_game_id = core.settings:get("menu_last_game")
+ local game = pkgmgr.find_by_gameid(last_game_id)
- return game
- end
+ return game
+end
- -- Apply menu changes from given game
- function apply_game(game)
- core.set_topleft_text(game.name)
- core.settings:set("menu_last_game", game.id)
- menudata.worldlist:set_filtercriteria(game.id)
+-- Apply menu changes from given game
+function apply_game(game)
+ core.set_topleft_text(game.name)
+ core.settings:set("menu_last_game", game.id)
+ menudata.worldlist:set_filtercriteria(game.id)
- mm_game_theme.update("singleplayer", game) -- this refreshes the formspec
+ mm_game_theme.update("singleplayer", game) -- this refreshes the formspec
- local index = filterlist.get_current_index(menudata.worldlist,
- tonumber(core.settings:get("mainmenu_last_selected_world")))
- if not index or index < 1 then
- local selected = core.get_textlist_index("sp_worlds")
- if selected ~= nil and selected < #menudata.worldlist:get_list() then
- index = selected
- else
- index = #menudata.worldlist:get_list()
- end
+ local index = filterlist.get_current_index(menudata.worldlist,
+ tonumber(core.settings:get("mainmenu_last_selected_world")))
+ if not index or index < 1 then
+ local selected = core.get_textlist_index("sp_worlds")
+ if selected ~= nil and selected < #menudata.worldlist:get_list() then
+ index = selected
+ else
+ index = #menudata.worldlist:get_list()
end
- menu_worldmt_legacy(index)
end
+ menu_worldmt_legacy(index)
+end
- function singleplayer_refresh_gamebar()
+function singleplayer_refresh_gamebar()
- local old_bar = ui.find_by_name("game_button_bar")
- if old_bar ~= nil then
- old_bar:delete()
+ local old_bar = ui.find_by_name("game_button_bar")
+ if old_bar ~= nil then
+ old_bar:delete()
+ end
+
+ local function game_buttonbar_button_handler(fields)
+ if fields.game_open_cdb then
+ local maintab = ui.find_by_name("maintab")
+ local dlg = create_store_dlg("game")
+ dlg:set_parent(maintab)
+ maintab:hide()
+ dlg:show()
+ return true
end
- local function game_buttonbar_button_handler(fields)
- if fields.game_open_cdb then
- local maintab = ui.find_by_name("maintab")
- local dlg = create_store_dlg("game")
- dlg:set_parent(maintab)
- maintab:hide()
- dlg:show()
+ for _, game in ipairs(pkgmgr.games) do
+ if fields["game_btnbar_" .. game.id] then
+ apply_game(game)
return true
end
-
- for _, game in ipairs(pkgmgr.games) do
- if fields["game_btnbar_" .. game.id] then
- apply_game(game)
- return true
- end
- end
end
+ end
- local btnbar = buttonbar_create("game_button_bar",
- game_buttonbar_button_handler,
- {x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15})
+ local btnbar = buttonbar_create("game_button_bar",
+ game_buttonbar_button_handler,
+ {x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15})
- for _, game in ipairs(pkgmgr.games) do
- local btn_name = "game_btnbar_" .. game.id
+ for _, game in ipairs(pkgmgr.games) do
+ local btn_name = "game_btnbar_" .. game.id
- local image = nil
- local text = nil
- local tooltip = core.formspec_escape(game.name)
+ local image = nil
+ local text = nil
+ local tooltip = core.formspec_escape(game.title)
- if (game.menuicon_path or "") ~= "" then
- image = core.formspec_escape(game.menuicon_path)
- else
- local part1 = game.id:sub(1,5)
- local part2 = game.id:sub(6,10)
- local part3 = game.id:sub(11)
+ if (game.menuicon_path or "") ~= "" then
+ image = core.formspec_escape(game.menuicon_path)
+ else
+ local part1 = game.id:sub(1,5)
+ local part2 = game.id:sub(6,10)
+ local part3 = game.id:sub(11)
- text = part1 .. "\n" .. part2
- if part3 ~= "" then
- text = text .. "\n" .. part3
- end
+ text = part1 .. "\n" .. part2
+ if part3 ~= "" then
+ text = text .. "\n" .. part3
end
- btnbar:add_button(btn_name, text, image, tooltip)
end
-
- local plus_image = core.formspec_escape(defaulttexturedir .. "plus.png")
- btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB"))
- end
-else
- -- Currently chosen game in gamebar: no gamebar -> no "current" game
- function current_game()
- return nil
+ btnbar:add_button(btn_name, text, image, tooltip)
end
+
+ local plus_image = core.formspec_escape(defaulttexturedir .. "plus.png")
+ btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB"))
end
local function get_disabled_settings(game)
@@ -187,7 +179,7 @@ local function get_formspec(tabview, name, tabdata)
damage ..
host ..
"textlist[3.9,0.4;7.9,3.45;sp_worlds;" ..
- menu_render_worldlist(not enable_gamebar) ..
+ menu_render_worldlist() ..
";" .. index .. "]"
if core.settings:get_bool("enable_server") and disabled_settings["enable_server"] == nil then
@@ -324,7 +316,7 @@ local function main_button_handler(this, fields, name, tabdata)
end
if fields["world_create"] ~= nil then
- local create_world_dlg = create_create_world_dlg(enable_gamebar)
+ local create_world_dlg = create_create_world_dlg()
create_world_dlg:set_parent(this)
this:hide()
create_world_dlg:show()
@@ -371,26 +363,23 @@ local function main_button_handler(this, fields, name, tabdata)
end
end
-local on_change
-if enable_gamebar then
- function on_change(type, old_tab, new_tab)
- if (type == "ENTER") then
- local game = current_game()
- if game then
- apply_game(game)
- end
+local function on_change(type, old_tab, new_tab)
+ if (type == "ENTER") then
+ local game = current_game()
+ if game then
+ apply_game(game)
+ end
- singleplayer_refresh_gamebar()
- ui.find_by_name("game_button_bar"):show()
- else
- menudata.worldlist:set_filtercriteria(nil)
- local gamebar = ui.find_by_name("game_button_bar")
- if gamebar then
- gamebar:hide()
- end
- core.set_topleft_text("")
- mm_game_theme.update(new_tab,nil)
+ singleplayer_refresh_gamebar()
+ ui.find_by_name("game_button_bar"):show()
+ else
+ menudata.worldlist:set_filtercriteria(nil)
+ local gamebar = ui.find_by_name("game_button_bar")
+ if gamebar then
+ gamebar:hide()
end
+ core.set_topleft_text("")
+ mm_game_theme.update(new_tab,nil)
end
end
diff --git a/builtin/mainmenu/tab_online.lua b/builtin/mainmenu/tab_online.lua
index fb7409864..899f30bd1 100644
--- a/builtin/mainmenu/tab_online.lua
+++ b/builtin/mainmenu/tab_online.lua
@@ -87,27 +87,34 @@ local function get_formspec(tabview, name, tabdata)
"field[4.25,0.5;1.25,0.75;te_port;;" ..
core.formspec_escape(core.settings:get("remote_port")) .. "]" ..
- -- Name / Password
- "label[0.25,1.55;" .. fgettext("Name") .. "]" ..
- "label[3,1.55;" .. fgettext("Password") .. "]" ..
- "field[0.25,1.75;2.75,0.75;te_name;;" ..
- core.formspec_escape(core.settings:get("name")) .. "]" ..
- "pwdfield[3,1.75;2.5,0.75;te_pwd;]" ..
-
-- Description Background
- "label[0.25,2.75;" .. fgettext("Server Description") .. "]" ..
- "box[0.25,3;5.25,2.75;#999999]"..
+ "label[0.25,1.6;" .. fgettext("Server Description") .. "]" ..
+ "box[0.25,1.85;5.25,2.7;#999999]"..
+
+ -- Name / Password
+ "container[0,4.8]" ..
+ "label[0.25,0;" .. fgettext("Name") .. "]" ..
+ "label[3,0;" .. fgettext("Password") .. "]" ..
+ "field[0.25,0.2;2.625,0.75;te_name;;" .. core.formspec_escape(core.settings:get("name")) .. "]" ..
+ "pwdfield[2.875,0.2;2.625,0.75;te_pwd;]" ..
+ "container_end[]" ..
-- Connect
- "button[3,6;2.5,0.75;btn_mp_connect;" .. fgettext("Connect") .. "]"
+ "button[3,6;2.5,0.75;btn_mp_login;" .. fgettext("Login") .. "]"
+
+ if core.settings:get_bool("enable_split_login_register") then
+ retval = retval .. "button[0.25,6;2.5,0.75;btn_mp_register;" .. fgettext("Register") .. "]"
+ end
if tabdata.selected then
if gamedata.fav then
- retval = retval .. "button[0.25,6;2.5,0.75;btn_delete_favorite;" ..
- fgettext("Del. Favorite") .. "]"
+ retval = retval .. "tooltip[btn_delete_favorite;" .. fgettext("Remove favorite") .. "]"
+ retval = retval .. "style[btn_delete_favorite;padding=6]"
+ retval = retval .. "image_button[5,1.3;0.5,0.5;" .. core.formspec_escape(defaulttexturedir ..
+ "server_favorite_delete.png") .. ";btn_delete_favorite;]"
end
if gamedata.serverdescription then
- retval = retval .. "textarea[0.25,3;5.25,2.75;;;" ..
+ retval = retval .. "textarea[0.25,1.85;5.2,2.75;;;" ..
core.formspec_escape(gamedata.serverdescription) .. "]"
end
end
@@ -339,12 +346,15 @@ local function main_button_handler(tabview, fields, name, tabdata)
return true
end
- if (fields.btn_mp_connect or fields.key_enter)
+ if (fields.btn_mp_login or fields.key_enter)
and fields.te_address ~= "" and fields.te_port then
gamedata.playername = fields.te_name
gamedata.password = fields.te_pwd
gamedata.address = fields.te_address
gamedata.port = tonumber(fields.te_port)
+
+ local enable_split_login_register = core.settings:get_bool("enable_split_login_register")
+ gamedata.allow_login_or_register = enable_split_login_register and "login" or "any"
gamedata.selected_world = 0
local idx = core.get_table_index("servers")
@@ -381,6 +391,25 @@ local function main_button_handler(tabview, fields, name, tabdata)
return true
end
+ if fields.btn_mp_register and fields.te_address ~= "" and fields.te_port then
+ local idx = core.get_table_index("servers")
+ local server = idx and tabdata.lookup[idx]
+ if server and (server.address ~= fields.te_address or server.port ~= tonumber(fields.te_port)) then
+ server = nil
+ end
+
+ if server and not is_server_protocol_compat_or_error(
+ server.proto_min, server.proto_max) then
+ return true
+ end
+
+ local dlg = create_register_dialog(fields.te_address, tonumber(fields.te_port), server)
+ dlg:set_parent(tabview)
+ tabview:hide()
+ dlg:show()
+ return true
+ end
+
return false
end
diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua
index 700b7390f..21c77aa8e 100644
--- a/builtin/mainmenu/tab_settings.lua
+++ b/builtin/mainmenu/tab_settings.lua
@@ -50,7 +50,7 @@ local labels = {
fgettext("Low"),
fgettext("Medium"),
fgettext("High"),
- fgettext("Ultra High")
+ fgettext("Very High")
}
}
@@ -160,7 +160,7 @@ local function formspec(tabview, name, tabdata)
.. getSettingIndex.NodeHighlighting() .. "]" ..
"dropdown[0.25,3.6;3.5;dd_leaves_style;" .. dd_options.leaves[1] .. ";"
.. getSettingIndex.Leaves() .. "]" ..
- "box[4,0;3.75,4.5;#999999]" ..
+ "box[4,0;3.75,4.9;#999999]" ..
"label[4.25,0.1;" .. fgettext("Texturing:") .. "]" ..
"dropdown[4.25,0.55;3.5;dd_filters;" .. dd_options.filters[1] .. ";"
.. getSettingIndex.Filter() .. "]" ..
@@ -169,9 +169,6 @@ local function formspec(tabview, name, tabdata)
"label[4.25,2.15;" .. fgettext("Antialiasing:") .. "]" ..
"dropdown[4.25,2.6;3.5;dd_antialiasing;" .. dd_options.antialiasing[1] .. ";"
.. getSettingIndex.Antialiasing() .. "]" ..
- "label[4.25,3.45;" .. fgettext("Screen:") .. "]" ..
- "checkbox[4.25,3.6;cb_autosave_screensize;" .. fgettext("Autosave Screen Size") .. ";"
- .. dump(core.settings:get_bool("autosave_screensize")) .. "]" ..
"box[8,0;3.75,4.5;#999999]"
local video_driver = core.settings:get("video_driver")
@@ -203,10 +200,15 @@ local function formspec(tabview, name, tabdata)
if core.settings:get("touchscreen_threshold") ~= nil then
tab_string = tab_string ..
- "label[4.3,4.2;" .. fgettext("Touchthreshold: (px)") .. "]" ..
- "dropdown[4.25,4.65;3.5;dd_touchthreshold;0,10,20,30,40,50;" ..
+ "label[4.25,3.5;" .. fgettext("Touch threshold (px):") .. "]" ..
+ "dropdown[4.25,3.95;3.5;dd_touchthreshold;0,10,20,30,40,50;" ..
((tonumber(core.settings:get("touchscreen_threshold")) / 10) + 1) ..
- "]box[4.0,4.5;3.75,1.0;#999999]"
+ "]"
+ else
+ tab_string = tab_string ..
+ "label[4.25,3.65;" .. fgettext("Screen:") .. "]" ..
+ "checkbox[4.25,3.9;cb_autosave_screensize;" .. fgettext("Autosave Screen Size") .. ";"
+ .. dump(core.settings:get_bool("autosave_screensize")) .. "]"
end
if shaders_enabled then
@@ -219,9 +221,18 @@ local function formspec(tabview, name, tabdata)
.. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" ..
"checkbox[8.25,2;cb_waving_plants;" .. fgettext("Waving Plants") .. ";"
.. dump(core.settings:get_bool("enable_waving_plants")) .. "]"
- --"label[8.25,3.0;" .. fgettext("Dynamic shadows: ") .. "]" ..
- --"dropdown[8.25,3.5;3.5;dd_shadows;" .. dd_options.shadow_levels[1] .. ";"
- -- .. getSettingIndex.ShadowMapping() .. "]"
+
+ if video_driver == "opengl" then
+ tab_string = tab_string ..
+ "label[8.25,2.8;" .. fgettext("Dynamic shadows:") .. "]" ..
+ "label[8.25,3.2;" .. fgettext("(game support required)") .. "]" ..
+ "dropdown[8.25,3.7;3.5;dd_shadows;" .. dd_options.shadow_levels[1] .. ";"
+ .. getSettingIndex.ShadowMapping() .. "]"
+ else
+ tab_string = tab_string ..
+ "label[8.38,2.7;" .. core.colorize("#888888",
+ fgettext("Dynamic shadows")) .. "]"
+ end
else
tab_string = tab_string ..
"label[8.38,0.7;" .. core.colorize("#888888",
@@ -231,9 +242,9 @@ local function formspec(tabview, name, tabdata)
"label[8.38,1.7;" .. core.colorize("#888888",
fgettext("Waving Leaves")) .. "]" ..
"label[8.38,2.2;" .. core.colorize("#888888",
- fgettext("Waving Plants")) .. "]"
- --"label[8.38,2.7;" .. core.colorize("#888888",
- -- fgettext("Dynamic shadows")) .. "]"
+ fgettext("Waving Plants")) .. "]"..
+ "label[8.38,2.7;" .. core.colorize("#888888",
+ fgettext("Dynamic shadows")) .. "]"
end
return tab_string
@@ -364,11 +375,11 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
core.settings:set("enable_dynamic_shadows", "false")
else
local shadow_presets = {
- [2] = { 80, 512, "true", 0, "false" },
- [3] = { 120, 1024, "true", 1, "false" },
- [4] = { 350, 2048, "true", 1, "false" },
- [5] = { 350, 2048, "true", 2, "true" },
- [6] = { 450, 4096, "true", 2, "true" },
+ [2] = { 62, 512, "true", 0, "false" },
+ [3] = { 93, 1024, "true", 0, "false" },
+ [4] = { 140, 2048, "true", 1, "false" },
+ [5] = { 210, 4096, "true", 2, "true" },
+ [6] = { 300, 8192, "true", 2, "true" },
}
local s = shadow_presets[table.indexof(labels.shadow_levels, fields["dd_shadows"])]
if s then
diff --git a/builtin/mainmenu/tests/serverlistmgr_spec.lua b/builtin/mainmenu/tests/serverlistmgr_spec.lua
index a091959fb..ab7a6c60c 100644
--- a/builtin/mainmenu/tests/serverlistmgr_spec.lua
+++ b/builtin/mainmenu/tests/serverlistmgr_spec.lua
@@ -1,4 +1,5 @@
_G.core = {}
+_G.vector = {metatable = {}}
_G.unpack = table.unpack
_G.serverlistmgr = {}
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index 01bebe4cc..52b4b4d9d 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -63,26 +63,15 @@
# There shouldn't be too much settings per category; settings that shouldn't be
# modified by the "average user" should be in (sub-)categories called "Advanced".
+
[Controls]
+
+[*General]
+
# If enabled, you can place blocks at the position (feet + eye level) where you stand.
# This is helpful when working with nodeboxes in small areas.
enable_build_where_you_stand (Build inside player) bool false
-# Player is able to fly without being affected by gravity.
-# This requires the "fly" privilege on the server.
-free_move (Flying) bool false
-
-# If enabled, makes move directions relative to the player's pitch when flying or swimming.
-pitch_move (Pitch move mode) bool false
-
-# Fast movement (via the "Aux1" key).
-# This requires the "fast" privilege on the server.
-fast_move (Fast movement) bool false
-
-# If enabled together with fly mode, player is able to fly through solid nodes.
-# This requires the "noclip" privilege on the server.
-noclip (Noclip) bool false
-
# Smooths camera when looking around. Also called look or mouse smoothing.
# Useful for recording videos.
cinematic (Cinematic mode) bool false
@@ -93,12 +82,6 @@ camera_smoothing (Camera smoothing) float 0.0 0.0 0.99
# Smooths rotation of camera in cinematic mode. 0 to disable.
cinematic_camera_smoothing (Camera smoothing in cinematic mode) float 0.7 0.0 0.99
-# Invert vertical mouse movement.
-invert_mouse (Invert mouse) bool false
-
-# Mouse sensitivity multiplier.
-mouse_sensitivity (Mouse sensitivity) float 0.2
-
# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and
# descending.
aux1_descends (Aux1 key for climbing/descending) bool false
@@ -108,11 +91,11 @@ doubletap_jump (Double tap jump for fly) bool false
# If disabled, "Aux1" key is used to fly fast if both fly and fast mode are
# enabled.
-always_fly_fast (Always fly and fast) bool true
+always_fly_fast (Always fly fast) bool true
# The time in seconds it takes between repeated node placements when holding
# the place button.
-repeat_place_time (Place repetition interval) float 0.25 0.001
+repeat_place_time (Place repetition interval) float 0.25 0.25 2
# Automatically jump up single-node obstacles.
autojump (Automatic jumping) bool false
@@ -121,12 +104,15 @@ autojump (Automatic jumping) bool false
# Enable this when you dig or place too often by accident.
safe_dig_and_place (Safe digging and placing) bool false
-# Enable random user input (only used for testing).
-random_input (Random input) bool false
+[*Keyboard and Mouse]
-# Continuous forward movement, toggled by autoforward key.
-# Press the autoforward key again or the backwards movement to disable.
-continuous_forward (Continuous forward) bool false
+# Invert vertical mouse movement.
+invert_mouse (Invert mouse) bool false
+
+# Mouse sensitivity multiplier.
+mouse_sensitivity (Mouse sensitivity) float 0.2 0.001 10.0
+
+[*Touchscreen]
# The length in pixels it takes for touch screen interaction to start.
touchscreen_threshold (Touch screen threshold) int 20 0 100
@@ -139,345 +125,179 @@ fixed_virtual_joystick (Fixed virtual joystick) bool false
# If enabled, virtual joystick will also tap "Aux1" button when out of main circle.
virtual_joystick_triggers_aux1 (Virtual joystick triggers Aux1 button) bool false
-# Enable joysticks
-enable_joysticks (Enable joysticks) bool false
-
-# The identifier of the joystick to use
-joystick_id (Joystick ID) int 0
-
-# The type of joystick
-joystick_type (Joystick type) enum auto auto,generic,xbox,dragonrise_gamecube
-
-# The time in seconds it takes between repeated events
-# when holding down a joystick button combination.
-repeat_joystick_button_time (Joystick button repetition interval) float 0.17 0.001
-
-# The dead zone of the joystick
-joystick_deadzone (Joystick dead zone) int 2048
-
-# The sensitivity of the joystick axes for moving the
-# in-game view frustum around.
-joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170
-
-# Key for moving the player forward.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_forward (Forward key) key KEY_KEY_W
-
-# Key for moving the player backward.
-# Will also disable autoforward, when active.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_backward (Backward key) key KEY_KEY_S
-
-# Key for moving the player left.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_left (Left key) key KEY_KEY_A
-
-# Key for moving the player right.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_right (Right key) key KEY_KEY_D
-
-# Key for jumping.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_jump (Jump key) key KEY_SPACE
-
-# Key for sneaking.
-# Also used for climbing down and descending in water if aux1_descends is disabled.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_sneak (Sneak key) key KEY_LSHIFT
-
-# Key for digging.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_dig (Dig key) key KEY_LBUTTON
-
-# Key for placing.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_place (Place key) key KEY_RBUTTON
-
-# Key for opening the inventory.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_inventory (Inventory key) key KEY_KEY_I
-
-# Key for moving fast in fast mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_aux1 (Aux1 key) key KEY_KEY_E
-
-# Key for opening the chat window.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_chat (Chat key) key KEY_KEY_T
-
-# Key for opening the chat window to type commands.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_cmd (Command key) key /
-
-# Key for opening the chat window to type local commands.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_cmd_local (Command key) key .
-
-# Key for toggling unlimited view range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_rangeselect (Range select key) key KEY_KEY_R
-
-# Key for toggling flying.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_freemove (Fly key) key KEY_KEY_K
-
-# Key for toggling pitch move mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_pitchmove (Pitch move key) key KEY_KEY_P
-
-# Key for toggling fast mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_fastmove (Fast key) key KEY_KEY_J
-
-# Key for toggling noclip mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_noclip (Noclip key) key KEY_KEY_H
-
-# Key for selecting the next item in the hotbar.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_hotbar_next (Hotbar next key) key KEY_KEY_N
-
-# Key for selecting the previous item in the hotbar.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_hotbar_previous (Hotbar previous key) key KEY_KEY_B
-
-# Key for muting the game.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_mute (Mute key) key KEY_KEY_M
-
-# Key for increasing the volume.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_increase_volume (Inc. volume key) key
-# Key for decreasing the volume.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_decrease_volume (Dec. volume key) key
+[Graphics and Audio]
-# Key for toggling autoforward.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_autoforward (Automatic forward key) key
+[*Graphics]
-# Key for toggling cinematic mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_cinematic (Cinematic mode key) key
+[**Screen]
-# Key for toggling display of minimap.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_minimap (Minimap key) key KEY_KEY_V
-
-# Key for taking screenshots.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_screenshot (Screenshot) key KEY_F12
-
-# Key for dropping the currently selected item.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_drop (Drop item key) key KEY_KEY_Q
-
-# Key to use view zoom when possible.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_zoom (View zoom key) key KEY_KEY_Z
-
-# Key for selecting the first hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot1 (Hotbar slot 1 key) key KEY_KEY_1
-
-# Key for selecting the second hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot2 (Hotbar slot 2 key) key KEY_KEY_2
-
-# Key for selecting the third hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot3 (Hotbar slot 3 key) key KEY_KEY_3
-
-# Key for selecting the fourth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot4 (Hotbar slot 4 key) key KEY_KEY_4
-
-# Key for selecting the fifth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot5 (Hotbar slot 5 key) key KEY_KEY_5
-
-# Key for selecting the sixth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot6 (Hotbar slot 6 key) key KEY_KEY_6
+# Width component of the initial window size. Ignored in fullscreen mode.
+screen_w (Screen width) int 1024 1 65535
-# Key for selecting the seventh hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot7 (Hotbar slot 7 key) key KEY_KEY_7
+# Height component of the initial window size. Ignored in fullscreen mode.
+screen_h (Screen height) int 600 1 65535
-# Key for selecting the eighth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot8 (Hotbar slot 8 key) key KEY_KEY_8
+# Save window size automatically when modified.
+autosave_screensize (Autosave screen size) bool true
-# Key for selecting the ninth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot9 (Hotbar slot 9 key) key KEY_KEY_9
+# Fullscreen mode.
+fullscreen (Full screen) bool false
-# Key for selecting the tenth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot10 (Hotbar slot 10 key) key KEY_KEY_0
+# Open the pause menu when the window's focus is lost. Does not pause if a formspec is
+# open.
+pause_on_lost_focus (Pause on lost window focus) bool false
-# Key for selecting the 11th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot11 (Hotbar slot 11 key) key
+[**FPS]
-# Key for selecting the 12th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot12 (Hotbar slot 12 key) key
+# If FPS would go higher than this, limit it by sleeping
+# to not waste CPU power for no benefit.
+fps_max (Maximum FPS) int 60 1 4294967295
-# Key for selecting the 13th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot13 (Hotbar slot 13 key) key
+# Vertical screen synchronization.
+vsync (VSync) bool false
-# Key for selecting the 14th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot14 (Hotbar slot 14 key) key
+# Maximum FPS when the window is not focused, or when the game is paused.
+fps_max_unfocused (FPS when unfocused or paused) int 20 1 4294967295
-# Key for selecting the 15th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot15 (Hotbar slot 15 key) key
+# View distance in nodes.
+viewing_range (Viewing range) int 190 20 4000
-# Key for selecting the 16th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot16 (Hotbar slot 16 key) key
+# Undersampling is similar to using a lower screen resolution, but it applies
+# to the game world only, keeping the GUI intact.
+# It should give a significant performance boost at the cost of less detailed image.
+# Higher values result in a less detailed image.
+undersampling (Undersampling) int 1 1 8
-# Key for selecting the 17th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot17 (Hotbar slot 17 key) key
+[**Graphics Effects]
-# Key for selecting the 18th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot18 (Hotbar slot 18 key) key
+# Makes all liquids opaque
+opaque_water (Opaque liquids) bool false
-# Key for selecting the 19th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot19 (Hotbar slot 19 key) key
+# Leaves style:
+# - Fancy: all faces visible
+# - Simple: only outer faces, if defined special_tiles are used
+# - Opaque: disable transparency
+leaves_style (Leaves style) enum fancy fancy,simple,opaque
-# Key for selecting the 20th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot20 (Hotbar slot 20 key) key
+# Connects glass if supported by node.
+connected_glass (Connect glass) bool false
-# Key for selecting the 21st hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot21 (Hotbar slot 21 key) key
+# Enable smooth lighting with simple ambient occlusion.
+# Disable for speed or for different looks.
+smooth_lighting (Smooth lighting) bool true
-# Key for selecting the 22nd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot22 (Hotbar slot 22 key) key
+# Enables tradeoffs that reduce CPU load or increase rendering performance
+# at the expense of minor visual glitches that do not impact game playability.
+performance_tradeoffs (Tradeoffs for performance) bool false
-# Key for selecting the 23rd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot23 (Hotbar slot 23 key) key
+# Adds particles when digging a node.
+enable_particles (Digging particles) bool true
-# Key for selecting the 24th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot24 (Hotbar slot 24 key) key
+[**3d]
-# Key for selecting the 25th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot25 (Hotbar slot 25 key) key
+# 3D support.
+# Currently supported:
+# - none: no 3d output.
+# - anaglyph: cyan/magenta color 3d.
+# - interlaced: odd/even line based polarisation screen support.
+# - topbottom: split screen top/bottom.
+# - sidebyside: split screen side by side.
+# - crossview: Cross-eyed 3d
+# - pageflip: quadbuffer based 3d.
+# Note that the interlaced mode requires shaders to be enabled.
+3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,crossview,pageflip
-# Key for selecting the 26th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot26 (Hotbar slot 26 key) key
+# Strength of 3D mode parallax.
+3d_paralax_strength (3D mode parallax strength) float 0.025 -0.087 0.087
-# Key for selecting the 27th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot27 (Hotbar slot 27 key) key
+[**Bobbing]
-# Key for selecting the 28th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot28 (Hotbar slot 28 key) key
+# Arm inertia, gives a more realistic movement of
+# the arm when the camera moves.
+arm_inertia (Arm inertia) bool true
-# Key for selecting the 29th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot29 (Hotbar slot 29 key) key
+# Enable view bobbing and amount of view bobbing.
+# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
+view_bobbing_amount (View bobbing factor) float 1.0 0.0 7.9
-# Key for selecting the 30th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot30 (Hotbar slot 30 key) key
+# Multiplier for fall bobbing.
+# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
+fall_bobbing_amount (Fall bobbing factor) float 0.03 0.0 100.0
-# Key for selecting the 31st hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot31 (Hotbar slot 31 key) key
+[**Camera]
-# Key for selecting the 32nd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_slot32 (Hotbar slot 32 key) key
+# Camera 'near clipping plane' distance in nodes, between 0 and 0.25
+# Only works on GLES platforms. Most users will not need to change this.
+# Increasing can reduce artifacting on weaker GPUs.
+# 0.1 = Default, 0.25 = Good value for weaker tablets.
+near_plane (Near plane) float 0.1 0 0.25
-# Key for toggling the display of the HUD.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_hud (HUD toggle key) key KEY_F1
+# Field of view in degrees.
+fov (Field of view) int 72 45 160
-# Key for toggling the display of chat.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_chat (Chat toggle key) key KEY_F2
+# Alters the light curve by applying 'gamma correction' to it.
+# Higher values make middle and lower light levels brighter.
+# Value '1.0' leaves the light curve unaltered.
+# This only has significant effect on daylight and artificial
+# light, it has very little effect on natural night light.
+display_gamma (Light curve gamma) float 1.0 0.33 3.0
-# Key for toggling the display of the large chat console.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_console (Large chat console key) key KEY_F10
+# The strength (darkness) of node ambient-occlusion shading.
+# Lower is darker, Higher is lighter. The valid range of values for this
+# setting is 0.25 to 4.0 inclusive. If the value is out of range it will be
+# set to the nearest valid value.
+ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0
-# Key for toggling the display of fog.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_force_fog_off (Fog toggle key) key KEY_F3
+[**Screenshots]
-# Key for toggling the camera update. Only used for development
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_update_camera (Camera update toggle key) key
+# Path to save screenshots at. Can be an absolute or relative path.
+# The folder will be created if it doesn't already exist.
+screenshot_path (Screenshot folder) path screenshots
-# Key for toggling the display of debug info.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_debug (Debug info toggle key) key KEY_F5
+# Format of screenshots.
+screenshot_format (Screenshot format) enum png png,jpg
-# Key for toggling the display of the profiler. Used for development.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_toggle_profiler (Profiler toggle key) key KEY_F6
+# Screenshot quality. Only used for JPEG format.
+# 1 means worst quality; 100 means best quality.
+# Use 0 for default quality.
+screenshot_quality (Screenshot quality) int 0 0 100
-# Key for switching between first- and third-person camera.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_camera_mode (Toggle camera mode key) key KEY_KEY_C
+[**Node and Entity Highlighting]
-# Key for increasing the viewing range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_increase_viewing_range_min (View range increase key) key +
+# Method used to highlight selected object.
+node_highlighting (Node highlighting) enum box box,halo,none
-# Key for decreasing the viewing range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_decrease_viewing_range_min (View range decrease key) key -
+# Show entity selection boxes
+# A restart is required after changing this.
+show_entity_selectionbox (Show entity selection boxes) bool false
-[Graphics]
+# Selection box border color (R,G,B).
+selectionbox_color (Selection box color) string (0,0,0)
-[*In-Game]
+# Width of the selection box lines around nodes.
+selectionbox_width (Selection box width) int 2 1 5
-[**Basic]
+# Crosshair color (R,G,B).
+# Also controls the object crosshair color
+crosshair_color (Crosshair color) string (255,255,255)
-# Whether name tag backgrounds should be shown by default.
-# Mods may still set a background.
-show_nametag_backgrounds (Show name tag backgrounds by default) bool true
+# Crosshair alpha (opaqueness, between 0 and 255).
+# This also applies to the object crosshair.
+crosshair_alpha (Crosshair alpha) int 255 0 255
-# Enable vertex buffer objects.
-# This should greatly improve graphics performance.
-enable_vbo (VBO) bool true
+[**Fog]
# Whether to fog out the end of the visible area.
enable_fog (Fog) bool true
-# Leaves style:
-# - Fancy: all faces visible
-# - Simple: only outer faces, if defined special_tiles are used
-# - Opaque: disable transparency
-leaves_style (Leaves style) enum fancy fancy,simple,opaque
-
-# Connects glass if supported by node.
-connected_glass (Connect glass) bool false
+# Make fog and sky colors depend on daytime (dawn/sunset) and view direction.
+directional_colored_fog (Colored fog) bool true
-# Enable smooth lighting with simple ambient occlusion.
-# Disable for speed or for different looks.
-smooth_lighting (Smooth lighting) bool true
+# Fraction of the visible distance at which fog starts to be rendered
+fog_start (Fog start) float 0.4 0.0 0.99
-# Enables tradeoffs that reduce CPU load or increase rendering performance
-# at the expense of minor visual glitches that do not impact game playability.
-performance_tradeoffs (Tradeoffs for performance) bool false
+[**Clouds]
# Clouds are a client side effect.
enable_clouds (Clouds) bool true
@@ -485,13 +305,7 @@ enable_clouds (Clouds) bool true
# Use 3D cloud look instead of flat.
enable_3d_clouds (3D clouds) bool true
-# Method used to highlight selected object.
-node_highlighting (Node highlighting) enum box box,halo,none
-
-# Adds particles when digging a node.
-enable_particles (Digging particles) bool true
-
-[**Filtering]
+[**Filtering and Antialiasing]
# Use mipmapping to scale textures. May slightly increase performance,
# especially when using a high resolution texture pack.
@@ -521,7 +335,7 @@ texture_clean_transparent (Clean transparent textures) bool false
# bilinear/trilinear/anisotropic filtering is enabled.
# This is also used as the base node texture size for world-aligned
# texture autoscaling.
-texture_min_size (Minimum texture size) int 64
+texture_min_size (Minimum texture size) int 64 1 32768
# Use multi-sample antialiasing (MSAA) to smooth out block edges.
# This algorithm smooths out the 3D viewport while keeping the image sharp,
@@ -532,23 +346,15 @@ texture_min_size (Minimum texture size) int 64
# A restart is required after changing this option.
fsaa (FSAA) enum 0 0,1,2,4,8,16
-# Undersampling is similar to using a lower screen resolution, but it applies
-# to the game world only, keeping the GUI intact.
-# It should give a significant performance boost at the cost of less detailed image.
-# Higher values result in a less detailed image.
-undersampling (Undersampling) int 1 1 8
-[**Shaders]
+[*Shaders]
# Shaders allow advanced visual effects and may increase performance on some video
# cards.
# This only works with the OpenGL video backend.
enable_shaders (Shaders) bool true
-# Path to shader directory. If no path is defined, default location will be used.
-shader_path (Shader path) path
-
-[***Tone Mapping]
+[**Tone Mapping]
# Enables Hable's 'Uncharted 2' filmic tone mapping.
# Simulates the tone curve of photographic film and how this approximates the
@@ -556,7 +362,15 @@ shader_path (Shader path) path
# enhanced, highlights and shadows are gradually compressed.
tone_mapping (Filmic tone mapping) bool false
-[***Waving Nodes]
+[**Waving Nodes]
+
+# Set to true to enable waving leaves.
+# Requires shaders to be enabled.
+enable_waving_leaves (Waving leaves) bool false
+
+# Set to true to enable waving plants.
+# Requires shaders to be enabled.
+enable_waving_plants (Waving plants) bool false
# Set to true to enable waving liquids (like water).
# Requires shaders to be enabled.
@@ -578,132 +392,88 @@ water_wave_length (Waving liquids wavelength) float 20.0 0.1
# Requires waving liquids to be enabled.
water_wave_speed (Waving liquids wave speed) float 5.0
-# Set to true to enable waving leaves.
-# Requires shaders to be enabled.
-enable_waving_leaves (Waving leaves) bool false
+[**Dynamic shadows]
-# Set to true to enable waving plants.
+# Set to true to enable Shadow Mapping.
# Requires shaders to be enabled.
-enable_waving_plants (Waving plants) bool false
+enable_dynamic_shadows (Dynamic shadows) bool false
-[**Advanced]
-
-# Arm inertia, gives a more realistic movement of
-# the arm when the camera moves.
-arm_inertia (Arm inertia) bool true
-
-# If FPS would go higher than this, limit it by sleeping
-# to not waste CPU power for no benefit.
-fps_max (Maximum FPS) int 60 1
-
-# Maximum FPS when the window is not focused, or when the game is paused.
-fps_max_unfocused (FPS when unfocused or paused) int 20 1
+# Set the shadow strength gamma.
+# Adjusts the intensity of in-game dynamic shadows.
+# Lower value means lighter shadows, higher value means darker shadows.
+shadow_strength_gamma (Shadow strength gamma) float 1.0 0.1 10.0
-# Open the pause menu when the window's focus is lost. Does not pause if a formspec is
-# open.
-pause_on_lost_focus (Pause on lost window focus) bool false
-
-# View distance in nodes.
-viewing_range (Viewing range) int 190 20 4000
-
-# Camera 'near clipping plane' distance in nodes, between 0 and 0.25
-# Only works on GLES platforms. Most users will not need to change this.
-# Increasing can reduce artifacting on weaker GPUs.
-# 0.1 = Default, 0.25 = Good value for weaker tablets.
-near_plane (Near plane) float 0.1 0 0.25
-
-# Width component of the initial window size. Ignored in fullscreen mode.
-screen_w (Screen width) int 1024 1
+# Maximum distance to render shadows.
+shadow_map_max_distance (Shadow map max distance in nodes to render shadows) float 120.0 10.0 1000.0
-# Height component of the initial window size. Ignored in fullscreen mode.
-screen_h (Screen height) int 600 1
+# Texture size to render the shadow map on.
+# This must be a power of two.
+# Bigger numbers create better shadows but it is also more expensive.
+shadow_map_texture_size (Shadow map texture size) int 1024 128 8192
-# Save window size automatically when modified.
-autosave_screensize (Autosave screen size) bool true
+# Sets shadow texture quality to 32 bits.
+# On false, 16 bits texture will be used.
+# This can cause much more artifacts in the shadow.
+shadow_map_texture_32bit (Shadow map texture in 32 bits) bool true
-# Fullscreen mode.
-fullscreen (Full screen) bool false
+# Enable Poisson disk filtering.
+# On true uses Poisson disk to make "soft shadows". Otherwise uses PCF filtering.
+shadow_poisson_filter (Poisson filtering) bool true
-# Vertical screen synchronization.
-vsync (VSync) bool false
+# Define shadow filtering quality.
+# This simulates the soft shadows effect by applying a PCF or Poisson disk
+# but also uses more resources.
+shadow_filters (Shadow filter quality) enum 1 0,1,2
-# Field of view in degrees.
-fov (Field of view) int 72 45 160
+# Enable colored shadows.
+# On true translucent nodes cast colored shadows. This is expensive.
+shadow_map_color (Colored shadows) bool false
-# Alters the light curve by applying 'gamma correction' to it.
-# Higher values make middle and lower light levels brighter.
-# Value '1.0' leaves the light curve unaltered.
-# This only has significant effect on daylight and artificial
-# light, it has very little effect on natural night light.
-display_gamma (Light curve gamma) float 1.0 0.33 3.0
+# Spread a complete update of shadow map over given amount of frames.
+# Higher values might make shadows laggy, lower values
+# will consume more resources.
+# Minimum value: 1; maximum value: 16
+shadow_update_frames (Map shadows update frames) int 8 1 16
-# Gradient of light curve at minimum light level.
-# Controls the contrast of the lowest light levels.
-lighting_alpha (Light curve low gradient) float 0.0 0.0 3.0
+# Set the soft shadow radius size.
+# Lower values mean sharper shadows, bigger values mean softer shadows.
+# Minimum value: 1.0; maximum value: 15.0
+shadow_soft_radius (Soft shadow radius) float 5.0 1.0 15.0
-# Gradient of light curve at maximum light level.
-# Controls the contrast of the highest light levels.
-lighting_beta (Light curve high gradient) float 1.5 0.0 3.0
+# Set the tilt of Sun/Moon orbit in degrees.
+# Value of 0 means no tilt / vertical orbit.
+# Minimum value: 0.0; maximum value: 60.0
+shadow_sky_body_orbit_tilt (Sky Body Orbit Tilt) float 0.0 0.0 60.0
-# Strength of light curve boost.
-# The 3 'boost' parameters define a range of the light
-# curve that is boosted in brightness.
-lighting_boost (Light curve boost) float 0.2 0.0 0.4
+[*Audio]
-# Center of light curve boost range.
-# Where 0.0 is minimum light level, 1.0 is maximum light level.
-lighting_boost_center (Light curve boost center) float 0.5 0.0 1.0
+# Volume of all sounds.
+# Requires the sound system to be enabled.
+sound_volume (Volume) float 0.7 0.0 1.0
-# Spread of light curve boost range.
-# Controls the width of the range to be boosted.
-# Standard deviation of the light curve boost Gaussian.
-lighting_boost_spread (Light curve boost spread) float 0.2 0.0 0.4
+# Whether to mute sounds. You can unmute sounds at any time, unless the
+# sound system is disabled (enable_sound=false).
+# In-game, you can toggle the mute state with the mute key or by using the
+# pause menu.
+mute_sound (Mute sound) bool false
-# Path to texture directory. All textures are first searched from here.
-texture_path (Texture path) path
+[*User Interfaces]
-# The rendering back-end.
+# Set the language. Leave empty to use the system language.
# A restart is required after changing this.
-# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
-# On other platforms, OpenGL is recommended.
-# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
-video_driver (Video driver) enum opengl opengl,ogles1,ogles2
-
-# Radius of cloud area stated in number of 64 node cloud squares.
-# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
-cloud_radius (Cloud radius) int 12
-
-# Enable view bobbing and amount of view bobbing.
-# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
-view_bobbing_amount (View bobbing factor) float 1.0
-
-# Multiplier for fall bobbing.
-# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
-fall_bobbing_amount (Fall bobbing factor) float 0.03
-
-# 3D support.
-# Currently supported:
-# - none: no 3d output.
-# - anaglyph: cyan/magenta color 3d.
-# - interlaced: odd/even line based polarisation screen support.
-# - topbottom: split screen top/bottom.
-# - sidebyside: split screen side by side.
-# - crossview: Cross-eyed 3d
-# - pageflip: quadbuffer based 3d.
-# Note that the interlaced mode requires shaders to be enabled.
-3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,crossview,pageflip
-
-# Strength of 3D mode parallax.
-3d_paralax_strength (3D mode parallax strength) float 0.025
+language (Language) enum ,be,bg,ca,cs,da,de,el,en,eo,es,et,eu,fi,fr,gd,gl,hu,id,it,ja,jbo,kk,ko,lt,lv,ms,nb,nl,nn,pl,pt,pt_BR,ro,ru,sk,sl,sr_Cyrl,sr_Latn,sv,sw,tr,uk,vi,zh_CN,zh_TW
-# In-game chat console height, between 0.1 (10%) and 1.0 (100%).
-console_height (Console height) float 0.6 0.1 1.0
+[**GUIs]
-# In-game chat console background color (R,G,B).
-console_color (Console color) string (0,0,0)
+# Scale GUI by a user specified value.
+# Use a nearest-neighbor-anti-alias filter to scale the GUI.
+# This will smooth over some of the rough edges, and blend
+# pixels when scaling down, at the cost of blurring some
+# edge pixels when images are scaled by non-integer sizes.
+gui_scaling (GUI scaling) float 1.0 0.5 20
-# In-game chat console background alpha (opaqueness, between 0 and 255).
-console_alpha (Console alpha) int 200 0 255
+# Enables animation of inventory items.
+inventory_items_animations (Inventory items animations) bool false
# Formspec full-screen background opacity (between 0 and 255).
formspec_fullscreen_bg_opacity (Formspec Full-Screen Background Opacity) int 140 0 255
@@ -711,112 +481,6 @@ formspec_fullscreen_bg_opacity (Formspec Full-Screen Background Opacity) int 140
# Formspec full-screen background color (R,G,B).
formspec_fullscreen_bg_color (Formspec Full-Screen Background Color) string (0,0,0)
-# Formspec default background opacity (between 0 and 255).
-formspec_default_bg_opacity (Formspec Default Background Opacity) int 140 0 255
-
-# Formspec default background color (R,G,B).
-formspec_default_bg_color (Formspec Default Background Color) string (0,0,0)
-
-# Selection box border color (R,G,B).
-selectionbox_color (Selection box color) string (0,0,0)
-
-# Width of the selection box lines around nodes.
-selectionbox_width (Selection box width) int 2 1 5
-
-# Crosshair color (R,G,B).
-# Also controls the object crosshair color
-crosshair_color (Crosshair color) string (255,255,255)
-
-# Crosshair alpha (opaqueness, between 0 and 255).
-# This also applies to the object crosshair.
-crosshair_alpha (Crosshair alpha) int 255 0 255
-
-# Maximum number of recent chat messages to show
-recent_chat_messages (Recent Chat Messages) int 6 2 20
-
-# Whether node texture animations should be desynchronized per mapblock.
-desynchronize_mapblock_texture_animation (Desynchronize block animation) bool true
-
-# Maximum proportion of current window to be used for hotbar.
-# Useful if there's something to be displayed right or left of hotbar.
-hud_hotbar_max_width (Maximum hotbar width) float 1.0
-
-# Modifies the size of the HUD elements.
-hud_scaling (HUD scale factor) float 1.0
-
-# Enables caching of facedir rotated meshes.
-enable_mesh_cache (Mesh cache) bool false
-
-# Delay between mesh updates on the client in ms. Increasing this will slow
-# down the rate of mesh updates, thus reducing jitter on slower clients.
-mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50
-
-# Size of the MapBlock cache of the mesh generator. Increasing this will
-# increase the cache hit %, reducing the data being copied from the main
-# thread, thus reducing jitter.
-meshgen_block_cache_size (Mapblock mesh generator's MapBlock cache size in MB) int 20 0 1000
-
-# Enables minimap.
-enable_minimap (Minimap) bool true
-
-# Shape of the minimap. Enabled = round, disabled = square.
-minimap_shape_round (Round minimap) bool true
-
-# True = 256
-# False = 128
-# Usable to make minimap smoother on slower machines.
-minimap_double_scan_height (Minimap scan height) bool true
-
-# Make fog and sky colors depend on daytime (dawn/sunset) and view direction.
-directional_colored_fog (Colored fog) bool true
-
-# The strength (darkness) of node ambient-occlusion shading.
-# Lower is darker, Higher is lighter. The valid range of values for this
-# setting is 0.25 to 4.0 inclusive. If the value is out of range it will be
-# set to the nearest valid value.
-ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0
-
-# Enables animation of inventory items.
-inventory_items_animations (Inventory items animations) bool false
-
-# Fraction of the visible distance at which fog starts to be rendered
-fog_start (Fog start) float 0.4 0.0 0.99
-
-# Makes all liquids opaque
-opaque_water (Opaque liquids) bool false
-
-# Textures on a node may be aligned either to the node or to the world.
-# The former mode suits better things like machines, furniture, etc., while
-# the latter makes stairs and microblocks fit surroundings better.
-# However, as this possibility is new, thus may not be used by older servers,
-# this option allows enforcing it for certain node types. Note though that
-# that is considered EXPERIMENTAL and may not work properly.
-world_aligned_mode (World-aligned textures mode) enum enable disable,enable,force_solid,force_nodebox
-
-# World-aligned textures may be scaled to span several nodes. However,
-# the server may not send the scale you want, especially if you use
-# a specially-designed texture pack; with this option, the client tries
-# to determine the scale automatically basing on the texture size.
-# See also texture_min_size.
-# Warning: This option is EXPERIMENTAL!
-autoscale_mode (Autoscaling mode) enum disable disable,enable,force
-
-# Show entity selection boxes
-# A restart is required after changing this.
-show_entity_selectionbox (Show entity selection boxes) bool false
-
-[*Menus]
-
-# Use a cloud animation for the main menu background.
-menu_clouds (Clouds in menu) bool true
-
-# Scale GUI by a user specified value.
-# Use a nearest-neighbor-anti-alias filter to scale the GUI.
-# This will smooth over some of the rough edges, and blend
-# pixels when scaling down, at the cost of blurring some
-# edge pixels when images are scaled by non-integer sizes.
-gui_scaling (GUI scaling) float 1.0 0.001
-
# When gui_scaling_filter is true, all GUI images need to be
# filtered in software, but some images are generated directly
# to hardware (e.g. render-to-texture for nodes in inventory).
@@ -829,170 +493,105 @@ gui_scaling_filter (GUI scaling filter) bool false
gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true
# Delay showing tooltips, stated in milliseconds.
-tooltip_show_delay (Tooltip delay) int 400
+tooltip_show_delay (Tooltip delay) int 400 0 18446744073709551615
# Append item name to tooltip.
tooltip_append_itemname (Append item name) bool false
-font_bold (Font bold by default) bool false
-
-font_italic (Font italic by default) bool false
+# Use a cloud animation for the main menu background.
+menu_clouds (Clouds in menu) bool true
-# Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn.
-font_shadow (Font shadow) int 1
+[**HUD]
-# Opaqueness (alpha) of the shadow behind the default font, between 0 and 255.
-font_shadow_alpha (Font shadow alpha) int 127 0 255
+# Modifies the size of the HUD elements.
+hud_scaling (HUD scaling) float 1.0 0.5 20
-# Font size of the default font where 1 unit = 1 pixel at 96 DPI
-font_size (Font size) int 16 1
+# Whether name tag backgrounds should be shown by default.
+# Mods may still set a background.
+show_nametag_backgrounds (Show name tag backgrounds by default) bool true
-# For pixel-style fonts that do not scale well, this ensures that font sizes used
-# with this font will always be divisible by this value, in pixels. For instance,
-# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
-# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
-font_size_divisible_by (Font size divisible by) int 1 1
+[**Chat]
-# Path to the default font. Must be a TrueType font.
-# The fallback font will be used if the font cannot be loaded.
-font_path (Regular font path) filepath fonts/Arimo-Regular.ttf
+# Maximum number of recent chat messages to show
+recent_chat_messages (Recent Chat Messages) int 6 2 20
-font_path_bold (Bold font path) filepath fonts/Arimo-Bold.ttf
-font_path_italic (Italic font path) filepath fonts/Arimo-Italic.ttf
-font_path_bold_italic (Bold and italic font path) filepath fonts/Arimo-BoldItalic.ttf
+# In-game chat console height, between 0.1 (10%) and 1.0 (100%).
+console_height (Console height) float 0.6 0.1 1.0
-# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
-mono_font_size (Monospace font size) int 16 1
+# In-game chat console background color (R,G,B).
+console_color (Console color) string (0,0,0)
-# For pixel-style fonts that do not scale well, this ensures that font sizes used
-# with this font will always be divisible by this value, in pixels. For instance,
-# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
-# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
-mono_font_size_divisible_by (Monospace font size divisible by) int 1 1
+# In-game chat console background alpha (opaqueness, between 0 and 255).
+console_alpha (Console alpha) int 200 0 255
-# Path to the monospace font. Must be a TrueType font.
-# This font is used for e.g. the console and profiler screen.
-mono_font_path (Monospace font path) filepath fonts/Cousine-Regular.ttf
+# Maximum proportion of current window to be used for hotbar.
+# Useful if there's something to be displayed right or left of hotbar.
+hud_hotbar_max_width (Maximum hotbar width) float 1.0 0.001 1.0
-mono_font_path_bold (Bold monospace font path) filepath fonts/Cousine-Bold.ttf
-mono_font_path_italic (Italic monospace font path) filepath fonts/Cousine-Italic.ttf
-mono_font_path_bold_italic (Bold and italic monospace font path) filepath fonts/Cousine-BoldItalic.ttf
+# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
+clickable_chat_weblinks (Chat weblinks) bool true
-# Path of the fallback font. Must be a TrueType font.
-# This font will be used for certain languages or if the default font is unavailable.
-fallback_font_path (Fallback font path) filepath fonts/DroidSansFallbackFull.ttf
+# Optional override for chat weblink color.
+chat_weblink_color (Weblink color) string
# Font size of the recent chat text and chat prompt in point (pt).
# Value 0 will use the default font size.
-chat_font_size (Chat font size) int 0
-
-# Path to save screenshots at. Can be an absolute or relative path.
-# The folder will be created if it doesn't already exist.
-screenshot_path (Screenshot folder) path screenshots
-
-# Format of screenshots.
-screenshot_format (Screenshot format) enum png png,jpg
-
-# Screenshot quality. Only used for JPEG format.
-# 1 means worst quality; 100 means best quality.
-# Use 0 for default quality.
-screenshot_quality (Screenshot quality) int 0 0 100
-
-[*Advanced]
+chat_font_size (Chat font size) int 0 0 72
-# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens.
-screen_dpi (DPI) int 72 1
-# Adjust the detected display density, used for scaling UI elements.
-display_density_factor (Display Density Scaling Factor) float 1
+[**Content Repository]
-# Windows systems only: Start Minetest with the command line window in the background.
-# Contains the same information as the file debug.txt (default name).
-enable_console (Enable console window) bool false
-
-[Sound]
-
-# Enables the sound system.
-# If disabled, this completely disables all sounds everywhere and the in-game
-# sound controls will be non-functional.
-# Changing this setting requires a restart.
-enable_sound (Sound) bool true
-
-# Volume of all sounds.
-# Requires the sound system to be enabled.
-sound_volume (Volume) float 0.7 0.0 1.0
-
-# Whether to mute sounds. You can unmute sounds at any time, unless the
-# sound system is disabled (enable_sound=false).
-# In-game, you can toggle the mute state with the mute key or by using the
-# pause menu.
-mute_sound (Mute sound) bool false
-
-[Client]
+# The URL for the content repository
+contentdb_url (ContentDB URL) string https://content.minetest.net
-# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
-clickable_chat_weblinks (Chat weblinks) bool false
+# 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.
+# You can also specify content ratings.
+# These flags are independent from Minetest versions,
+# so see a full list at https://content.minetest.net/help/content_flags/
+contentdb_flag_blacklist (ContentDB Flag Blacklist) string nonfree, desktop_default
-# Optional override for chat weblink color.
-chat_weblink_color (Weblink color) string
+# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.
+# This should be lower than curl_parallel_limit.
+contentdb_max_concurrent_downloads (ContentDB Max Concurrent Downloads) int 3 1
-[*Network]
-# Address to connect to.
-# Leave this blank to start a local server.
-# Note that the address field in the main menu overrides this setting.
-address (Server address) string
+[Client and Server]
-# Port to connect to (UDP).
-# Note that the port field in the main menu overrides this setting.
-remote_port (Remote port) int 30000 1 65535
-
-# Prometheus listener address.
-# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
-# enable metrics listener for Prometheus on that address.
-# Metrics can be fetched on http://127.0.0.1:30000/metrics
-prometheus_listener_address (Prometheus listener address) string 127.0.0.1:30000
+[*Client]
# Save the map received by the client on disk.
enable_local_map_saving (Saving map received from server) bool false
-# Enable usage of remote media server (if provided by server).
-# Remote servers offer a significantly faster way to download media (e.g. textures)
-# when connecting to the server.
-enable_remote_media_server (Connect to external media server) bool true
-
-# Enable Lua modding support on client.
-# This support is experimental and API can change.
-enable_client_modding (Client modding) bool false
-
# URL to the server list displayed in the Multiplayer Tab.
serverlist_url (Serverlist URL) string servers.minetest.net
-# File in client/serverlist/ that contains your favorite servers displayed in the
-# Multiplayer Tab.
-serverlist_file (Serverlist file) string favoriteservers.json
-
-# Maximum size of the out chat queue.
-# 0 to disable queueing and -1 to make the queue size unlimited.
-max_out_chat_queue_size (Maximum size of the out chat queue) int 20
+# If enabled, account registration is separate from login in the UI.
+# If disabled, new accounts will be registered automatically when logging in.
+enable_split_login_register (Enable split login/register) bool true
-# Enable register confirmation when connecting to server.
-# If disabled, new account will be registered automatically.
-enable_register_confirmation (Enable register confirmation) bool true
+# URL to JSON file which provides information about the newest Minetest release
+update_information_url (Update information URL) string https://www.minetest.net/release_info.json
-[*Advanced]
+# Unix timestamp (integer) of when the client last checked for an update
+# Set this value to "disabled" to never check for updates.
+update_last_checked (Last update check) string
-# Timeout for client to remove unused map data from memory.
-client_unload_unused_data_timeout (Mapblock unload timeout) int 600
+# Version number which was last seen during an update check.
+#
+# Representation: MMMIIIPPP, where M=Major, I=Minor, P=Patch
+# Ex: 5.5.0 is 005005000
+update_last_known (Last known version update) int 0
-# Maximum number of mapblocks for client to be kept in memory.
-# Set to -1 for unlimited amount.
-client_mapblock_limit (Mapblock limit) int 7500
+[*Server]
-# Whether to show the client debug info (has the same effect as hitting F5).
-show_debug (Show debug info) bool false
+# Name of the player.
+# When running a server, clients connecting with this name are admins.
+# When starting from the main menu, this is overridden.
+name (Admin name) string
-[Server / Singleplayer]
+[**Serverlist and MOTD]
# Name of the server, to be displayed when players join and in the serverlist.
server_name (Server name) string Minetest server
@@ -1012,15 +611,20 @@ server_announce (Announce server) bool false
# Announce to this serverlist.
serverlist_url (Serverlist URL) string servers.minetest.net
-# Remove color codes from incoming chat messages
-# Use this to stop players from being able to use color in their messages
-strip_color_codes (Strip color codes) bool false
+# Message of the day displayed to players connecting.
+motd (Message of the day) string
-[*Network]
+# Maximum number of players that can be connected simultaneously.
+max_users (Maximum users) int 15 0 65535
+
+# If this is set, players will always (re)spawn at the given position.
+static_spawnpoint (Static spawnpoint) string
+
+[**Networking]
# Network port to listen (UDP).
# This value will be overridden when starting from the main menu.
-port (Server port) int 30000
+port (Server port) int 30000 1 65535
# The network interface that the server listens on.
bind_address (Bind address) string
@@ -1041,65 +645,14 @@ remote_media (Remote media) string
# Needs enable_ipv6 to be enabled.
ipv6_server (IPv6 server) bool false
-[**Advanced]
-
-# Maximum number of blocks that are simultaneously sent per client.
-# The maximum total count is calculated dynamically:
-# max_total = ceil((#clients + max_users) * per_client / 4)
-max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 40
-
-# To reduce lag, block transfers are slowed down when a player is building something.
-# This determines how long they are slowed down after placing or removing a node.
-full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0
-
-# Maximum number of packets sent per send step, if you have a slow connection
-# try reducing it, but don't reduce it to a number below double of targeted
-# client number.
-max_packets_per_iteration (Max. packets per iteration) int 1024
-
-# Compression level to use when sending mapblocks to the client.
-# -1 - use default compression level
-# 0 - least compression, fastest
-# 9 - best compression, slowest
-map_compression_level_net (Map Compression Level for Network Transfer) int -1 -1 9
-
-[*Game]
-
-# Default game when creating a new world.
-# This will be overridden when creating a world from the main menu.
-default_game (Default game) string minetest
-
-# Message of the day displayed to players connecting.
-motd (Message of the day) string
-
-# Maximum number of players that can be connected simultaneously.
-max_users (Maximum users) int 15
-
-# World directory (everything in the world is stored here).
-# Not needed if starting from the main menu.
-map-dir (Map directory) path
-
-# Time in seconds for item entity (dropped items) to live.
-# Setting it to -1 disables the feature.
-item_entity_ttl (Item entity TTL) int 900
-
-# Specifies the default stack size of nodes, items and tools.
-# Note that mods or games may explicitly set a stack for certain (or all) items.
-default_stack_max (Default stack size) int 99
-
-# Enable players getting damage and dying.
-enable_damage (Damage) bool false
-
-# Enable creative mode for all players
-creative_mode (Creative) bool false
-
-# A chosen map seed for a new map, leave empty for random.
-# Will be overridden when creating a new world in the main menu.
-fixed_map_seed (Fixed map seed) string
+[*Server Security]
# New users need to input this password.
default_password (Default password) string
+# If enabled, players cannot join without a password or change theirs to an empty password.
+disallow_empty_password (Disallow empty passwords) bool false
+
# The privileges that new users automatically get.
# See /privs in game for a full list on your server and mod configuration.
default_privs (Default privileges) string interact, shout
@@ -1107,25 +660,6 @@ default_privs (Default privileges) string interact, shout
# Privileges that players with basic_privs can grant
basic_privs (Basic privileges) string interact, shout
-# Whether players are shown to clients without any range limit.
-# Deprecated, use the setting player_transfer_distance instead.
-unlimited_player_transfer_distance (Unlimited player transfer distance) bool true
-
-# Defines the maximal player transfer distance in blocks (0 = unlimited).
-player_transfer_distance (Player transfer distance) int 0
-
-# Whether to allow players to damage and kill each other.
-enable_pvp (Player versus player) bool true
-
-# Enable mod channels support.
-enable_mod_channels (Mod channels) bool false
-
-# If this is set, players will always (re)spawn at the given position.
-static_spawnpoint (Static spawnpoint) string
-
-# If enabled, players cannot join without a password or change theirs to an empty password.
-disallow_empty_password (Disallow empty passwords) bool false
-
# If enabled, disable cheat prevention in multiplayer.
disable_anticheat (Disable anticheat) bool false
@@ -1133,317 +667,108 @@ disable_anticheat (Disable anticheat) bool false
# This option is only read when server starts.
enable_rollback_recording (Rollback recording) bool false
-# Format of player chat messages. The following strings are valid placeholders:
-# @name, @message, @timestamp (optional)
-chat_message_format (Chat message format) string <@name> @message
-
-# If the execution of a chat command takes longer than this specified time in
-# seconds, add the time information to the chat command message
-chatcommand_msg_time_threshold (Chat command time message threshold) float 0.1
+[**Client-side Modding]
-# A message to be displayed to all clients when the server shuts down.
-kick_msg_shutdown (Shutdown message) string Server shutting down.
+# Restricts the access of certain client-side functions on servers.
+# Combine the byteflags below to restrict client-side features, or set to 0
+# for no restrictions:
+# LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)
+# CHAT_MESSAGES: 2 (disable send_chat_message call client-side)
+# READ_ITEMDEFS: 4 (disable get_item_def call client-side)
+# READ_NODEDEFS: 8 (disable get_node_def call client-side)
+# LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to
+# csm_restriction_noderange)
+# READ_PLAYERINFO: 32 (disable get_player_names call client-side)
+csm_restriction_flags (Client side modding restrictions) int 62 0 63
-# A message to be displayed to all clients when the server crashes.
-kick_msg_crash (Crash message) string This server has experienced an internal error. You will now be disconnected.
+# If the CSM restriction for node range is enabled, get_node calls are limited
+# to this distance from the player to the node.
+csm_restriction_noderange (Client side node lookup range restriction) int 0 0 4294967295
-# Whether to ask clients to reconnect after a (Lua) crash.
-# Set this to true if your server is set up to restart automatically.
-ask_reconnect_on_crash (Ask to reconnect after crash) bool false
+[**Chat]
-# From how far clients know about objects, stated in mapblocks (16 nodes).
-#
-# Setting this larger than active_block_range will also cause the server
-# to maintain active objects up to this distance in the direction the
-# player is looking. (This can avoid mobs suddenly disappearing from view)
-active_object_send_range_blocks (Active object send range) int 8
+# Remove color codes from incoming chat messages
+# Use this to stop players from being able to use color in their messages
+strip_color_codes (Strip color codes) bool false
-# The radius of the volume of blocks around every player that is subject to the
-# active block stuff, stated in mapblocks (16 nodes).
-# In active blocks objects are loaded and ABMs run.
-# This is also the minimum range in which active objects (mobs) are maintained.
-# This should be configured together with active_object_send_range_blocks.
-active_block_range (Active block range) int 4
+# Set the maximum length of a chat message (in characters) sent by clients.
+chat_message_max_size (Chat message max length) int 500 10 65535
-# From how far blocks are sent to clients, stated in mapblocks (16 nodes).
-max_block_send_distance (Max block send distance) int 12
+# Amount of messages a player may send per 10 seconds.
+chat_message_limit_per_10sec (Chat message count limit) float 10.0 1.0
-# Maximum number of forceloaded mapblocks.
-max_forceloaded_blocks (Maximum forceloaded blocks) int 16
+# Kick players who sent more than X messages per 10 seconds.
+chat_message_limit_trigger_kick (Chat message kick threshold) int 50 1 65535
-# Interval of sending time of day to clients.
-time_send_interval (Time send interval) int 5
+[*Server Gameplay]
# Controls length of day/night cycle.
# Examples:
# 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged.
-time_speed (Time speed) int 72
+time_speed (Time speed) int 72 0
# Time of day when a new world is started, in millihours (0-23999).
world_start_time (World start time) int 6125 0 23999
-# Interval of saving important changes in the world, stated in seconds.
-server_map_save_interval (Map save interval) float 5.3
-
-# Set the maximum character length of a chat message sent by clients.
-chat_message_max_size (Chat message max length) int 500
-
-# Amount of messages a player may send per 10 seconds.
-chat_message_limit_per_10sec (Chat message count limit) float 10.0
+# Time in seconds for item entity (dropped items) to live.
+# Setting it to -1 disables the feature.
+item_entity_ttl (Item entity TTL) int 900 -1
-# Kick players who sent more than X messages per 10 seconds.
-chat_message_limit_trigger_kick (Chat message kick threshold) int 50
+# Specifies the default stack size of nodes, items and tools.
+# Note that mods or games may explicitly set a stack for certain (or all) items.
+default_stack_max (Default stack size) int 99 1 65535
[**Physics]
# Horizontal and vertical acceleration on ground or when climbing,
# in nodes per second per second.
-movement_acceleration_default (Default acceleration) float 3
+movement_acceleration_default (Default acceleration) float 3.0 0.0
# Horizontal acceleration in air when jumping or falling,
# in nodes per second per second.
-movement_acceleration_air (Acceleration in air) float 2
+movement_acceleration_air (Acceleration in air) float 2.0 0.0
# Horizontal and vertical acceleration in fast mode,
# in nodes per second per second.
-movement_acceleration_fast (Fast mode acceleration) float 10
+movement_acceleration_fast (Fast mode acceleration) float 10.0 0.0
# Walking and flying speed, in nodes per second.
-movement_speed_walk (Walking speed) float 4
+movement_speed_walk (Walking speed) float 4.0 0.0
# Sneaking speed, in nodes per second.
-movement_speed_crouch (Sneaking speed) float 1.35
+movement_speed_crouch (Sneaking speed) float 1.35 0.0
# Walking, flying and climbing speed in fast mode, in nodes per second.
-movement_speed_fast (Fast mode speed) float 20
+movement_speed_fast (Fast mode speed) float 20.0 0.0
# Vertical climbing speed, in nodes per second.
-movement_speed_climb (Climbing speed) float 3
+movement_speed_climb (Climbing speed) float 3.0 0.0
# Initial vertical speed when jumping, in nodes per second.
-movement_speed_jump (Jumping speed) float 6.5
+movement_speed_jump (Jumping speed) float 6.5 0.0
+# How much you are slowed down when moving inside a liquid.
# Decrease this to increase liquid resistance to movement.
-movement_liquid_fluidity (Liquid fluidity) float 1
+movement_liquid_fluidity (Liquid fluidity) float 1.0 0.001
# Maximum liquid resistance. Controls deceleration when entering liquid at
# high speed.
movement_liquid_fluidity_smooth (Liquid fluidity smoothing) float 0.5
-# Controls sinking speed in liquid.
-movement_liquid_sink (Liquid sinking) float 10
+# Controls sinking speed in liquid when idling. Negative values will cause
+# you to rise instead.
+movement_liquid_sink (Liquid sinking) float 10.0
# Acceleration of gravity, in nodes per second per second.
movement_gravity (Gravity) float 9.81
-[**Advanced]
-
-# Handling for deprecated Lua API calls:
-# - none: Do not log deprecated calls
-# - log: mimic and log backtrace of deprecated call (default).
-# - error: abort on usage of deprecated call (suggested for mod developers).
-deprecated_lua_api_handling (Deprecated Lua API handling) enum log none,log,error
-
-# Number of extra blocks that can be loaded by /clearobjects at once.
-# This is a trade-off between SQLite transaction overhead and
-# memory consumption (4096=100MB, as a rule of thumb).
-max_clearobjects_extra_loaded_blocks (Max. clearobjects extra blocks) int 4096
-
-# How much the server will wait before unloading unused mapblocks.
-# Higher value is smoother, but will use more RAM.
-server_unload_unused_data_timeout (Unload unused server data) int 29
-
-# Maximum number of statically stored objects in a block.
-max_objects_per_block (Maximum objects per block) int 64
-
-# See https://www.sqlite.org/pragma.html#pragma_synchronous
-sqlite_synchronous (Synchronous SQLite) enum 2 0,1,2
-
-# Compression level to use when saving mapblocks to disk.
-# -1 - use default compression level
-# 0 - least compression, fastest
-# 9 - best compression, slowest
-map_compression_level_disk (Map Compression Level for Disk Storage) int -1 -1 9
-
-# Length of a server tick and the interval at which objects are generally updated over
-# network.
-dedicated_server_step (Dedicated server step) float 0.09
-
-# Length of time between active block management cycles
-active_block_mgmt_interval (Active block management interval) float 2.0
-
-# Length of time between Active Block Modifier (ABM) execution cycles
-abm_interval (ABM interval) float 1.0
-
-# The time budget allowed for ABMs to execute on each step
-# (as a fraction of the ABM Interval)
-abm_time_budget (ABM time budget) float 0.2 0.1 0.9
-
-# Length of time between NodeTimer execution cycles
-nodetimer_interval (NodeTimer interval) float 0.2
-
-# If enabled, invalid world data won't cause the server to shut down.
-# Only enable this if you know what you are doing.
-ignore_world_load_errors (Ignore world errors) bool false
-
-# Max liquids processed per step.
-liquid_loop_max (Liquid loop max) int 100000
-
-# The time (in seconds) that the liquids queue may grow beyond processing
-# capacity until an attempt is made to decrease its size by dumping old queue
-# items. A value of 0 disables the functionality.
-liquid_queue_purge_time (Liquid queue purge time) int 0
-
-# Liquid update interval in seconds.
-liquid_update (Liquid update tick) float 1.0
-
-# At this distance the server will aggressively optimize which blocks are sent to
-# clients.
-# Small values potentially improve performance a lot, at the expense of visible
-# rendering glitches (some blocks will not be rendered under water and in caves,
-# as well as sometimes on land).
-# Setting this to a value greater than max_block_send_distance disables this
-# optimization.
-# Stated in mapblocks (16 nodes).
-block_send_optimize_distance (Block send optimize distance) int 4 2
-
-# If enabled the server will perform map block occlusion culling based on
-# on the eye position of the player. This can reduce the number of blocks
-# sent to the client 50-80%. The client will not longer receive most invisible
-# so that the utility of noclip mode is reduced.
-server_side_occlusion_culling (Server side occlusion culling) bool true
-
-# Restricts the access of certain client-side functions on servers.
-# Combine the byteflags below to restrict client-side features, or set to 0
-# for no restrictions:
-# LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)
-# CHAT_MESSAGES: 2 (disable send_chat_message call client-side)
-# READ_ITEMDEFS: 4 (disable get_item_def call client-side)
-# READ_NODEDEFS: 8 (disable get_node_def call client-side)
-# LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to
-# csm_restriction_noderange)
-# READ_PLAYERINFO: 32 (disable get_player_names call client-side)
-csm_restriction_flags (Client side modding restrictions) int 62
-
-# If the CSM restriction for node range is enabled, get_node calls are limited
-# to this distance from the player to the node.
-csm_restriction_noderange (Client side node lookup range restriction) int 0
-
-[*Security]
-
-# Prevent mods from doing insecure things like running shell commands.
-secure.enable_security (Enable mod security) bool true
-
-# Comma-separated list of trusted mods that are allowed to access insecure
-# functions even when mod security is on (via request_insecure_environment()).
-secure.trusted_mods (Trusted mods) string
-
-# Comma-separated list of mods that are allowed to access HTTP APIs, which
-# allow them to upload and download data to/from the internet.
-secure.http_mods (HTTP mods) string
-
-[*Advanced]
-
-[**Profiling]
-# Load the game profiler to collect game profiling data.
-# Provides a /profiler command to access the compiled profile.
-# Useful for mod developers and server operators.
-profiler.load (Load the game profiler) bool false
-
-# The default format in which profiles are being saved,
-# when calling `/profiler save [format]` without format.
-profiler.default_report_format (Default report format) enum txt txt,csv,lua,json,json_pretty
-
-# The file path relative to your worldpath in which profiles will be saved to.
-profiler.report_path (Report path) string ""
-
-[***Instrumentation]
-
-# Instrument the methods of entities on registration.
-instrument.entity (Entity methods) bool true
-
-# Instrument the action function of Active Block Modifiers on registration.
-instrument.abm (Active Block Modifiers) bool true
-
-# Instrument the action function of Loading Block Modifiers on registration.
-instrument.lbm (Loading Block Modifiers) bool true
-
-# Instrument chat commands on registration.
-instrument.chatcommand (Chat commands) bool true
-
-# Instrument global callback functions on registration.
-# (anything you pass to a minetest.register_*() function)
-instrument.global_callback (Global callbacks) bool true
-
-[****Advanced]
-# Instrument builtin.
-# This is usually only needed by core/builtin contributors
-instrument.builtin (Builtin) bool false
-
-# Have the profiler instrument itself:
-# * Instrument an empty function.
-# This estimates the overhead, that instrumentation is adding (+1 function call).
-# * Instrument the sampler being used to update the statistics.
-instrument.profiler (Profiler) bool false
-
-[Client and Server]
-
-# Name of the player.
-# When running a server, clients connecting with this name are admins.
-# When starting from the main menu, this is overridden.
-name (Player name) string
-
-# Set the language. Leave empty to use the system language.
-# A restart is required after changing this.
-language (Language) enum ,be,bg,ca,cs,da,de,el,en,eo,es,et,eu,fi,fr,gd,gl,hu,id,it,ja,jbo,kk,ko,lt,lv,ms,nb,nl,nn,pl,pt,pt_BR,ro,ru,sk,sl,sr_Cyrl,sr_Latn,sv,sw,tr,uk,vi,zh_CN,zh_TW
-
-# Level of logging to be written to debug.txt:
-# - <nothing> (no logging)
-# - none (messages with no level)
-# - error
-# - warning
-# - action
-# - info
-# - verbose
-debug_log_level (Debug log level) enum action ,none,error,warning,action,info,verbose
-
-# If the file size of debug.txt exceeds the number of megabytes specified in
-# this setting when it is opened, the file is moved to debug.txt.1,
-# deleting an older debug.txt.1 if it exists.
-# debug.txt is only moved if this setting is positive.
-debug_log_size_max (Debug log file size threshold) int 50
-
-# Minimal level of logging to be written to chat.
-chat_log_level (Chat log level) enum error ,none,error,warning,action,info,verbose
-
-# Enable IPv6 support (for both client and server).
-# Required for IPv6 connections to work at all.
-enable_ipv6 (IPv6) bool true
-
-[*Advanced]
-
-# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
-curl_timeout (cURL interactive timeout) int 20000
-
-# Limits number of parallel HTTP requests. Affects:
-# - Media fetch if server uses remote_media setting.
-# - Serverlist download and server announcement.
-# - Downloads performed by main menu (e.g. mod manager).
-# Only has an effect if compiled with cURL.
-curl_parallel_limit (cURL parallel limit) int 8
-
-# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
-curl_file_download_timeout (cURL file download timeout) int 300000
-
-# Replaces the default main menu with a custom one.
-main_menu_script (Main menu script) string
-
-# Print the engine's profiling data in regular intervals (in seconds).
-# 0 = disable. Useful for developers.
-profiler_print_interval (Engine profiling data print interval) int 0
[Mapgen]
+# A chosen map seed for a new map, leave empty for random.
+# Will be overridden when creating a new world in the main menu.
+fixed_map_seed (Fixed map seed) string
+
# Name of map generator to be used when creating a new world.
# Creating a world in the main menu will override this.
# Current mapgens in a highly unstable state:
@@ -1451,10 +776,10 @@ profiler_print_interval (Engine profiling data print interval) int 0
mg_name (Mapgen name) enum v7 v7,valleys,carpathian,v5,flat,fractal,singlenode,v6
# Water surface level of the world.
-water_level (Water level) int 1
+water_level (Water level) int 1 -31000 31000
# From how far blocks are generated for clients, stated in mapblocks (16 nodes).
-max_block_generate_distance (Max block generate distance) int 10
+max_block_generate_distance (Max block generate distance) int 10 1 32767
# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).
# Only mapchunks completely within the mapgen limit are generated.
@@ -1466,7 +791,7 @@ mapgen_limit (Map generation limit) int 31007 0 31007
# and jungle grass, in all other mapgens this flag controls all decorations.
mg_flags (Mapgen flags) flags caves,dungeons,light,decorations,biomes,ores caves,dungeons,light,decorations,biomes,ores,nocaves,nodungeons,nolight,nodecorations,nobiomes,noores
-[*Biome API temperature and humidity noise parameters]
+[*Biome API noise parameters]
# Temperature variation for biomes.
mg_biome_np_heat (Heat noise) noise_params_2d 50, 50, (1000, 1000, 1000), 5349, 3, 0.5, 2.0, eased
@@ -1491,7 +816,7 @@ mgv5_spflags (Mapgen V5 specific flags) flags caverns caverns,nocaverns
mgv5_cave_width (Cave width) float 0.09
# Y of upper limit of large caves.
-mgv5_large_cave_depth (Large cave depth) int -256
+mgv5_large_cave_depth (Large cave depth) int -256 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgv5_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -1509,19 +834,19 @@ mgv5_large_cave_num_max (Large cave maximum number) int 2 0 64
mgv5_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Y-level of cavern upper limit.
-mgv5_cavern_limit (Cavern limit) int -256
+mgv5_cavern_limit (Cavern limit) int -256 -31000 31000
# Y-distance over which caverns expand to full size.
-mgv5_cavern_taper (Cavern taper) int 256
+mgv5_cavern_taper (Cavern taper) int 256 0 32767
# Defines full size of caverns, smaller values create larger caverns.
mgv5_cavern_threshold (Cavern threshold) float 0.7
# Lower Y limit of dungeons.
-mgv5_dungeon_ymin (Dungeon minimum Y) int -31000
+mgv5_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgv5_dungeon_ymax (Dungeon maximum Y) int 31000
+mgv5_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
[**Noises]
@@ -1566,10 +891,10 @@ mgv6_freq_desert (Desert noise threshold) float 0.45
mgv6_freq_beach (Beach noise threshold) float 0.15
# Lower Y limit of dungeons.
-mgv6_dungeon_ymin (Dungeon minimum Y) int -31000
+mgv6_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgv6_dungeon_ymax (Dungeon maximum Y) int 31000
+mgv6_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
[**Noises]
@@ -1615,19 +940,19 @@ mgv6_np_apple_trees (Apple trees noise) noise_params_2d 0, 1, (100, 100, 100), 3
mgv7_spflags (Mapgen V7 specific flags) flags mountains,ridges,nofloatlands,caverns mountains,ridges,floatlands,caverns,nomountains,noridges,nofloatlands,nocaverns
# Y of mountain density gradient zero level. Used to shift mountains vertically.
-mgv7_mount_zero_level (Mountain zero level) int 0
+mgv7_mount_zero_level (Mountain zero level) int 0 -31000 31000
# Lower Y limit of floatlands.
-mgv7_floatland_ymin (Floatland minimum Y) int 1024
+mgv7_floatland_ymin (Floatland minimum Y) int 1024 -31000 31000
# Upper Y limit of floatlands.
-mgv7_floatland_ymax (Floatland maximum Y) int 4096
+mgv7_floatland_ymax (Floatland maximum Y) int 4096 -31000 31000
# Y-distance over which floatlands taper from full density to nothing.
# Tapering starts at this distance from the Y limit.
# For a solid floatland layer, this controls the height of hills/mountains.
# Must be less than or equal to half the distance between the Y limits.
-mgv7_floatland_taper (Floatland tapering distance) int 256
+mgv7_floatland_taper (Floatland tapering distance) int 256 0 32767
# Exponent of the floatland tapering. Alters the tapering behaviour.
# Value = 1.0 creates a uniform, linear tapering.
@@ -1654,7 +979,7 @@ mgv7_floatland_density (Floatland density) float -0.6
# required value depending on 'mgv7_np_floatland'), to avoid
# server-intensive extreme water flow and to avoid vast flooding of the
# world surface below.
-mgv7_floatland_ywater (Floatland water level) int -31000
+mgv7_floatland_ywater (Floatland water level) int -31000 -31000 31000
# Controls width of tunnels, a smaller value creates wider tunnels.
# Value >= 10.0 completely disables generation of tunnels and avoids the
@@ -1662,7 +987,7 @@ mgv7_floatland_ywater (Floatland water level) int -31000
mgv7_cave_width (Cave width) float 0.09
# Y of upper limit of large caves.
-mgv7_large_cave_depth (Large cave depth) int -33
+mgv7_large_cave_depth (Large cave depth) int -33 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgv7_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -1680,19 +1005,19 @@ mgv7_large_cave_num_max (Large cave maximum number) int 2 0 64
mgv7_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Y-level of cavern upper limit.
-mgv7_cavern_limit (Cavern limit) int -256
+mgv7_cavern_limit (Cavern limit) int -256 -31000 31000
# Y-distance over which caverns expand to full size.
-mgv7_cavern_taper (Cavern taper) int 256
+mgv7_cavern_taper (Cavern taper) int 256 0 32767
# Defines full size of caverns, smaller values create larger caverns.
mgv7_cavern_threshold (Cavern threshold) float 0.7
# Lower Y limit of dungeons.
-mgv7_dungeon_ymin (Dungeon minimum Y) int -31000
+mgv7_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgv7_dungeon_ymax (Dungeon maximum Y) int 31000
+mgv7_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
[**Noises]
@@ -1766,7 +1091,7 @@ mgcarpathian_valley_width (River valley width) float 0.25
mgcarpathian_cave_width (Cave width) float 0.09
# Y of upper limit of large caves.
-mgcarpathian_large_cave_depth (Large cave depth) int -33
+mgcarpathian_large_cave_depth (Large cave depth) int -33 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgcarpathian_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -1784,19 +1109,19 @@ mgcarpathian_large_cave_num_max (Large cave maximum number) int 2 0 64
mgcarpathian_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Y-level of cavern upper limit.
-mgcarpathian_cavern_limit (Cavern limit) int -256
+mgcarpathian_cavern_limit (Cavern limit) int -256 -31000 31000
# Y-distance over which caverns expand to full size.
-mgcarpathian_cavern_taper (Cavern taper) int 256
+mgcarpathian_cavern_taper (Cavern taper) int 256 0 32767
# Defines full size of caverns, smaller values create larger caverns.
mgcarpathian_cavern_threshold (Cavern threshold) float 0.7
# Lower Y limit of dungeons.
-mgcarpathian_dungeon_ymin (Dungeon minimum Y) int -31000
+mgcarpathian_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgcarpathian_dungeon_ymax (Dungeon maximum Y) int 31000
+mgcarpathian_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
[**Noises]
@@ -1858,10 +1183,10 @@ mgcarpathian_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 50
mgflat_spflags (Mapgen Flat specific flags) flags nolakes,nohills,nocaverns lakes,hills,caverns,nolakes,nohills,nocaverns
# Y of flat ground.
-mgflat_ground_level (Ground level) int 8
+mgflat_ground_level (Ground level) int 8 -31000 31000
# Y of upper limit of large caves.
-mgflat_large_cave_depth (Large cave depth) int -33
+mgflat_large_cave_depth (Large cave depth) int -33 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgflat_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -1900,19 +1225,19 @@ mgflat_hill_threshold (Hill threshold) float 0.45
mgflat_hill_steepness (Hill steepness) float 64.0
# Y-level of cavern upper limit.
-mgflat_cavern_limit (Cavern limit) int -256
+mgflat_cavern_limit (Cavern limit) int -256 -31000 31000
# Y-distance over which caverns expand to full size.
-mgflat_cavern_taper (Cavern taper) int 256
+mgflat_cavern_taper (Cavern taper) int 256 0 32767
# Defines full size of caverns, smaller values create larger caverns.
mgflat_cavern_threshold (Cavern threshold) float 0.7
# Lower Y limit of dungeons.
-mgflat_dungeon_ymin (Dungeon minimum Y) int -31000
+mgflat_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgflat_dungeon_ymax (Dungeon maximum Y) int 31000
+mgflat_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
[**Noises]
@@ -1947,7 +1272,7 @@ mgfractal_spflags (Mapgen Fractal specific flags) flags terrain terrain,noterrai
mgfractal_cave_width (Cave width) float 0.09
# Y of upper limit of large caves.
-mgfractal_large_cave_depth (Large cave depth) int -33
+mgfractal_large_cave_depth (Large cave depth) int -33 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgfractal_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -1965,10 +1290,10 @@ mgfractal_large_cave_num_max (Large cave maximum number) int 2 0 64
mgfractal_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Lower Y limit of dungeons.
-mgfractal_dungeon_ymin (Dungeon minimum Y) int -31000
+mgfractal_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgfractal_dungeon_ymax (Dungeon maximum Y) int 31000
+mgfractal_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000
# Selects one of 18 fractal types.
# 1 = 4D "Roundy" Mandelbrot set.
@@ -1995,7 +1320,7 @@ mgfractal_fractal (Fractal type) int 1 1 18
# Increasing this increases the amount of fine detail, but also
# increases processing load.
# At iterations = 20 this mapgen has a similar load to mapgen V7.
-mgfractal_iterations (Iterations) int 11
+mgfractal_iterations (Iterations) int 11 1 65535
# (X,Y,Z) scale of fractal in nodes.
# Actual fractal size will be 2 to 3 times larger.
@@ -2078,10 +1403,10 @@ mgvalleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_riv
# The vertical distance over which heat drops by 20 if 'altitude_chill' is
# enabled. Also the vertical distance over which humidity drops by 10 if
# 'altitude_dry' is enabled.
-mgvalleys_altitude_chill (Altitude chill) int 90
+mgvalleys_altitude_chill (Altitude chill) int 90 0 65535
# Depth below which you'll find large caves.
-mgvalleys_large_cave_depth (Large cave depth) int -33
+mgvalleys_large_cave_depth (Large cave depth) int -33 -31000 31000
# Minimum limit of random number of small caves per mapchunk.
mgvalleys_small_cave_num_min (Small cave minimum number) int 0 0 256
@@ -2099,19 +1424,19 @@ mgvalleys_large_cave_num_max (Large cave maximum number) int 2 0 64
mgvalleys_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Depth below which you'll find giant caverns.
-mgvalleys_cavern_limit (Cavern upper limit) int -256
+mgvalleys_cavern_limit (Cavern upper limit) int -256 -31000 31000
# Y-distance over which caverns expand to full size.
-mgvalleys_cavern_taper (Cavern taper) int 192
+mgvalleys_cavern_taper (Cavern taper) int 192 0 32767
# Defines full size of caverns, smaller values create larger caverns.
mgvalleys_cavern_threshold (Cavern threshold) float 0.6
# How deep to make rivers.
-mgvalleys_river_depth (River depth) int 4
+mgvalleys_river_depth (River depth) int 4 0 65535
# How wide to make rivers.
-mgvalleys_river_size (River size) int 5
+mgvalleys_river_size (River size) int 5 0 65535
# Controls width of tunnels, a smaller value creates wider tunnels.
# Value >= 10.0 completely disables generation of tunnels and avoids the
@@ -2119,10 +1444,10 @@ mgvalleys_river_size (River size) int 5
mgvalleys_cave_width (Cave width) float 0.09
# Lower Y limit of dungeons.
-mgvalleys_dungeon_ymin (Dungeon minimum Y) int -31000
+mgvalleys_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000
# Upper Y limit of dungeons.
-mgvalleys_dungeon_ymax (Dungeon maximum Y) int 63
+mgvalleys_dungeon_ymax (Dungeon maximum Y) int 63 -31000 31000
[**Noises]
@@ -2159,15 +1484,413 @@ mgvalleys_np_inter_valley_slope (Valley slope) noise_params_2d 0.5, 0.5, (128, 1
# 3D noise that determines number of dungeons per mapchunk.
mgvalleys_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0
+
+[Advanced]
+
+[*Developer Options]
+
+# Enable Lua modding support on client.
+# This support is experimental and API can change.
+enable_client_modding (Client modding) bool false
+
+# Replaces the default main menu with a custom one.
+main_menu_script (Main menu script) string
+
+[**Mod Security]
+
+# Prevent mods from doing insecure things like running shell commands.
+secure.enable_security (Enable mod security) bool true
+
+# Comma-separated list of trusted mods that are allowed to access insecure
+# functions even when mod security is on (via request_insecure_environment()).
+secure.trusted_mods (Trusted mods) string
+
+# Comma-separated list of mods that are allowed to access HTTP APIs, which
+# allow them to upload and download data to/from the internet.
+secure.http_mods (HTTP mods) string
+
+[**Debugging]
+
+# Level of logging to be written to debug.txt:
+# - <nothing> (no logging)
+# - none (messages with no level)
+# - error
+# - warning
+# - action
+# - info
+# - verbose
+# - trace
+debug_log_level (Debug log level) enum action ,none,error,warning,action,info,verbose,trace
+
+# If the file size of debug.txt exceeds the number of megabytes specified in
+# this setting when it is opened, the file is moved to debug.txt.1,
+# deleting an older debug.txt.1 if it exists.
+# debug.txt is only moved if this setting is positive.
+debug_log_size_max (Debug log file size threshold) int 50 1
+
+# Minimal level of logging to be written to chat.
+chat_log_level (Chat log level) enum error ,none,error,warning,action,info,verbose,trace
+
+# Handling for deprecated Lua API calls:
+# - none: Do not log deprecated calls
+# - log: mimic and log backtrace of deprecated call (default).
+# - error: abort on usage of deprecated call (suggested for mod developers).
+deprecated_lua_api_handling (Deprecated Lua API handling) enum log none,log,error
+
+# Enable random user input (only used for testing).
+random_input (Random input) bool false
+
+# Enable mod channels support.
+enable_mod_channels (Mod channels) bool false
+
+[**Mod Profiler]
+
+# Load the game profiler to collect game profiling data.
+# Provides a /profiler command to access the compiled profile.
+# Useful for mod developers and server operators.
+profiler.load (Load the game profiler) bool false
+
+# The default format in which profiles are being saved,
+# when calling `/profiler save [format]` without format.
+profiler.default_report_format (Default report format) enum txt txt,csv,lua,json,json_pretty
+
+# The file path relative to your worldpath in which profiles will be saved to.
+profiler.report_path (Report path) string ""
+
+# Instrument the methods of entities on registration.
+instrument.entity (Entity methods) bool true
+
+# Instrument the action function of Active Block Modifiers on registration.
+instrument.abm (Active Block Modifiers) bool true
+
+# Instrument the action function of Loading Block Modifiers on registration.
+instrument.lbm (Loading Block Modifiers) bool true
+
+# Instrument chat commands on registration.
+instrument.chatcommand (Chat commands) bool true
+
+# Instrument global callback functions on registration.
+# (anything you pass to a minetest.register_*() function)
+instrument.global_callback (Global callbacks) bool true
+
+# Instrument builtin.
+# This is usually only needed by core/builtin contributors
+instrument.builtin (Builtin) bool false
+
+# Have the profiler instrument itself:
+# * Instrument an empty function.
+# This estimates the overhead, that instrumentation is adding (+1 function call).
+# * Instrument the sampler being used to update the statistics.
+instrument.profiler (Profiler) bool false
+
+[**Engine profiler]
+
+# Print the engine's profiling data in regular intervals (in seconds).
+# 0 = disable. Useful for developers.
+profiler_print_interval (Engine profiling data print interval) int 0 0
+
+
[*Advanced]
+# Enable IPv6 support (for both client and server).
+# Required for IPv6 connections to work at all.
+enable_ipv6 (IPv6) bool true
+
+# If enabled, invalid world data won't cause the server to shut down.
+# Only enable this if you know what you are doing.
+ignore_world_load_errors (Ignore world errors) bool false
+
+[**Graphics]
+
+# Path to shader directory. If no path is defined, default location will be used.
+shader_path (Shader path) path
+
+# The rendering back-end.
+# A restart is required after changing this.
+# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
+# On other platforms, OpenGL is recommended.
+# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
+video_driver (Video driver) enum opengl opengl,ogles1,ogles2
+
+# Distance in nodes at which transparency depth sorting is enabled
+# Use this to limit the performance impact of transparency depth sorting
+transparency_sorting_distance (Transparency Sorting Distance) int 16 0 128
+
+# Enable vertex buffer objects.
+# This should greatly improve graphics performance.
+enable_vbo (VBO) bool true
+
+# Radius of cloud area stated in number of 64 node cloud squares.
+# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
+cloud_radius (Cloud radius) int 12 1 62
+
+# Whether node texture animations should be desynchronized per mapblock.
+desynchronize_mapblock_texture_animation (Desynchronize block animation) bool true
+
+# Enables caching of facedir rotated meshes.
+enable_mesh_cache (Mesh cache) bool false
+
+# Delay between mesh updates on the client in ms. Increasing this will slow
+# down the rate of mesh updates, thus reducing jitter on slower clients.
+mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50
+
+# Size of the MapBlock cache of the mesh generator. Increasing this will
+# increase the cache hit %, reducing the data being copied from the main
+# thread, thus reducing jitter.
+meshgen_block_cache_size (Mapblock mesh generator's MapBlock cache size in MB) int 20 0 1000
+
+# True = 256
+# False = 128
+# Usable to make minimap smoother on slower machines.
+minimap_double_scan_height (Minimap scan height) bool true
+
+# Textures on a node may be aligned either to the node or to the world.
+# The former mode suits better things like machines, furniture, etc., while
+# the latter makes stairs and microblocks fit surroundings better.
+# However, as this possibility is new, thus may not be used by older servers,
+# this option allows enforcing it for certain node types. Note though that
+# that is considered EXPERIMENTAL and may not work properly.
+world_aligned_mode (World-aligned textures mode) enum enable disable,enable,force_solid,force_nodebox
+
+# World-aligned textures may be scaled to span several nodes. However,
+# the server may not send the scale you want, especially if you use
+# a specially-designed texture pack; with this option, the client tries
+# to determine the scale automatically basing on the texture size.
+# See also texture_min_size.
+# Warning: This option is EXPERIMENTAL!
+autoscale_mode (Autoscaling mode) enum disable disable,enable,force
+
+[**Font]
+
+font_bold (Font bold by default) bool false
+
+font_italic (Font italic by default) bool false
+
+# Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn.
+font_shadow (Font shadow) int 1 0 65535
+
+# Opaqueness (alpha) of the shadow behind the default font, between 0 and 255.
+font_shadow_alpha (Font shadow alpha) int 127 0 255
+
+# Font size of the default font where 1 unit = 1 pixel at 96 DPI
+font_size (Font size) int 16 5 72
+
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+font_size_divisible_by (Font size divisible by) int 1 1
+
+# Path to the default font. Must be a TrueType font.
+# The fallback font will be used if the font cannot be loaded.
+font_path (Regular font path) filepath fonts/Arimo-Regular.ttf
+
+font_path_bold (Bold font path) filepath fonts/Arimo-Bold.ttf
+font_path_italic (Italic font path) filepath fonts/Arimo-Italic.ttf
+font_path_bold_italic (Bold and italic font path) filepath fonts/Arimo-BoldItalic.ttf
+
+# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
+mono_font_size (Monospace font size) int 16 5 72
+
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+mono_font_size_divisible_by (Monospace font size divisible by) int 1 1
+
+# Path to the monospace font. Must be a TrueType font.
+# This font is used for e.g. the console and profiler screen.
+mono_font_path (Monospace font path) filepath fonts/Cousine-Regular.ttf
+
+mono_font_path_bold (Bold monospace font path) filepath fonts/Cousine-Bold.ttf
+mono_font_path_italic (Italic monospace font path) filepath fonts/Cousine-Italic.ttf
+mono_font_path_bold_italic (Bold and italic monospace font path) filepath fonts/Cousine-BoldItalic.ttf
+
+# Path of the fallback font. Must be a TrueType font.
+# This font will be used for certain languages or if the default font is unavailable.
+fallback_font_path (Fallback font path) filepath fonts/DroidSansFallbackFull.ttf
+
+[**Lighting]
+
+# Gradient of light curve at minimum light level.
+# Controls the contrast of the lowest light levels.
+lighting_alpha (Light curve low gradient) float 0.0 0.0 3.0
+
+# Gradient of light curve at maximum light level.
+# Controls the contrast of the highest light levels.
+lighting_beta (Light curve high gradient) float 1.5 0.0 3.0
+
+# Strength of light curve boost.
+# The 3 'boost' parameters define a range of the light
+# curve that is boosted in brightness.
+lighting_boost (Light curve boost) float 0.2 0.0 0.4
+
+# Center of light curve boost range.
+# Where 0.0 is minimum light level, 1.0 is maximum light level.
+lighting_boost_center (Light curve boost center) float 0.5 0.0 1.0
+
+# Spread of light curve boost range.
+# Controls the width of the range to be boosted.
+# Standard deviation of the light curve boost Gaussian.
+lighting_boost_spread (Light curve boost spread) float 0.2 0.0 0.4
+
+[**Networking]
+
+# Prometheus listener address.
+# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
+# enable metrics listener for Prometheus on that address.
+# Metrics can be fetched on http://127.0.0.1:30000/metrics
+prometheus_listener_address (Prometheus listener address) string 127.0.0.1:30000
+
+# Maximum size of the out chat queue.
+# 0 to disable queueing and -1 to make the queue size unlimited.
+max_out_chat_queue_size (Maximum size of the out chat queue) int 20 -1 32767
+
+# Timeout for client to remove unused map data from memory, in seconds.
+client_unload_unused_data_timeout (Mapblock unload timeout) float 600.0 0.0
+
+# Maximum number of mapblocks for client to be kept in memory.
+# Set to -1 for unlimited amount.
+client_mapblock_limit (Mapblock limit) int 7500 -1 2147483647
+
+# Whether to show the client debug info (has the same effect as hitting F5).
+show_debug (Show debug info) bool false
+
+# Maximum number of blocks that are simultaneously sent per client.
+# The maximum total count is calculated dynamically:
+# max_total = ceil((#clients + max_users) * per_client / 4)
+max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 40 1 4294967295
+
+# To reduce lag, block transfers are slowed down when a player is building something.
+# This determines how long they are slowed down after placing or removing a node.
+full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0 0.0
+
+# Maximum number of packets sent per send step, if you have a slow connection
+# try reducing it, but don't reduce it to a number below double of targeted
+# client number.
+max_packets_per_iteration (Max. packets per iteration) int 1024 1 65535
+
+# Compression level to use when sending mapblocks to the client.
+# -1 - use default compression level
+# 0 - least compression, fastest
+# 9 - best compression, slowest
+map_compression_level_net (Map Compression Level for Network Transfer) int -1 -1 9
+
+[**Server]
+
+# Format of player chat messages. The following strings are valid placeholders:
+# @name, @message, @timestamp (optional)
+chat_message_format (Chat message format) string <@name> @message
+
+# If the execution of a chat command takes longer than this specified time in
+# seconds, add the time information to the chat command message
+chatcommand_msg_time_threshold (Chat command time message threshold) float 0.1 0.0
+
+# A message to be displayed to all clients when the server shuts down.
+kick_msg_shutdown (Shutdown message) string Server shutting down.
+
+# A message to be displayed to all clients when the server crashes.
+kick_msg_crash (Crash message) string This server has experienced an internal error. You will now be disconnected.
+
+# Whether to ask clients to reconnect after a (Lua) crash.
+# Set this to true if your server is set up to restart automatically.
+ask_reconnect_on_crash (Ask to reconnect after crash) bool false
+
+[**Server/Env Performance]
+
+# Length of a server tick and the interval at which objects are generally updated over
+# network, stated in seconds.
+dedicated_server_step (Dedicated server step) float 0.09 0.0
+
+# Whether players are shown to clients without any range limit.
+# Deprecated, use the setting player_transfer_distance instead.
+unlimited_player_transfer_distance (Unlimited player transfer distance) bool true
+
+# Defines the maximal player transfer distance in blocks (0 = unlimited).
+player_transfer_distance (Player transfer distance) int 0 0 65535
+
+# From how far clients know about objects, stated in mapblocks (16 nodes).
+#
+# Setting this larger than active_block_range will also cause the server
+# to maintain active objects up to this distance in the direction the
+# player is looking. (This can avoid mobs suddenly disappearing from view)
+active_object_send_range_blocks (Active object send range) int 8 1 65535
+
+# The radius of the volume of blocks around every player that is subject to the
+# active block stuff, stated in mapblocks (16 nodes).
+# In active blocks objects are loaded and ABMs run.
+# This is also the minimum range in which active objects (mobs) are maintained.
+# This should be configured together with active_object_send_range_blocks.
+active_block_range (Active block range) int 4 1 65535
+
+# From how far blocks are sent to clients, stated in mapblocks (16 nodes).
+max_block_send_distance (Max block send distance) int 12 1 65535
+
+# Maximum number of forceloaded mapblocks.
+max_forceloaded_blocks (Maximum forceloaded blocks) int 16 0
+
+# Interval of sending time of day to clients, stated in seconds.
+time_send_interval (Time send interval) float 5.0 0.001
+
+# Interval of saving important changes in the world, stated in seconds.
+server_map_save_interval (Map save interval) float 5.3 0.001
+
+# How long the server will wait before unloading unused mapblocks, stated in seconds.
+# Higher value is smoother, but will use more RAM.
+server_unload_unused_data_timeout (Unload unused server data) int 29 0 4294967295
+
+# Maximum number of statically stored objects in a block.
+max_objects_per_block (Maximum objects per block) int 256 1 65535
+
+# Length of time between active block management cycles, stated in seconds.
+active_block_mgmt_interval (Active block management interval) float 2.0 0.0
+
+# Length of time between Active Block Modifier (ABM) execution cycles, stated in seconds.
+abm_interval (ABM interval) float 1.0 0.0
+
+# The time budget allowed for ABMs to execute on each step
+# (as a fraction of the ABM Interval)
+abm_time_budget (ABM time budget) float 0.2 0.1 0.9
+
+# Length of time between NodeTimer execution cycles, stated in seconds.
+nodetimer_interval (NodeTimer interval) float 0.2 0.0
+
+# Max liquids processed per step.
+liquid_loop_max (Liquid loop max) int 100000 1 4294967295
+
+# The time (in seconds) that the liquids queue may grow beyond processing
+# capacity until an attempt is made to decrease its size by dumping old queue
+# items. A value of 0 disables the functionality.
+liquid_queue_purge_time (Liquid queue purge time) int 0 0 65535
+
+# Liquid update interval in seconds.
+liquid_update (Liquid update tick) float 1.0 0.001
+
+# At this distance the server will aggressively optimize which blocks are sent to
+# clients.
+# Small values potentially improve performance a lot, at the expense of visible
+# rendering glitches (some blocks will not be rendered under water and in caves,
+# as well as sometimes on land).
+# Setting this to a value greater than max_block_send_distance disables this
+# optimization.
+# Stated in mapblocks (16 nodes).
+block_send_optimize_distance (Block send optimize distance) int 4 2 32767
+
+# If enabled the server will perform map block occlusion culling based on
+# on the eye position of the player. This can reduce the number of blocks
+# sent to the client 50-80%. The client will not longer receive most invisible
+# so that the utility of noclip mode is reduced.
+server_side_occlusion_culling (Server side occlusion culling) bool true
+
+[**Mapgen]
+
# Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).
# WARNING!: There is no benefit, and there are several dangers, in
# increasing this value above 5.
# Reducing this value increases cave and dungeon density.
# Altering this value is for special usage, leaving it unchanged is
# recommended.
-chunksize (Chunk size) int 5
+chunksize (Chunk size) int 5 1 10
# Dump the mapgen debug information.
enable_mapgen_debug_info (Mapgen debug) bool false
@@ -2193,21 +1916,438 @@ emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 1
# speed, but this may harm game performance by interfering with other
# processes, especially in singleplayer and/or when running Lua code in
# 'on_generated'. For many users the optimum setting may be '1'.
-num_emerge_threads (Number of emerge threads) int 1
+num_emerge_threads (Number of emerge threads) int 1 0 32767
-[Online Content Repository]
+[**cURL]
-# The URL for the content repository
-contentdb_url (ContentDB URL) string https://content.minetest.net
+# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
+curl_timeout (cURL interactive timeout) int 20000 100 2147483647
-# 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.
-# You can also specify content ratings.
-# These flags are independent from Minetest versions,
-# so see a full list at https://content.minetest.net/help/content_flags/
-contentdb_flag_blacklist (ContentDB Flag Blacklist) string nonfree, desktop_default
+# Limits number of parallel HTTP requests. Affects:
+# - Media fetch if server uses remote_media setting.
+# - Serverlist download and server announcement.
+# - Downloads performed by main menu (e.g. mod manager).
+# Only has an effect if compiled with cURL.
+curl_parallel_limit (cURL parallel limit) int 8 1 2147483647
-# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.
-# This should be lower than curl_parallel_limit.
-contentdb_max_concurrent_downloads (ContentDB Max Concurrent Downloads) int 3
+# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
+curl_file_download_timeout (cURL file download timeout) int 300000 100 2147483647
+
+[**Misc]
+
+# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens.
+screen_dpi (DPI) int 72 1
+
+# Adjust the detected display density, used for scaling UI elements.
+display_density_factor (Display Density Scaling Factor) float 1 0.5 5.0
+
+# Windows systems only: Start Minetest with the command line window in the background.
+# Contains the same information as the file debug.txt (default name).
+enable_console (Enable console window) bool false
+
+# Number of extra blocks that can be loaded by /clearobjects at once.
+# This is a trade-off between SQLite transaction overhead and
+# memory consumption (4096=100MB, as a rule of thumb).
+max_clearobjects_extra_loaded_blocks (Max. clearobjects extra blocks) int 4096 0 4294967295
+
+# World directory (everything in the world is stored here).
+# Not needed if starting from the main menu.
+map-dir (Map directory) path
+
+# See https://www.sqlite.org/pragma.html#pragma_synchronous
+sqlite_synchronous (Synchronous SQLite) enum 2 0,1,2
+
+# Compression level to use when saving mapblocks to disk.
+# -1 - use default compression level
+# 0 - least compression, fastest
+# 9 - best compression, slowest
+map_compression_level_disk (Map Compression Level for Disk Storage) int -1 -1 9
+
+# Enable usage of remote media server (if provided by server).
+# Remote servers offer a significantly faster way to download media (e.g. textures)
+# when connecting to the server.
+enable_remote_media_server (Connect to external media server) bool true
+
+# File in client/serverlist/ that contains your favorite servers displayed in the
+# Multiplayer Tab.
+serverlist_file (Serverlist file) string favoriteservers.json
+
+
+[*Gamepads]
+
+# Enable joysticks. Requires a restart to take effect
+enable_joysticks (Enable joysticks) bool false
+
+# The identifier of the joystick to use
+joystick_id (Joystick ID) int 0 0 255
+
+# The type of joystick
+joystick_type (Joystick type) enum auto auto,generic,xbox,dragonrise_gamecube
+
+# The time in seconds it takes between repeated events
+# when holding down a joystick button combination.
+repeat_joystick_button_time (Joystick button repetition interval) float 0.17 0.001
+
+# The dead zone of the joystick
+joystick_deadzone (Joystick dead zone) int 2048 0 65535
+
+# The sensitivity of the joystick axes for moving the
+# in-game view frustum around.
+joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170.0 0.001
+
+
+[*Temporary Settings]
+
+# Path to texture directory. All textures are first searched from here.
+texture_path (Texture path) path
+
+# Enables minimap.
+enable_minimap (Minimap) bool true
+
+# Shape of the minimap. Enabled = round, disabled = square.
+minimap_shape_round (Round minimap) bool true
+
+# Address to connect to.
+# Leave this blank to start a local server.
+# Note that the address field in the main menu overrides this setting.
+address (Server address) string
+
+# Port to connect to (UDP).
+# Note that the port field in the main menu overrides this setting.
+remote_port (Remote port) int 30000 1 65535
+
+# Default game when creating a new world.
+# This will be overridden when creating a world from the main menu.
+default_game (Default game) string minetest
+
+# Enable players getting damage and dying.
+enable_damage (Damage) bool false
+
+# Enable creative mode for all players
+creative_mode (Creative) bool false
+
+# Whether to allow players to damage and kill each other.
+enable_pvp (Player versus player) bool true
+
+# Player is able to fly without being affected by gravity.
+# This requires the "fly" privilege on the server.
+free_move (Flying) bool false
+
+# If enabled, makes move directions relative to the player's pitch when flying or swimming.
+pitch_move (Pitch move mode) bool false
+
+# Fast movement (via the "Aux1" key).
+# This requires the "fast" privilege on the server.
+fast_move (Fast movement) bool false
+
+# If enabled together with fly mode, player is able to fly through solid nodes.
+# This requires the "noclip" privilege on the server.
+noclip (Noclip) bool false
+
+# Continuous forward movement, toggled by autoforward key.
+# Press the autoforward key again or the backwards movement to disable.
+continuous_forward (Continuous forward) bool false
+
+# Formspec default background opacity (between 0 and 255).
+formspec_default_bg_opacity (Formspec Default Background Opacity) int 140 0 255
+
+# Formspec default background color (R,G,B).
+formspec_default_bg_color (Formspec Default Background Color) string (0,0,0)
+
+# Whether to show technical names.
+# Affects mods and texture packs in the Content and Select Mods menus, as well as
+# setting names in All Settings.
+# Controlled by the checkbox in the "All settings" menu.
+show_technical_names (Show technical names) bool false
+
+# Enables the sound system.
+# If disabled, this completely disables all sounds everywhere and the in-game
+# sound controls will be non-functional.
+# Changing this setting requires a restart.
+enable_sound (Sound) bool true
+
+# Key for moving the player forward.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_forward (Forward key) key KEY_KEY_W
+
+# Key for moving the player backward.
+# Will also disable autoforward, when active.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_backward (Backward key) key KEY_KEY_S
+
+# Key for moving the player left.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_left (Left key) key KEY_KEY_A
+
+# Key for moving the player right.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_right (Right key) key KEY_KEY_D
+
+# Key for jumping.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_jump (Jump key) key KEY_SPACE
+
+# Key for sneaking.
+# Also used for climbing down and descending in water if aux1_descends is disabled.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_sneak (Sneak key) key KEY_LSHIFT
+
+# Key for digging.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_dig (Dig key) key KEY_LBUTTON
+
+# Key for placing.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_place (Place key) key KEY_RBUTTON
+
+# Key for opening the inventory.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_inventory (Inventory key) key KEY_KEY_I
+
+# Key for moving fast in fast mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_aux1 (Aux1 key) key KEY_KEY_E
+
+# Key for opening the chat window.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_chat (Chat key) key KEY_KEY_T
+
+# Key for opening the chat window to type commands.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_cmd (Command key) key /
+
+# Key for opening the chat window to type local commands.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_cmd_local (Command key) key .
+
+# Key for toggling unlimited view range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_rangeselect (Range select key) key KEY_KEY_R
+
+# Key for toggling flying.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_freemove (Fly key) key KEY_KEY_K
+
+# Key for toggling pitch move mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_pitchmove (Pitch move key) key KEY_KEY_P
+
+# Key for toggling fast mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_fastmove (Fast key) key KEY_KEY_J
+
+# Key for toggling noclip mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_noclip (Noclip key) key KEY_KEY_H
+
+# Key for selecting the next item in the hotbar.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_hotbar_next (Hotbar next key) key KEY_KEY_N
+
+# Key for selecting the previous item in the hotbar.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_hotbar_previous (Hotbar previous key) key KEY_KEY_B
+
+# Key for muting the game.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_mute (Mute key) key KEY_KEY_M
+
+# Key for increasing the volume.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_increase_volume (Inc. volume key) key
+
+# Key for decreasing the volume.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_decrease_volume (Dec. volume key) key
+
+# Key for toggling autoforward.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_autoforward (Automatic forward key) key
+
+# Key for toggling cinematic mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_cinematic (Cinematic mode key) key
+
+# Key for toggling display of minimap.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_minimap (Minimap key) key KEY_KEY_V
+
+# Key for taking screenshots.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_screenshot (Screenshot) key KEY_F12
+
+# Key for dropping the currently selected item.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_drop (Drop item key) key KEY_KEY_Q
+
+# Key to use view zoom when possible.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_zoom (View zoom key) key KEY_KEY_Z
+
+# Key for selecting the first hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot1 (Hotbar slot 1 key) key KEY_KEY_1
+
+# Key for selecting the second hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot2 (Hotbar slot 2 key) key KEY_KEY_2
+
+# Key for selecting the third hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot3 (Hotbar slot 3 key) key KEY_KEY_3
+
+# Key for selecting the fourth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot4 (Hotbar slot 4 key) key KEY_KEY_4
+
+# Key for selecting the fifth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot5 (Hotbar slot 5 key) key KEY_KEY_5
+
+# Key for selecting the sixth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot6 (Hotbar slot 6 key) key KEY_KEY_6
+
+# Key for selecting the seventh hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot7 (Hotbar slot 7 key) key KEY_KEY_7
+
+# Key for selecting the eighth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot8 (Hotbar slot 8 key) key KEY_KEY_8
+
+# Key for selecting the ninth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot9 (Hotbar slot 9 key) key KEY_KEY_9
+
+# Key for selecting the tenth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot10 (Hotbar slot 10 key) key KEY_KEY_0
+
+# Key for selecting the 11th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot11 (Hotbar slot 11 key) key
+
+# Key for selecting the 12th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot12 (Hotbar slot 12 key) key
+
+# Key for selecting the 13th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot13 (Hotbar slot 13 key) key
+
+# Key for selecting the 14th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot14 (Hotbar slot 14 key) key
+
+# Key for selecting the 15th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot15 (Hotbar slot 15 key) key
+
+# Key for selecting the 16th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot16 (Hotbar slot 16 key) key
+
+# Key for selecting the 17th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot17 (Hotbar slot 17 key) key
+
+# Key for selecting the 18th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot18 (Hotbar slot 18 key) key
+
+# Key for selecting the 19th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot19 (Hotbar slot 19 key) key
+
+# Key for selecting the 20th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot20 (Hotbar slot 20 key) key
+
+# Key for selecting the 21st hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot21 (Hotbar slot 21 key) key
+
+# Key for selecting the 22nd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot22 (Hotbar slot 22 key) key
+
+# Key for selecting the 23rd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot23 (Hotbar slot 23 key) key
+
+# Key for selecting the 24th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot24 (Hotbar slot 24 key) key
+
+# Key for selecting the 25th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot25 (Hotbar slot 25 key) key
+
+# Key for selecting the 26th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot26 (Hotbar slot 26 key) key
+
+# Key for selecting the 27th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot27 (Hotbar slot 27 key) key
+
+# Key for selecting the 28th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot28 (Hotbar slot 28 key) key
+
+# Key for selecting the 29th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot29 (Hotbar slot 29 key) key
+
+# Key for selecting the 30th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot30 (Hotbar slot 30 key) key
+
+# Key for selecting the 31st hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot31 (Hotbar slot 31 key) key
+
+# Key for selecting the 32nd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_slot32 (Hotbar slot 32 key) key
+
+# Key for toggling the display of the HUD.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_hud (HUD toggle key) key KEY_F1
+
+# Key for toggling the display of chat.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_chat (Chat toggle key) key KEY_F2
+
+# Key for toggling the display of the large chat console.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_console (Large chat console key) key KEY_F10
+
+# Key for toggling the display of fog.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_force_fog_off (Fog toggle key) key KEY_F3
+
+# Key for toggling the camera update. Only used for development
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_update_camera (Camera update toggle key) key
+
+# Key for toggling the display of debug info.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_debug (Debug info toggle key) key KEY_F5
+
+# Key for toggling the display of the profiler. Used for development.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_toggle_profiler (Profiler toggle key) key KEY_F6
+
+# Key for switching between first- and third-person camera.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_camera_mode (Toggle camera mode key) key KEY_KEY_C
+
+# Key for increasing the viewing range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_increase_viewing_range_min (View range increase key) key +
+
+# Key for decreasing the viewing range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_decrease_viewing_range_min (View range decrease key) key -
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index 762a676c6..c4b947e72 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -16,10 +16,16 @@ uniform float animationTimer;
uniform float f_textureresolution;
uniform mat4 m_ShadowViewProj;
uniform float f_shadowfar;
- varying float normalOffsetScale;
+ uniform float f_shadow_strength;
+ uniform vec4 CameraPos;
+ uniform float xyPerspectiveBias0;
+ uniform float xyPerspectiveBias1;
+
varying float adj_shadow_strength;
varying float cosLight;
varying float f_normal_length;
+ varying vec3 shadow_position;
+ varying float perspective_factor;
#endif
@@ -43,23 +49,7 @@ varying float nightRatio;
const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / ( 1.0 - fogStart);
-
-
#ifdef ENABLE_DYNAMIC_SHADOWS
-const float bias0 = 0.9;
-const float zPersFactor = 0.5;
-const float bias1 = 1.0 - bias0 + 1e-6;
-
-vec4 getPerspectiveFactor(in vec4 shadowPosition)
-{
-
- float pDistance = length(shadowPosition.xy);
- float pFactor = pDistance * bias0 + bias1;
-
- shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
-
- return shadowPosition;
-}
// assuming near is always 1.0
float getLinearDepth()
@@ -69,16 +59,7 @@ float getLinearDepth()
vec3 getLightSpacePosition()
{
- vec4 pLightSpace;
- // some drawtypes have zero normals, so we need to handle it :(
- #if DRAW_TYPE == NDT_PLANTLIKE
- pLightSpace = m_ShadowViewProj * vec4(worldPosition, 1.0);
- #else
- float offsetScale = (0.0057 * getLinearDepth() + normalOffsetScale);
- pLightSpace = m_ShadowViewProj * vec4(worldPosition + offsetScale * normalize(vNormal), 1.0);
- #endif
- pLightSpace = getPerspectiveFactor(pLightSpace);
- return pLightSpace.xyz * 0.5 + 0.5;
+ return shadow_position * 0.5 + 0.5;
}
// custom smoothstep implementation because it's not defined in glsl1.2
// https://docs.gl/sl4/smoothstep
@@ -136,23 +117,16 @@ float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance
#if SHADOW_FILTER == 2
- #define PCFBOUND 3.5
- #define PCFSAMPLES 64.0
+ #define PCFBOUND 2.0 // 5x5
+ #define PCFSAMPLES 25
#elif SHADOW_FILTER == 1
- #define PCFBOUND 1.5
- #if defined(POISSON_FILTER)
- #define PCFSAMPLES 32.0
- #else
- #define PCFSAMPLES 16.0
- #endif
+ #define PCFBOUND 1.0 // 3x3
+ #define PCFSAMPLES 9
#else
#define PCFBOUND 0.0
- #if defined(POISSON_FILTER)
- #define PCFSAMPLES 4.0
- #else
- #define PCFSAMPLES 1.0
- #endif
+ #define PCFSAMPLES 1
#endif
+
#ifdef COLORED_SHADOWS
float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
@@ -169,57 +143,31 @@ float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDis
}
#endif
-float getBaseLength(vec2 smTexCoord)
-{
- float l = length(2.0 * smTexCoord.xy - 1.0); // length in texture coords
- return bias1 / (1.0 / l - bias0); // return to undistorted coords
-}
-
-float getDeltaPerspectiveFactor(float l)
-{
- return 0.1 / (bias0 * l + bias1); // original distortion factor, divided by 10
-}
+#define BASEFILTERRADIUS 1.0
-float getPenumbraRadius(sampler2D shadowsampler, vec2 smTexCoord, float realDistance, float multiplier)
+float getPenumbraRadius(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
- float baseLength = getBaseLength(smTexCoord);
- float perspectiveFactor;
-
- if (PCFBOUND == 0.0) return 0.0;
// Return fast if sharp shadows are requested
- if (SOFTSHADOWRADIUS <= 1.0) {
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength);
- return max(2 * length(smTexCoord.xy) * 2048 / f_textureresolution / pow(perspectiveFactor, 3), SOFTSHADOWRADIUS);
- }
+ if (PCFBOUND == 0.0 || SOFTSHADOWRADIUS <= 0.0)
+ return 0.0;
vec2 clampedpos;
- float texture_size = 1.0 / (2048 /*f_textureresolution*/ * 0.5);
float y, x;
- float depth = 0.0;
- float pointDepth;
- float maxRadius = SOFTSHADOWRADIUS * 5.0 * multiplier;
-
- float bound = clamp(PCFBOUND * (1 - baseLength), 0.0, PCFBOUND);
- int n = 0;
-
- for (y = -bound; y <= bound; y += 1.0)
- for (x = -bound; x <= bound; x += 1.0) {
- clampedpos = vec2(x,y);
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * maxRadius);
- clampedpos = clampedpos * texture_size * perspectiveFactor * maxRadius * perspectiveFactor + smTexCoord.xy;
-
- pointDepth = getHardShadowDepth(shadowsampler, clampedpos.xy, realDistance);
- if (pointDepth > -0.01) {
- depth += pointDepth;
- n += 1;
- }
- }
-
- depth = depth / n;
- depth = pow(clamp(depth, 0.0, 1000.0), 1.6) / 0.001;
-
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength);
- return max(length(smTexCoord.xy) * 2 * 2048 / f_textureresolution / pow(perspectiveFactor, 3), depth * maxRadius);
+ float depth = getHardShadowDepth(shadowsampler, smTexCoord.xy, realDistance);
+ // A factor from 0 to 1 to reduce blurring of short shadows
+ float sharpness_factor = 1.0;
+ // conversion factor from shadow depth to blur radius
+ float depth_to_blur = f_shadowfar / SOFTSHADOWRADIUS / xyPerspectiveBias0;
+ if (depth > 0.0 && f_normal_length > 0.0)
+ // 5 is empirical factor that controls how fast shadow loses sharpness
+ sharpness_factor = clamp(5 * depth * depth_to_blur, 0.0, 1.0);
+ depth = 0.0;
+
+ float world_to_texture = xyPerspectiveBias1 / perspective_factor / perspective_factor
+ * f_textureresolution / 2.0 / f_shadowfar;
+ float world_radius = 0.2; // shadow blur radius in world float coordinates, e.g. 0.2 = 0.02 of one node
+
+ return max(BASEFILTERRADIUS * f_textureresolution / 4096.0, sharpness_factor * world_radius * world_to_texture * SOFTSHADOWRADIUS);
}
#ifdef POISSON_FILTER
@@ -294,26 +242,23 @@ const vec2[64] poissonDisk = vec2[64](
vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
- vec2 clampedpos;
- vec4 visibility = vec4(0.0);
- float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.5); // scale to align with PCF
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
if (radius < 0.1) {
// we are in the middle of even brightness, no need for filtering
return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
}
- float baseLength = getBaseLength(smTexCoord);
- float perspectiveFactor;
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+ float scale_factor = radius / f_textureresolution;
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- int samples = int(clamp(PCFSAMPLES * (1 - baseLength) * (1 - baseLength), PCFSAMPLES / 4, PCFSAMPLES));
+ int samples = (1 + 1 * int(SOFTSHADOWRADIUS > 1.0)) * PCFSAMPLES; // scale max samples for the soft shadows
+ samples = int(clamp(pow(4.0 * radius + 1.0, 2.0), 1.0, float(samples)));
int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
int end_offset = int(samples) + init_offset;
for (int x = init_offset; x < end_offset; x++) {
- clampedpos = poissonDisk[x];
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius);
- clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor + smTexCoord.xy;
+ clampedpos = poissonDisk[x] * scale_factor + smTexCoord.xy;
visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
}
@@ -324,26 +269,23 @@ vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance
float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
- vec2 clampedpos;
- float visibility = 0.0;
- float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.5); // scale to align with PCF
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
if (radius < 0.1) {
// we are in the middle of even brightness, no need for filtering
return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
}
- float baseLength = getBaseLength(smTexCoord);
- float perspectiveFactor;
+ vec2 clampedpos;
+ float visibility = 0.0;
+ float scale_factor = radius / f_textureresolution;
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- int samples = int(clamp(PCFSAMPLES * (1 - baseLength) * (1 - baseLength), PCFSAMPLES / 4, PCFSAMPLES));
+ int samples = (1 + 1 * int(SOFTSHADOWRADIUS > 1.0)) * PCFSAMPLES; // scale max samples for the soft shadows
+ samples = int(clamp(pow(4.0 * radius + 1.0, 2.0), 1.0, float(samples)));
int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
int end_offset = int(samples) + init_offset;
for (int x = init_offset; x < end_offset; x++) {
- clampedpos = poissonDisk[x];
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius);
- clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor + smTexCoord.xy;
+ clampedpos = poissonDisk[x] * scale_factor + smTexCoord.xy;
visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
}
@@ -359,65 +301,57 @@ float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
- vec2 clampedpos;
- vec4 visibility = vec4(0.0);
- float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.0);
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
if (radius < 0.1) {
// we are in the middle of even brightness, no need for filtering
return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
}
- float baseLength = getBaseLength(smTexCoord);
- float perspectiveFactor;
-
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- float y, x;
- float bound = clamp(PCFBOUND * (1 - baseLength), PCFBOUND / 2, PCFBOUND);
- int n = 0;
+ vec2 clampedpos;
+ vec4 visibility = vec4(0.0);
+ float x, y;
+ float bound = (1 + 0.5 * int(SOFTSHADOWRADIUS > 1.0)) * PCFBOUND; // scale max bound for soft shadows
+ bound = clamp(0.5 * (4.0 * radius - 1.0), 0.5, bound);
+ float scale_factor = radius / bound / f_textureresolution;
+ float n = 0.0;
// basic PCF filter
for (y = -bound; y <= bound; y += 1.0)
for (x = -bound; x <= bound; x += 1.0) {
- clampedpos = vec2(x,y); // screen offset
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius / bound);
- clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor / bound + smTexCoord.xy; // both dx,dy and radius are adjusted
+ clampedpos = vec2(x,y) * scale_factor + smTexCoord.xy;
visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
- n += 1;
+ n += 1.0;
}
- return visibility / n;
+ return visibility / max(n, 1.0);
}
#else
float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
- vec2 clampedpos;
- float visibility = 0.0;
- float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance, 1.0);
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
if (radius < 0.1) {
// we are in the middle of even brightness, no need for filtering
return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
}
- float baseLength = getBaseLength(smTexCoord);
- float perspectiveFactor;
-
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- float y, x;
- float bound = clamp(PCFBOUND * (1 - baseLength), PCFBOUND / 2, PCFBOUND);
- int n = 0;
+ vec2 clampedpos;
+ float visibility = 0.0;
+ float x, y;
+ float bound = (1 + 0.5 * int(SOFTSHADOWRADIUS > 1.0)) * PCFBOUND; // scale max bound for soft shadows
+ bound = clamp(0.5 * (4.0 * radius - 1.0), 0.5, bound);
+ float scale_factor = radius / bound / f_textureresolution;
+ float n = 0.0;
// basic PCF filter
for (y = -bound; y <= bound; y += 1.0)
for (x = -bound; x <= bound; x += 1.0) {
- clampedpos = vec2(x,y); // screen offset
- perspectiveFactor = getDeltaPerspectiveFactor(baseLength + length(clampedpos) * texture_size * radius / bound);
- clampedpos = clampedpos * texture_size * perspectiveFactor * radius * perspectiveFactor / bound + smTexCoord.xy; // both dx,dy and radius are adjusted
+ clampedpos = vec2(x,y) * scale_factor + smTexCoord.xy;
visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
- n += 1;
+ n += 1.0;
}
- return visibility / n;
+ return visibility / max(n, 1.0);
}
#endif
@@ -481,53 +415,59 @@ void main(void)
vec4 col = vec4(color.rgb * varColor.rgb, 1.0);
#ifdef ENABLE_DYNAMIC_SHADOWS
- float shadow_int = 0.0;
- vec3 shadow_color = vec3(0.0, 0.0, 0.0);
- vec3 posLightSpace = getLightSpacePosition();
+ if (f_shadow_strength > 0.0) {
+ float shadow_int = 0.0;
+ vec3 shadow_color = vec3(0.0, 0.0, 0.0);
+ vec3 posLightSpace = getLightSpacePosition();
- float distance_rate = (1 - pow(clamp(2.0 * length(posLightSpace.xy - 0.5),0.0,1.0), 20.0));
- float f_adj_shadow_strength = max(adj_shadow_strength-mtsmoothstep(0.9,1.1, posLightSpace.z ),0.0);
+ float distance_rate = (1.0 - pow(clamp(2.0 * length(posLightSpace.xy - 0.5),0.0,1.0), 10.0));
+ if (max(abs(posLightSpace.x - 0.5), abs(posLightSpace.y - 0.5)) > 0.5)
+ distance_rate = 0.0;
+ float f_adj_shadow_strength = max(adj_shadow_strength-mtsmoothstep(0.9,1.1, posLightSpace.z),0.0);
+
+ if (distance_rate > 1e-7) {
- if (distance_rate > 1e-7) {
-
#ifdef COLORED_SHADOWS
- vec4 visibility;
- if (cosLight > 0.0)
- visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
- else
- visibility = vec4(1.0, 0.0, 0.0, 0.0);
- shadow_int = visibility.r;
- shadow_color = visibility.gba;
+ vec4 visibility;
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
+ visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ visibility = vec4(1.0, 0.0, 0.0, 0.0);
+ shadow_int = visibility.r;
+ shadow_color = visibility.gba;
#else
- if (cosLight > 0.0)
- shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
- else
- shadow_int = 1.0;
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
+ shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ shadow_int = 1.0;
#endif
- shadow_int *= distance_rate;
- shadow_int = clamp(shadow_int, 0.0, 1.0);
+ shadow_int *= distance_rate;
+ shadow_int = clamp(shadow_int, 0.0, 1.0);
- }
+ }
- // turns out that nightRatio falls off much faster than
- // actual brightness of artificial light in relation to natual light.
- // Power ratio was measured on torches in MTG (brightness = 14).
- float adjusted_night_ratio = pow(max(0.0, nightRatio), 0.6);
+ // turns out that nightRatio falls off much faster than
+ // actual brightness of artificial light in relation to natual light.
+ // Power ratio was measured on torches in MTG (brightness = 14).
+ float adjusted_night_ratio = pow(max(0.0, nightRatio), 0.6);
+
+ // Apply self-shadowing when light falls at a narrow angle to the surface
+ // Cosine of the cut-off angle.
+ const float self_shadow_cutoff_cosine = 0.035;
+ if (f_normal_length != 0 && cosLight < self_shadow_cutoff_cosine) {
+ shadow_int = max(shadow_int, 1 - clamp(cosLight, 0.0, self_shadow_cutoff_cosine)/self_shadow_cutoff_cosine);
+ shadow_color = mix(vec3(0.0), shadow_color, min(cosLight, self_shadow_cutoff_cosine)/self_shadow_cutoff_cosine);
+ }
- if (f_normal_length != 0 && cosLight < 0.035) {
- shadow_int = max(shadow_int, 1 - clamp(cosLight, 0.0, 0.035)/0.035);
- }
+ shadow_int *= f_adj_shadow_strength;
- shadow_int *= f_adj_shadow_strength;
-
- // calculate fragment color from components:
- col.rgb =
- adjusted_night_ratio * col.rgb + // artificial light
- (1.0 - adjusted_night_ratio) * ( // natural light
- col.rgb * (1.0 - shadow_int * (1.0 - shadow_color)) + // filtered texture color
- dayLight * shadow_color * shadow_int); // reflected filtered sunlight/moonlight
- // col.r = 0.5 * clamp(getPenumbraRadius(ShadowMapSampler, posLightSpace.xy, posLightSpace.z, 1.0) / SOFTSHADOWRADIUS, 0.0, 1.0) + 0.5 * col.r;
- // col.r = adjusted_night_ratio; // debug night ratio adjustment
+ // calculate fragment color from components:
+ col.rgb =
+ adjusted_night_ratio * col.rgb + // artificial light
+ (1.0 - adjusted_night_ratio) * ( // natural light
+ col.rgb * (1.0 - shadow_int * (1.0 - shadow_color)) + // filtered texture color
+ dayLight * shadow_color * shadow_int); // reflected filtered sunlight/moonlight
+ }
#endif
#if ENABLE_TONE_MAPPING
@@ -547,6 +487,6 @@ void main(void)
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
col = mix(skyBgColor, col, clarity);
col = vec4(col.rgb, base.a);
-
+
gl_FragColor = col;
}
diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl
index d316930b2..d1fba2830 100644
--- a/client/shaders/nodes_shader/opengl_vertex.glsl
+++ b/client/shaders/nodes_shader/opengl_vertex.glsl
@@ -32,10 +32,14 @@ centroid varying vec2 varTexCoord;
uniform float f_shadowfar;
uniform float f_shadow_strength;
uniform float f_timeofday;
+ uniform vec4 CameraPos;
+
varying float cosLight;
varying float normalOffsetScale;
varying float adj_shadow_strength;
varying float f_normal_length;
+ varying vec3 shadow_position;
+ varying float perspective_factor;
#endif
@@ -45,8 +49,38 @@ varying float nightRatio;
const vec3 artificialLight = vec3(1.04, 1.04, 1.04);
const float e = 2.718281828459;
const float BS = 10.0;
+uniform float xyPerspectiveBias0;
+uniform float xyPerspectiveBias1;
+uniform float zPerspectiveBias;
#ifdef ENABLE_DYNAMIC_SHADOWS
+
+vec4 getRelativePosition(in vec4 position)
+{
+ vec2 l = position.xy - CameraPos.xy;
+ vec2 s = l / abs(l);
+ s = (1.0 - s * CameraPos.xy);
+ l /= s;
+ return vec4(l, s);
+}
+
+float getPerspectiveFactor(in vec4 relativePosition)
+{
+ float pDistance = length(relativePosition.xy);
+ float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1;
+ return pFactor;
+}
+
+vec4 applyPerspectiveDistortion(in vec4 position)
+{
+ vec4 l = getRelativePosition(position);
+ float pFactor = getPerspectiveFactor(l);
+ l.xy /= pFactor;
+ position.xy = l.xy * l.zw + CameraPos.xy;
+ position.z *= zPerspectiveBias;
+ return position;
+}
+
// custom smoothstep implementation because it's not defined in glsl1.2
// https://docs.gl/sl4/smoothstep
float mtsmoothstep(in float edge0, in float edge1, in float x)
@@ -193,24 +227,46 @@ void main(void)
varColor = clamp(color, 0.0, 1.0);
#ifdef ENABLE_DYNAMIC_SHADOWS
- vec3 nNormal = normalize(vNormal);
- cosLight = dot(nNormal, -v_LightDirection);
- float texelSize = 767.0 / f_textureresolution;
- float slopeScale = clamp(1.0 - abs(cosLight), 0.0, 1.0);
- normalOffsetScale = texelSize * slopeScale;
-
- if (f_timeofday < 0.2) {
- adj_shadow_strength = f_shadow_strength * 0.5 *
- (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
- } else if (f_timeofday >= 0.8) {
- adj_shadow_strength = f_shadow_strength * 0.5 *
- mtsmoothstep(0.8, 0.83, f_timeofday);
- } else {
- adj_shadow_strength = f_shadow_strength *
- mtsmoothstep(0.20, 0.25, f_timeofday) *
- (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
+ if (f_shadow_strength > 0.0) {
+ vec3 nNormal;
+ f_normal_length = length(vNormal);
+
+ /* normalOffsetScale is in world coordinates (1/10th of a meter)
+ z_bias is in light space coordinates */
+ float normalOffsetScale, z_bias;
+ float pFactor = getPerspectiveFactor(getRelativePosition(m_ShadowViewProj * mWorld * inVertexPosition));
+ if (f_normal_length > 0.0) {
+ nNormal = normalize(vNormal);
+ cosLight = dot(nNormal, -v_LightDirection);
+ float sinLight = pow(1 - pow(cosLight, 2.0), 0.5);
+ normalOffsetScale = 2.0 * pFactor * pFactor * sinLight * min(f_shadowfar, 500.0) /
+ xyPerspectiveBias1 / f_textureresolution;
+ z_bias = 1.0 * sinLight / cosLight;
+ }
+ else {
+ nNormal = vec3(0.0);
+ cosLight = clamp(dot(v_LightDirection, normalize(vec3(v_LightDirection.x, 0.0, v_LightDirection.z))), 1e-2, 1.0);
+ float sinLight = pow(1 - pow(cosLight, 2.0), 0.5);
+ normalOffsetScale = 0.0;
+ z_bias = 3.6e3 * sinLight / cosLight;
+ }
+ z_bias *= pFactor * pFactor / f_textureresolution / f_shadowfar;
+
+ shadow_position = applyPerspectiveDistortion(m_ShadowViewProj * mWorld * (inVertexPosition + vec4(normalOffsetScale * nNormal, 0.0))).xyz;
+ shadow_position.z -= z_bias;
+ perspective_factor = pFactor;
+
+ if (f_timeofday < 0.2) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
+ } else if (f_timeofday >= 0.8) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ mtsmoothstep(0.8, 0.83, f_timeofday);
+ } else {
+ adj_shadow_strength = f_shadow_strength *
+ mtsmoothstep(0.20, 0.25, f_timeofday) *
+ (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
+ }
}
- f_normal_length = length(vNormal);
#endif
-
}
diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl
index 3390e7227..1fefc764b 100644
--- a/client/shaders/object_shader/opengl_fragment.glsl
+++ b/client/shaders/object_shader/opengl_fragment.glsl
@@ -1,28 +1,13 @@
uniform sampler2D baseTexture;
-uniform vec4 emissiveColor;
+uniform vec3 dayLight;
uniform vec4 skyBgColor;
uniform float fogDistance;
uniform vec3 eyePosition;
-varying vec3 vNormal;
-varying vec3 vPosition;
-varying vec3 worldPosition;
-varying lowp vec4 varColor;
-#ifdef GL_ES
-varying mediump vec2 varTexCoord;
-#else
-centroid varying vec2 varTexCoord;
-#endif
-
-varying vec3 eyeVec;
-varying float vIDiff;
-
-const float e = 2.718281828459;
-const float BS = 10.0;
-const float fogStart = FOG_START;
-const float fogShadingParameter = 1.0 / (1.0 - fogStart);
-
+// The cameraOffset is the current center of the visible world.
+uniform vec3 cameraOffset;
+uniform float animationTimer;
#ifdef ENABLE_DYNAMIC_SHADOWS
// shadow texture
uniform sampler2D ShadowMapSampler;
@@ -31,57 +16,42 @@ const float fogShadingParameter = 1.0 / (1.0 - fogStart);
uniform float f_textureresolution;
uniform mat4 m_ShadowViewProj;
uniform float f_shadowfar;
- uniform float f_timeofday;
- varying float normalOffsetScale;
+ uniform float f_shadow_strength;
+ uniform vec4 CameraPos;
+ uniform float xyPerspectiveBias0;
+ uniform float xyPerspectiveBias1;
+
varying float adj_shadow_strength;
varying float cosLight;
varying float f_normal_length;
+ varying vec3 shadow_position;
+ varying float perspective_factor;
#endif
-#if ENABLE_TONE_MAPPING
-/* Hable's UC2 Tone mapping parameters
- A = 0.22;
- B = 0.30;
- C = 0.10;
- D = 0.20;
- E = 0.01;
- F = 0.30;
- W = 11.2;
- equation used: ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
-*/
-
-vec3 uncharted2Tonemap(vec3 x)
-{
- return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
-}
-vec4 applyToneMapping(vec4 color)
-{
- color = vec4(pow(color.rgb, vec3(2.2)), color.a);
- const float gamma = 1.6;
- const float exposureBias = 5.5;
- color.rgb = uncharted2Tonemap(exposureBias * color.rgb);
- // Precalculated white_scale from
- //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W));
- vec3 whiteScale = vec3(1.036015346);
- color.rgb *= whiteScale;
- return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a);
-}
+varying vec3 vNormal;
+varying vec3 vPosition;
+// World position in the visible world (i.e. relative to the cameraOffset.)
+// This can be used for many shader effects without loss of precision.
+// If the absolute position is required it can be calculated with
+// cameraOffset + worldPosition (for large coordinates the limits of float
+// precision must be considered).
+varying vec3 worldPosition;
+varying lowp vec4 varColor;
+#ifdef GL_ES
+varying mediump vec2 varTexCoord;
+#else
+centroid varying vec2 varTexCoord;
#endif
+varying vec3 eyeVec;
+varying float nightRatio;
-#ifdef ENABLE_DYNAMIC_SHADOWS
-const float bias0 = 0.9;
-const float zPersFactor = 0.5;
-const float bias1 = 1.0 - bias0;
+varying float vIDiff;
-vec4 getPerspectiveFactor(in vec4 shadowPosition)
-{
- float pDistance = length(shadowPosition.xy);
- float pFactor = pDistance * bias0 + bias1;
- shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1.0 / (1.0 - fogStart);
- return shadowPosition;
-}
+#ifdef ENABLE_DYNAMIC_SHADOWS
// assuming near is always 1.0
float getLinearDepth()
@@ -91,11 +61,14 @@ float getLinearDepth()
vec3 getLightSpacePosition()
{
- vec4 pLightSpace;
- float normalBias = 0.0005 * getLinearDepth() * cosLight + normalOffsetScale;
- pLightSpace = m_ShadowViewProj * vec4(worldPosition + normalBias * normalize(vNormal), 1.0);
- pLightSpace = getPerspectiveFactor(pLightSpace);
- return pLightSpace.xyz * 0.5 + 0.5;
+ return shadow_position * 0.5 + 0.5;
+}
+// custom smoothstep implementation because it's not defined in glsl1.2
+// https://docs.gl/sl4/smoothstep
+float mtsmoothstep(in float edge0, in float edge1, in float x)
+{
+ float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+ return t * t * (3.0 - 2.0 * t);
}
#ifdef COLORED_SHADOWS
@@ -124,10 +97,10 @@ vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDist
{
vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy).rgba;
- float visibility = step(0.0, (realDistance-2e-5) - texDepth.r);
+ float visibility = step(0.0, realDistance - texDepth.r);
vec4 result = vec4(visibility, vec3(0.0,0.0,0.0));//unpackColor(texDepth.g));
if (visibility < 0.1) {
- visibility = step(0.0, (realDistance-2e-5) - texDepth.r);
+ visibility = step(0.0, realDistance - texDepth.b);
result = vec4(visibility, unpackColor(texDepth.a));
}
return result;
@@ -138,32 +111,67 @@ vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDist
float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
float texDepth = texture2D(shadowsampler, smTexCoord.xy).r;
- float visibility = step(0.0, (realDistance-2e-5) - texDepth);
-
+ float visibility = step(0.0, realDistance - texDepth);
return visibility;
}
#endif
+
#if SHADOW_FILTER == 2
- #define PCFBOUND 3.5
- #define PCFSAMPLES 64.0
+ #define PCFBOUND 2.0 // 5x5
+ #define PCFSAMPLES 25
#elif SHADOW_FILTER == 1
- #define PCFBOUND 1.5
- #if defined(POISSON_FILTER)
- #define PCFSAMPLES 32.0
- #else
- #define PCFSAMPLES 16.0
- #endif
+ #define PCFBOUND 1.0 // 3x3
+ #define PCFSAMPLES 9
#else
#define PCFBOUND 0.0
- #if defined(POISSON_FILTER)
- #define PCFSAMPLES 4.0
- #else
- #define PCFSAMPLES 1.0
- #endif
+ #define PCFSAMPLES 1
#endif
+#ifdef COLORED_SHADOWS
+float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy);
+ float depth = max(realDistance - texDepth.r, realDistance - texDepth.b);
+ return depth;
+}
+#else
+float getHardShadowDepth(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ float texDepth = texture2D(shadowsampler, smTexCoord.xy).r;
+ float depth = realDistance - texDepth;
+ return depth;
+}
+#endif
+
+#define BASEFILTERRADIUS 1.0
+
+float getPenumbraRadius(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
+{
+ // Return fast if sharp shadows are requested
+ if (PCFBOUND == 0.0 || SOFTSHADOWRADIUS <= 0.0)
+ return 0.0;
+
+ vec2 clampedpos;
+ float y, x;
+ float depth = getHardShadowDepth(shadowsampler, smTexCoord.xy, realDistance);
+ // A factor from 0 to 1 to reduce blurring of short shadows
+ float sharpness_factor = 1.0;
+ // conversion factor from shadow depth to blur radius
+ float depth_to_blur = f_shadowfar / SOFTSHADOWRADIUS / xyPerspectiveBias0;
+ if (depth > 0.0 && f_normal_length > 0.0)
+ // 5 is empirical factor that controls how fast shadow loses sharpness
+ sharpness_factor = clamp(5 * depth * depth_to_blur, 0.0, 1.0);
+ depth = 0.0;
+
+ float world_to_texture = xyPerspectiveBias1 / perspective_factor / perspective_factor
+ * f_textureresolution / 2.0 / f_shadowfar;
+ float world_radius = 0.2; // shadow blur radius in world float coordinates, e.g. 0.2 = 0.02 of one node
+
+ return max(BASEFILTERRADIUS * f_textureresolution / 4096.0, sharpness_factor * world_radius * world_to_texture * SOFTSHADOWRADIUS);
+}
+
#ifdef POISSON_FILTER
const vec2[64] poissonDisk = vec2[64](
vec2(0.170019, -0.040254),
@@ -236,38 +244,54 @@ const vec2[64] poissonDisk = vec2[64](
vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
vec2 clampedpos;
vec4 visibility = vec4(0.0);
+ float scale_factor = radius / f_textureresolution;
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-PCFSAMPLES)));
- int end_offset = int(PCFSAMPLES) + init_offset;
+ int samples = (1 + 1 * int(SOFTSHADOWRADIUS > 1.0)) * PCFSAMPLES; // scale max samples for the soft shadows
+ samples = int(clamp(pow(4.0 * radius + 1.0, 2.0), 1.0, float(samples)));
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
+ int end_offset = int(samples) + init_offset;
for (int x = init_offset; x < end_offset; x++) {
- clampedpos = poissonDisk[x] * texture_size * SOFTSHADOWRADIUS + smTexCoord.xy;
+ clampedpos = poissonDisk[x] * scale_factor + smTexCoord.xy;
visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
}
- return visibility / PCFSAMPLES;
+ return visibility / samples;
}
#else
float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
vec2 clampedpos;
float visibility = 0.0;
+ float scale_factor = radius / f_textureresolution;
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-PCFSAMPLES)));
- int end_offset = int(PCFSAMPLES) + init_offset;
+ int samples = (1 + 1 * int(SOFTSHADOWRADIUS > 1.0)) * PCFSAMPLES; // scale max samples for the soft shadows
+ samples = int(clamp(pow(4.0 * radius + 1.0, 2.0), 1.0, float(samples)));
+ int init_offset = int(floor(mod(((smTexCoord.x * 34.0) + 1.0) * smTexCoord.y, 64.0-samples)));
+ int end_offset = int(samples) + init_offset;
for (int x = init_offset; x < end_offset; x++) {
- clampedpos = poissonDisk[x] * texture_size * SOFTSHADOWRADIUS + smTexCoord.xy;
+ clampedpos = poissonDisk[x] * scale_factor + smTexCoord.xy;
visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
}
- return visibility / PCFSAMPLES;
+ return visibility / samples;
}
#endif
@@ -279,42 +303,57 @@ float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
vec4 getShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadowColor(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
vec2 clampedpos;
vec4 visibility = vec4(0.0);
- float sradius=0.0;
- if( PCFBOUND>0)
- sradius = SOFTSHADOWRADIUS / PCFBOUND;
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- float y, x;
+ float x, y;
+ float bound = (1 + 0.5 * int(SOFTSHADOWRADIUS > 1.0)) * PCFBOUND; // scale max bound for soft shadows
+ bound = clamp(0.5 * (4.0 * radius - 1.0), 0.5, bound);
+ float scale_factor = radius / bound / f_textureresolution;
+ float n = 0.0;
+
// basic PCF filter
- for (y = -PCFBOUND; y <= PCFBOUND; y += 1.0)
- for (x = -PCFBOUND; x <= PCFBOUND; x += 1.0) {
- clampedpos = vec2(x,y) * texture_size* sradius + smTexCoord.xy;
+ for (y = -bound; y <= bound; y += 1.0)
+ for (x = -bound; x <= bound; x += 1.0) {
+ clampedpos = vec2(x,y) * scale_factor + smTexCoord.xy;
visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance);
+ n += 1.0;
}
- return visibility / PCFSAMPLES;
+ return visibility / max(n, 1.0);
}
#else
float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
{
+ float radius = getPenumbraRadius(shadowsampler, smTexCoord, realDistance);
+ if (radius < 0.1) {
+ // we are in the middle of even brightness, no need for filtering
+ return getHardShadow(shadowsampler, smTexCoord.xy, realDistance);
+ }
+
vec2 clampedpos;
float visibility = 0.0;
- float sradius=0.0;
- if( PCFBOUND>0)
- sradius = SOFTSHADOWRADIUS / PCFBOUND;
-
- float texture_size = 1.0 / (f_textureresolution * 0.5);
- float y, x;
+ float x, y;
+ float bound = (1 + 0.5 * int(SOFTSHADOWRADIUS > 1.0)) * PCFBOUND; // scale max bound for soft shadows
+ bound = clamp(0.5 * (4.0 * radius - 1.0), 0.5, bound);
+ float scale_factor = radius / bound / f_textureresolution;
+ float n = 0.0;
+
// basic PCF filter
- for (y = -PCFBOUND; y <= PCFBOUND; y += 1.0)
- for (x = -PCFBOUND; x <= PCFBOUND; x += 1.0) {
- clampedpos = vec2(x,y) * texture_size * sradius + smTexCoord.xy;
+ for (y = -bound; y <= bound; y += 1.0)
+ for (x = -bound; x <= bound; x += 1.0) {
+ clampedpos = vec2(x,y) * scale_factor + smTexCoord.xy;
visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance);
+ n += 1.0;
}
- return visibility / PCFSAMPLES;
+ return visibility / max(n, 1.0);
}
#endif
@@ -322,12 +361,46 @@ float getShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance)
#endif
#endif
+#if ENABLE_TONE_MAPPING
+
+/* Hable's UC2 Tone mapping parameters
+ A = 0.22;
+ B = 0.30;
+ C = 0.10;
+ D = 0.20;
+ E = 0.01;
+ F = 0.30;
+ W = 11.2;
+ equation used: ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F
+*/
+
+vec3 uncharted2Tonemap(vec3 x)
+{
+ return ((x * (0.22 * x + 0.03) + 0.002) / (x * (0.22 * x + 0.3) + 0.06)) - 0.03333;
+}
+
+vec4 applyToneMapping(vec4 color)
+{
+ color = vec4(pow(color.rgb, vec3(2.2)), color.a);
+ const float gamma = 1.6;
+ const float exposureBias = 5.5;
+ color.rgb = uncharted2Tonemap(exposureBias * color.rgb);
+ // Precalculated white_scale from
+ //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W));
+ vec3 whiteScale = vec3(1.036015346);
+ color.rgb *= whiteScale;
+ return vec4(pow(color.rgb, vec3(1.0 / gamma)), color.a);
+}
+#endif
+
+
+
void main(void)
{
vec3 color;
vec2 uv = varTexCoord.st;
- vec4 base = texture2D(baseTexture, uv).rgba;
+ vec4 base = texture2D(baseTexture, uv).rgba;
// If alpha is zero, we can just discard the pixel. This fixes transparency
// on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa,
// and also on GLES 2, where GL_ALPHA_TEST is missing entirely.
@@ -341,38 +414,65 @@ void main(void)
#endif
color = base.rgb;
- vec4 col = vec4(color.rgb, base.a);
- col.rgb *= varColor.rgb;
- col.rgb *= emissiveColor.rgb * vIDiff;
+ vec4 col = vec4(color.rgb * varColor.rgb, 1.0);
+ col.rgb *= vIDiff;
#ifdef ENABLE_DYNAMIC_SHADOWS
- float shadow_int = 0.0;
- vec3 shadow_color = vec3(0.0, 0.0, 0.0);
- vec3 posLightSpace = getLightSpacePosition();
+ if (f_shadow_strength > 0.0) {
+ float shadow_int = 0.0;
+ vec3 shadow_color = vec3(0.0, 0.0, 0.0);
+ vec3 posLightSpace = getLightSpacePosition();
+
+ float distance_rate = (1.0 - pow(clamp(2.0 * length(posLightSpace.xy - 0.5),0.0,1.0), 10.0));
+ if (max(abs(posLightSpace.x - 0.5), abs(posLightSpace.y - 0.5)) > 0.5)
+ distance_rate = 0.0;
+ float f_adj_shadow_strength = max(adj_shadow_strength-mtsmoothstep(0.9,1.1, posLightSpace.z),0.0);
+
+ if (distance_rate > 1e-7) {
#ifdef COLORED_SHADOWS
- vec4 visibility;
- if (cosLight > 0.0)
- visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
- else
- visibility = vec4(1.0, 0.0, 0.0, 0.0);
- shadow_int = visibility.r;
- shadow_color = visibility.gba;
+ vec4 visibility;
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
+ visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ visibility = vec4(1.0, 0.0, 0.0, 0.0);
+ shadow_int = visibility.r;
+ shadow_color = visibility.gba;
#else
- shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
+ shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
+ else
+ shadow_int = 1.0;
#endif
-
- if (f_normal_length != 0 && cosLight <= 0.001) {
- shadow_int = clamp(shadow_int + 0.5 * abs(cosLight), 0.0, 1.0);
+ shadow_int *= distance_rate;
+ shadow_int = clamp(shadow_int, 0.0, 1.0);
+
+ }
+
+ // turns out that nightRatio falls off much faster than
+ // actual brightness of artificial light in relation to natual light.
+ // Power ratio was measured on torches in MTG (brightness = 14).
+ float adjusted_night_ratio = pow(max(0.0, nightRatio), 0.6);
+
+ // Apply self-shadowing when light falls at a narrow angle to the surface
+ // Cosine of the cut-off angle.
+ const float self_shadow_cutoff_cosine = 0.14;
+ if (f_normal_length != 0 && cosLight < self_shadow_cutoff_cosine) {
+ shadow_int = max(shadow_int, 1 - clamp(cosLight, 0.0, self_shadow_cutoff_cosine)/self_shadow_cutoff_cosine);
+ shadow_color = mix(vec3(0.0), shadow_color, min(cosLight, self_shadow_cutoff_cosine)/self_shadow_cutoff_cosine);
+ }
+
+ shadow_int *= f_adj_shadow_strength;
+
+ // calculate fragment color from components:
+ col.rgb =
+ adjusted_night_ratio * col.rgb + // artificial light
+ (1.0 - adjusted_night_ratio) * ( // natural light
+ col.rgb * (1.0 - shadow_int * (1.0 - shadow_color)) + // filtered texture color
+ dayLight * shadow_color * shadow_int); // reflected filtered sunlight/moonlight
}
-
- shadow_int = 1.0 - (shadow_int * adj_shadow_strength);
-
- col.rgb = mix(shadow_color, col.rgb, shadow_int) * shadow_int;
#endif
-
-
#if ENABLE_TONE_MAPPING
col = applyToneMapping(col);
#endif
@@ -389,6 +489,7 @@ void main(void)
float clarity = clamp(fogShadingParameter
- fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
col = mix(skyBgColor, col, clarity);
+ col = vec4(col.rgb, base.a);
- gl_FragColor = vec4(col.rgb, base.a);
+ gl_FragColor = col;
}
diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl
index f135ab9dc..dc9c70cdf 100644
--- a/client/shaders/object_shader/opengl_vertex.glsl
+++ b/client/shaders/object_shader/opengl_vertex.glsl
@@ -1,7 +1,10 @@
uniform mat4 mWorld;
-
+uniform vec3 dayLight;
uniform vec3 eyePosition;
uniform float animationTimer;
+uniform vec4 emissiveColor;
+uniform vec3 cameraOffset;
+
varying vec3 vNormal;
varying vec3 vPosition;
@@ -21,19 +24,54 @@ centroid varying vec2 varTexCoord;
uniform float f_shadowfar;
uniform float f_shadow_strength;
uniform float f_timeofday;
+ uniform vec4 CameraPos;
+
varying float cosLight;
- varying float normalOffsetScale;
varying float adj_shadow_strength;
varying float f_normal_length;
+ varying vec3 shadow_position;
+ varying float perspective_factor;
#endif
varying vec3 eyeVec;
+varying float nightRatio;
+// Color of the light emitted by the light sources.
+const vec3 artificialLight = vec3(1.04, 1.04, 1.04);
varying float vIDiff;
-
const float e = 2.718281828459;
const float BS = 10.0;
+uniform float xyPerspectiveBias0;
+uniform float xyPerspectiveBias1;
+uniform float zPerspectiveBias;
#ifdef ENABLE_DYNAMIC_SHADOWS
+
+vec4 getRelativePosition(in vec4 position)
+{
+ vec2 l = position.xy - CameraPos.xy;
+ vec2 s = l / abs(l);
+ s = (1.0 - s * CameraPos.xy);
+ l /= s;
+ return vec4(l, s);
+}
+
+float getPerspectiveFactor(in vec4 relativePosition)
+{
+ float pDistance = length(relativePosition.xy);
+ float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1;
+ return pFactor;
+}
+
+vec4 applyPerspectiveDistortion(in vec4 position)
+{
+ vec4 l = getRelativePosition(position);
+ float pFactor = getPerspectiveFactor(l);
+ l.xy /= pFactor;
+ position.xy = l.xy * l.zw + CameraPos.xy;
+ position.z *= zPerspectiveBias;
+ return position;
+}
+
// custom smoothstep implementation because it's not defined in glsl1.2
// https://docs.gl/sl4/smoothstep
float mtsmoothstep(in float edge0, in float edge1, in float x)
@@ -60,7 +98,7 @@ void main(void)
gl_Position = mWorldViewProj * inVertexPosition;
vPosition = gl_Position.xyz;
- vNormal = inVertexNormal;
+ vNormal = (mWorld * vec4(inVertexNormal, 0.0)).xyz;
worldPosition = (mWorld * inVertexPosition).xyz;
eyeVec = -(mWorldView * inVertexPosition).xyz;
@@ -75,29 +113,69 @@ void main(void)
#endif
#ifdef GL_ES
- varColor = inVertexColor.bgra;
+ vec4 color = inVertexColor.bgra;
#else
- varColor = inVertexColor;
+ vec4 color = inVertexColor;
#endif
-#ifdef ENABLE_DYNAMIC_SHADOWS
+ color *= emissiveColor;
- cosLight = max(0.0, dot(vNormal, -v_LightDirection));
- float texelSize = 0.51;
- float slopeScale = clamp(1.0 - cosLight, 0.0, 1.0);
- normalOffsetScale = texelSize * slopeScale;
- if (f_timeofday < 0.2) {
- adj_shadow_strength = f_shadow_strength * 0.5 *
- (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
- } else if (f_timeofday >= 0.8) {
- adj_shadow_strength = f_shadow_strength * 0.5 *
- mtsmoothstep(0.8, 0.83, f_timeofday);
- } else {
- adj_shadow_strength = f_shadow_strength *
- mtsmoothstep(0.20, 0.25, f_timeofday) *
- (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
- }
- f_normal_length = length(vNormal);
+ // The alpha gives the ratio of sunlight in the incoming light.
+ nightRatio = 1.0 - color.a;
+ color.rgb = color.rgb * (color.a * dayLight.rgb +
+ nightRatio * artificialLight.rgb) * 2.0;
+ color.a = 1.0;
+ // Emphase blue a bit in darker places
+ // See C++ implementation in mapblock_mesh.cpp final_color_blend()
+ float brightness = (color.r + color.g + color.b) / 3.0;
+ color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) +
+ 0.07 * brightness);
+
+ varColor = clamp(color, 0.0, 1.0);
+
+
+#ifdef ENABLE_DYNAMIC_SHADOWS
+ if (f_shadow_strength > 0.0) {
+ vec3 nNormal = normalize(vNormal);
+ f_normal_length = length(vNormal);
+
+ /* normalOffsetScale is in world coordinates (1/10th of a meter)
+ z_bias is in light space coordinates */
+ float normalOffsetScale, z_bias;
+ float pFactor = getPerspectiveFactor(getRelativePosition(m_ShadowViewProj * mWorld * inVertexPosition));
+ if (f_normal_length > 0.0) {
+ nNormal = normalize(vNormal);
+ cosLight = dot(nNormal, -v_LightDirection);
+ float sinLight = pow(1 - pow(cosLight, 2.0), 0.5);
+ normalOffsetScale = 0.1 * pFactor * pFactor * sinLight * min(f_shadowfar, 500.0) /
+ xyPerspectiveBias1 / f_textureresolution;
+ z_bias = 1e3 * sinLight / cosLight * (0.5 + f_textureresolution / 1024.0);
+ }
+ else {
+ nNormal = vec3(0.0);
+ cosLight = clamp(dot(v_LightDirection, normalize(vec3(v_LightDirection.x, 0.0, v_LightDirection.z))), 1e-2, 1.0);
+ float sinLight = pow(1 - pow(cosLight, 2.0), 0.5);
+ normalOffsetScale = 0.0;
+ z_bias = 3.6e3 * sinLight / cosLight;
+ }
+ z_bias *= pFactor * pFactor / f_textureresolution / f_shadowfar;
+
+ shadow_position = applyPerspectiveDistortion(m_ShadowViewProj * mWorld * (inVertexPosition + vec4(normalOffsetScale * nNormal, 0.0))).xyz;
+ shadow_position.z -= z_bias;
+ perspective_factor = pFactor;
+
+ if (f_timeofday < 0.2) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ (1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
+ } else if (f_timeofday >= 0.8) {
+ adj_shadow_strength = f_shadow_strength * 0.5 *
+ mtsmoothstep(0.8, 0.83, f_timeofday);
+ } else {
+ adj_shadow_strength = f_shadow_strength *
+ mtsmoothstep(0.20, 0.25, f_timeofday) *
+ (1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
+ }
+ }
#endif
}
diff --git a/client/shaders/shadow_shaders/pass1_trans_vertex.glsl b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl
index 0a9efe450..244d2562a 100644
--- a/client/shaders/shadow_shaders/pass1_trans_vertex.glsl
+++ b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl
@@ -1,28 +1,45 @@
uniform mat4 LightMVP; // world matrix
+uniform vec4 CameraPos;
varying vec4 tPos;
#ifdef COLORED_SHADOWS
varying vec3 varColor;
#endif
-const float bias0 = 0.9;
-const float zPersFactor = 0.5;
-const float bias1 = 1.0 - bias0 + 1e-6;
+uniform float xyPerspectiveBias0;
+uniform float xyPerspectiveBias1;
+uniform float zPerspectiveBias;
-vec4 getPerspectiveFactor(in vec4 shadowPosition)
+vec4 getRelativePosition(in vec4 position)
{
- float pDistance = length(shadowPosition.xy);
- float pFactor = pDistance * bias0 + bias1;
- shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+ vec2 l = position.xy - CameraPos.xy;
+ vec2 s = l / abs(l);
+ s = (1.0 - s * CameraPos.xy);
+ l /= s;
+ return vec4(l, s);
+}
- return shadowPosition;
+float getPerspectiveFactor(in vec4 relativePosition)
+{
+ float pDistance = length(relativePosition.xy);
+ float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1;
+ return pFactor;
}
+vec4 applyPerspectiveDistortion(in vec4 position)
+{
+ vec4 l = getRelativePosition(position);
+ float pFactor = getPerspectiveFactor(l);
+ l.xy /= pFactor;
+ position.xy = l.xy * l.zw + CameraPos.xy;
+ position.z *= zPerspectiveBias;
+ return position;
+}
void main()
{
vec4 pos = LightMVP * gl_Vertex;
- tPos = getPerspectiveFactor(LightMVP * gl_Vertex);
+ tPos = applyPerspectiveDistortion(LightMVP * gl_Vertex);
gl_Position = vec4(tPos.xyz, 1.0);
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
diff --git a/client/shaders/shadow_shaders/pass1_vertex.glsl b/client/shaders/shadow_shaders/pass1_vertex.glsl
index a6d8b3db8..1dceb93c6 100644
--- a/client/shaders/shadow_shaders/pass1_vertex.glsl
+++ b/client/shaders/shadow_shaders/pass1_vertex.glsl
@@ -1,26 +1,43 @@
uniform mat4 LightMVP; // world matrix
+uniform vec4 CameraPos; // camera position
varying vec4 tPos;
-const float bias0 = 0.9;
-const float zPersFactor = 0.5;
-const float bias1 = 1.0 - bias0 + 1e-6;
+uniform float xyPerspectiveBias0;
+uniform float xyPerspectiveBias1;
+uniform float zPerspectiveBias;
-vec4 getPerspectiveFactor(in vec4 shadowPosition)
+vec4 getRelativePosition(in vec4 position)
{
- float pDistance = length(shadowPosition.xy);
- float pFactor = pDistance * bias0 + bias1;
- shadowPosition.xyz *= vec3(vec2(1.0 / pFactor), zPersFactor);
+ vec2 l = position.xy - CameraPos.xy;
+ vec2 s = l / abs(l);
+ s = (1.0 - s * CameraPos.xy);
+ l /= s;
+ return vec4(l, s);
+}
- return shadowPosition;
+float getPerspectiveFactor(in vec4 relativePosition)
+{
+ float pDistance = length(relativePosition.xy);
+ float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1;
+ return pFactor;
}
+vec4 applyPerspectiveDistortion(in vec4 position)
+{
+ vec4 l = getRelativePosition(position);
+ float pFactor = getPerspectiveFactor(l);
+ l.xy /= pFactor;
+ position.xy = l.xy * l.zw + CameraPos.xy;
+ position.z *= zPerspectiveBias;
+ return position;
+}
void main()
{
vec4 pos = LightMVP * gl_Vertex;
- tPos = getPerspectiveFactor(pos);
+ tPos = applyPerspectiveDistortion(pos);
gl_Position = vec4(tPos.xyz, 1.0);
- gl_TexCoord[0].st = gl_MultiTexCoord0.st;
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
}
diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua
index 977ed0ec3..46d59ec9a 100644
--- a/clientmods/preview/init.lua
+++ b/clientmods/preview/init.lua
@@ -165,6 +165,9 @@ core.after(5, function()
print("[PREVIEW] Find node near: " .. dump(core.find_node_near({x=0, y=20, z=0}, 10,
{"group:tree", "default:dirt", "default:stone"})))
+
+ print("[PREVIEW] Settings: preview_csm_test_setting = " ..
+ tostring(core.settings:get_bool("preview_csm_test_setting", false)))
end)
core.register_on_dignode(function(pos, node)
diff --git a/clientmods/preview/mod.conf b/clientmods/preview/mod.conf
index 4e56ec293..23a5c3e90 100644
--- a/clientmods/preview/mod.conf
+++ b/clientmods/preview/mod.conf
@@ -1 +1 @@
-name = preview
+name = preview
diff --git a/clientmods/preview/settingtypes.txt b/clientmods/preview/settingtypes.txt
new file mode 100644
index 000000000..fea9e71f3
--- /dev/null
+++ b/clientmods/preview/settingtypes.txt
@@ -0,0 +1 @@
+preview_csm_test_setting (Test CSM setting) bool false \ No newline at end of file
diff --git a/cmake/Modules/FindOpenGLES2.cmake b/cmake/Modules/FindOpenGLES2.cmake
deleted file mode 100644
index ce04191dd..000000000
--- a/cmake/Modules/FindOpenGLES2.cmake
+++ /dev/null
@@ -1,73 +0,0 @@
-#-------------------------------------------------------------------
-# The contents of this file are placed in the public domain. Feel
-# free to make use of it in any way you like.
-#-------------------------------------------------------------------
-
-# - Try to find OpenGLES and EGL
-# Once done this will define
-#
-# OPENGLES2_FOUND - system has OpenGLES
-# OPENGLES2_INCLUDE_DIR - the GL include directory
-# OPENGLES2_LIBRARIES - Link these to use OpenGLES
-#
-# EGL_FOUND - system has EGL
-# EGL_INCLUDE_DIR - the EGL include directory
-# EGL_LIBRARIES - Link these to use EGL
-
-# Win32 and Apple are not tested!
-# Linux tested and works
-
-if(WIN32)
- find_path(OPENGLES2_INCLUDE_DIR GLES2/gl2.h)
- find_library(OPENGLES2_LIBRARY libGLESv2)
-elseif(APPLE)
- create_search_paths(/Developer/Platforms)
- findpkg_framework(OpenGLES2)
- set(OPENGLES2_LIBRARY "-framework OpenGLES")
-else()
- # Unix
- find_path(OPENGLES2_INCLUDE_DIR GLES2/gl2.h
- PATHS /usr/openwin/share/include
- /opt/graphics/OpenGL/include
- /usr/X11R6/include
- /usr/include
- )
-
- find_library(OPENGLES2_LIBRARY
- NAMES GLESv2
- PATHS /opt/graphics/OpenGL/lib
- /usr/openwin/lib
- /usr/X11R6/lib
- /usr/lib
- )
-
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(OpenGLES2 DEFAULT_MSG OPENGLES2_LIBRARY OPENGLES2_INCLUDE_DIR)
-
- find_path(EGL_INCLUDE_DIR EGL/egl.h
- PATHS /usr/openwin/share/include
- /opt/graphics/OpenGL/include
- /usr/X11R6/include
- /usr/include
- )
-
- find_library(EGL_LIBRARY
- NAMES EGL
- PATHS /opt/graphics/OpenGL/lib
- /usr/openwin/lib
- /usr/X11R6/lib
- /usr/lib
- )
-
- find_package_handle_standard_args(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR)
-endif()
-
-set(OPENGLES2_LIBRARIES ${OPENGLES2_LIBRARY})
-set(EGL_LIBRARIES ${EGL_LIBRARY})
-
-mark_as_advanced(
- OPENGLES2_INCLUDE_DIR
- OPENGLES2_LIBRARY
- EGL_INCLUDE_DIR
- EGL_LIBRARY
-)
diff --git a/cmake/Modules/FindSQLite3.cmake b/cmake/Modules/FindSQLite3.cmake
index b23553a80..8a66cb241 100644
--- a/cmake/Modules/FindSQLite3.cmake
+++ b/cmake/Modules/FindSQLite3.cmake
@@ -1,4 +1,4 @@
-mark_as_advanced(SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR)
+mark_as_advanced(SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR)
find_path(SQLITE3_INCLUDE_DIR sqlite3.h)
diff --git a/cmake/Modules/FindVorbis.cmake b/cmake/Modules/FindVorbis.cmake
index e5fe7f25e..222ddd9d5 100644
--- a/cmake/Modules/FindVorbis.cmake
+++ b/cmake/Modules/FindVorbis.cmake
@@ -29,18 +29,17 @@ else(NOT GP2XWIZ)
find_package_handle_standard_args(Vorbis DEFAULT_MSG
VORBIS_INCLUDE_DIR VORBIS_LIBRARY)
endif(NOT GP2XWIZ)
-
+
if(VORBIS_FOUND)
- if(NOT GP2XWIZ)
- set(VORBIS_LIBRARIES ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY}
- ${OGG_LIBRARY})
- else(NOT GP2XWIZ)
- set(VORBIS_LIBRARIES ${VORBIS_LIBRARY})
- endif(NOT GP2XWIZ)
+ if(NOT GP2XWIZ)
+ set(VORBIS_LIBRARIES ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY}
+ ${OGG_LIBRARY})
+ else(NOT GP2XWIZ)
+ set(VORBIS_LIBRARIES ${VORBIS_LIBRARY})
+ endif(NOT GP2XWIZ)
else(VORBIS_FOUND)
- set(VORBIS_LIBRARIES)
+ set(VORBIS_LIBRARIES)
endif(VORBIS_FOUND)
mark_as_advanced(OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR)
mark_as_advanced(OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
-
diff --git a/cmake/Modules/MinetestFindIrrlichtHeaders.cmake b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
index d33b296d0..e434b582f 100644
--- a/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
+++ b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake
@@ -1,21 +1,13 @@
-# Locate Irrlicht or IrrlichtMt headers on system.
+# Locate IrrlichtMt headers on system.
-foreach(libname IN ITEMS IrrlichtMt Irrlicht)
- string(TOLOWER "${libname}" libname2)
-
- find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
- DOC "Path to the directory with IrrlichtMt includes"
- PATHS
- /usr/local/include/${libname2}
- /usr/include/${libname2}
- /system/develop/headers/${libname2} #Haiku
- PATH_SUFFIXES "include/${libname2}"
- )
-
- if(IRRLICHT_INCLUDE_DIR)
- break()
- endif()
-endforeach()
+find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h
+ DOC "Path to the directory with IrrlichtMt includes"
+ PATHS
+ /usr/local/include/irrlichtmt
+ /usr/include/irrlichtmt
+ /system/develop/headers/irrlichtmt #Haiku
+ PATH_SUFFIXES "include/irrlichtmt"
+)
# Handholding for users
if(IRRLICHT_INCLUDE_DIR AND (NOT IS_DIRECTORY "${IRRLICHT_INCLUDE_DIR}" OR
diff --git a/doc/breakages.md b/doc/breakages.md
new file mode 100644
index 000000000..f7078f1e9
--- /dev/null
+++ b/doc/breakages.md
@@ -0,0 +1,8 @@
+# Minetest Major Breakages List
+
+This document contains a list of breaking changes to be made in the next major version.
+
+* Remove attachment space multiplier (*10)
+* `get_sky()` returns a table (without arg)
+* `game.conf` name/id mess
+* remove `depends.txt` / `description.txt` (would simplify ContentDB and Minetest code a little)
diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt
index 32be8c849..8a450ba13 100644
--- a/doc/client_lua_api.txt
+++ b/doc/client_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Client Modding API Reference 5.5.0
+Minetest Lua Client Modding API Reference 5.6.0
================================================
* More information at <http://www.minetest.net/>
* Developer Wiki: <http://dev.minetest.net/>
@@ -580,6 +580,7 @@ Spatial Vectors
* `vector.floor(v)`: returns a vector, each dimension rounded down
* `vector.round(v)`: returns a vector, each dimension rounded to nearest int
* `vector.apply(v, func)`: returns a vector
+* `vector.combine(v, w, func)`: returns a vector
* `vector.equals(v1, v2)`: returns a boolean
For the following functions `x` can be either a vector or a number:
@@ -937,6 +938,14 @@ Call these functions only at load time!
* `minetest.display_chat_message(message)` returns true on success
* Shows a chat message to the current player.
+Setting-related
+---------------
+
+* `minetest.settings`: Settings object containing all of the settings from the
+ main config file (`minetest.conf`). Check lua_api.txt for class reference.
+* `minetest.setting_get_pos(name)`: Loads a setting from the main settings and
+ parses it as a position (in the format `(1,2,3)`). Returns a position or nil.
+
Class reference
---------------
diff --git a/doc/lgpl-2.1.txt b/doc/lgpl-2.1.txt
index 4362b4915..e5ab03e12 100644
--- a/doc/lgpl-2.1.txt
+++ b/doc/lgpl-2.1.txt
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
-
+
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
-
+
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
-
+
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
-
+
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
-
+
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
-
+
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
-
+
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
-
+
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
-
+
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index faaed55e1..9e1633a14 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -35,19 +35,16 @@ the `init.lua` scripts in a shared environment.
Paths
-----
-* `RUN_IN_PLACE=1` (Windows release, local build)
- * `$path_user`: `<build directory>`
- * `$path_share`: `<build directory>`
-* `RUN_IN_PLACE=0`: (Linux release)
- * `$path_share`:
- * Linux: `/usr/share/minetest`
- * Windows: `<install directory>/minetest-0.4.x`
- * `$path_user`:
- * Linux: `$HOME/.minetest`
- * Windows: `C:/users/<user>/AppData/minetest` (maybe)
-
+Minetest keeps and looks for files mostly in two paths. `path_share` or `path_user`.
+`path_share` contains possibly read-only content for the engine (incl. games and mods).
+`path_user` contains mods or games installed by the user but also the users
+worlds or settings.
+With a local build (`RUN_IN_PLACE=1`) `path_share` and `path_user` both point to
+the build directory. For system-wide builds on Linux the share path is usually at
+`/usr/share/minetest` while the user path resides in `.minetest` in the home directory.
+Paths on other operating systems will differ.
Games
=====
@@ -62,7 +59,8 @@ Where `<gameid>` is unique to each game.
The game directory can contain the following files:
* `game.conf`, with the following keys:
- * `name`: Required, a human readable title to address the game, e.g. `name = Minetest`.
+ * `title`: Required, a human-readable title to address the game, e.g. `title = Minetest Game`.
+ * `name`: (Deprecated) same as title.
* `description`: Short description to be shown in the content tab
* `allowed_mapgens = <comma-separated mapgens>`
e.g. `allowed_mapgens = v5,v6,flat`
@@ -78,7 +76,7 @@ The game directory can contain the following files:
* `disallowed_mapgen_settings= <comma-separated mapgen settings>`
e.g. `disallowed_mapgen_settings = mgv5_spflags`
These mapgen settings are hidden for this game in the world creation
- dialog and game start menu.
+ dialog and game start menu. Add `seed` to hide the seed input field.
* `disabled_settings = <comma-separated settings>`
e.g. `disabled_settings = enable_damage, creative_mode`
These settings are hidden for this game in the "Start game" tab
@@ -213,8 +211,6 @@ A `Settings` file that provides meta information about the mod.
internal ID used to track versions.
* `title`: A human-readable title to address the mod.
-Note: to support 0.4.x, please also provide depends.txt.
-
### `screenshot.png`
A screenshot shown in the mod manager within the main menu. It should
@@ -303,8 +299,8 @@ Any mod can redefine `experimental:tnt` by using the name
:experimental:tnt
-when registering it. That mod is required to have `experimental` as a
-dependency.
+when registering it. For this to work correctly, that mod must have
+`experimental` as a dependency.
@@ -345,9 +341,9 @@ of the game's nodes are to be used for core mapgen generation. For example:
#### Essential aliases
-* mapgen_stone
-* mapgen_water_source
-* mapgen_river_water_source
+* `mapgen_stone`
+* `mapgen_water_source`
+* `mapgen_river_water_source`
`mapgen_river_water_source` is required for mapgens with sloping rivers where
it is necessary to have a river liquid node with a short `liquid_range` and
@@ -355,50 +351,56 @@ it is necessary to have a river liquid node with a short `liquid_range` and
#### Optional aliases
-* mapgen_lava_source
+* `mapgen_lava_source`
Fallback lava node used if cave liquids are not defined in biome definitions.
-Deprecated for non-V6 mapgens, define cave liquids in biome definitions instead.
+Deprecated, define cave liquids in biome definitions instead.
-* mapgen_cobble
+* `mapgen_cobble`
Fallback node used if dungeon nodes are not defined in biome definitions.
-Deprecated for non-V6 mapgens, define dungeon nodes in biome definitions instead.
-
-### Aliases needed for Mapgen V6
-
-* mapgen_stone
-* mapgen_water_source
-* mapgen_lava_source
-* mapgen_dirt
-* mapgen_dirt_with_grass
-* mapgen_sand
-* mapgen_gravel
-* mapgen_desert_stone
-* mapgen_desert_sand
-* mapgen_dirt_with_snow
-* mapgen_snowblock
-* mapgen_snow
-* mapgen_ice
-
-* mapgen_tree
-* mapgen_leaves
-* mapgen_apple
-* mapgen_jungletree
-* mapgen_jungleleaves
-* mapgen_junglegrass
-* mapgen_pine_tree
-* mapgen_pine_needles
-
-* mapgen_cobble
-* mapgen_stair_cobble
-* mapgen_mossycobble
-* mapgen_stair_desert_stone
+Deprecated, define dungeon nodes in biome definitions instead.
+
+### Aliases for Mapgen V6
+
+#### Essential
+
+* `mapgen_stone`
+* `mapgen_water_source`
+* `mapgen_lava_source`
+* `mapgen_dirt`
+* `mapgen_dirt_with_grass`
+* `mapgen_sand`
+
+* `mapgen_tree`
+* `mapgen_leaves`
+* `mapgen_apple`
+
+* `mapgen_cobble`
+
+#### Optional
+
+* `mapgen_gravel` (falls back to stone)
+* `mapgen_desert_stone` (falls back to stone)
+* `mapgen_desert_sand` (falls back to sand)
+* `mapgen_dirt_with_snow` (falls back to dirt_with_grass)
+* `mapgen_snowblock` (falls back to dirt_with_grass)
+* `mapgen_snow` (not placed if missing)
+* `mapgen_ice` (falls back to water_source)
+
+* `mapgen_jungletree` (falls back to tree)
+* `mapgen_jungleleaves` (falls back to leaves)
+* `mapgen_junglegrass` (not placed if missing)
+* `mapgen_pine_tree` (falls back to tree)
+* `mapgen_pine_needles` (falls back to leaves)
+
+* `mapgen_stair_cobble` (falls back to cobble)
+* `mapgen_mossycobble` (falls back to cobble)
+* `mapgen_stair_desert_stone` (falls backto desert_stone)
### Setting the node used in Mapgen Singlenode
-By default the world is filled with air nodes. To set a different node use, for
-example:
+By default the world is filled with air nodes. To set a different node use e.g.:
minetest.register_alias("mapgen_singlenode", "default:stone")
@@ -419,6 +421,9 @@ stripping out the file extension:
* e.g. `foomod_foothing.png`
* e.g. `foomod_foothing`
+Supported texture formats are PNG (`.png`), JPEG (`.jpg`), Bitmap (`.bmp`)
+and Targa (`.tga`).
+Since better alternatives exist, the latter two may be removed in the future.
Texture modifiers
-----------------
@@ -981,15 +986,10 @@ Example:
All nodes register with `minetest.register_node` get added to the table
`minetest.registered_nodes`.
-If you want to check the drawtype of a node, you could do:
+If you want to check the drawtype of a node, you could do it like this:
- local function get_nodedef_field(nodename, fieldname)
- if not minetest.registered_nodes[nodename] then
- return nil
- end
- return minetest.registered_nodes[nodename][fieldname]
- end
- local drawtype = get_nodedef_field(nodename, "drawtype")
+ local def = minetest.registered_nodes[nodename]
+ local drawtype = def and def.drawtype
@@ -1191,7 +1191,7 @@ Look for examples in `games/devtest` or `games/minetest_game`.
used to compensate for how `glasslike` reduces visual thickness.
* `torchlike`
* A single vertical texture.
- * If `paramtype2="[color]wallmounted":
+ * If `paramtype2="[color]wallmounted"`:
* If placed on top of a node, uses the first texture specified in `tiles`.
* If placed against the underside of a node, uses the second texture
specified in `tiles`.
@@ -1203,7 +1203,7 @@ Look for examples in `games/devtest` or `games/minetest_game`.
* `signlike`
* A single texture parallel to, and mounted against, the top, underside or
side of a node.
- * If `paramtype2="[color]wallmounted", it rotates according to `param2`
+ * If `paramtype2="[color]wallmounted"`, it rotates according to `param2`
* If `paramtype2="none"`, it will always be on the floor.
* `plantlike`
* Two vertical and diagonal textures at right-angles to each other.
@@ -1388,11 +1388,10 @@ HUD element types
-----------------
The position field is used for all element types.
-
To account for differing resolutions, the position coordinates are the
percentage of the screen, ranging in value from `0` to `1`.
-The name field is not yet used, but should contain a description of what the
+The `name` field is not yet used, but should contain a description of what the
HUD element represents.
The `direction` field is the direction in which something is drawn.
@@ -1425,10 +1424,9 @@ Supports negative values. By convention, the following values are recommended:
* 100: Temporary text messages or notification icons
* 1000: Full-screen effects such as full-black screen or credits.
This includes effects that cover the entire screen
-* Other: If your HUD element doesn't fit into any category, pick a number
- between the suggested values
-
+If your HUD element doesn't fit into any category, pick a number
+between the suggested values
Below are the specific uses for fields in each type; fields not listed for that
type are ignored.
@@ -1458,6 +1456,8 @@ Displays text on the HUD.
* `offset`: offset in pixels from position.
* `size`: size of the text.
The player-set font size is multiplied by size.x (y value isn't used).
+* `style`: determines font style
+ Bitfield with 1 = bold, 2 = italic, 4 = monospace
### `statbar`
@@ -1480,7 +1480,7 @@ Displays a horizontal bar made up of half-images with an optional background.
* `text`: The name of the inventory list to be displayed.
* `number`: Number of items in the inventory to be displayed.
* `item`: Position of item that is selected.
-* `direction`
+* `direction`: Direction the list will be displayed in
* `offset`: offset in pixels from position.
### `waypoint`
@@ -1524,7 +1524,7 @@ Displays an image oriented or translated according to current heading direction.
* `text`: The name of the texture to use.
* `alignment`: The alignment of the image.
* `offset`: Offset in pixels from position.
-* `dir`: How the image is rotated/translated:
+* `direction`: How the image is rotated/translated:
* 0 - Rotate as heading direction
* 1 - Rotate in reverse direction
* 2 - Translate as landscape direction
@@ -1544,15 +1544,12 @@ Displays a minimap on the HUD.
Representations of simple things
================================
-Position/vector
----------------
-
- {x=num, y=num, z=num}
+Vector (ie. a position)
+-----------------------
- Note: it is highly recommended to construct a vector using the helper function:
- vector.new(num, num, num)
+ vector.new(x, y, z)
-For helper functions see [Spatial Vectors].
+See [Spatial Vectors] for details.
`pointed_thing`
---------------
@@ -1573,8 +1570,7 @@ Exact pointing location (currently only `Raycast` supports these fields):
from 1).
* `pointed_thing.intersection_normal`: Unit vector, points outwards of the
selected selection box. This specifies which face is pointed at.
- Is a null vector `{x = 0, y = 0, z = 0}` when the pointer is inside the
- selection box.
+ Is a null vector `vector.zero()` when the pointer is inside the selection box.
@@ -1676,17 +1672,43 @@ these formats.
### Serialized
This is called "stackstring" or "itemstring". It is a simple string with
-1-3 components: the full item identifier, an optional amount and an optional
-wear value. Syntax:
+1-4 components:
+
+1. Full item identifier ("item name")
+2. Optional amount
+3. Optional wear value
+4. Optional item metadata
- <identifier> [<amount>[ <wear>]]
+Syntax:
+
+ <identifier> [<amount>[ <wear>[ <metadata>]]]
Examples:
-* `'default:apple'`: 1 apple
-* `'default:dirt 5'`: 5 dirt
-* `'default:pick_stone'`: a new stone pickaxe
-* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
+* `"default:apple"`: 1 apple
+* `"default:dirt 5"`: 5 dirt
+* `"default:pick_stone"`: a new stone pickaxe
+* `"default:pick_wood 1 21323"`: a wooden pickaxe, ca. 1/3 worn out
+* `[[default:pick_wood 1 21323 "\u0001description\u0002My worn out pick\u0003"]]`:
+ * a wooden pickaxe from the `default` mod,
+ * amount must be 1 (pickaxe is a tool), ca. 1/3 worn out (it's a tool),
+ * with the `description` field set to `"My worn out pick"` in its metadata
+* `[[default:dirt 5 0 "\u0001description\u0002Special dirt\u0003"]]`:
+ * analogeous to the above example
+ * note how the wear is set to `0` as dirt is not a tool
+
+You should ideally use the `ItemStack` format to build complex item strings
+(especially if they use item metadata)
+without relying on the serialization format. Example:
+
+ local stack = ItemStack("default:pick_wood")
+ stack:set_wear(21323)
+ stack:get_meta():set_string("description", "My worn out pick")
+ local itemstring = stack:to_string()
+
+Additionally the methods `minetest.itemstring_with_palette(item, palette_index)`
+and `minetest.itemstring_with_color(item, colorstring)` may be used to create
+item strings encoding color information in their metadata.
### Table format
@@ -1776,21 +1798,20 @@ Groups in crafting recipes
An example: Make meat soup from any meat, any water and any bowl:
{
- output = 'food:meat_soup_raw',
+ output = "food:meat_soup_raw",
recipe = {
- {'group:meat'},
- {'group:water'},
- {'group:bowl'},
+ {"group:meat"},
+ {"group:water"},
+ {"group:bowl"},
},
- -- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
}
Another example: Make red wool from white wool and red dye:
{
- type = 'shapeless',
- output = 'wool:red',
- recipe = {'wool:white', 'group:dye,basecolor_red'},
+ type = "shapeless",
+ output = "wool:red",
+ recipe = {"wool:white", "group:dye,basecolor_red"},
}
Special groups
@@ -1944,21 +1965,21 @@ Tool capabilities define:
* Damage groups
* Punch attack uses (until the tool breaks)
-### Full punch interval
+### Full punch interval `full_punch_interval`
When used as a weapon, the item will do full damage if this time is spent
between punches. If e.g. half the time is spent, the item will do half
damage.
-### Maximum drop level
+### Maximum drop level `max_drop_level`
Suggests the maximum level of node, when dug with the item, that will drop
its useful item. (e.g. iron ore to drop a lump of iron).
-This is not automated; it is the responsibility of the node definition
-to implement this.
+This value is not used in the engine; it is the responsibility of the game/mod
+code to implement this.
-### Uses (tools only)
+### Uses `uses` (tools only)
Determines how many uses the tool has when it is used for digging a node,
of this group, of the maximum level. The maximum supported number of
@@ -1973,17 +1994,17 @@ node's `level` group. The node cannot be dug if `leveldiff` is less than zero.
For non-tools, this has no effect.
-### Maximum level
+### Maximum level `maxlevel`
Tells what is the maximum level of a node of this group that the item will
be able to dig.
-### Digging times
+### Digging times `times`
List of digging times for different ratings of the group, for nodes of the
maximum level.
-For example, as a Lua table, `times={2=2.00, 3=0.70}`. This would
+For example, as a Lua table, `times={[2]=2.00, [3]=0.70}`. This would
result in the item to be able to dig nodes that have a rating of `2` or `3`
for this group, and unable to dig the rating `1`, which is the toughest.
Unless there is a matching group that enables digging otherwise.
@@ -2011,12 +2032,9 @@ Example definition of the capabilities of an item
-------------------------------------------------
tool_capabilities = {
- full_punch_interval=1.5,
- max_drop_level=1,
groupcaps={
crumbly={maxlevel=2, uses=20, times={[1]=1.60, [2]=1.20, [3]=0.80}}
- }
- damage_groups = {fleshy=2},
+ },
}
This makes the item capable of digging nodes that fulfil both of these:
@@ -2174,6 +2192,13 @@ Some of the values in the key-value store are handled specially:
* `color`: A `ColorString`, which sets the stack's color.
* `palette_index`: If the item has a palette, this is used to get the
current color from the palette.
+* `count_meta`: Replace the displayed count with any string.
+* `count_alignment`: Set the alignment of the displayed count value. This is an
+ int value. The lowest 2 bits specify the alignment in x-direction, the 3rd and
+ 4th bit specify the alignment in y-direction:
+ 0 = default, 1 = left / up, 2 = middle, 3 = right / down
+ The default currently is the same as right/down.
+ Example: 6 = 2 + 1*4 = middle,up
Example:
@@ -2230,7 +2255,7 @@ player named `<name>`.
When displaying text which can contain formspec code, e.g. text set by a player,
use `minetest.formspec_escape`.
-For coloured text you can use `minetest.colorize`.
+For colored text you can use `minetest.colorize`.
Since formspec version 3, elements drawn in the order they are defined. All
background elements are drawn before all other elements.
@@ -2285,6 +2310,8 @@ Version History
* Allow dropdown indexing events
* Formspec version 5 (5.5.0):
* Added padding[] element
+* Formspec version 6 (5.6.0):
+ * Add nine-slice images, animated_image, and fgimg_middle
Elements
--------
@@ -2388,24 +2415,26 @@ Elements
* End of a scroll_container, following elements are no longer bound to this
container.
-### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
+### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
-* Show an inventory list if it has been sent to the client. Nothing will
- be shown if the inventory list is of size 0.
+* Show an inventory list if it has been sent to the client.
+* If the inventory list changes (eg. it didn't exist before, it's resized, or its items
+ are moved) while the formspec is open, the formspec element may (but is not guaranteed
+ to) adapt to the new inventory list.
+* Item slots are drawn in a grid from left to right, then up to down, ordered
+ according to the slot index.
+* `W` and `H` are in inventory slots, not in coordinates.
+* `starting item index` (Optional): The index of the first (upper-left) item to draw.
+ Indices start at `0`. Default is `0`.
+* The number of shown slots is the minimum of `W*H` and the inventory list's size minus
+ `starting item index`.
* **Note**: With the new coordinate system, the spacing between inventory
slots is one-fourth the size of an inventory slot by default. Also see
[Styling Formspecs] for changing the size of slots and spacing.
-### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
-
-* Show an inventory list if it has been sent to the client. Nothing will
- be shown if the inventory list is of size 0.
-* **Note**: With the new coordinate system, the spacing between inventory
- slots is one-fourth the size of an inventory slot.
-
### `listring[<inventory location>;<list name>]`
-* Allows to create a ring of inventory lists
+* Appends to an internal ring of inventory lists.
* Shift-clicking on items in one element of the ring
will send them to the next inventory list inside the ring
* The first occurrence of an element inside the ring will
@@ -2447,20 +2476,25 @@ Elements
* `bgcolor` tooltip background color as `ColorString` (optional)
* `fontcolor` tooltip font color as `ColorString` (optional)
-### `image[<X>,<Y>;<W>,<H>;<texture name>]`
+### `image[<X>,<Y>;<W>,<H>;<texture name>;<middle>]`
-* Show an image
+* Show an image.
+* `middle` (optional): Makes the image render in 9-sliced mode and defines the middle rect.
+ * Requires formspec version >= 6.
+ * See `background9[]` documentation for more information.
-### `animated_image[<X>,<Y>;<W>,<H>;<name>;<texture name>;<frame count>;<frame duration>;<frame start>]`
+### `animated_image[<X>,<Y>;<W>,<H>;<name>;<texture name>;<frame count>;<frame duration>;<frame start>;<middle>]`
* Show an animated image. The image is drawn like a "vertical_frames" tile
- animation (See [Tile animation definition]), but uses a frame count/duration
- for simplicity
+ animation (See [Tile animation definition]), but uses a frame count/duration for simplicity
* `name`: Element name to send when an event occurs. The event value is the index of the current frame.
* `texture name`: The image to use.
* `frame count`: The number of frames animating the image.
* `frame duration`: Milliseconds between each frame. `0` means the frames don't advance.
-* `frame start` (Optional): The index of the frame to start on. Default `1`.
+* `frame start` (optional): The index of the frame to start on. Default `1`.
+* `middle` (optional): Makes the image render in 9-sliced mode and defines the middle rect.
+ * Requires formspec version >= 6.
+ * See `background9[]` documentation for more information.
### `model[<X>,<Y>;<W>,<H>;<name>;<mesh>;<textures>;<rotation X,Y>;<continuous>;<mouse control>;<frame loop range>;<animation speed>]`
@@ -2518,8 +2552,6 @@ Elements
will be added to the width and height of the texture, allowing it to be used as the
distance from the far end.
* All numbers in middle are integers.
-* Example for formspec 8x4 in 16x resolution:
- image shall be sized 8 times 16px times 4 times 16px
* If `auto_clip` is `true`, the background is clipped to the formspec size
(`x` and `y` are used as offset values, `w` and `h` are ignored)
* Available since formspec version 2
@@ -3076,6 +3108,8 @@ Some types may inherit styles from parent types.
* This is deprecated, use states instead.
* fgimg_pressed - image when pressed. Defaults to fgimg when not provided.
* This is deprecated, use states instead.
+ * fgimg_middle - Makes the fgimg textures render in 9-sliced mode and defines the middle rect.
+ See background9[] documentation for more details.
* NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed
* sound - a sound to be played when triggered.
* scrollbar
@@ -3243,7 +3277,7 @@ Colors
`#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
Named colors are also supported and are equivalent to
-[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
+[CSS Color Module Level 4](https://www.w3.org/TR/css-color-4/#named-color).
To specify the value of the alpha channel, append `#A` or `#AA` to the end of
the color name (e.g. `colorname#08`).
@@ -3294,33 +3328,76 @@ The following functions provide escape sequences:
Spatial Vectors
===============
-A spatial vector is similar to a position, but instead using
-absolute world coordinates, it uses *relative* coordinates, relative to
-no particular point.
-
-Internally, it is implemented as a table with the 3 fields
-`x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`.
-However, one should *never* create a vector manually as above, such misbehavior
-is deprecated. The vector helpers set a metatable for the created vectors which
-allows indexing with numbers, calling functions directly on vectors and using
-operators (like `+`). Furthermore, the internal implementation might change in
+
+Minetest stores 3-dimensional spatial vectors in Lua as tables of 3 coordinates,
+and has a class to represent them (`vector.*`), which this chapter is about.
+For details on what a spatial vectors is, please refer to Wikipedia:
+https://en.wikipedia.org/wiki/Euclidean_vector.
+
+Spatial vectors are used for various things, including, but not limited to:
+
+* any 3D spatial vector (x/y/z-directions)
+* Euler angles (pitch/yaw/roll in radians) (Spatial vectors have no real semantic
+ meaning here. Therefore, most vector operations make no sense in this use case.)
+
+Note that they are *not* used for:
+
+* n-dimensional vectors where n is not 3 (ie. n=2)
+* arrays of the form `{num, num, num}`
+
+The API documentation may refer to spatial vectors, as produced by `vector.new`,
+by any of the following notations:
+
+* `(x, y, z)` (Used rarely, and only if it's clear that it's a vector.)
+* `vector.new(x, y, z)`
+* `{x=num, y=num, z=num}` (Even here you are still supposed to use `vector.new`.)
+
+Compatibility notes
+-------------------
+
+Vectors used to be defined as tables of the form `{x = num, y = num, z = num}`.
+Since Minetest 5.5.0, vectors additionally have a metatable to enable easier use.
+Note: Those old-style vectors can still be found in old mod code. Hence, mod and
+engine APIs still need to be able to cope with them in many places.
+
+Manually constructed tables are deprecated and highly discouraged. This interface
+should be used to ensure seamless compatibility between mods and the Minetest API.
+This is especially important to callback function parameters and functions overwritten
+by mods.
+Also, though not likely, the internal implementation of a vector might change in
the future.
-Old code might still use vectors without metatables, be aware of this!
+In your own code, or if you define your own API, you can, of course, still use
+other representations of vectors.
+
+Vectors provided by API functions will provide an instance of this class if not
+stated otherwise. Mods should adapt this for convenience reasons.
+
+Special properties of the class
+-------------------------------
+
+Vectors can be indexed with numbers and allow method and operator syntax.
All these forms of addressing a vector `v` are valid:
`v[1]`, `v[3]`, `v.x`, `v[1] = 42`, `v.y = 13`
+Note: Prefer letter over number indexing for performance and compatibility reasons.
Where `v` is a vector and `foo` stands for any function name, `v:foo(...)` does
the same as `vector.foo(v, ...)`, apart from deprecated functionality.
+`tostring` is defined for vectors, see `vector.to_string`.
+
The metatable that is used for vectors can be accessed via `vector.metatable`.
Do not modify it!
All `vector.*` functions allow vectors `{x = X, y = Y, z = Z}` without metatables.
Returned vectors always have a metatable set.
-For the following functions, `v`, `v1`, `v2` are vectors,
-`p1`, `p2` are positions,
+Common functions and methods
+----------------------------
+
+For the following functions (and subchapters),
+`v`, `v1`, `v2` are vectors,
+`p1`, `p2` are position vectors,
`s` is a scalar (a number),
vectors are written like this: `(x, y, z)`:
@@ -3342,6 +3419,7 @@ vectors are written like this: `(x, y, z)`:
* `init`: If given starts looking for the vector at this string index.
* `vector.to_string(v)`:
* Returns a string of the form `"(x, y, z)"`.
+ * `tostring(v)` does the same.
* `vector.direction(p1, p2)`:
* Returns a vector of length 1 with direction `p1` to `p2`.
* If `p1` and `p2` are identical, returns `(0, 0, 0)`.
@@ -3360,6 +3438,9 @@ vectors are written like this: `(x, y, z)`:
* `vector.apply(v, func)`:
* Returns a vector where the function `func` has been applied to each
component.
+* `vector.combine(v, w, func)`:
+ * Returns a vector where the function `func` has combined both components of `v` and `w`
+ for each component
* `vector.equals(v1, v2)`:
* Returns a boolean, `true` if the vectors are identical.
* `vector.sort(v1, v2)`:
@@ -3372,7 +3453,7 @@ vectors are written like this: `(x, y, z)`:
* Returns the cross product of `v1` and `v2`.
* `vector.offset(v, x, y, z)`:
* Returns the sum of the vectors `v` and `(x, y, z)`.
-* `vector.check()`:
+* `vector.check(v)`:
* Returns a boolean value indicating whether `v` is a real vector, eg. created
by a `vector.*` function.
* Returns `false` for anything else, including tables like `{x=3,y=1,z=4}`.
@@ -3394,6 +3475,9 @@ For the following functions `x` can be either a vector or a number:
* Returns a scaled vector.
* Deprecated: If `s` is a vector: Returns the Schur quotient.
+Operators
+---------
+
Operators can be used if all of the involved vectors have metatables:
* `v1 == v2`:
* Returns whether `v1` and `v2` are identical.
@@ -3410,8 +3494,11 @@ Operators can be used if all of the involved vectors have metatables:
* `v / s`:
* Returns `v` scaled by `1 / s`.
+Rotation-related functions
+--------------------------
+
For the following functions `a` is an angle in radians and `r` is a rotation
-vector ({x = <pitch>, y = <yaw>, z = <roll>}) where pitch, yaw and roll are
+vector (`{x = <pitch>, y = <yaw>, z = <roll>}`) where pitch, yaw and roll are
angles in radians.
* `vector.rotate(v, r)`:
@@ -3428,6 +3515,18 @@ angles in radians.
* If `up` is omitted, the roll of the returned vector defaults to zero.
* Otherwise `direction` and `up` need to be vectors in a 90 degree angle to each other.
+Further helpers
+---------------
+
+There are more helper functions involving vectors, but they are listed elsewhere
+because they only work on specific sorts of vectors or involve things that are not
+vectors.
+
+For example:
+
+* `minetest.hash_node_position` (Only works on node positions.)
+* `minetest.dir_to_wallmounted` (Involves wallmounted param2 values.)
+
@@ -3479,8 +3578,16 @@ Helper functions
* `minetest.string_to_pos(string)`: returns a position or `nil`
* Same but in reverse.
* If the string can't be parsed to a position, nothing is returned.
-* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
+* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)", relative_to)`:
+ * returns two positions
* Converts a string representing an area box into two positions
+ * X1, Y1, ... Z2 are coordinates
+ * `relative_to`: Optional. If set to a position, each coordinate
+ can use the tilde notation for relative positions
+ * Tilde notation: "~": Relative coordinate
+ "~<number>": Relative coordinate plus <number>
+ * Example: `minetest.string_to_area("(1,2,3) (~5,~-5,~)", {x=10,y=10,z=10})`
+ returns `{x=1,y=2,z=3}, {x=15,y=5,z=10}`
* `minetest.formspec_escape(string)`: returns a string
* escapes the characters "[", "]", "\", "," and ";", which can not be used
in formspecs.
@@ -3512,6 +3619,12 @@ Helper functions
* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a
position.
* returns the exact position on the surface of a pointed node
+* `minetest.get_tool_wear_after_use(uses [, initial_wear])`
+ * Simulates a tool being used once and returns the added wear,
+ such that, if only this function is used to calculate wear,
+ the tool will break exactly after `uses` times of uses
+ * `uses`: Number of times the tool can be used
+ * `initial_wear`: The initial wear the tool starts with (default: 0)
* `minetest.get_dig_params(groups, tool_capabilities [, wear])`:
Simulates an item that digs a node.
Returns a table with the following fields:
@@ -3543,6 +3656,9 @@ Translations
Texts can be translated client-side with the help of `minetest.translate` and
translation files.
+Consider using the tool [update_translations](https://github.com/minetest-tools/update_translations)
+to generate and update translation files automatically from the Lua source.
+
Translating a string
--------------------
@@ -4186,15 +4302,15 @@ differences:
* The Mapgen VoxelManip object is retrieved using:
`minetest.get_mapgen_object("voxelmanip")`
* This VoxelManip object already has the region of map just generated loaded
- into it; it's not necessary to call `VoxelManip:read_from_map()` before using
- a Mapgen VoxelManip.
+ into it; it's not necessary to call `VoxelManip:read_from_map()`.
+ Note that the region of map it has loaded is NOT THE SAME as the `minp`, `maxp`
+ parameters of `on_generated()`. Refer to `minetest.get_mapgen_object` docs.
* The `on_generated()` callbacks of some mods may place individual nodes in the
generated area using non-VoxelManip map modification methods. Because the
same Mapgen VoxelManip object is passed through each `on_generated()`
callback, it becomes necessary for the Mapgen VoxelManip object to maintain
- consistency with the current map state. For this reason, calling any of the
- following functions:
- `minetest.add_node()`, `minetest.set_node()`, or `minetest.swap_node()`
+ consistency with the current map state. For this reason, calling any of
+ `minetest.add_node()`, `minetest.set_node()` or `minetest.swap_node()`
will also update the Mapgen VoxelManip object's internal state active on the
current thread.
* After modifying the Mapgen VoxelManip object's internal buffer, it may be
@@ -4307,7 +4423,7 @@ Methods
-----------
A helper class for voxel areas.
-It can be created via `VoxelArea:new{MinEdge = pmin, MaxEdge = pmax}`.
+It can be created via `VoxelArea:new({MinEdge = pmin, MaxEdge = pmax})`.
The coordinates are *inclusive*, like most other things in Minetest.
### Methods
@@ -4355,7 +4471,7 @@ the axes in a voxel area:
If, for example:
- local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
+ local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
The values of `ystride` and `zstride` can be obtained using `area.ystride` and
`area.zstride`.
@@ -4404,36 +4520,36 @@ generated chunk by the current mapgen.
Returns a table mapping requested generation notification types to arrays of
positions at which the corresponding generated structures are located within
-the current chunk. To set the capture of positions of interest to be recorded
-on generate, use `minetest.set_gen_notify()`.
-For decorations, the returned positions are the ground surface 'place_on'
-nodes, not the decorations themselves. A 'simple' type decoration is often 1
-node above the returned position and possibly displaced by 'place_offset_y'.
+the current chunk. To enable the capture of positions of interest to be recorded
+call `minetest.set_gen_notify()` first.
-Possible fields of the table returned are:
+Possible fields of the returned table are:
-* `dungeon`
-* `temple`
+* `dungeon`: bottom center position of dungeon rooms
+* `temple`: as above but for desert temples (mgv6 only)
* `cave_begin`
* `cave_end`
* `large_cave_begin`
* `large_cave_end`
-* `decoration`
+* `decoration#id` (see below)
Decorations have a key in the format of `"decoration#id"`, where `id` is the
-numeric unique decoration ID as returned by `minetest.get_decoration_id`.
-
+numeric unique decoration ID as returned by `minetest.get_decoration_id()`.
+For example, `decoration#123`.
+The returned positions are the ground surface 'place_on' nodes,
+not the decorations themselves. A 'simple' type decoration is often 1
+node above the returned position and possibly displaced by 'place_offset_y'.
Registered entities
===================
-Functions receive a "luaentity" as `self`:
+Functions receive a "luaentity" table as `self`:
-* It has the member `.name`, which is the registered name `("mod:thing")`
-* It has the member `.object`, which is an `ObjectRef` pointing to the object
-* The original prototype stuff is visible directly via a metatable
+* It has the member `name`, which is the registered name `("mod:thing")`
+* It has the member `object`, which is an `ObjectRef` pointing to the object
+* The original prototype is visible directly via a metatable
Callbacks:
@@ -4441,12 +4557,18 @@ Callbacks:
* Called when the object is instantiated.
* `dtime_s` is the time passed since the object was unloaded, which can be
used for updating the entity state.
-* `on_deactivate(self)
+* `on_deactivate(self, removal)`
* Called when the object is about to get removed or unloaded.
-* `on_step(self, dtime)`
+ * `removal`: boolean indicating whether the object is about to get removed.
+ Calling `object:remove()` on an active object will call this with `removal=true`.
+ The mapblock the entity resides in being unloaded will call this with `removal=false`.
+ * Note that this won't be called if the object hasn't been activated in the first place.
+ In particular, `minetest.clear_objects({mode = "full"})` won't call this,
+ whereas `minetest.clear_objects({mode = "quick"})` might call this.
+* `on_step(self, dtime, moveresult)`
* Called on every server tick, after movement and collision processing.
- `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
- in `minetest.conf`.
+ * `dtime`: elapsed time since last call
+ * `moveresult`: table with collision info (only available if physical=true)
* `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)`
* Called when somebody punches the object.
* Note that you probably want to handle most punches using the automatic
@@ -4477,6 +4599,30 @@ Callbacks:
* Should return a string that will be passed to `on_activate` when the
object is instantiated the next time.
+Collision info passed to `on_step` (`moveresult` argument):
+
+ {
+ touching_ground = boolean,
+ -- Note that touching_ground is only true if the entity was moving and
+ -- collided with ground.
+
+ collides = boolean,
+ standing_on_object = boolean,
+
+ collisions = {
+ {
+ type = string, -- "node" or "object",
+ axis = string, -- "x", "y" or "z"
+ node_pos = vector, -- if type is "node"
+ object = ObjectRef, -- if type is "object"
+ old_velocity = vector,
+ new_velocity = vector,
+ },
+ ...
+ }
+ -- `collisions` does not contain data of unloaded mapblock collisions
+ -- or when the velocity changes are negligibly small
+ }
@@ -4556,7 +4702,92 @@ Spawn a small apple tree:
minetest.spawn_tree(pos,apple_tree)
+Privileges
+==========
+Privileges provide a means for server administrators to give certain players
+access to special abilities in the engine, games or mods.
+For example, game moderators may need to travel instantly to any place in the world,
+this ability is implemented in `/teleport` command which requires `teleport` privilege.
+
+Registering privileges
+----------------------
+
+A mod can register a custom privilege using `minetest.register_privilege` function
+to give server administrators fine-grained access control over mod functionality.
+
+For consistency and practical reasons, privileges should strictly increase the abilities of the user.
+Do not register custom privileges that e.g. restrict the player from certain in-game actions.
+
+Checking privileges
+-------------------
+
+A mod can call `minetest.check_player_privs` to test whether a player has privileges
+to perform an operation.
+Also, when registering a chat command with `minetest.register_chatcommand` a mod can
+declare privileges that the command requires using the `privs` field of the command
+definition.
+
+Managing player privileges
+--------------------------
+
+A mod can update player privileges using `minetest.set_player_privs` function.
+Players holding the `privs` privilege can see and manage privileges for all
+players on the server.
+
+A mod can subscribe to changes in player privileges using `minetest.register_on_priv_grant`
+and `minetest.register_on_priv_revoke` functions.
+
+Built-in privileges
+-------------------
+
+Minetest includes a set of built-in privileges that control capabilities
+provided by the Minetest engine and can be used by mods:
+
+ * Basic privileges are normally granted to all players:
+ * `shout`: can communicate using the in-game chat.
+ * `interact`: can modify the world by digging, building and interacting
+ with the nodes, entities and other players. Players without the `interact`
+ privilege can only travel and observe the world.
+
+ * Advanced privileges allow bypassing certain aspects of the gameplay:
+ * `fast`: can use "fast mode" to move with maximum speed.
+ * `fly`: can use "fly mode" to move freely above the ground without falling.
+ * `noclip`: can use "noclip mode" to fly through solid nodes (e.g. walls).
+ * `teleport`: can use `/teleport` command to move to any point in the world.
+ * `creative`: can access creative inventory.
+ * `bring`: can teleport other players to oneself.
+ * `give`: can use `/give` and `/giveme` commands to give any item
+ in the game to oneself or others.
+ * `settime`: can use `/time` command to change current in-game time.
+ * `debug`: can enable wireframe rendering mode.
+
+ * Security-related privileges:
+ * `privs`: can modify privileges of the players using `/grant[me]` and
+ `/revoke[me]` commands.
+ * `basic_privs`: can grant and revoke basic privileges as defined by
+ the `basic_privs` setting.
+ * `kick`: can kick other players from the server using `/kick` command.
+ * `ban`: can ban other players using `/ban` command.
+ * `password`: can use `/setpassword` and `/clearpassword` commands
+ to manage players' passwords.
+ * `protection_bypass`: can bypass node protection. Note that the engine does not act upon this privilege,
+ it is only an implementation suggestion for games.
+
+ * Administrative privileges:
+ * `server`: can use `/fixlight`, `/deleteblocks` and `/deleteobjects`
+ commands. Can clear inventory of other players using `/clearinv` command.
+ * `rollback`: can use `/rollback_check` and `/rollback` commands.
+
+Related settings
+----------------
+
+Minetest includes the following settings to control behavior of privileges:
+
+ * `default_privs`: defines privileges granted to new players.
+ * `basic_privs`: defines privileges that can be granted/revoked by players having
+ the `basic_privs` privilege. This can be used, for example, to give
+ limited moderation powers to selected users.
'minetest' namespace reference
==============================
@@ -4625,6 +4856,13 @@ Utilities
abm_min_max_y = true,
-- dynamic_add_media supports passing a table with options (5.5.0)
dynamic_add_media_table = true,
+ -- particlespawners support texpools and animation of properties,
+ -- particle textures support smooth fade and scale animations, and
+ -- sprite-sheet particle animations can by synced to the lifetime
+ -- of individual particles (5.6.0)
+ particlespawner_tweenable = true,
+ -- allows get_sky to return a table instead of separate values (5.6.0)
+ get_sky_as_table = true,
}
* `minetest.has_feature(arg)`: returns `boolean, missing_features`
@@ -4688,6 +4926,7 @@ Utilities
* `string`: Simple version, eg, "1.2.3-dev"
* `hash`: Full git version (only set if available),
eg, "1.2.3-dev-01234567-dirty".
+ * `is_dev`: Boolean value indicating whether it's a development build
Use this for informational purposes only. The information in the returned
table does not represent the capabilities of the engine, nor is it
reliable or verifiable. Compatible forks will have a different name and
@@ -4851,7 +5090,7 @@ Call these functions only at load time!
* Called when a node is punched
* `minetest.register_on_generated(function(minp, maxp, blockseed))`
* Called after generating a piece of world. Modifying nodes inside the area
- is a bit faster than usually.
+ is a bit faster than usual.
* `minetest.register_on_newplayer(function(ObjectRef))`
* Called when a new player enters the world for the first time
* `minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))`
@@ -5276,8 +5515,7 @@ Environment access
* Deprecated: use `minetest.set_mapgen_setting(name, value, override)`
instead.
* Set map generation parameters.
- * Function cannot be called after the registration period; only
- initialization and `on_mapgen_init`.
+ * Function cannot be called after the registration period.
* Takes a table as an argument with the fields:
* `mgname`
* `seed`
@@ -5583,14 +5821,19 @@ Item handling
* `width`: 0-3, 0 means shapeless recipe
* `items`: indexed [1-9] table with recipe items
* `output`: string with item name and quantity
- * Example query for `"default:gold_ingot"` will return table:
+ * Example result for `"default:gold_ingot"` with two recipes:
{
- [1]={method = "cooking", width = 3, output = "default:gold_ingot",
- items = {1 = "default:gold_lump"}},
- [2]={method = "normal", width = 1, output = "default:gold_ingot 9",
- items = {1 = "default:goldblock"}}
+ {
+ method = "cooking", width = 3,
+ output = "default:gold_ingot", items = {"default:gold_lump"}
+ },
+ {
+ method = "normal", width = 1,
+ output = "default:gold_ingot 9", items = {"default:goldblock"}
+ }
}
+
* `minetest.handle_node_drops(pos, drops, digger)`
* `drops`: list of itemstrings
* Handles drops from nodes after digging: Default action is to put them
@@ -5698,6 +5941,68 @@ Timing
* `job:cancel()`
* Cancels the job function from being called
+Async environment
+-----------------
+
+The engine allows you to submit jobs to be ran in an isolated environment
+concurrently with normal server operation.
+A job consists of a function to be ran in the async environment, any amount of
+arguments (will be serialized) and a callback that will be called with the return
+value of the job function once it is finished.
+
+The async environment does *not* have access to the map, entities, players or any
+globals defined in the 'usual' environment. Consequently, functions like
+`minetest.get_node()` or `minetest.get_player_by_name()` simply do not exist in it.
+
+Arguments and return values passed through this can contain certain userdata
+objects that will be seamlessly copied (not shared) to the async environment.
+This allows you easy interoperability for delegating work to jobs.
+
+* `minetest.handle_async(func, callback, ...)`:
+ * Queue the function `func` to be ran in an async environment.
+ Note that there are multiple persistent workers and any of them may
+ end up running a given job. The engine will scale the amount of
+ worker threads automatically.
+ * When `func` returns the callback is called (in the normal environment)
+ with all of the return values as arguments.
+ * Optional: Variable number of arguments that are passed to `func`
+* `minetest.register_async_dofile(path)`:
+ * 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()`.
+
+### List of APIs available in an async environment
+
+Classes:
+* `ItemStack`
+* `PerlinNoise`
+* `PerlinNoiseMap`
+* `PseudoRandom`
+* `PcgRandom`
+* `SecureRandom`
+* `VoxelArea`
+* `VoxelManip`
+ * only if transferred into environment; can't read/write to map
+* `Settings`
+
+Class instances that can be transferred between environments:
+* `ItemStack`
+* `PerlinNoise`
+* `PerlinNoiseMap`
+* `VoxelManip`
+
+Functions:
+* Standalone helpers such as logging, filesystem, encoding,
+ hashing or compression APIs
+* `minetest.request_insecure_environment` (same restrictions apply)
+
+Variables:
+* `minetest.settings`
+* `minetest.registered_items`, `registered_nodes`, `registered_tools`,
+ `registered_craftitems` and `registered_aliases`
+ * with all functions and userdata values replaced by `true`, calling any
+ callbacks here is obviously not possible
+
Server
------
@@ -5973,11 +6278,11 @@ Misc.
This is due to the fact that JSON has two distinct array and object
values.
* Example: `write_json({10, {a = false}})`,
- returns `"[10, {\"a\": false}]"`
+ returns `'[10, {"a": false}]'`
* `minetest.serialize(table)`: returns a string
* Convert a table containing tables, strings, numbers, booleans and `nil`s
into string form readable by `minetest.deserialize`
- * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
+ * Example: `serialize({foo="bar"})`, returns `'return { ["foo"] = "bar" }'`
* `minetest.deserialize(string[, safe])`: returns a table
* Convert a string returned by `minetest.serialize` into a table
* `string` is loaded in an empty sandbox environment.
@@ -5989,7 +6294,7 @@ Misc.
value of `safe`. It is fine to serialize then deserialize user-provided
data, but directly providing user input to deserialize is always unsafe.
* Example: `deserialize('return { ["foo"] = "bar" }')`,
- returns `{foo='bar'}`
+ returns `{foo="bar"}`
* Example: `deserialize('print("foo")')`, returns `nil`
(function call fails), returns
`error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
@@ -6202,45 +6507,53 @@ Sorted alphabetically.
`AreaStore`
-----------
-A fast access data structure to store areas, and find areas near a given
-position or area.
-Every area has a `data` string attribute to store additional information.
-You can create an empty `AreaStore` by calling `AreaStore()`, or
-`AreaStore(type_name)`. The mod decides where to save and load AreaStore.
-If you chose the parameter-less constructor, a fast implementation will be
-automatically chosen for you.
+AreaStore is a data structure to calculate intersections of 3D cuboid volumes
+and points. The `data` field (string) may be used to store and retrieve any
+mod-relevant information to the specified area.
+
+Despite its name, mods must take care of persisting AreaStore data. They may
+use the provided load and write functions for this.
+
### Methods
-* `get_area(id, include_borders, include_data)`
+* `AreaStore(type_name)`
+ * Returns a new AreaStore instance
+ * `type_name`: optional, forces the internally used API.
+ * Possible values: `"LibSpatial"` (default).
+ * When other values are specified, or SpatialIndex is not available,
+ the custom Minetest functions are used.
+* `get_area(id, include_corners, include_data)`
* Returns the area information about the specified ID.
* Returned values are either of these:
nil -- Area not found
- true -- Without `include_borders` and `include_data`
+ true -- Without `include_corners` and `include_data`
{
- min = pos, max = pos -- `include_borders == true`
+ min = pos, max = pos -- `include_corners == true`
data = string -- `include_data == true`
}
-* `get_areas_for_pos(pos, include_borders, include_data)`
+* `get_areas_for_pos(pos, include_corners, include_data)`
* Returns all areas as table, indexed by the area ID.
* Table values: see `get_area`.
-* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`
- * Returns all areas that contain all nodes inside the area specified by `edge1`
- and `edge2` (inclusive).
+* `get_areas_in_area(corner1, corner2, accept_overlap, include_corners, include_data)`
+ * Returns all areas that contain all nodes inside the area specified by`
+ `corner1 and `corner2` (inclusive).
* `accept_overlap`: if `true`, areas are returned that have nodes in
common (intersect) with the specified area.
* Returns the same values as `get_areas_for_pos`.
-* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store.
+* `insert_area(corner1, corner2, data, [id])`: inserts an area into the store.
* Returns the new area's ID, or nil if the insertion failed.
- * The (inclusive) positions `edge1` and `edge2` describe the area.
+ * The (inclusive) positions `corner1` and `corner2` describe the area.
* `data` is a string stored with the area.
* `id` (optional): will be used as the internal area ID if it is an unique
number between 0 and 2^32-2.
-* `reserve(count)`: reserves resources for at most `count` many contained
- areas.
- Only needed for efficiency, and only some implementations profit.
+* `reserve(count)`
+ * Requires SpatialIndex, no-op function otherwise.
+ * Reserves resources for `count` many contained areas to improve
+ efficiency when working with many area entries. Additional areas can still
+ be inserted afterwards at the usual complexity.
* `remove_area(id)`: removes the area with the given id from the store, returns
success.
* `set_cache_params(params)`: sets params for the included prefiltering cache.
@@ -6278,9 +6591,9 @@ An `InvRef` is a reference to an inventory.
* `set_width(listname, width)`: set width of list; currently used for crafting
* `get_stack(listname, i)`: get a copy of stack index `i` in list
* `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
-* `get_list(listname)`: return full list
+* `get_list(listname)`: return full list (list of `ItemStack`s)
* `set_list(listname, list)`: set full list (size will not change)
-* `get_lists()`: returns list of inventory lists
+* `get_lists()`: returns table that maps listnames to inventory lists
* `set_lists(lists)`: sets inventory lists (size will not change)
* `add_item(listname, stack)`: add item somewhere in list, returns leftover
`ItemStack`.
@@ -6375,7 +6688,13 @@ an itemstring, a table or `nil`.
or those of the hand if none are defined for this item type
* `add_wear(amount)`
* Increases wear by `amount` if the item is a tool, otherwise does nothing
+ * Valid `amount` range is [0,65536]
* `amount`: number, integer
+* `add_wear_by_uses(max_uses)`
+ * Increases wear in such a way that, if only this function is called,
+ the item breaks after `max_uses` times
+ * Valid `max_uses` range is [0,65536]
+ * Does nothing if item is not a tool or if `max_uses` is 0
* `add_item(item)`: returns leftover `ItemStack`
* Put some item or stack onto this stack
* `item_fits(item)`: returns `true` if item or stack can be fully added to
@@ -6509,6 +6828,21 @@ Lua back to the engine.
Doing so is much less error-prone and you will never need to wonder if the
object you are working with still exists.
+### Attachments
+
+It is possible to attach objects to other objects (`set_attach` method).
+
+When an object is attached, it is positioned relative to the parent's position
+and rotation. `get_pos` and `get_rotation` will always return the parent's
+values and changes via their setter counterparts are ignored.
+
+To change position or rotation call `set_attach` again with the new values.
+
+**Note**: Just like model dimensions, the relative position in `set_attach`
+must be multiplied by 10 compared to world positions.
+
+It is also possible to attach to a bone of the parent object. In that case the
+child will follow movement and rotation of that bone.
### Methods
@@ -6541,8 +6875,7 @@ object you are working with still exists.
* `set_hp(hp, reason)`: set number of health points
* See reason in register_on_player_hpchange
* Is limited to the range of 0 ... 65535 (2^16 - 1)
- * For players: HP are also limited by `hp_max` specified in the player's
- object properties
+ * For players: HP are also limited by `hp_max` specified in object properties
* `get_inventory()`: returns an `InvRef` for players, otherwise returns `nil`
* `get_wield_list()`: returns the name of the inventory list the wielded item
is in.
@@ -6562,12 +6895,13 @@ object you are working with still exists.
* `set_animation_frame_speed(frame_speed)`
* `frame_speed`: number, default: `15.0`
* `set_attach(parent[, bone, position, rotation, forced_visible])`
- * `bone`: string. Default is `""`, the root bone
- * `position`: `{x=num, y=num, z=num}`, relative, default `{x=0, y=0, z=0}`
- * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees.
- Default `{x=0, y=0, z=0}`
+ * `parent`: `ObjectRef` to attach to
+ * `bone`: default `""` (the root bone)
+ * `position`: relative position, default `{x=0, y=0, z=0}`
+ * `rotation`: relative rotation in degrees, default `{x=0, y=0, z=0}`
* `forced_visible`: Boolean to control whether the attached entity
- should appear in first person. Default `false`.
+ should appear in first person, default `false`.
+ * Please also read the [Attachments] section above.
* This command may fail silently (do nothing) when it would result
in circular attachments.
* `get_attach()`: returns parent, bone, position, rotation, forced_visible,
@@ -6640,7 +6974,7 @@ object you are working with still exists.
* Fourth column: subject looking to the right
* Fifth column: subject viewed from above
* Sixth column: subject viewed from below
-* `get_entity_name()` (**Deprecated**: Will be removed in a future version)
+* `get_entity_name()` (**Deprecated**: Will be removed in a future version, use the field `self.name` instead)
* `get_luaentity()`
#### Player only (no-op for other objects)
@@ -6748,22 +7082,23 @@ object you are working with still exists.
* `hud_remove(id)`: remove the HUD element of the specified id
* `hud_change(id, stat, value)`: change a value of a previously added HUD
element.
- * element `stat` values:
- `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
+ * `stat` supports the same keys as in the hud definition table except for
+ `"hud_elem_type"`.
* `hud_get(id)`: gets the HUD element definition structure of the specified ID
* `hud_set_flags(flags)`: sets specified HUD flags of player.
* `flags`: A table with the following fields set to boolean values
- * hotbar
- * healthbar
- * crosshair
- * wielditem
- * breathbar
- * minimap
- * minimap_radar
+ * `hotbar`
+ * `healthbar`
+ * `crosshair`
+ * `wielditem`
+ * `breathbar`
+ * `minimap`: Modifies the client's permission to view the minimap.
+ The client may locally elect to not view the minimap.
+ * `minimap_radar`: is only usable when `minimap` is true
+ * `basic_debug`: Allow showing basic debug info that might give a gameplay advantage.
+ This includes map seed, player position, look direction, the pointed node and block bounds.
+ Does not affect players with the `debug` privilege.
* If a flag equals `nil`, the flag is not modified
- * `minimap`: Modifies the client's permission to view the minimap.
- The client may locally elect to not view the minimap.
- * `minimap_radar` is only usable when `minimap` is true
* `hud_get_flags()`: returns a table of player HUD flags with boolean values.
* 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
@@ -6852,9 +7187,15 @@ object you are working with still exists.
* `"plain"`: Uses 0 textures, `bgcolor` used
* `clouds`: Boolean for whether clouds appear in front of `"skybox"` or
`"plain"` custom skyboxes (default: `true`)
-* `get_sky()`: returns base_color, type, table of textures, clouds.
-* `get_sky_color()`: returns a table with the `sky_color` parameters as in
- `set_sky`.
+* `get_sky(as_table)`:
+ * `as_table`: boolean that determines whether the deprecated version of this
+ function is being used.
+ * `true` returns a table containing sky parameters as defined in `set_sky(sky_parameters)`.
+ * Deprecated: `false` or `nil` returns base_color, type, table of textures,
+ clouds.
+* `get_sky_color()`:
+ * Deprecated: Use `get_sky(as_table)` instead.
+ * returns a table with the `sky_color` parameters as in `set_sky`.
* `set_sun(sun_parameters)`:
* Passing no arguments resets the sun to its default values.
* `sun_parameters` is a table with the following optional fields:
@@ -6877,7 +7218,9 @@ object you are working with still exists.
* `visible`: Boolean for whether the moon is visible.
(default: `true`)
* `texture`: A regular texture for the moon. Setting to `""`
- will re-enable the mesh moon. (default: "moon.png", if it exists)
+ will re-enable the mesh moon. (default: `"moon.png"`, if it exists)
+ Note: Relative to the sun, the moon texture is rotated by 180°.
+ You can use the `^[transformR180` texture modifier to achieve the same orientation.
* `tonemap`: A 512x1 texture containing the tonemap for the moon
(default: `"moon_tonemap.png"`)
* `scale`: Float controlling the overall size of the moon (default: `1`)
@@ -6888,6 +7231,9 @@ object you are working with still exists.
* `star_parameters` is a table with the following optional fields:
* `visible`: Boolean for whether the stars are visible.
(default: `true`)
+ * `day_opacity`: Float for maximum opacity of stars at day.
+ No effect if `visible` is false.
+ (default: 0.0; maximum: 1.0; minimum: 0.0)
* `count`: Integer number to set the number of stars in
the skybox. Only applies to `"skybox"` and `"regular"` sky types.
(default: `1000`)
@@ -6929,10 +7275,18 @@ object you are working with still exists.
* in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
* `get_eye_offset()`: returns first and third person offsets.
* `send_mapblock(blockpos)`:
- * Sends a server-side loaded mapblock to the player.
- * Returns `false` if failed.
+ * Sends an already loaded mapblock to the player.
+ * Returns `false` if nothing was sent (note that this can also mean that
+ the client already has the block)
* Resource intensive - use sparsely
- * To get blockpos, integer divide pos by 16
+* `set_lighting(light_definition)`: sets lighting for the player
+ * `light_definition` is a table with the following optional fields:
+ * `shadows` is a table that controls ambient shadows
+ * `intensity` sets the intensity of the shadows from 0 (no shadows, default) to 1 (blackness)
+* `get_lighting()`: returns the current state of lighting for the player.
+ * Result is a table with the same fields as `light_definition` in `set_lighting`.
+* `respawn()`: Respawns the player using the same mechanism as the death screen,
+ including calling on_respawnplayer callbacks.
`PcgRandom`
-----------
@@ -7137,7 +7491,7 @@ The settings have the format `key = value`. Example:
Mod metadata: per mod metadata, saved automatically.
Can be obtained via `minetest.get_mod_storage()` during load time.
-WARNING: This storage backend is incaptable to save raw binary data due
+WARNING: This storage backend is incapable of saving raw binary data due
to restrictions of JSON.
### Methods
@@ -7159,8 +7513,10 @@ corresponding Lua entity using the given registration fields.
Player properties need to be saved manually.
{
- hp_max = 1,
- -- For players only. Defaults to `minetest.PLAYER_MAX_HP_DEFAULT`.
+ hp_max = 10,
+ -- Defines the maximum and default HP of the entity
+ -- For Lua entities the maximum is not enforced.
+ -- For players this defaults to `minetest.PLAYER_MAX_HP_DEFAULT`.
breath_max = 0,
-- For players only. Defaults to `minetest.PLAYER_MAX_BREATH_DEFAULT`.
@@ -7175,22 +7531,21 @@ Player properties need to be saved manually.
eye_height = 1.625,
-- For players only. Camera height above feet position in nodes.
- -- Defaults to 1.625.
- physical = true,
+ physical = false,
-- Collide with `walkable` nodes.
collide_with_objects = true,
-- Collide with other objects if physical = true
- collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5}, -- Default
- selectionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},
+ collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-- Selection box uses collision box dimensions when not set.
-- For both boxes: {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from
-- object position.
pointable = true,
- -- Overrides selection box when false
+ -- Whether the object can be pointed at
visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem" / "item",
-- "cube" is a node-sized cube.
@@ -7327,48 +7682,26 @@ Used by `minetest.register_entity`.
...,
},
-- A table of object properties, see the `Object properties` section.
- -- Object properties being read directly from the entity definition
- -- table is deprecated. Define object properties in this
- -- `initial_properties` table instead.
+ -- The properties in this table are applied to the object
+ -- once when it is spawned.
+ -- Refer to the "Registered entities" section for explanations
on_activate = function(self, staticdata, dtime_s),
-
+ on_deactivate = function(self, removal),
on_step = function(self, dtime, moveresult),
- -- Called every server step
- -- dtime: Elapsed time
- -- moveresult: Table with collision info (only available if physical=true)
-
- on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
-
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage),
+ on_death = function(self, killer),
on_rightclick = function(self, clicker),
-
+ on_attach_child = function(self, child),
+ on_detach_child = function(self, child),
+ on_detach = function(self, parent),
get_staticdata = function(self),
- -- Called sometimes; the string returned is passed to on_activate when
- -- the entity is re-activated from static state
_custom_field = whatever,
-- You can define arbitrary member variables here (see Item definition
-- for more info) by using a '_' prefix
}
-Collision info passed to `on_step`:
-
- {
- touching_ground = boolean,
- collides = boolean,
- standing_on_object = boolean,
- collisions = {
- {
- type = string, -- "node" or "object",
- axis = string, -- "x", "y" or "z"
- node_pos = vector, -- if type is "node"
- object = ObjectRef, -- if type is "object"
- old_velocity = vector,
- new_velocity = vector,
- },
- ...
- }
- }
ABM (ActiveBlockModifier) definition
------------------------------------
@@ -7399,7 +7732,7 @@ Used by `minetest.register_abm`.
min_y = -32768,
max_y = 32767,
- -- min and max height levels where ABM will be processed
+ -- min and max height levels where ABM will be processed (inclusive)
-- can be used to reduce CPU usage
catch_up = true,
@@ -7425,7 +7758,7 @@ Used by `minetest.register_lbm`.
A loading block modifier (LBM) is used to define a function that is called for
specific nodes (defined by `nodenames`) when a mapblock which contains such nodes
-gets loaded.
+gets activated (not loaded!)
{
label = "Upgrade legacy doors",
@@ -7433,18 +7766,20 @@ gets loaded.
-- Definitions with identical labels will be listed as one.
name = "modname:replace_legacy_door",
+ -- Identifier of the LBM, should follow the modname:<whatever> convention
nodenames = {"default:lava_source"},
-- List of node names to trigger the LBM on.
- -- Also non-registered nodes will work.
- -- Groups (as of group:groupname) will work as well.
+ -- Names of non-registered nodes and groups (as group:groupname)
+ -- will work as well.
run_at_every_load = false,
- -- Whether to run the LBM's action every time a block gets loaded,
- -- and not only the first time the block gets loaded after the LBM
+ -- Whether to run the LBM's action every time a block gets activated,
+ -- and not only the first time the block gets activated after the LBM
-- was introduced.
action = function(pos, node),
+ -- Function triggered for each qualifying node.
}
Tile definition
@@ -7505,32 +7840,40 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
`minetest.register_tool`.
{
- description = "Steel Axe",
+ description = "",
-- Can contain new lines. "\n" has to be used as new line character.
-- See also: `get_description` in [`ItemStack`]
- short_description = "Steel Axe",
+ short_description = "",
-- Must not contain new lines.
-- Defaults to nil.
- -- Use an [`ItemStack`] to get the short description, eg:
+ -- Use an [`ItemStack`] to get the short description, e.g.:
-- ItemStack(itemname):get_short_description()
groups = {},
- -- key = name, value = rating; rating = 1..3.
+ -- key = name, value = rating; rating = <number>.
-- If rating not applicable, use 1.
-- e.g. {wool = 1, fluffy = 3}
-- {soil = 2, outerspace = 1, crumbly = 1}
-- {bendy = 2, snappy = 1},
-- {hard = 1, metal = 1, spikes = 1}
- inventory_image = "default_tool_steelaxe.png",
+ inventory_image = "",
+ -- Texture shown in the inventory GUI
+ -- Defaults to a 3D rendering of the node if left empty.
- inventory_overlay = "overlay.png",
- -- An overlay which does not get colorized
+ inventory_overlay = "",
+ -- An overlay texture which is not affected by colorization
wield_image = "",
+ -- Texture shown when item is held in hand
+ -- Defaults to a 3D rendering of the node if left empty.
wield_overlay = "",
+ -- Like inventory_overlay but only used in the same situation as wield_image
+
+ wield_scale = {x = 1, y = 1, z = 1},
+ -- Scale for the item when held in hand
palette = "",
-- An image file containing the palette of a node.
@@ -7539,19 +7882,18 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
-- The palette is always stretched to fit indices between 0 and 255, to
-- ensure compatibility with "colorfacedir" and "colorwallmounted" nodes.
- color = "0xFFFFFFFF",
- -- The color of the item. The palette overrides this.
-
- wield_scale = {x = 1, y = 1, z = 1},
+ color = "#ffffffff",
+ -- Color the item is colorized with. The palette overrides this.
- -- The default value of 99 may be configured by
- -- users using the setting "default_stack_max"
stack_max = 99,
+ -- Maximum amount of items that can be in a single stack.
+ -- The default can be changed by the setting `default_stack_max`
range = 4.0,
+ -- Range of node and object pointing that is possible with this item held
liquids_pointable = false,
- -- If true, item points to all liquid nodes (`liquidtype ~= "none"`),
+ -- If true, item can point to all liquid nodes (`liquidtype ~= "none"`),
-- even those for which `pointable = false`
light_source = 0,
@@ -7567,8 +7909,7 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
max_drop_level = 0,
groupcaps = {
-- For example:
- choppy = {times = {[1] = 2.50, [2] = 1.40, [3] = 1.00},
- uses = 20, maxlevel = 2},
+ choppy = {times = {2.50, 1.40, 1.00}, uses = 20, maxlevel = 2},
},
damage_groups = {groupname = damage},
-- Damage values must be between -32768 and 32767 (2^15)
@@ -7588,16 +7929,16 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
-- If "" and item is anything, no prediction is made.
-- Otherwise should be name of node which the client immediately places
-- on ground when the player places the item. Server will always update
- -- actual result to client in a short moment.
+ -- with actual result shortly.
node_dig_prediction = "air",
-- if "", no prediction is made.
-- if "air", node is removed.
-- Otherwise should be name of node which the client immediately places
- -- upon digging. Server will always update actual result shortly.
+ -- upon digging. Server will always update with actual result shortly.
sound = {
- -- Definition of items sounds to be played at various events.
+ -- Definition of item sounds to be played at various events.
-- All fields in this table are optional.
breaks = <SimpleSoundSpec>,
@@ -7660,7 +8001,7 @@ Node definition
Used by `minetest.register_node`.
{
- -- <all fields allowed in item definitions>,
+ -- <all fields allowed in item definitions>
drawtype = "normal", -- See "Node drawtypes"
@@ -7674,7 +8015,6 @@ Used by `minetest.register_node`.
tiles = {tile definition 1, def2, def3, def4, def5, def6},
-- Textures of node; +Y, -Y, +X, -X, +Z, -Z
- -- Old field name was 'tile_images'.
-- List can be shortened to needed length.
overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6},
@@ -7686,7 +8026,6 @@ Used by `minetest.register_node`.
special_tiles = {tile definition 1, Tile definition 2},
-- Special textures of node; used rarely.
- -- Old field name was 'special_materials'.
-- List can be shortened to needed length.
color = ColorSpec,
@@ -7707,21 +8046,22 @@ Used by `minetest.register_node`.
-- If set to a boolean value (deprecated): true either sets it to blend
-- or clip, false sets it to clip or opaque mode depending on the drawtype.
- palette = "palette.png",
+ palette = "",
-- The node's `param2` is used to select a pixel from the image.
-- Pixels are arranged from left to right and from top to bottom.
-- The node's color will be multiplied with the selected pixel's color.
-- Tiles can override this behavior.
-- Only when `paramtype2` supports palettes.
- post_effect_color = "green#0F",
+ post_effect_color = "#00000000",
-- Screen tint if player is inside node, see "ColorSpec"
paramtype = "none", -- See "Nodes"
paramtype2 = "none", -- See "Nodes"
- place_param2 = nil, -- Force value for param2 when player places node
+ place_param2 = 0,
+ -- Value for param2 that is set when player places node
is_ground_content = true,
-- If false, the cave generator and dungeon generator will not carve
@@ -7739,7 +8079,7 @@ Used by `minetest.register_node`.
diggable = true, -- If false, can never be dug
- climbable = false, -- If true, can be climbed on (ladder)
+ climbable = false, -- If true, can be climbed on like a ladder
move_resistance = 0,
-- Slows down movement of players through this node (max. 7).
@@ -7765,9 +8105,11 @@ Used by `minetest.register_node`.
-- If it's "source" or "flowing" and `liquid_range > 0`, then
-- both `liquid_alternative_*` fields must be specified
- liquid_alternative_flowing = "", -- Flowing version of source liquid
+ liquid_alternative_flowing = "",
+ -- Node that represents the flowing version of the liquid
- liquid_alternative_source = "", -- Source version of flowing liquid
+ liquid_alternative_source = "",
+ -- Node that represents the source version of the liquid
liquid_viscosity = 0,
-- Controls speed at which the liquid spreads/flows (max. 7).
@@ -7787,7 +8129,6 @@ Used by `minetest.register_node`.
-- settings apply.
-- * nil: Will be treated as true if `liquidype ~= "none"`
-- and as false otherwise.
- -- Default: nil
leveled = 0,
-- Only valid for "nodebox" drawtype with 'type = "leveled"'.
@@ -7811,37 +8152,29 @@ Used by `minetest.register_node`.
damage_per_second = 0,
-- If player is inside node, this damage is caused
- node_box = {type="regular"}, -- See "Node boxes"
+ node_box = {type = "regular"}, -- See "Node boxes"
- connects_to = nodenames,
+ connects_to = {},
-- Used for nodebox nodes with the type == "connected".
-- Specifies to what neighboring nodes connections will be drawn.
-- e.g. `{"group:fence", "default:wood"}` or `"default:stone"`
- connect_sides = { "top", "bottom", "front", "left", "back", "right" },
+ connect_sides = {},
-- Tells connected nodebox nodes to connect only to these sides of this
- -- node
+ -- node. possible: "top", "bottom", "front", "left", "back", "right"
- mesh = "model.obj",
+ mesh = "",
-- File name of mesh when using "mesh" drawtype
selection_box = {
- type = "fixed",
- fixed = {
- {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
- -- Node box format: see [Node boxes]
- },
+ -- see [Node boxes] for possibilities
},
-- Custom selection box definition. Multiple boxes can be defined.
-- If "nodebox" drawtype is used and selection_box is nil, then node_box
-- definition is used for the selection box.
collision_box = {
- type = "fixed",
- fixed = {
- {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
- -- Node box format: see [Node boxes]
- },
+ -- see [Node boxes] for possibilities
},
-- Custom collision box definition. Multiple boxes can be defined.
-- If "nodebox" drawtype is used and collision_box is nil, then node_box
@@ -7898,8 +8231,8 @@ Used by `minetest.register_node`.
drop = "",
-- Name of dropped item when dug.
-- Default dropped item is the node itself.
- -- Using a table allows multiple items, drop chances and item filtering.
- -- Item filtering by string matching is deprecated.
+
+ -- Using a table allows multiple items, drop chances and item filtering:
drop = {
max_items = 1,
-- Maximum number of item lists to drop.
@@ -7910,7 +8243,7 @@ Used by `minetest.register_node`.
-- equals 'max_items'.
-- Therefore, entries should progress from low to high drop chance.
items = {
- -- Entry examples.
+ -- Examples:
{
-- 1 in 1000 chance of dropping a diamond.
-- Default rarity is '1'.
@@ -7980,7 +8313,7 @@ Used by `minetest.register_node`.
-- node is deleted from the world or the drops are added. This is
-- generally the result of either the node being dug or an attached node
-- becoming detached.
- -- oldmeta is the NodeMetaRef of the oldnode before deletion.
+ -- oldmeta are the metadata fields (table) of the node before deletion.
-- drops is a table of ItemStacks, so any metadata to be preserved can
-- be added directly to one or more of the dropped items. See
-- "ItemStackMetaRef".
@@ -8066,8 +8399,8 @@ Used by `minetest.register_node`.
mod_origin = "modname",
-- stores which mod actually registered a node
- -- if it can not find a source, returns "??"
- -- useful for getting what mod truly registered something
+ -- If the source could not be determined it contains "??"
+ -- Useful for getting which mod truly registered something
-- example: if a node is registered as ":othermodname:nodename",
-- nodename will show "othermodname", but mod_orgin will say "modname"
}
@@ -8080,11 +8413,11 @@ Used by `minetest.register_craft`.
### Shaped
{
- output = 'default:pick_stone',
+ output = "default:pick_stone",
recipe = {
- {'default:cobble', 'default:cobble', 'default:cobble'},
- {'', 'default:stick', ''},
- {'', 'default:stick', ''}, -- Also groups; e.g. 'group:crumbly'
+ {"default:cobble", "default:cobble", "default:cobble"},
+ {"", "default:stick", ""},
+ {"", "default:stick", ""}, -- Also groups; e.g. "group:crumbly"
},
replacements = <list of item pairs>,
-- replacements: replace one input item with another item on crafting
@@ -8095,7 +8428,7 @@ Used by `minetest.register_craft`.
{
type = "shapeless",
- output = 'mushrooms:mushroom_stew',
+ output = "mushrooms:mushroom_stew",
recipe = {
"mushrooms:bowl",
"mushrooms:mushroom_brown",
@@ -8120,7 +8453,7 @@ you want `additional_wear` to be negative.
The formula used to calculate the resulting wear is:
- 65536 - ( (65536 - tool_1_wear) + (65536 - tool_2_wear) + 65536 * additional_wear )
+ 65536 * (1 - ( (1 - tool_1_wear) + (1 - tool_2_wear) + additional_wear ))
The result is rounded and can't be lower than 0. If the result is 65536 or higher,
no crafting is possible.
@@ -8143,6 +8476,10 @@ no crafting is possible.
replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
}
+The engine does not implement anything specific to cooking or fuels, but the
+recpies can be retrieved later using `minetest.get_craft_result` to have a
+consistent interface across different games/mods.
+
Ore definition
--------------
@@ -8151,15 +8488,17 @@ Used by `minetest.register_ore`.
See [Ores] section above for essential information.
{
- ore_type = "scatter",
+ ore_type = "",
+ -- Supported: "scatter", "sheet", "puff", "blob", "vein", "stratum"
- ore = "default:stone_with_coal",
+ ore = "",
+ -- Ore node to place
- ore_param2 = 3,
- -- Facedir rotation. Default is 0 (unchanged rotation)
+ ore_param2 = 0,
+ -- Param2 to set for ore (e.g. facedir rotation)
- wherein = "default:stone",
- -- A list of nodenames is supported too
+ wherein = "",
+ -- Node to place ore in. Multiple are possible by passing a list.
clust_scarcity = 8 * 8 * 8,
-- Ore has a 1 out of clust_scarcity chance of spawning in a node.
@@ -8175,13 +8514,13 @@ See [Ores] section above for essential information.
-- nodes are coal ore.
y_min = -31000,
- y_max = 64,
- -- Lower and upper limits for ore
+ y_max = 31000,
+ -- Lower and upper limits for ore (inclusive)
flags = "",
-- Attributes for the ore generation, see 'Ore attributes' section above
- noise_threshold = 0.5,
+ noise_threshold = 0,
-- If noise is above this threshold, ore is placed. Not needed for a
-- uniform distribution.
@@ -8208,12 +8547,12 @@ See [Ores] section above for essential information.
-- Type-specific parameters
- -- sheet
+ -- "sheet"
column_height_min = 1,
column_height_max = 16,
column_midpoint_factor = 0.5,
- -- puff
+ -- "puff"
np_puff_top = {
offset = 4,
scale = 2,
@@ -8231,10 +8570,10 @@ See [Ores] section above for essential information.
persistence = 0.7
},
- -- vein
+ -- "vein"
random_factor = 1.0,
- -- stratum
+ -- "stratum"
np_stratum_thickness = {
offset = 8,
scale = 4,
@@ -8243,7 +8582,7 @@ See [Ores] section above for essential information.
octaves = 3,
persistence = 0.7
},
- stratum_thickness = 8,
+ stratum_thickness = 8, -- only used if no noise defined
}
Biome definition
@@ -8305,8 +8644,7 @@ performance and computing power the practical limit is much lower.
node_dungeon_alt = "default:mossycobble",
-- Node used for randomly-distributed alternative structure nodes.
- -- If alternative structure nodes are not wanted leave this absent for
- -- performance reasons.
+ -- If alternative structure nodes are not wanted leave this absent.
node_dungeon_stair = "stairs:stair_cobble",
-- Node used for dungeon stairs.
@@ -8346,12 +8684,13 @@ See [Decoration types]. Used by `minetest.register_decoration`.
{
deco_type = "simple",
+ -- Type. "simple" or "schematic" supported
place_on = "default:dirt_with_grass",
-- Node (or list of nodes) that the decoration can be placed on
sidelen = 8,
- -- Size of the square divisions of the mapchunk being generated.
+ -- Size of the square (X / Z) divisions of the mapchunk being generated.
-- Determines the resolution of noise variation if used.
-- If the chunk size is not evenly divisible by sidelen, sidelen is made
-- equal to the chunk size.
@@ -8387,14 +8726,13 @@ See [Decoration types]. Used by `minetest.register_decoration`.
y_min = -31000,
y_max = 31000,
- -- Lower and upper limits for decoration.
+ -- Lower and upper limits for decoration (inclusive).
-- These parameters refer to the Y co-ordinate of the 'place_on' node.
spawn_by = "default:water",
-- Node (or list of nodes) that the decoration only spawns next to.
- -- Checks two horizontal planes of 8 neighbouring nodes (including
- -- diagonal neighbours), one plane level with the 'place_on' node and a
- -- plane one node above that.
+ -- Checks the 8 neighbouring nodes on the same Y, and also the ones
+ -- at Y+1, excluding both center nodes.
num_spawn_by = 1,
-- Number of spawn_by nodes that must be surrounding the decoration
@@ -8478,6 +8816,7 @@ See [Decoration types]. Used by `minetest.register_decoration`.
-- See 'Schematic specifier' for details.
replacements = {["oldname"] = "convert_to", ...},
+ -- Map of node names to replace in the schematic after reading it.
flags = "place_center_x, place_center_y, place_center_z",
-- Flags for schematic decorations. See 'Schematic attributes'.
@@ -8587,30 +8926,30 @@ Used by `minetest.create_detached_inventory`.
HUD Definition
--------------
-See [HUD] section.
+Since most values have multiple different functions, please see the
+documentation in [HUD] section.
-Used by `Player:hud_add`. Returned by `Player:hud_get`.
+Used by `ObjectRef:hud_add`. Returned by `ObjectRef:hud_get`.
{
- hud_elem_type = "image", -- See HUD element types
+ hud_elem_type = "image",
-- Type of element, can be "image", "text", "statbar", "inventory",
- -- "compass" or "minimap"
+ -- "waypoint", "image_waypoint", "compass" or "minimap"
position = {x=0.5, y=0.5},
- -- Left corner position of element
+ -- Top left corner position of element
name = "<name>",
- scale = {x = 2, y = 2},
+ scale = {x = 1, y = 1},
text = "<text>",
text2 = "<text>",
- number = 2,
+ number = 0,
- item = 3,
- -- Selected item in inventory. 0 for no item selected.
+ item = 0,
direction = 0,
-- Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
@@ -8619,14 +8958,14 @@ Used by `Player:hud_add`. Returned by `Player:hud_get`.
offset = {x=0, y=0},
- size = { x=100, y=100 },
- -- Size of element in pixels
+ world_pos = {x=0, y=0, z=0},
+
+ size = {x=0, y=0},
z_index = 0,
- -- Z index : lower z-index HUDs are displayed behind higher z-index HUDs
+ -- Z index: lower z-index HUDs are displayed behind higher z-index HUDs
style = 0,
- -- For "text" elements sets font style: bitfield with 1 = bold, 2 = italic, 4 = monospace
}
Particle definition
@@ -8666,6 +9005,8 @@ Used by `minetest.add_particle`.
texture = "image.png",
-- The texture of the particle
+ -- v5.6.0 and later: also supports the table format described in the
+ -- following section
playername = "singleplayer",
-- Optional, if specified spawns particle only on the player's client
@@ -8687,6 +9028,12 @@ Used by `minetest.add_particle`.
-- If set to a valid number 1-6, specifies the tile from which the
-- particle texture is picked.
-- Otherwise, the default behavior is used. (currently: any random tile)
+
+ drag = {x=0, y=0, z=0},
+ -- v5.6.0 and later: Optional drag value, consult the following section
+
+ bounce = {min = ..., max = ..., bias = 0},
+ -- v5.6.0 and later: Optional bounce range, consult the following section
}
@@ -8695,7 +9042,20 @@ Used by `minetest.add_particle`.
Used by `minetest.add_particlespawner`.
+Before v5.6.0, particlespawners used a different syntax and had a more limited set
+of features. Definition fields that are the same in both legacy and modern versions
+are shown in the next listing, and the fields that are used by legacy versions are
+shown separated by a comment; the modern fields are too complex to compactly
+describe in this manner and are documented after the listing.
+
+The older syntax can be used in combination with the newer syntax (e.g. having
+`minpos`, `maxpos`, and `pos` all set) to support older servers. On newer servers,
+the new syntax will override the older syntax; on older servers, the newer syntax
+will be ignored.
+
{
+ -- Common fields (same name and meaning in both new and legacy syntax)
+
amount = 1,
-- Number of particles spawned over the time period `time`.
@@ -8704,22 +9064,6 @@ Used by `minetest.add_particlespawner`.
-- If time is 0 spawner has infinite lifespan and spawns the `amount` on
-- a per-second basis.
- minpos = {x=0, y=0, z=0},
- maxpos = {x=0, y=0, z=0},
- minvel = {x=0, y=0, z=0},
- maxvel = {x=0, y=0, z=0},
- minacc = {x=0, y=0, z=0},
- maxacc = {x=0, y=0, z=0},
- minexptime = 1,
- maxexptime = 1,
- minsize = 1,
- maxsize = 1,
- -- The particles' properties are random values between the min and max
- -- values.
- -- applies to: pos, velocity, acceleration, expirationtime, size
- -- If `node` is set, min and maxsize can be set to 0 to spawn
- -- randomly-sized particles (just like actual node dig particles).
-
collisiondetection = false,
-- If true collide with `walkable` nodes and, depending on the
-- `object_collision` field, objects too.
@@ -8748,8 +9092,11 @@ Used by `minetest.add_particlespawner`.
animation = {Tile Animation definition},
-- Optional, specifies how to animate the particles' texture
+ -- v5.6.0 and later: set length to -1 to sychronize the length
+ -- of the animation with the expiration time of individual particles.
+ -- (-2 causes the animation to be played twice, and so on)
- glow = 0
+ glow = 0,
-- Optional, specify particle self-luminescence in darkness.
-- Values 0-14.
@@ -8763,8 +9110,307 @@ Used by `minetest.add_particlespawner`.
-- If set to a valid number 1-6, specifies the tile from which the
-- particle texture is picked.
-- Otherwise, the default behavior is used. (currently: any random tile)
+
+ -- Legacy definition fields
+
+ minpos = {x=0, y=0, z=0},
+ maxpos = {x=0, y=0, z=0},
+ minvel = {x=0, y=0, z=0},
+ maxvel = {x=0, y=0, z=0},
+ minacc = {x=0, y=0, z=0},
+ maxacc = {x=0, y=0, z=0},
+ minexptime = 1,
+ maxexptime = 1,
+ minsize = 1,
+ maxsize = 1,
+ -- The particles' properties are random values between the min and max
+ -- values.
+ -- applies to: pos, velocity, acceleration, expirationtime, size
+ -- If `node` is set, min and maxsize can be set to 0 to spawn
+ -- randomly-sized particles (just like actual node dig particles).
+ }
+
+### Modern definition fields
+
+After v5.6.0, spawner properties can be defined in several different ways depending
+on the level of control you need. `pos` for instance can be set as a single vector,
+in which case all particles will appear at that exact point throughout the lifetime
+of the spawner. Alternately, it can be specified as a min-max pair, specifying a
+cubic range the particles can appear randomly within. Finally, some properties can
+be animated by suffixing their key with `_tween` (e.g. `pos_tween`) and supplying
+a tween table.
+
+The following definitions are all equivalent, listed in order of precedence from
+lowest (the legacy syntax) to highest (tween tables). If multiple forms of a
+property definition are present, the highest-precidence form will be selected
+and all lower-precedence fields will be ignored, allowing for graceful
+degradation in older clients).
+
+ {
+ -- old syntax
+ maxpos = {x = 0, y = 0, z = 0},
+ minpos = {x = 0, y = 0, z = 0},
+
+ -- absolute value
+ pos = 0,
+ -- all components of every particle's position vector will be set to this
+ -- value
+
+ -- vec3
+ pos = vector.new(0,0,0),
+ -- all particles will appear at this exact position throughout the lifetime
+ -- of the particlespawner
+
+ -- vec3 range
+ pos = {
+ -- the particle will appear at a position that is picked at random from
+ -- within a cubic range
+
+ min = vector.new(0,0,0),
+ -- `min` is the minimum value this property will be set to in particles
+ -- spawned by the generator
+
+ max = vector.new(0,0,0),
+ -- `max` is the minimum value this property will be set to in particles
+ -- spawned by the generator
+
+ bias = 0,
+ -- when `bias` is 0, all random values are exactly as likely as any
+ -- other. when it is positive, the higher it is, the more likely values
+ -- will appear towards the minimum end of the allowed spectrum. when
+ -- it is negative, the lower it is, the more likely values will appear
+ -- towards the maximum end of the allowed spectrum. the curve is
+ -- exponential and there is no particular maximum or minimum value
+ },
+
+ -- tween table
+ pos_tween = {...},
+ -- a tween table should consist of a list of frames in the same form as the
+ -- untweened pos property above, which the engine will interpolate between,
+ -- and optionally a number of properties that control how the interpolation
+ -- takes place. currently **only two frames**, the first and the last, are
+ -- used, but extra frames are accepted for the sake of forward compatibility.
+ -- any of the above definition styles can be used here as well in any combination
+ -- supported by the property type
+
+ pos_tween = {
+ style = "fwd",
+ -- linear animation from first to last frame (default)
+ style = "rev",
+ -- linear animation from last to first frame
+ style = "pulse",
+ -- linear animation from first to last then back to first again
+ style = "flicker",
+ -- like "pulse", but slightly randomized to add a bit of stutter
+
+ reps = 1,
+ -- number of times the animation is played over the particle's lifespan
+
+ start = 0.0,
+ -- point in the spawner's lifespan at which the animation begins. 0 is
+ -- the very beginning, 1 is the very end
+
+ -- frames can be defined in a number of different ways, depending on the
+ -- underlying type of the property. for now, all but the first and last
+ -- frame are ignored
+
+ -- frames
+
+ -- floats
+ 0, 0,
+
+ -- vec3s
+ vector.new(0,0,0),
+ vector.new(0,0,0),
+
+ -- vec3 ranges
+ { min = vector.new(0,0,0), max = vector.new(0,0,0), bias = 0 },
+ { min = vector.new(0,0,0), max = vector.new(0,0,0), bias = 0 },
+
+ -- mixed
+ 0, { min = vector.new(0,0,0), max = vector.new(0,0,0), bias = 0 },
+ },
+ }
+
+All of the properties that can be defined in this way are listed in the next
+section, along with the datatypes they accept.
+
+#### List of particlespawner properties
+All of the properties in this list can be animated with `*_tween` tables
+unless otherwise specified. For example, `jitter` can be tweened by setting
+a `jitter_tween` table instead of (or in addition to) a `jitter` table/value.
+Types used are defined in the previous section.
+
+* vec3 range `pos`: the position at which particles can appear
+* vec3 range `vel`: the initial velocity of the particle
+* vec3 range `acc`: the direction and speed with which the particle
+ accelerates
+* vec3 range `jitter`: offsets the velocity of each particle by a random
+ amount within the specified range each frame. used to create Brownian motion.
+* vec3 range `drag`: the amount by which absolute particle velocity along
+ each axis is decreased per second. a value of 1.0 means that the particle
+ will be slowed to a stop over the space of a second; a value of -1.0 means
+ that the particle speed will be doubled every second. to avoid interfering
+ with gravity provided by `acc`, a drag vector like `vector.new(1,0,1)` can
+ be used instead of a uniform value.
+* float range `bounce`: how bouncy the particles are when `collisiondetection`
+ is turned on. values less than or equal to `0` turn off particle bounce;
+ `1` makes the particles bounce without losing any velocity, and `2` makes
+ them double their velocity with every bounce. `bounce` is not bounded but
+ values much larger than `1.0` probably aren't very useful.
+* float range `exptime`: the number of seconds after which the particle
+ disappears.
+* table `attract`: sets the birth orientation of particles relative to various
+ shapes defined in world coordinate space. this is an alternative means of
+ setting the velocity which allows particles to emerge from or enter into
+ some entity or node on the map, rather than simply being assigned random
+ velocity values within a range. the velocity calculated by this method will
+ be **added** to that specified by `vel` if `vel` is also set, so in most
+ cases **`vel` should be set to 0**. `attract` has the fields:
+ * string `kind`: selects the kind of shape towards which the particles will
+ be oriented. it must have one of the following values:
+ * `"none"`: no attractor is set and the `attractor` table is ignored
+ * `"point"`: the particles are attracted to a specific point in space.
+ use this also if you want a sphere-like effect, in combination with
+ the `radius` property.
+ * `"line"`: the particles are attracted to an (infinite) line passing
+ through the points `origin` and `angle`. use this for e.g. beacon
+ effects, energy beam effects, etc.
+ * `"plane"`: the particles are attracted to an (infinite) plane on whose
+ surface `origin` designates a point in world coordinate space. use this
+ for e.g. particles entering or emerging from a portal.
+ * float range `strength`: the speed with which particles will move towards
+ `attractor`. If negative, the particles will instead move away from that
+ point.
+ * vec3 `origin`: the origin point of the shape towards which particles will
+ initially be oriented. functions as an offset if `origin_attached` is also
+ set.
+ * vec3 `direction`: sets the direction in which the attractor shape faces. for
+ lines, this sets the angle of the line; e.g. a vector of (0,1,0) will
+ create a vertical line that passes through `origin`. for planes, `direction`
+ is the surface normal of an infinite plane on whose surface `origin` is
+ a point. functions as an offset if `direction_attached` is also set.
+ * entity `origin_attached`: allows the origin to be specified as an offset
+ from the position of an entity rather than a coordinate in world space.
+ * entity `direction_attached`: allows the direction to be specified as an offset
+ from the position of an entity rather than a coordinate in world space.
+ * bool `die_on_contact`: if true, the particles' lifetimes are adjusted so
+ that they will die as they cross the attractor threshold. this behavior
+ is the default but is undesirable for some kinds of animations; set it to
+ false to allow particles to live out their natural lives.
+* vec3 range `radius`: if set, particles will be arranged in a sphere around
+ `pos`. A constant can be used to create a spherical shell of particles, a
+ vector to create an ovoid shell, and a range to create a volume; e.g.
+ `{min = 0.5, max = 1, bias = 1}` will allow particles to appear between 0.5
+ and 1 nodes away from `pos` but will cluster them towards the center of the
+ sphere. Usually if `radius` is used, `pos` should be a single point, but it
+ can still be a range if you really know what you're doing (e.g. to create a
+ "roundcube" emitter volume).
+
+### Textures
+
+In versions before v5.6.0, particlespawner textures could only be specified as a single
+texture string. After v5.6.0, textures can now be specified as a table as well. This
+table contains options that allow simple animations to be applied to the texture.
+
+ texture = {
+ name = "mymod_particle_texture.png",
+ -- the texture specification string
+
+ alpha = 1.0,
+ -- controls how visible the particle is; at 1.0 the particle is fully
+ -- visible, at 0, it is completely invisible.
+
+ alpha_tween = {1, 0},
+ -- can be used instead of `alpha` to animate the alpha value over the
+ -- particle's lifetime. these tween tables work identically to the tween
+ -- tables used in particlespawner properties, except that time references
+ -- are understood with respect to the particle's lifetime, not the
+ -- spawner's. {1,0} fades the particle out over its lifetime.
+
+ scale = 1,
+ scale = {x = 1, y = 1},
+ -- scales the texture onscreen
+
+ scale_tween = {
+ {x = 1, y = 1},
+ {x = 0, y = 1},
+ },
+ -- animates the scale over the particle's lifetime. works like the
+ -- alpha_tween table, but can accept two-dimensional vectors as well as
+ -- integer values. the example value would cause the particle to shrink
+ -- in one dimension over the course of its life until it disappears
+
+ blend = "alpha",
+ -- (default) blends transparent pixels with those they are drawn atop
+ -- according to the alpha channel of the source texture. useful for
+ -- e.g. material objects like rocks, dirt, smoke, or node chunks
+ blend = "add",
+ -- adds the value of pixels to those underneath them, modulo the sources
+ -- alpha channel. useful for e.g. bright light effects like sparks or fire
+ blend = "screen",
+ -- like "add" but less bright. useful for subtler light effecs. note that
+ -- this is NOT formally equivalent to the "screen" effect used in image
+ -- editors and compositors, as it does not respect the alpha channel of
+ -- of the image being blended
+ blend = "sub",
+ -- the inverse of "add"; the value of the source pixel is subtracted from
+ -- the pixel underneath it. a white pixel will turn whatever is underneath
+ -- it black; a black pixel will be "transparent". useful for creating
+ -- darkening effects
+
+ animation = {Tile Animation definition},
+ -- overrides the particlespawner's global animation property for a single
+ -- specific texture
}
+Instead of setting a single texture definition, it is also possible to set a
+`texpool` property. A `texpool` consists of a list of possible particle textures.
+Every time a particle is spawned, the engine will pick a texture at random from
+the `texpool` and assign it as that particle's texture. You can also specify a
+`texture` in addition to a `texpool`; the `texture` value will be ignored on newer
+clients but will be sent to older (pre-v5.6.0) clients that do not implement
+texpools.
+
+ texpool = {
+ "mymod_particle_texture.png";
+ { name = "mymod_spark.png", fade = "out" },
+ {
+ name = "mymod_dust.png",
+ alpha = 0.3,
+ scale = 1.5,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16, aspect_h = 16,
+
+ length = 3,
+ -- the animation lasts for 3s and then repeats
+ length = -3,
+ -- repeat the animation three times over the particle's lifetime
+ -- (post-v5.6.0 clients only)
+ },
+ },
+ }
+
+#### List of animatable texture properties
+
+While animated particlespawner values vary over the course of the particlespawner's
+lifetime, animated texture properties vary over the lifespans of the individual
+particles spawned with that texture. So a particle with the texture property
+
+ alpha_tween = {
+ 0.0, 1.0,
+ style = "pulse",
+ reps = 4,
+ }
+
+would be invisible at its spawning, pulse visible four times throughout its
+lifespan, and then vanish again before expiring.
+
+* float `alpha` (0.0 - 1.0): controls the visibility of the texture
+* vec2 `scale`: controls the size of the displayed billboard onscreen. Its units
+ are multiples of the parent particle's assigned size (see the `size` property above)
+
`HTTPRequest` definition
------------------------
diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt
index 9bc0c46bd..4d495f21e 100644
--- a/doc/menu_lua_api.txt
+++ b/doc/menu_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Mainmenu API Reference 5.5.0
+Minetest Lua Mainmenu API Reference 5.6.0
=========================================
Introduction
@@ -46,6 +46,8 @@ core.open_url(url)
core.open_dir(path)
^ opens the path in the system file browser/explorer, returns false on failure.
^ Must be an existing directory.
+core.share_file(path)
+^ Android only. Shares file using the share popup
core.get_version() (possible in async calls)
^ returns current core version
@@ -221,13 +223,24 @@ Package - content which is downloadable from the content db, may or may not be i
* returns path to global user data,
the directory that contains user-provided mods, worlds, games, and texture packs.
* core.get_modpath() (possible in async calls)
- * returns path to global modpath, where mods can be installed
+ * returns path to global modpath in the user path, where mods can be installed
* core.get_modpaths() (possible in async calls)
- * returns list of paths to global modpaths, where mods have been installed
-
+ * returns table of virtual path to global modpaths, where mods have been installed
The difference with "core.get_modpath" is that no mods should be installed in these
directories by Minetest -- they might be read-only.
+ Ex:
+
+ ```
+ {
+ mods = "/home/user/.minetest/mods",
+ share = "/usr/share/minetest/mods",
+
+ -- Custom dirs can be specified by the MINETEST_MOD_DIR env variable
+ ["/path/to/custom/dir"] = "/path/to/custom/dir",
+ }
+ ```
+
* core.get_clientmodpath() (possible in async calls)
* returns path to global client-side modpath
* core.get_gamepath() (possible in async calls)
@@ -235,13 +248,14 @@ Package - content which is downloadable from the content db, may or may not be i
* core.get_texturepath() (possible in async calls)
* returns path to default textures
* core.get_game(index)
+ * `name` in return value is deprecated, use `title` instead.
* returns:
{
id = <id>,
path = <full path to game>,
gamemods_path = <path>,
- name = <name of game>,
+ title = <title of game>,
menuicon_path = <full path to menuicon>,
author = "author",
DEPRECATED:
@@ -253,15 +267,27 @@ Package - content which is downloadable from the content db, may or may not be i
* returns
{
- name = "name of content",
+ name = "technical_id",
type = "mod" or "modpack" or "game" or "txp",
+ title = "Human readable title",
description = "description",
author = "author",
path = "path/to/content",
depends = {"mod", "names"}, -- mods only
optional_depends = {"mod", "names"}, -- mods only
}
+* core.check_mod_configuration(world_path, mod_paths)
+ * Checks whether configuration is valid.
+ * `world_path`: path to the world
+ * `mod_paths`: list of enabled mod paths
+ * returns:
+ {
+ is_consistent = true, -- true is consistent, false otherwise
+ unsatisfied_mods = {}, -- list of mod specs
+ satisfied_mods = {}, -- list of mod specs
+ error_message = "", -- message or nil
+ }
Logging
-------
diff --git a/doc/minetest.6 b/doc/minetest.6
index 6a3601f80..27a3d0024 100644
--- a/doc/minetest.6
+++ b/doc/minetest.6
@@ -92,8 +92,6 @@ Set password from contents of file
.B \-\-random\-input
Enable random user input, for testing (client only)
.TP
-.B \-\-videomodes
-List available video modes (client only)
.TP
.B \-\-speedtests
Run speed tests
diff --git a/doc/world_format.txt b/doc/world_format.txt
index eb1d7f728..17923df8e 100644
--- a/doc/world_format.txt
+++ b/doc/world_format.txt
@@ -129,9 +129,34 @@ Example content (added indentation and - explanations):
backend = sqlite3 - which DB backend to use for blocks (sqlite3, dummy, leveldb, redis, postgresql)
player_backend = sqlite3 - which DB backend to use for player data
readonly_backend = sqlite3 - optionally readonly seed DB (DB file _must_ be located in "readonly" subfolder)
+ auth_backend = files - which DB backend to use for authentication data
server_announce = false - whether the server is publicly announced or not
load_mod_<mod> = false - whether <mod> is to be loaded in this world
- auth_backend = files - which DB backend to use for authentication data
+
+For load_mod_<mod>, the possible values are:
+
+* `false` - Do not load the mod.
+* `true` - Load the mod from wherever it is found (may cause conflicts if the same mod appears also in some other place).
+* `mods/modpack/moddir` - Relative path to the mod
+ * Must be one of the following:
+ * `mods/`: mods in the user path's mods folder (ex `/home/user/.minetest/mods`)
+ * `share/`: mods in the share's mods folder (ex: `/usr/share/minetest/mods`)
+ * `/path/to/env`: you can use absolute paths to mods inside folders specified with the `MINETEST_MOD_PATH` env variable.
+ * Other locations and absolute paths are not supported
+ * Note that `moddir` is the directory name, not the mod name specified in mod.conf.
+
+PostgreSQL backend specific settings:
+ pgsql_connection = host=127.0.0.1 port=5432 user=mt_user password=mt_password dbname=minetest
+ pgsql_player_connection = (same parameters as above)
+ pgsql_readonly_connection = (same parameters as above)
+ pgsql_auth_connection = (same parameters as above)
+
+Redis backend specific settings:
+ redis_address = 127.0.0.1 - Redis server address
+ redis_hash = foo - Database hash
+ redis_port = 6379 - (optional) connection port
+ redis_password = hunter2 - (optional) server password
+
Player File Format
===================
@@ -333,6 +358,9 @@ if map format version >= 29:
- 0xffffffff = invalid/unknown timestamp, nothing should be done with the time
difference when loaded
+ u8 name_id_mapping_version
+ - Should be zero for map format version 29.
+
u16 num_name_id_mappings
foreach num_name_id_mappings
u16 id
@@ -434,7 +462,7 @@ if map format version < 29:
u8[name_len] name
- Node timers
-if map format version == 25:
+if map format version >= 25:
u8 length of the data of a single timer (always 2+4+4=10)
u16 num_of_timers
foreach num_of_timers:
diff --git a/games/devtest/.luacheckrc b/games/devtest/.luacheckrc
new file mode 100644
index 000000000..1c7d3994f
--- /dev/null
+++ b/games/devtest/.luacheckrc
@@ -0,0 +1,43 @@
+unused_args = false
+allow_defined_top = true
+max_string_line_length = false
+max_line_length = false
+
+ignore = {
+ "131", -- Unused global variable
+ "211", -- Unused local variable
+ "231", -- Local variable never accessed
+ "311", -- Value assigned to a local variable is unused
+ "412", -- Redefining an argument
+ "421", -- Shadowing a local variable
+ "431", -- Shadowing an upvalue
+ "432", -- Shadowing an upvalue argument
+ "611", -- Line contains only whitespace
+}
+
+read_globals = {
+ "ItemStack",
+ "INIT",
+ "DIR_DELIM",
+ "dump", "dump2",
+ "fgettext", "fgettext_ne",
+ "vector",
+ "VoxelArea",
+ "profiler",
+ "Settings",
+ "check",
+ "PseudoRandom",
+
+ string = {fields = {"split", "trim"}},
+ table = {fields = {"copy", "getn", "indexof", "insert_all"}},
+ math = {fields = {"hypot", "round"}},
+}
+
+globals = {
+ "aborted",
+ "minetest",
+ "core",
+ os = { fields = { "tempfolder" } },
+ "_",
+}
+
diff --git a/games/devtest/game.conf b/games/devtest/game.conf
index d6e382ad7..0f5656c99 100644
--- a/games/devtest/game.conf
+++ b/games/devtest/game.conf
@@ -1,2 +1,2 @@
-name = Development Test
+title = Development Test
description = Testing environment to help with testing the engine features of Minetest. It can also be helpful in mod development.
diff --git a/games/devtest/mods/basetools/init.lua b/games/devtest/mods/basetools/init.lua
index fd83b82eb..3ec69d39f 100644
--- a/games/devtest/mods/basetools/init.lua
+++ b/games/devtest/mods/basetools/init.lua
@@ -279,50 +279,135 @@ minetest.register_tool("basetools:sword_wood", {
})
minetest.register_tool("basetools:sword_stone", {
description = "Stone Sword".."\n"..
- "Damage: fleshy=4",
+ "Damage: fleshy=5",
inventory_image = "basetools_stonesword.png",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
- damage_groups = {fleshy=4},
+ damage_groups = {fleshy=5},
}
})
minetest.register_tool("basetools:sword_steel", {
description = "Steel Sword".."\n"..
- "Damage: fleshy=6",
+ "Damage: fleshy=10",
inventory_image = "basetools_steelsword.png",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
- damage_groups = {fleshy=6},
+ damage_groups = {fleshy=10},
+ }
+})
+minetest.register_tool("basetools:sword_titanium", {
+ description = "Titanium Sword".."\n"..
+ "Damage: fleshy=100",
+ inventory_image = "basetools_titaniumsword.png",
+ tool_capabilities = {
+ full_punch_interval = 1.0,
+ max_drop_level=1,
+ damage_groups = {fleshy=100},
+ }
+})
+minetest.register_tool("basetools:sword_blood", {
+ description = "Blood Sword".."\n"..
+ "Damage: fleshy=1000",
+ inventory_image = "basetools_bloodsword.png",
+ tool_capabilities = {
+ full_punch_interval = 1.0,
+ max_drop_level=1,
+ damage_groups = {fleshy=1000},
+ }
+})
+
+-- Max. damage sword
+minetest.register_tool("basetools:sword_mese", {
+ description = "Mese Sword".."\n"..
+ "Damage: fleshy=32767, fiery=32767, icy=32767".."\n"..
+ "Full Punch Interval: 0.0s",
+ inventory_image = "basetools_mesesword.png",
+ tool_capabilities = {
+ full_punch_interval = 0.0,
+ max_drop_level=1,
+ damage_groups = {fleshy=32767, fiery=32767, icy=32767},
}
})
-- Fire/Ice sword: Deal damage to non-fleshy damage groups
minetest.register_tool("basetools:sword_fire", {
description = "Fire Sword".."\n"..
- "Damage: icy=6",
+ "Damage: icy=10",
inventory_image = "basetools_firesword.png",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
- damage_groups = {icy=6},
+ damage_groups = {icy=10},
}
})
minetest.register_tool("basetools:sword_ice", {
description = "Ice Sword".."\n"..
- "Damage: fiery=6",
+ "Damage: fiery=10",
inventory_image = "basetools_icesword.png",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
- damage_groups = {fiery=6},
+ damage_groups = {fiery=10},
+ }
+})
+minetest.register_tool("basetools:sword_elemental", {
+ description = "Elemental Sword".."\n"..
+ "Damage: fiery=10, icy=10",
+ inventory_image = "basetools_elementalsword.png",
+ tool_capabilities = {
+ full_punch_interval = 1.0,
+ max_drop_level=0,
+ damage_groups = {fiery=10, icy=10},
}
})
+-- Healing weapons: heal HP
+minetest.register_tool("basetools:dagger_heal", {
+ description = "Healing Dagger".."\n"..
+ "Heal: fleshy=1".."\n"..
+ "Full Punch Interval: 0.5s",
+ inventory_image = "basetools_healdagger.png",
+ tool_capabilities = {
+ full_punch_interval = 0.5,
+ damage_groups = {fleshy=-1},
+ }
+})
+minetest.register_tool("basetools:sword_heal", {
+ description = "Healing Sword".."\n"..
+ "Heal: fleshy=10",
+ inventory_image = "basetools_healsword.png",
+ tool_capabilities = {
+ full_punch_interval = 1.0,
+ damage_groups = {fleshy=-10},
+ }
+})
+minetest.register_tool("basetools:sword_heal_super", {
+ description = "Super Healing Sword".."\n"..
+ "Heal: fleshy=32768, fiery=32768, icy=32768",
+ inventory_image = "basetools_superhealsword.png",
+ tool_capabilities = {
+ full_punch_interval = 1.0,
+ damage_groups = {fleshy=-32768, fiery=-32768, icy=-32768},
+ }
+})
+
+
--
-- Dagger: Low damage, fast punch interval
--
+minetest.register_tool("basetools:dagger_wood", {
+ description = "Wooden Dagger".."\n"..
+ "Damage: fleshy=1".."\n"..
+ "Full Punch Interval: 0.5s",
+ inventory_image = "basetools_wooddagger.png",
+ tool_capabilities = {
+ full_punch_interval = 0.5,
+ max_drop_level=0,
+ damage_groups = {fleshy=1},
+ }
+})
minetest.register_tool("basetools:dagger_steel", {
description = "Steel Dagger".."\n"..
"Damage: fleshy=2".."\n"..
@@ -343,7 +428,7 @@ for i=1, #uses do
minetest.register_tool("basetools:pick_uses_"..string.format("%05d", u), {
description = u.."-Uses Pickaxe".."\n"..
"Digs cracky=3",
- inventory_image = "basetools_steelpick.png^[colorize:"..color..":127",
+ inventory_image = "basetools_usespick.png^[colorize:"..color..":127",
tool_capabilities = {
max_drop_level=0,
groupcaps={
@@ -355,7 +440,7 @@ for i=1, #uses do
minetest.register_tool("basetools:sword_uses_"..string.format("%05d", u), {
description = u.."-Uses Sword".."\n"..
"Damage: fleshy=1",
- inventory_image = "basetools_woodsword.png^[colorize:"..color..":127",
+ inventory_image = "basetools_usessword.png^[colorize:"..color..":127",
tool_capabilities = {
damage_groups = {fleshy=1},
punch_attack_uses = u,
diff --git a/games/devtest/mods/basetools/textures/basetools_bloodsword.png b/games/devtest/mods/basetools/textures/basetools_bloodsword.png
new file mode 100644
index 000000000..a521ba4a2
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_bloodsword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_elementalsword.png b/games/devtest/mods/basetools/textures/basetools_elementalsword.png
new file mode 100644
index 000000000..d007217ee
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_elementalsword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_firesword.png b/games/devtest/mods/basetools/textures/basetools_firesword.png
index ee2809ab7..eca999ba1 100644
--- a/games/devtest/mods/basetools/textures/basetools_firesword.png
+++ b/games/devtest/mods/basetools/textures/basetools_firesword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_healdagger.png b/games/devtest/mods/basetools/textures/basetools_healdagger.png
new file mode 100644
index 000000000..3e6eb9cd0
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_healdagger.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_healsword.png b/games/devtest/mods/basetools/textures/basetools_healsword.png
new file mode 100644
index 000000000..f93fddfb2
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_healsword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_icesword.png b/games/devtest/mods/basetools/textures/basetools_icesword.png
index 35ba8214b..55a8d609d 100644
--- a/games/devtest/mods/basetools/textures/basetools_icesword.png
+++ b/games/devtest/mods/basetools/textures/basetools_icesword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_mesepick.png b/games/devtest/mods/basetools/textures/basetools_mesepick.png
index 2b5e12cdb..2993b475b 100644
--- a/games/devtest/mods/basetools/textures/basetools_mesepick.png
+++ b/games/devtest/mods/basetools/textures/basetools_mesepick.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_mesesword.png b/games/devtest/mods/basetools/textures/basetools_mesesword.png
new file mode 100644
index 000000000..bc82769bc
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_mesesword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_superhealsword.png b/games/devtest/mods/basetools/textures/basetools_superhealsword.png
new file mode 100644
index 000000000..4175a0917
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_superhealsword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_titaniumsword.png b/games/devtest/mods/basetools/textures/basetools_titaniumsword.png
new file mode 100644
index 000000000..55e22c7d5
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_titaniumsword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_usespick.png b/games/devtest/mods/basetools/textures/basetools_usespick.png
new file mode 100644
index 000000000..27850f961
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_usespick.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_usessword.png b/games/devtest/mods/basetools/textures/basetools_usessword.png
new file mode 100644
index 000000000..0eaf4cf38
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_usessword.png
Binary files differ
diff --git a/games/devtest/mods/basetools/textures/basetools_wooddagger.png b/games/devtest/mods/basetools/textures/basetools_wooddagger.png
new file mode 100644
index 000000000..6e5ab0fd6
--- /dev/null
+++ b/games/devtest/mods/basetools/textures/basetools_wooddagger.png
Binary files differ
diff --git a/games/devtest/mods/testentities/armor.lua b/games/devtest/mods/testentities/armor.lua
index 306953d50..415e5bd19 100644
--- a/games/devtest/mods/testentities/armor.lua
+++ b/games/devtest/mods/testentities/armor.lua
@@ -4,10 +4,19 @@
local phasearmor = {
[0]={icy=100},
[1]={fiery=100},
- [2]={fleshy=100},
- [3]={immortal=1},
- [4]={punch_operable=1},
+ [2]={icy=100, fiery=100},
+ [3]={fleshy=-100},
+ [4]={fleshy=1},
+ [5]={fleshy=10},
+ [6]={fleshy=50},
+ [7]={fleshy=100},
+ [8]={fleshy=200},
+ [9]={fleshy=1000},
+ [10]={fleshy=32767},
+ [11]={immortal=1},
+ [12]={punch_operable=1},
}
+local max_phase = 12
minetest.register_entity("testentities:armorball", {
initial_properties = {
@@ -17,11 +26,11 @@ minetest.register_entity("testentities:armorball", {
visual = "sprite",
visual_size = {x=1, y=1},
textures = {"testentities_armorball.png"},
- spritediv = {x=1, y=5},
+ spritediv = {x=1, y=max_phase+1},
initial_sprite_basepos = {x=0, y=0},
},
- _phase = 2,
+ _phase = 7,
on_activate = function(self, staticdata)
minetest.log("action", "[testentities] armorball.on_activate")
@@ -32,10 +41,21 @@ minetest.register_entity("testentities:armorball", {
on_rightclick = function(self, clicker)
-- Change armor group and sprite
self._phase = self._phase + 1
- if self._phase >= 5 then
+ if self._phase >= max_phase + 1 then
self._phase = 0
end
self.object:set_sprite({x=0, y=self._phase})
self.object:set_armor_groups(phasearmor[self._phase])
end,
+
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
+ if not puncher then
+ return
+ end
+ local name = puncher:get_player_name()
+ if not name then
+ return
+ end
+ minetest.chat_send_player(name, "time_from_last_punch="..string.format("%.3f", time_from_last_punch).."; damage="..tostring(damage))
+ end,
})
diff --git a/games/devtest/mods/testentities/callbacks.lua b/games/devtest/mods/testentities/callbacks.lua
index 320690b39..a212fbfbe 100644
--- a/games/devtest/mods/testentities/callbacks.lua
+++ b/games/devtest/mods/testentities/callbacks.lua
@@ -31,8 +31,8 @@ minetest.register_entity("testentities:callback", {
on_activate = function(self, staticdata, dtime_s)
message("Callback entity: on_activate! pos="..spos(self).."; dtime_s="..dtime_s)
end,
- on_deactivate = function(self)
- message("Callback entity: on_deactivate! pos="..spos(self))
+ on_deactivate = function(self, removal)
+ message("Callback entity: on_deactivate! pos="..spos(self) .. "; removal=" .. tostring(removal))
end,
on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
local name = get_object_name(puncher)
diff --git a/games/devtest/mods/testentities/textures/testentities_armorball.png b/games/devtest/mods/testentities/textures/testentities_armorball.png
index 88147bd1f..708c7b36d 100644
--- a/games/devtest/mods/testentities/textures/testentities_armorball.png
+++ b/games/devtest/mods/testentities/textures/testentities_armorball.png
Binary files differ
diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua
index c0db695b7..5f1f8970e 100644
--- a/games/devtest/mods/testformspec/formspec.lua
+++ b/games/devtest/mods/testformspec/formspec.lua
@@ -195,8 +195,10 @@ local style_fs = [[
style[one_btn15;border=false;bgcolor=#1cc;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png]
item_image_button[1.25,9.6;1,1;testformspec:item;one_btn15;Bg]
- style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_hovered=testformspec_bg_9slice_hovered.png;bgimg_pressed=testformspec_bg_9slice_pressed.png;bgimg_middle=4,6]
- button[2.5,9.6;2,1;one_btn16;9-Slice Bg]
+ style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_middle=4,6;padding=5,7;fgimg=testformspec_bg.png;fgimg_middle=1]
+ style[one_btn16:hovered;bgimg=testformspec_bg_9slice_hovered.png;fgimg=testformspec_bg_hovered.png]
+ style[one_btn16:pressed;bgimg=testformspec_bg_9slice_pressed.png;fgimg=testformspec_bg_pressed.png]
+ image_button[2.5,9.6;2,1;;one_btn16;9-Slice Bg]
@@ -375,12 +377,16 @@ local pages = {
-- Animation
[[
- formspec_version[3]
+ formspec_version[6]
size[12,13]
animated_image[0.5,0.5;1,1;;testformspec_animation.png;4;100]
animated_image[0.5,1.75;1,1;;testformspec_animation.jpg;4;100]
animated_image[1.75,0.5;1,1;;testformspec_animation.png;100;100]
animated_image[3,0.5;1,1;ani_img_1;testformspec_animation.png;4;1000]
+ image[0.5,3;1,1;testformspec_bg.png;1]
+ animated_image[0.5,4.25;1,1;;[combine:16x48:0,0=testformspec_bg.png:0,16=testformspec_bg_hovered.png:0,32=testformspec_bg_pressed.png;3;250;1;1]
+ image[0.5,5.5;2,1;testformspec_9slice.png;16,0,-16,-16]
+ animated_image[2.75,5.5;1.5,0.5;;[combine:300x140:0,0=testformspec_9slice.png:0,70=(testformspec_9slice.png^[transformFX);2;500;1;16,0,-16,-16]
button[4.25,0.5;1,1;ani_btn_1;Current
Number]
animated_image[3,1.75;1,1;ani_img_2;testformspec_animation.png;4;1000;2]
@@ -430,6 +436,33 @@ mouse control = true]
checkbox[0.5,5.5.5;snd_chk;Sound;]
tabheader[0.5,7;8,0.65;snd_tab;Soundtab1,Soundtab2,Soundtab3;1;false;false]
]],
+
+ -- Background
+ [[
+ formspec_version[3]
+ size[12,13]
+ box[0,0;12,13;#f0f1]
+ background[0,0;0,0;testformspec_bg.png;true]
+ box[3.9,2.9;6.2,4.2;#d00f]
+ scroll_container[4,3;6,4;scrbar;vertical]
+ background9[1,0.5;0,0;testformspec_bg_9slice.png;true;4,6]
+ label[0,0.2;Backgrounds are not be applied to scroll containers,]
+ label[0,0.5;but to the whole form.]
+ scroll_container_end[]
+ scrollbar[3.5,3;0.3,4;vertical;scrbar;0]
+ container[2,11]
+ box[-0.1,0.5;3.2,1;#fff5]
+ background[0,0;2,3;testformspec_bg.png;false]
+ background9[1,0;2,3;testformspec_bg_9slice.png;false;4,6]
+ container_end[]
+ ]],
+
+ -- Unsized
+ [[
+ formspec_version[3]
+ background9[0,0;0,0;testformspec_bg_9slice.png;true;4,6]
+ background[1,1;0,0;testformspec_bg.png;true]
+ ]],
}
local page_id = 2
@@ -439,7 +472,7 @@ local function show_test_formspec(pname)
page = page()
end
- local fs = page .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound;" .. page_id .. ";false;false]"
+ local fs = page .. "tabheader[0,0;11,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound,Background,Unsized;" .. page_id .. ";false;false]"
minetest.show_formspec(pname, "testformspec:formspec", fs)
end
diff --git a/games/devtest/mods/testformspec/textures/testformspec_9slice.png b/games/devtest/mods/testformspec/textures/testformspec_9slice.png
new file mode 100644
index 000000000..70b6412a4
--- /dev/null
+++ b/games/devtest/mods/testformspec/textures/testformspec_9slice.png
Binary files differ
diff --git a/games/devtest/mods/testitems/init.lua b/games/devtest/mods/testitems/init.lua
new file mode 100644
index 000000000..33ebf50fc
--- /dev/null
+++ b/games/devtest/mods/testitems/init.lua
@@ -0,0 +1,55 @@
+local S = minetest.get_translator("testitems")
+
+--
+-- Texture overlays for items
+--
+
+-- For the global overlay color test
+local GLOBAL_COLOR_ARG = "orange"
+
+-- Punch handler to set random color with "color" argument in item metadata
+local overlay_on_use = function(itemstack, user, pointed_thing)
+ local meta = itemstack:get_meta()
+ local color = math.random(0x0, 0xFFFFFF)
+ local colorstr = string.format("#%06x", color)
+ meta:set_string("color", colorstr)
+ minetest.log("action", "[testitems] Color of "..itemstack:get_name().." changed to "..colorstr)
+ return itemstack
+end
+-- Place handler to clear item metadata color
+local overlay_on_place = function(itemstack, user, pointed_thing)
+ local meta = itemstack:get_meta()
+ meta:set_string("color", "")
+ return itemstack
+end
+
+minetest.register_craftitem("testitems:overlay_meta", {
+ description = S("Texture Overlay Test Item, Meta Color") .. "\n" ..
+ S("Image must be a square with rainbow cross (inventory and wield)") .. "\n" ..
+ S("Item meta color must only change square color") .. "\n" ..
+ S("Punch: Set random color") .. "\n" ..
+ S("Place: Clear color"),
+ -- Base texture: A grayscale square (can be colorized)
+ inventory_image = "testitems_overlay_base.png",
+ wield_image = "testitems_overlay_base.png",
+ -- Overlay: A rainbow cross (NOT to be colorized!)
+ inventory_overlay = "testitems_overlay_overlay.png",
+ wield_overlay = "testitems_overlay_overlay.png",
+
+ on_use = overlay_on_use,
+ on_place = overlay_on_place,
+ on_secondary_use = overlay_on_place,
+})
+minetest.register_craftitem("testitems:overlay_global", {
+ description = S("Texture Overlay Test Item, Global Color") .. "\n" ..
+ S("Image must be an orange square with rainbow cross (inventory and wield)"),
+ -- Base texture: A grayscale square (to be colorized)
+ inventory_image = "testitems_overlay_base.png",
+ wield_image = "testitems_overlay_base.png",
+ -- Overlay: A rainbow cross (NOT to be colorized!)
+ inventory_overlay = "testitems_overlay_overlay.png",
+ wield_overlay = "testitems_overlay_overlay.png",
+ color = GLOBAL_COLOR_ARG,
+})
+
+
diff --git a/games/devtest/mods/testitems/mod.conf b/games/devtest/mods/testitems/mod.conf
new file mode 100644
index 000000000..f91febe01
--- /dev/null
+++ b/games/devtest/mods/testitems/mod.conf
@@ -0,0 +1,2 @@
+name = testitems
+description = Test mod to test misc. items that are neither tools nor nodes
diff --git a/games/devtest/mods/testitems/textures/testitems_overlay_base.png b/games/devtest/mods/testitems/textures/testitems_overlay_base.png
new file mode 100644
index 000000000..f473623be
--- /dev/null
+++ b/games/devtest/mods/testitems/textures/testitems_overlay_base.png
Binary files differ
diff --git a/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png b/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png
new file mode 100644
index 000000000..75a7d9fc3
--- /dev/null
+++ b/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/init.lua b/games/devtest/mods/testnodes/init.lua
index 92e2c5630..d355c4278 100644
--- a/games/devtest/mods/testnodes/init.lua
+++ b/games/devtest/mods/testnodes/init.lua
@@ -8,3 +8,4 @@ dofile(path.."/properties.lua")
dofile(path.."/liquids.lua")
dofile(path.."/light.lua")
dofile(path.."/textures.lua")
+dofile(path.."/overlays.lua")
diff --git a/games/devtest/mods/testnodes/overlays.lua b/games/devtest/mods/testnodes/overlays.lua
new file mode 100644
index 000000000..294e06a16
--- /dev/null
+++ b/games/devtest/mods/testnodes/overlays.lua
@@ -0,0 +1,93 @@
+local S = minetest.get_translator("testnodes")
+
+minetest.register_node("testnodes:overlay", {
+ description = S("Texture Overlay Test Node") .. "\n" ..
+ S("Uncolorized"),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_color_all", {
+ description = S("Texture Overlay Test Node, Colorized") .. "\n" ..
+ S("param2 changes color"),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_color_overlay", {
+ description = S("Texture Overlay Test Node, Colorized Overlay") .. "\n" ..
+ S("param2 changes color of overlay"),
+ tiles = {{name = "testnodes_overlayable.png", color="white"}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_color_overlayed", {
+ description = S("Texture Overlay Test Node, Colorized Base") .. "\n" ..
+ S("param2 changes color of base texture"),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png", color="white"}},
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
+
+local global_overlay_color = "#FF2000"
+minetest.register_node("testnodes:overlay_global", {
+ description = S("Texture Overlay Test Node, Global Color") .. "\n" ..
+ S("Global color = @1", global_overlay_color),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ color = global_overlay_color,
+
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_global_color_all", {
+ description = S("Texture Overlay Test Node, Global Color + Colorized") .. "\n" ..
+ S("Global color = @1", global_overlay_color) .. "\n" ..
+ S("param2 changes color"),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ color = global_overlay_color,
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_global_color_overlay", {
+ description = S("Texture Overlay Test Node, Global Color + Colorized Overlay") .. "\n" ..
+ S("Global color = @1", global_overlay_color) .. "\n" ..
+ S("param2 changes color of overlay"),
+ tiles = {{name = "testnodes_overlayable.png", color=global_overlay_color}},
+ overlay_tiles = {{name = "testnodes_overlay.png"}},
+ color = global_overlay_color,
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
+minetest.register_node("testnodes:overlay_global_color_overlayed", {
+ description = S("Texture Overlay Test Node, Global Color + Colorized Base") .. "\n" ..
+ S("Global color = @1", global_overlay_color) .. "\n" ..
+ S("param2 changes color of base texture"),
+ tiles = {{name = "testnodes_overlayable.png"}},
+ overlay_tiles = {{name = "testnodes_overlay.png", color=global_overlay_color}},
+ color = global_overlay_color,
+ paramtype2 = "color",
+ palette = "testnodes_palette_full.png",
+
+
+ groups = { dig_immediate = 2 },
+})
diff --git a/games/devtest/mods/testnodes/properties.lua b/games/devtest/mods/testnodes/properties.lua
index 51f703d7c..bacd555cd 100644
--- a/games/devtest/mods/testnodes/properties.lua
+++ b/games/devtest/mods/testnodes/properties.lua
@@ -13,6 +13,20 @@ minetest.register_node("testnodes:falling", {
groups = { falling_node = 1, dig_immediate = 3 },
})
+minetest.register_node("testnodes:falling_facedir", {
+ description = S("Falling Facedir Node"),
+ tiles = {
+ "testnodes_1.png",
+ "testnodes_2.png",
+ "testnodes_3.png",
+ "testnodes_4.png",
+ "testnodes_5.png",
+ "testnodes_6.png",
+ },
+ paramtype2 = "facedir",
+ groups = { falling_node = 1, dig_immediate = 3 },
+})
+
-- Same as falling node, but will stop falling on top of liquids
minetest.register_node("testnodes:falling_float", {
description = S("Falling+Floating Node"),
@@ -252,9 +266,9 @@ for i=-100, 100, 25 do
end
-- Bouncy nodes (various bounce levels)
-for i=20, 180, 20 do
+for i=-140, 180, 20 do
local val = math.floor(((i-20)/200)*255)
- minetest.register_node("testnodes:bouncy"..i, {
+ minetest.register_node(("testnodes:bouncy"..i):gsub("-","NEG"), {
description = S("Bouncy Node (@1%)", i),
groups = {bouncy=i, dig_immediate=3},
diff --git a/games/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua
index dc581b0c7..2faacdd78 100644
--- a/games/devtest/mods/testnodes/textures.lua
+++ b/games/devtest/mods/testnodes/textures.lua
@@ -171,3 +171,120 @@ minetest.register_node("testnodes:generated_png_dst_emb", {
groups = { dig_immediate = 2 },
})
+
+--[[
+
+The following nodes can be used to demonstrate the TGA format support.
+
+Minetest supports TGA types 1, 2, 3 & 10. While adding the support for
+TGA type 9 (RLE-compressed, color-mapped) is easy, it is not advisable
+to do so, as it is not backwards compatible with any Minetest pre-5.5;
+content creators should therefore either use TGA type 1 or 10, or PNG.
+
+TODO: Types 1, 2 & 10 should have two test nodes each (i.e. bottom-top
+and top-bottom) for 16bpp (A1R5G5B5), 24bpp (B8G8R8), 32bpp (B8G8R8A8)
+colors.
+
+Note: Minetest requires the optional TGA footer for a texture to load.
+If a TGA image does not load in Minetest, append eight (8) null bytes,
+then the string “TRUEVISION-XFILE.”, then another null byte.
+
+]]--
+
+minetest.register_node("testnodes:tga_type1_24bpp_bt", {
+ description = S("TGA Type 1 (color-mapped RGB) 24bpp bottom-top Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type1_24bpp_bt.tga" },
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type1_24bpp_tb", {
+ description = S("TGA Type 1 (color-mapped RGB) 24bpp top-bottom Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type1_24bpp_tb.tga" },
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type2_16bpp_bt", {
+ description = S("TGA Type 2 (uncompressed RGB) 16bpp bottom-top Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type2_16bpp_bt.tga" },
+ use_texture_alpha = "clip",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type2_16bpp_tb", {
+ description = S("TGA Type 2 (uncompressed RGB) 16bpp top-bottom Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type2_16bpp_tb.tga" },
+ use_texture_alpha = "clip",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type2_32bpp_bt", {
+ description = S("TGA Type 2 (uncompressed RGB) 32bpp bottom-top Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type2_32bpp_bt.tga" },
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type2_32bpp_tb", {
+ description = S("TGA Type 2 (uncompressed RGB) 32bpp top-bottom Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type2_32bpp_tb.tga" },
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type3_16bpp_bt", {
+ description = S("TGA Type 3 (uncompressed grayscale) 16bpp bottom-top Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type3_16bpp_bt.tga" },
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type3_16bpp_tb", {
+ description = S("TGA Type 3 (uncompressed grayscale) 16bpp top-bottom Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type3_16bpp_tb.tga" },
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type10_32bpp_bt", {
+ description = S("TGA Type 10 (RLE-compressed RGB) 32bpp bottom-top Test Node"),
+ tiles = { "testnodes_tga_type10_32bpp_bt.tga" },
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
+
+minetest.register_node("testnodes:tga_type10_32bpp_tb", {
+ description = S("TGA Type 10 (RLE-compressed RGB) 32bpp top-bottom Test Node"),
+ drawtype = "glasslike",
+ paramtype = "light",
+ sunlight_propagates = true,
+ tiles = { "testnodes_tga_type10_32bpp_tb.tga" },
+ use_texture_alpha = "blend",
+ groups = { dig_immediate = 2 },
+})
diff --git a/games/devtest/mods/testnodes/textures/testnodes_overlay.png b/games/devtest/mods/testnodes/textures/testnodes_overlay.png
new file mode 100644
index 000000000..1c69b5e08
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_overlay.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_overlayable.png b/games/devtest/mods/testnodes/textures/testnodes_overlayable.png
new file mode 100644
index 000000000..431bc94f4
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_overlayable.png
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga
new file mode 100644
index 000000000..2dc587bc3
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga
new file mode 100644
index 000000000..b44a81c79
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga
new file mode 100644
index 000000000..d2c2ca6d2
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga
new file mode 100644
index 000000000..dfcb98864
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga
new file mode 100644
index 000000000..0206216bb
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga
new file mode 100644
index 000000000..2563f084b
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga
new file mode 100644
index 000000000..3350500f8
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga
new file mode 100644
index 000000000..216de0634
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga
new file mode 100644
index 000000000..695bb4bb1
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga
Binary files differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga
new file mode 100644
index 000000000..c08a093b2
--- /dev/null
+++ b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga
Binary files differ
diff --git a/games/devtest/mods/testtools/README.md b/games/devtest/mods/testtools/README.md
index a1eb95ed7..72f0a2db0 100644
--- a/games/devtest/mods/testtools/README.md
+++ b/games/devtest/mods/testtools/README.md
@@ -40,6 +40,14 @@ Usage:
* Punch: Open node metadata editor
+## Item Meta Editor
+Edit and view metadata of items.
+
+Usage:
+
+* Place/Punch: Opens item metadata editor of the item in the next
+ inventory slot from the wielded item
+
## Entity Rotator
Changes the entity rotation (with `set_rotation`).
diff --git a/games/devtest/mods/testtools/init.lua b/games/devtest/mods/testtools/init.lua
index 1041acdeb..abc1ed79b 100644
--- a/games/devtest/mods/testtools/init.lua
+++ b/games/devtest/mods/testtools/init.lua
@@ -693,30 +693,40 @@ local function use_loadstring(param, player)
return true, errOrResult
end
--- Node Meta Editor
+-- Item Meta Editor + Node Meta Editor
local node_meta_posses = {}
-local node_meta_latest_keylist = {}
+local meta_latest_keylist = {}
-local function show_node_meta_formspec(user, pos, key, value, keylist)
+local function show_meta_formspec(user, metatype, pos_or_item, key, value, keylist)
local textlist
if keylist then
textlist = "textlist[0,0.5;2.5,6.5;keylist;"..keylist.."]"
else
textlist = ""
end
- minetest.show_formspec(user:get_player_name(),
- "testtools:node_meta_editor",
- "size[15,9]"..
+
+ local form = "size[15,9]"..
"label[0,0;"..F(S("Current keys:")).."]"..
textlist..
"field[3,0.5;12,1;key;"..F(S("Key"))..";"..F(key).."]"..
"textarea[3,1.5;12,6;value;"..F(S("Value (use empty value to delete key)"))..";"..F(value).."]"..
- "button[0,8;3,1;get;"..F(S("Get value")).."]"..
- "button[4,8;3,1;set;"..F(S("Set value")).."]"..
- "label[0,7.2;"..F(S("pos = @1", minetest.pos_to_string(pos))).."]")
+ "button[4,8;3,1;set;"..F(S("Set value")).."]"
+
+ local extra_label
+ local formname
+ if metatype == "node" then
+ formname = "testtools:node_meta_editor"
+ extra_label = S("pos = @1", minetest.pos_to_string(pos_or_item))
+ else
+ formname = "testtools:item_meta_editor"
+ extra_label = S("item = @1", pos_or_item:get_name())
+ end
+ form = form .. "label[0,7.2;"..F(extra_label).."]"
+
+ minetest.show_formspec(user:get_player_name(), formname, form)
end
-local function get_node_meta_keylist(meta, playername, escaped)
+local function get_meta_keylist(meta, playername, escaped)
local keys = {}
local ekeys = {}
local mtable = meta:to_table()
@@ -729,7 +739,7 @@ local function get_node_meta_keylist(meta, playername, escaped)
end
end
if playername then
- node_meta_latest_keylist[playername] = keys
+ meta_latest_keylist[playername] = keys
end
return table.concat(ekeys, ",")
end
@@ -750,11 +760,47 @@ minetest.register_tool("testtools:node_meta_editor", {
node_meta_posses[user:get_player_name()] = pos
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
- show_node_meta_formspec(user, pos, "", "", get_node_meta_keylist(meta, user:get_player_name(), true))
+ show_meta_formspec(user, "node", pos, "", "", get_meta_keylist(meta, user:get_player_name(), true))
return itemstack
end,
})
+local function get_item_next_to_wielded_item(player)
+ local inv = player:get_inventory()
+ local wield = player:get_wield_index()
+ local itemstack = inv:get_stack("main", wield+1)
+ return itemstack
+end
+local function set_item_next_to_wielded_item(player, itemstack)
+ local inv = player:get_inventory()
+ local wield = player:get_wield_index()
+ inv:set_stack("main", wield+1, itemstack)
+end
+
+local function use_item_meta_editor(itemstack, user, pointed_thing)
+ if not user:is_player() then
+ return itemstack
+ end
+ local item_to_edit = get_item_next_to_wielded_item(user)
+ if item_to_edit:is_empty() then
+ minetest.chat_send_player(user:get_player_name(), S("Place an item next to the Item Meta Editor in your inventory first!"))
+ return itemstack
+ end
+ local meta = item_to_edit:get_meta()
+ show_meta_formspec(user, "item", item_to_edit, "", "", get_meta_keylist(meta, user:get_player_name(), true))
+ return itemstack
+end
+
+minetest.register_tool("testtools:item_meta_editor", {
+ description = S("Item Meta Editor") .. "\n" ..
+ S("Punch/Place: Edit item metadata of item in the next inventory slot"),
+ inventory_image = "testtools_item_meta_editor.png",
+ groups = { testtool = 1, disable_repair = 1 },
+ on_use = use_item_meta_editor,
+ on_secondary_use = use_item_meta_editor,
+ on_place = use_item_meta_editor,
+})
+
minetest.register_on_player_receive_fields(function(player, formname, fields)
if not (player and player:is_player()) then
return
@@ -832,17 +878,30 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
player:set_wielded_item(witem)
end
end
- elseif formname == "testtools:node_meta_editor" then
+ elseif formname == "testtools:node_meta_editor" or formname == "testtools:item_meta_editor" then
local name = player:get_player_name()
- local pos = node_meta_posses[name]
+ local metatype
+ local pos_or_item
+ if formname == "testtools:node_meta_editor" then
+ metatype = "node"
+ pos_or_item = node_meta_posses[name]
+ else
+ metatype = "item"
+ pos_or_item = get_item_next_to_wielded_item(player)
+ end
if fields.keylist then
local evnt = minetest.explode_textlist_event(fields.keylist)
if evnt.type == "DCL" or evnt.type == "CHG" then
- local keylist_table = node_meta_latest_keylist[name]
- if not pos then
+ local keylist_table = meta_latest_keylist[name]
+ if metatype == "node" and not pos_or_item then
return
end
- local meta = minetest.get_meta(pos)
+ local meta
+ if metatype == "node" then
+ meta = minetest.get_meta(pos_or_item)
+ else
+ meta = pos_or_item:get_meta()
+ end
if not keylist_table then
return
end
@@ -856,31 +915,37 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
keylist_escaped[k] = F(v)
end
local keylist = table.concat(keylist_escaped, ",")
- show_node_meta_formspec(player, pos, key, value, keylist)
+ show_meta_formspec(player, metatype, pos_or_item, key, value, keylist)
return
end
elseif fields.key and fields.key ~= "" and fields.value then
- if not pos then
+ if metatype == "node" and not pos_or_item then
return
end
- local meta = minetest.get_meta(pos)
- if fields.get then
- local value = meta:get_string(fields.key)
- show_node_meta_formspec(player, pos, fields.key, value,
- get_node_meta_keylist(meta, name, true))
- return
- elseif fields.set then
+ local meta
+ if metatype == "node" then
+ meta = minetest.get_meta(pos_or_item)
+ elseif metatype == "item" then
+ if pos_or_item:is_empty() then
+ return
+ end
+ meta = pos_or_item:get_meta()
+ end
+ if fields.set then
meta:set_string(fields.key, fields.value)
- show_node_meta_formspec(player, pos, fields.key, fields.value,
- get_node_meta_keylist(meta, name, true))
- return
+ if metatype == "item" then
+ set_item_next_to_wielded_item(player, pos_or_item)
+ end
+ show_meta_formspec(player, metatype, pos_or_item, fields.key, fields.value,
+ get_meta_keylist(meta, name, true))
end
+ return
end
end
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
- node_meta_latest_keylist[name] = nil
+ meta_latest_keylist[name] = nil
node_meta_posses[name] = nil
end)
diff --git a/games/devtest/mods/testtools/textures/testtools_item_meta_editor.png b/games/devtest/mods/testtools/textures/testtools_item_meta_editor.png
new file mode 100644
index 000000000..5cebb0a9d
--- /dev/null
+++ b/games/devtest/mods/testtools/textures/testtools_item_meta_editor.png
Binary files differ
diff --git a/games/devtest/mods/unittests/async_env.lua b/games/devtest/mods/unittests/async_env.lua
new file mode 100644
index 000000000..b7edf941e
--- /dev/null
+++ b/games/devtest/mods/unittests/async_env.lua
@@ -0,0 +1,168 @@
+-- helper
+
+core.register_async_dofile(core.get_modpath(core.get_current_modname()) ..
+ DIR_DELIM .. "inside_async_env.lua")
+
+local function deepequal(a, b)
+ if type(a) == "function" then
+ return type(b) == "function"
+ elseif type(a) ~= "table" then
+ return a == b
+ elseif type(b) ~= "table" then
+ return false
+ end
+ for k, v in pairs(a) do
+ if not deepequal(v, b[k]) then
+ return false
+ end
+ end
+ for k, v in pairs(b) do
+ if not deepequal(a[k], v) then
+ return false
+ end
+ end
+ return true
+end
+
+-- Object Passing / Serialization
+
+local test_object = {
+ name = "stairs:stair_glass",
+ type = "node",
+ groups = {oddly_breakable_by_hand = 3, cracky = 3, stair = 1},
+ description = "Glass Stair",
+ sounds = {
+ dig = {name = "default_glass_footstep", gain = 0.5},
+ footstep = {name = "default_glass_footstep", gain = 0.3},
+ dug = {name = "default_break_glass", gain = 1}
+ },
+ node_box = {
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
+ {-0.5, 0, 0, 0.5, 0.5, 0.5}
+ },
+ type = "fixed"
+ },
+ tiles = {
+ {name = "stairs_glass_split.png", backface_culling = true},
+ {name = "default_glass.png", backface_culling = true},
+ {name = "stairs_glass_stairside.png^[transformFX", backface_culling = true}
+ },
+ on_place = function(itemstack, placer)
+ return core.is_player(placer)
+ end,
+ sunlight_propagates = true,
+ is_ground_content = false,
+ light_source = 0,
+}
+
+local function test_object_passing()
+ local tmp = core.serialize_roundtrip(test_object)
+ assert(deepequal(test_object, tmp))
+
+ local circular_key = {"foo", "bar"}
+ circular_key[circular_key] = true
+ tmp = core.serialize_roundtrip(circular_key)
+ assert(tmp[1] == "foo")
+ assert(tmp[2] == "bar")
+ assert(tmp[tmp] == true)
+
+ local circular_value = {"foo"}
+ circular_value[2] = circular_value
+ tmp = core.serialize_roundtrip(circular_value)
+ assert(tmp[1] == "foo")
+ assert(tmp[2] == tmp)
+
+ -- Two-segment cycle
+ local cycle_seg_1, cycle_seg_2 = {}, {}
+ cycle_seg_1[1] = cycle_seg_2
+ cycle_seg_2[1] = cycle_seg_1
+ tmp = core.serialize_roundtrip(cycle_seg_1)
+ assert(tmp[1][1] == tmp)
+
+ -- Duplicated value without a cycle
+ local acyclic_dup_holder = {}
+ tmp = ItemStack("")
+ acyclic_dup_holder[tmp] = tmp
+ tmp = core.serialize_roundtrip(acyclic_dup_holder)
+ for k, v in pairs(tmp) do
+ assert(rawequal(k, v))
+ end
+end
+unittests.register("test_object_passing", test_object_passing)
+
+local function test_userdata_passing(_, pos)
+ -- basic userdata passing
+ local obj = table.copy(test_object.tiles[1])
+ obj.test = ItemStack("default:cobble 99")
+ local tmp = core.serialize_roundtrip(obj)
+ assert(type(tmp.test) == "userdata")
+ assert(obj.test:to_string() == tmp.test:to_string())
+
+ -- object can't be passed, should error
+ obj = core.raycast(pos, pos)
+ assert(not pcall(core.serialize_roundtrip, obj))
+
+ -- VManip
+ local vm = core.get_voxel_manip(pos, pos)
+ local expect = vm:get_node_at(pos)
+ local vm2 = core.serialize_roundtrip(vm)
+ assert(deepequal(vm2:get_node_at(pos), expect))
+end
+unittests.register("test_userdata_passing", test_userdata_passing, {map=true})
+
+-- Asynchronous jobs
+
+local function test_handle_async(cb)
+ -- Basic test including mod name tracking and unittests.async_test()
+ -- which is defined inside_async_env.lua
+ local func = function(x)
+ return core.get_last_run_mod(), _VERSION, unittests[x]()
+ end
+ local expect = {core.get_last_run_mod(), _VERSION, true}
+
+ core.handle_async(func, function(...)
+ if not deepequal(expect, {...}) then
+ return cb("Values did not equal")
+ end
+ if core.get_last_run_mod() ~= expect[1] then
+ return cb("Mod name not tracked correctly")
+ end
+
+ -- Test passing of nil arguments and return values
+ core.handle_async(function(a, b)
+ return a, b
+ end, function(a, b)
+ if b ~= 123 then
+ return cb("Argument went missing")
+ end
+ cb()
+ end, nil, 123)
+ end, "async_test")
+end
+unittests.register("test_handle_async", test_handle_async, {async=true})
+
+local function test_userdata_passing2(cb, _, pos)
+ -- VManip: check transfer into other env
+ local vm = core.get_voxel_manip(pos, pos)
+ local expect = vm:get_node_at(pos)
+
+ core.handle_async(function(vm_, pos_)
+ return vm_:get_node_at(pos_)
+ end, function(ret)
+ if not deepequal(expect, ret) then
+ return cb("Node data mismatch (one-way)")
+ end
+
+ -- VManip: test a roundtrip
+ core.handle_async(function(vm_)
+ return vm_
+ end, function(vm2)
+ if not deepequal(expect, vm2:get_node_at(pos)) then
+ return cb("Node data mismatch (roundtrip)")
+ end
+ cb()
+ end, vm)
+ end, vm, pos)
+end
+unittests.register("test_userdata_passing2", test_userdata_passing2, {map=true, async=true})
diff --git a/games/devtest/mods/unittests/entity.lua b/games/devtest/mods/unittests/entity.lua
new file mode 100644
index 000000000..68635cad7
--- /dev/null
+++ b/games/devtest/mods/unittests/entity.lua
@@ -0,0 +1,132 @@
+local log = {}
+
+local function insert_log(...)
+ log[#log+1] = string.format(...)
+end
+
+local function objref_str(self, ref)
+ if ref and ref:is_player() then
+ return "player"
+ end
+ return self.object == ref and "self" or tostring(ref)
+end
+
+core.register_entity("unittests:callbacks", {
+ initial_properties = {
+ hp_max = 5,
+ visual = "upright_sprite",
+ textures = { "unittests_stick.png" },
+ static_save = false,
+ },
+
+ on_activate = function(self, staticdata, dtime_s)
+ self.object:set_armor_groups({test = 100})
+ assert(self.object:get_hp() == self.initial_properties.hp_max)
+ insert_log("on_activate(%d)", #staticdata)
+ end,
+ on_deactivate = function(self, removal)
+ insert_log("on_deactivate(%s)", tostring(removal))
+ end,
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
+ insert_log("on_punch(%s, %.1f, %d)", objref_str(self, puncher),
+ time_from_last_punch, damage)
+ end,
+ on_death = function(self, killer)
+ assert(self.object:get_hp() == 0)
+ insert_log("on_death(%s)", objref_str(self, killer))
+ end,
+ on_rightclick = function(self, clicker)
+ insert_log("on_rightclick(%s)", objref_str(self, clicker))
+ end,
+ on_attach_child = function(self, child)
+ insert_log("on_attach_child(%s)", objref_str(self, child))
+ end,
+ on_detach_child = function(self, child)
+ insert_log("on_detach_child(%s)", objref_str(self, child))
+ end,
+ on_detach = function(self, parent)
+ insert_log("on_detach(%s)", objref_str(self, parent))
+ end,
+ get_staticdata = function(self)
+ assert(false)
+ end,
+})
+
+--
+
+local function check_log(expect)
+ if #expect ~= #log then
+ error("Log mismatch: " .. core.write_json(log))
+ end
+ for i, s in ipairs(expect) do
+ if log[i] ~= s then
+ error("Log mismatch at " .. i .. ": " .. core.write_json(log))
+ end
+ end
+ log = {} -- clear it for next time
+end
+
+local function test_entity_lifecycle(_, pos)
+ log = {}
+
+ -- with binary in staticdata
+ local obj = core.add_entity(pos, "unittests:callbacks", "abc\000def")
+ check_log({"on_activate(7)"})
+
+ obj:set_hp(0)
+ check_log({"on_death(nil)", "on_deactivate(true)"})
+
+ -- objectref must be invalid now
+ assert(obj:get_velocity() == nil)
+end
+unittests.register("test_entity_lifecycle", test_entity_lifecycle, {map=true})
+
+local function test_entity_interact(_, pos)
+ log = {}
+
+ local obj = core.add_entity(pos, "unittests:callbacks")
+ check_log({"on_activate(0)"})
+
+ -- rightclick
+ obj:right_click(obj)
+ check_log({"on_rightclick(self)"})
+
+ -- useless punch
+ obj:punch(obj, 0.5, {})
+ check_log({"on_punch(self, 0.5, 0)"})
+
+ -- fatal punch
+ obj:punch(obj, 1.9, {
+ full_punch_interval = 1.0,
+ damage_groups = { test = 10 },
+ })
+ check_log({
+ -- does 10 damage even though we only have 5 hp
+ "on_punch(self, 1.9, 10)",
+ "on_death(self)",
+ "on_deactivate(true)"
+ })
+end
+unittests.register("test_entity_interact", test_entity_interact, {map=true})
+
+local function test_entity_attach(player, pos)
+ log = {}
+
+ local obj = core.add_entity(pos, "unittests:callbacks")
+ check_log({"on_activate(0)"})
+
+ -- attach player to entity
+ player:set_attach(obj)
+ check_log({"on_attach_child(player)"})
+ player:set_detach()
+ check_log({"on_detach_child(player)"})
+
+ -- attach entity to player
+ obj:set_attach(player)
+ check_log({})
+ obj:set_detach()
+ check_log({"on_detach(player)"})
+
+ obj:remove()
+end
+unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true})
diff --git a/games/devtest/mods/unittests/init.lua b/games/devtest/mods/unittests/init.lua
index 0754d507f..0e041be76 100644
--- a/games/devtest/mods/unittests/init.lua
+++ b/games/devtest/mods/unittests/init.lua
@@ -36,6 +36,7 @@ local function await(invoke)
called_early = {...}
else
coroutine.resume(co, ...)
+ co = nil
end
end)
if called_early ~= true then
@@ -112,7 +113,7 @@ local function wait_for_map(player, callback)
if core.get_node_or_nil(player:get_pos()) ~= nil then
callback()
else
- minetest.after(0, check)
+ core.after(0, check)
end
end
check()
@@ -170,11 +171,13 @@ end
--------------
-local modpath = minetest.get_modpath("unittests")
+local modpath = core.get_modpath("unittests")
dofile(modpath .. "/misc.lua")
dofile(modpath .. "/player.lua")
dofile(modpath .. "/crafting.lua")
dofile(modpath .. "/itemdescription.lua")
+dofile(modpath .. "/async_env.lua")
+dofile(modpath .. "/entity.lua")
--------------
@@ -183,7 +186,7 @@ if core.settings:get_bool("devtest_unittests_autostart", false) then
coroutine.wrap(unittests.run_all)()
end)
else
- minetest.register_chatcommand("unittests", {
+ core.register_chatcommand("unittests", {
privs = {basic_privs=true},
description = "Runs devtest unittests (may modify player or map state)",
func = function(name, param)
diff --git a/games/devtest/mods/unittests/inside_async_env.lua b/games/devtest/mods/unittests/inside_async_env.lua
new file mode 100644
index 000000000..4ed0fccd2
--- /dev/null
+++ b/games/devtest/mods/unittests/inside_async_env.lua
@@ -0,0 +1,25 @@
+unittests = {}
+
+core.log("info", "Hello World")
+
+local function do_tests()
+ assert(core == minetest)
+ -- stuff that should not be here
+ assert(not core.get_player_by_name)
+ assert(not core.set_node)
+ assert(not core.object_refs)
+ -- stuff that should be here
+ assert(ItemStack)
+ assert(core.registered_items[""])
+ -- alias handling
+ assert(core.registered_items["unittests:steel_ingot_alias"].name ==
+ "unittests:steel_ingot")
+end
+
+function unittests.async_test()
+ local ok, err = pcall(do_tests)
+ if not ok then
+ core.log("error", err)
+ end
+ return ok
+end
diff --git a/games/devtest/mods/unittests/itemdescription.lua b/games/devtest/mods/unittests/itemdescription.lua
index dc62de7f0..b4c218c98 100644
--- a/games/devtest/mods/unittests/itemdescription.lua
+++ b/games/devtest/mods/unittests/itemdescription.lua
@@ -1,17 +1,7 @@
-local full_description = "Colorful Pickaxe\nThe best pick."
-minetest.register_tool("unittests:colorful_pick", {
+local full_description = "Description Test Item\nFor testing item decription"
+minetest.register_tool("unittests:description_test", {
description = full_description,
- inventory_image = "basetools_mesepick.png",
- tool_capabilities = {
- full_punch_interval = 1.0,
- max_drop_level=3,
- groupcaps={
- cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
- crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
- snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}
- },
- damage_groups = {fleshy=4},
- },
+ inventory_image = "unittests_description_test.png",
})
minetest.register_chatcommand("item_description", {
@@ -30,18 +20,18 @@ local function test_short_desc()
return ItemStack(item):get_short_description()
end
- local stack = ItemStack("unittests:colorful_pick")
- assert(stack:get_short_description() == "Colorful Pickaxe")
- assert(get_short_description("unittests:colorful_pick") == "Colorful Pickaxe")
- assert(minetest.registered_items["unittests:colorful_pick"].short_description == nil)
+ local stack = ItemStack("unittests:description_test")
+ assert(stack:get_short_description() == "Description Test Item")
+ assert(get_short_description("unittests:description_test") == "Description Test Item")
+ assert(minetest.registered_items["unittests:description_test"].short_description == nil)
assert(stack:get_description() == full_description)
- assert(stack:get_description() == minetest.registered_items["unittests:colorful_pick"].description)
+ assert(stack:get_description() == minetest.registered_items["unittests:description_test"].description)
stack:get_meta():set_string("description", "Hello World")
assert(stack:get_short_description() == "Hello World")
assert(stack:get_description() == "Hello World")
assert(get_short_description(stack) == "Hello World")
- assert(get_short_description("unittests:colorful_pick") == "Colorful Pickaxe")
+ assert(get_short_description("unittests:description_test") == "Description Test Item")
stack:get_meta():set_string("short_description", "Foo Bar")
assert(stack:get_short_description() == "Foo Bar")
diff --git a/games/devtest/mods/unittests/misc.lua b/games/devtest/mods/unittests/misc.lua
index cf4f92cfa..4811c8008 100644
--- a/games/devtest/mods/unittests/misc.lua
+++ b/games/devtest/mods/unittests/misc.lua
@@ -24,7 +24,7 @@ local function test_dynamic_media(cb, player)
to_player = player:get_player_name(),
}, function(name)
if not call_ok then
- cb("impossible condition")
+ return cb("impossible condition")
end
cb()
end)
@@ -36,3 +36,47 @@ local function test_dynamic_media(cb, player)
-- if the callback isn't called this test will just hang :shrug:
end
unittests.register("test_dynamic_media", test_dynamic_media, {async=true, player=true})
+
+local function test_v3f_metatable(player)
+ assert(vector.check(player:get_pos()))
+end
+unittests.register("test_v3f_metatable", test_v3f_metatable, {player=true})
+
+local function test_v3s16_metatable(player, pos)
+ local node = minetest.get_node(pos)
+ local found_pos = minetest.find_node_near(pos, 0, node.name, true)
+ assert(vector.check(found_pos))
+end
+unittests.register("test_v3s16_metatable", test_v3s16_metatable, {map=true})
+
+local function test_clear_meta(_, pos)
+ local ref = core.get_meta(pos)
+
+ for way = 1, 3 do
+ ref:set_string("foo", "bar")
+ assert(ref:contains("foo"))
+
+ if way == 1 then
+ ref:from_table({})
+ elseif way == 2 then
+ ref:from_table(nil)
+ else
+ ref:set_string("foo", "")
+ end
+
+ assert(#core.find_nodes_with_meta(pos, pos) == 0, "clearing failed " .. way)
+ end
+end
+unittests.register("test_clear_meta", test_clear_meta, {map=true})
+
+local on_punch_called
+minetest.register_on_punchnode(function()
+ on_punch_called = true
+end)
+unittests.register("test_punch_node", function(_, pos)
+ minetest.place_node(pos, {name="basenodes:dirt"})
+ on_punch_called = false
+ minetest.punch_node(pos)
+ minetest.remove_node(pos)
+ -- currently failing: assert(on_punch_called)
+end, {map=true})
diff --git a/games/devtest/mods/unittests/textures/unittests_description_test.png b/games/devtest/mods/unittests/textures/unittests_description_test.png
new file mode 100644
index 000000000..a6be43314
--- /dev/null
+++ b/games/devtest/mods/unittests/textures/unittests_description_test.png
Binary files differ
diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua
index 79acaa0d0..c37364042 100644
--- a/games/devtest/mods/util_commands/init.lua
+++ b/games/devtest/mods/util_commands/init.lua
@@ -246,3 +246,64 @@ function minetest.handle_node_drops(pos, drops, digger)
end
end
end
+
+minetest.register_chatcommand("set_displayed_itemcount", {
+ params = "(-s \"<string>\" [-c <color>]) | -a <alignment_num>",
+ description = "Set the displayed itemcount of the wielded item",
+ func = function(name, param)
+ local player = minetest.get_player_by_name(name)
+ local item = player:get_wielded_item()
+ local meta = item:get_meta()
+ local flag1 = param:sub(1, 2)
+ if flag1 == "-s" then
+ if param:sub(3, 4) ~= " \"" then
+ return false, "Error: Space and string with \"s expected after -s."
+ end
+ local se = param:find("\"", 5, true)
+ if not se then
+ return false, "Error: String with two \"s expected after -s."
+ end
+ local s = param:sub(5, se - 1)
+ if param:sub(se + 1, se + 4) == " -c " then
+ s = minetest.colorize(param:sub(se + 5), s)
+ end
+ meta:set_string("count_meta", s)
+ elseif flag1 == "-a" then
+ local num = tonumber(param:sub(4))
+ if not num then
+ return false, "Error: Invalid number: "..param:sub(4)
+ end
+ meta:set_int("count_alignment", num)
+ else
+ return false
+ end
+ player:set_wielded_item(item)
+ return true, "Displayed itemcount set."
+ end,
+})
+
+minetest.register_chatcommand("dump_item", {
+ params = "",
+ description = "Prints a dump of the wielded item in table form",
+ func = function(name, param)
+ local player = minetest.get_player_by_name(name)
+ local item = player:get_wielded_item()
+ local str = dump(item:to_table())
+ print(str)
+ return true, str
+ end,
+})
+
+-- shadow control
+minetest.register_on_joinplayer(function (player)
+ player:set_lighting({shadows={intensity = 0.33}})
+end)
+
+core.register_chatcommand("set_shadow", {
+ params = "<shadow_intensity>",
+ description = "Set shadow parameters of current player.",
+ func = function(player_name, param)
+ local shadow_intensity = tonumber(param)
+ minetest.get_player_by_name(player_name):set_lighting({shadows = { intensity = shadow_intensity} })
+ end
+})
diff --git a/lib/catch2/CMakeLists.txt b/lib/catch2/CMakeLists.txt
new file mode 100644
index 000000000..3c471d49d
--- /dev/null
+++ b/lib/catch2/CMakeLists.txt
@@ -0,0 +1,16 @@
+# catch2 is distributed as a standalone header.
+#
+# Downloaded from:
+#
+# https://github.com/catchorg/Catch2/releases/download/v2.13.9/catch.hpp
+#
+# The following changes were made to always print in microseconds, fixed format:
+#
+# - explicit Duration(double inNanoseconds, Unit units = Unit::Auto)
+# + explicit Duration(double inNanoseconds, Unit units = Unit::Microseconds)
+#
+# - return os << duration.value() << ' ' << duration.unitsAsString();
+# + return os << std::fixed << duration.value() << ' ' << duration.unitsAsString();
+
+add_library(catch2 INTERFACE)
+target_include_directories(catch2 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/lib/catch2/catch.hpp b/lib/catch2/catch.hpp
new file mode 100644
index 000000000..88f110677
--- /dev/null
+++ b/lib/catch2/catch.hpp
@@ -0,0 +1,17970 @@
+/*
+ * Catch v2.13.9
+ * Generated: 2022-04-12 22:37:23.260201
+ * ----------------------------------------------------------
+ * This file has been merged from multiple headers. Please don't edit it directly
+ * Copyright (c) 2022 Two Blue Cubes Ltd. All rights reserved.
+ *
+ * Distributed under the Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+// start catch.hpp
+
+
+#define CATCH_VERSION_MAJOR 2
+#define CATCH_VERSION_MINOR 13
+#define CATCH_VERSION_PATCH 9
+
+#ifdef __clang__
+# pragma clang system_header
+#elif defined __GNUC__
+# pragma GCC system_header
+#endif
+
+// start catch_suppress_warnings.h
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(push)
+# pragma warning(disable: 161 1682)
+# else // __ICC
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wpadded"
+# pragma clang diagnostic ignored "-Wswitch-enum"
+# pragma clang diagnostic ignored "-Wcovered-switch-default"
+# endif
+#elif defined __GNUC__
+ // Because REQUIREs trigger GCC's -Wparentheses, and because still
+ // supported version of g++ have only buggy support for _Pragmas,
+ // Wparentheses have to be suppressed globally.
+# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details
+
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunused-variable"
+# pragma GCC diagnostic ignored "-Wpadded"
+#endif
+// end catch_suppress_warnings.h
+#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
+# define CATCH_IMPL
+# define CATCH_CONFIG_ALL_PARTS
+#endif
+
+// In the impl file, we want to have access to all parts of the headers
+// Can also be used to sanely support PCHs
+#if defined(CATCH_CONFIG_ALL_PARTS)
+# define CATCH_CONFIG_EXTERNAL_INTERFACES
+# if defined(CATCH_CONFIG_DISABLE_MATCHERS)
+# undef CATCH_CONFIG_DISABLE_MATCHERS
+# endif
+# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
+# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
+# endif
+#endif
+
+#if !defined(CATCH_CONFIG_IMPL_ONLY)
+// start catch_platform.h
+
+// See e.g.:
+// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html
+#ifdef __APPLE__
+# include <TargetConditionals.h>
+# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \
+ (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1)
+# define CATCH_PLATFORM_MAC
+# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1)
+# define CATCH_PLATFORM_IPHONE
+# endif
+
+#elif defined(linux) || defined(__linux) || defined(__linux__)
+# define CATCH_PLATFORM_LINUX
+
+#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__)
+# define CATCH_PLATFORM_WINDOWS
+#endif
+
+// end catch_platform.h
+
+#ifdef CATCH_IMPL
+# ifndef CLARA_CONFIG_MAIN
+# define CLARA_CONFIG_MAIN_NOT_DEFINED
+# define CLARA_CONFIG_MAIN
+# endif
+#endif
+
+// start catch_user_interfaces.h
+
+namespace Catch {
+ unsigned int rngSeed();
+}
+
+// end catch_user_interfaces.h
+// start catch_tag_alias_autoregistrar.h
+
+// start catch_common.h
+
+// start catch_compiler_capabilities.h
+
+// Detect a number of compiler features - by compiler
+// The following features are defined:
+//
+// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
+// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?
+// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?
+// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?
+// ****************
+// Note to maintainers: if new toggles are added please document them
+// in configuration.md, too
+// ****************
+
+// In general each macro has a _NO_<feature name> form
+// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.
+// Many features, at point of detection, define an _INTERNAL_ macro, so they
+// can be combined, en-mass, with the _NO_ forms later.
+
+#ifdef __cplusplus
+
+# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
+# define CATCH_CPP14_OR_GREATER
+# endif
+
+# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
+# define CATCH_CPP17_OR_GREATER
+# endif
+
+#endif
+
+// Only GCC compiler should be used in this block, so other compilers trying to
+// mask themselves as GCC should be ignored.
+#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__)
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" )
+
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
+
+#endif
+
+#if defined(__clang__)
+
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
+
+// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
+// which results in calls to destructors being emitted for each temporary,
+// without a matching initialization. In practice, this can result in something
+// like `std::string::~string` being called on an uninitialized value.
+//
+// For example, this code will likely segfault under IBM XL:
+// ```
+// REQUIRE(std::string("12") + "34" == "1234")
+// ```
+//
+// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
+# if !defined(__ibmxl__) && !defined(__CUDACC__)
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
+# endif
+
+# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
+ _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
+
+# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
+
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
+
+# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
+
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
+
+#endif // __clang__
+
+////////////////////////////////////////////////////////////////////////////////
+// Assume that non-Windows platforms support posix signals by default
+#if !defined(CATCH_PLATFORM_WINDOWS)
+ #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// We know some environments not to support full POSIX signals
+#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)
+ #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
+#endif
+
+#ifdef __OS400__
+# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
+# define CATCH_CONFIG_COLOUR_NONE
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Android somehow still does not support std::to_string
+#if defined(__ANDROID__)
+# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
+# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Not all Windows environments support SEH properly
+#if defined(__MINGW32__)
+# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// PS4
+#if defined(__ORBIS__)
+# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// Cygwin
+#ifdef __CYGWIN__
+
+// Required for some versions of Cygwin to declare gettimeofday
+// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin
+# define _BSD_SOURCE
+// some versions of cygwin (most) do not support std::to_string. Use the libstd check.
+// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813
+# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
+ && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
+
+# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
+
+# endif
+#endif // __CYGWIN__
+
+////////////////////////////////////////////////////////////////////////////////
+// Visual C++
+#if defined(_MSC_VER)
+
+// Universal Windows platform does not support SEH
+// Or console colours (or console at all...)
+# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+# define CATCH_CONFIG_COLOUR_NONE
+# else
+# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
+# endif
+
+# if !defined(__clang__) // Handle Clang masquerading for msvc
+
+// MSVC traditional preprocessor needs some workaround for __VA_ARGS__
+// _MSVC_TRADITIONAL == 0 means new conformant preprocessor
+// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor
+# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
+# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+# endif // MSVC_TRADITIONAL
+
+// Only do this if we're not using clang on Windows, which uses `diagnostic push` & `diagnostic pop`
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) )
+# endif // __clang__
+
+#endif // _MSC_VER
+
+#if defined(_REENTRANT) || defined(_MSC_VER)
+// Enable async processing, as -pthread is specified or no additional linking is required
+# define CATCH_INTERNAL_CONFIG_USE_ASYNC
+#endif // _MSC_VER
+
+////////////////////////////////////////////////////////////////////////////////
+// Check if we are compiled with -fno-exceptions or equivalent
+#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)
+# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+// DJGPP
+#ifdef __DJGPP__
+# define CATCH_INTERNAL_CONFIG_NO_WCHAR
+#endif // __DJGPP__
+
+////////////////////////////////////////////////////////////////////////////////
+// Embarcadero C++Build
+#if defined(__BORLANDC__)
+ #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+// Use of __COUNTER__ is suppressed during code analysis in
+// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly
+// handled by it.
+// Otherwise all supported compilers support COUNTER macro,
+// but user still might want to turn it off
+#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L )
+ #define CATCH_INTERNAL_CONFIG_COUNTER
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+// RTX is a special version of Windows that is real time.
+// This means that it is detected as Windows, but does not provide
+// the same set of capabilities as real Windows does.
+#if defined(UNDER_RTSS) || defined(RTX64_BUILD)
+ #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
+ #define CATCH_INTERNAL_CONFIG_NO_ASYNC
+ #define CATCH_CONFIG_COLOUR_NONE
+#endif
+
+#if !defined(_GLIBCXX_USE_C99_MATH_TR1)
+#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
+#endif
+
+// Various stdlib support checks that require __has_include
+#if defined(__has_include)
+ // Check if string_view is available and usable
+ #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
+ # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
+ #endif
+
+ // Check if optional is available and usable
+ # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
+ # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
+ # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
+
+ // Check if byte is available and usable
+ # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
+ # include <cstddef>
+ # if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0)
+ # define CATCH_INTERNAL_CONFIG_CPP17_BYTE
+ # endif
+ # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
+
+ // Check if variant is available and usable
+ # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
+ # if defined(__clang__) && (__clang_major__ < 8)
+ // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852
+ // fix should be in clang 8, workaround in libstdc++ 8.2
+ # include <ciso646>
+ # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
+ # define CATCH_CONFIG_NO_CPP17_VARIANT
+ # else
+ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
+ # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
+ # else
+ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
+ # endif // defined(__clang__) && (__clang_major__ < 8)
+ # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
+#endif // defined(__has_include)
+
+#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)
+# define CATCH_CONFIG_COUNTER
+#endif
+#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)
+# define CATCH_CONFIG_WINDOWS_SEH
+#endif
+// This is set by default, because we assume that unix compilers are posix-signal-compatible by default.
+#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS)
+# define CATCH_CONFIG_POSIX_SIGNALS
+#endif
+// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions.
+#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR)
+# define CATCH_CONFIG_WCHAR
+#endif
+
+#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)
+# define CATCH_CONFIG_CPP11_TO_STRING
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)
+# define CATCH_CONFIG_CPP17_OPTIONAL
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
+# define CATCH_CONFIG_CPP17_STRING_VIEW
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)
+# define CATCH_CONFIG_CPP17_VARIANT
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE)
+# define CATCH_CONFIG_CPP17_BYTE
+#endif
+
+#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
+# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE)
+# define CATCH_CONFIG_NEW_CAPTURE
+#endif
+
+#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+# define CATCH_CONFIG_DISABLE_EXCEPTIONS
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)
+# define CATCH_CONFIG_POLYFILL_ISNAN
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)
+# define CATCH_CONFIG_USE_ASYNC
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)
+# define CATCH_CONFIG_ANDROID_LOGWRITE
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
+# define CATCH_CONFIG_GLOBAL_NEXTAFTER
+#endif
+
+// Even if we do not think the compiler has that warning, we still have
+// to provide a macro that can be used by the code.
+#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
+#endif
+#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+#endif
+#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
+#endif
+#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
+#endif
+#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS
+#endif
+#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
+#endif
+
+// The goal of this macro is to avoid evaluation of the arguments, but
+// still have the compiler warn on problems inside...
+#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
+#endif
+
+#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
+# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
+#elif defined(__clang__) && (__clang_major__ < 5)
+# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
+#endif
+
+#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
+#endif
+
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+#define CATCH_TRY if ((true))
+#define CATCH_CATCH_ALL if ((false))
+#define CATCH_CATCH_ANON(type) if ((false))
+#else
+#define CATCH_TRY try
+#define CATCH_CATCH_ALL catch (...)
+#define CATCH_CATCH_ANON(type) catch (type)
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)
+#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#endif
+
+// end catch_compiler_capabilities.h
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
+#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
+#ifdef CATCH_CONFIG_COUNTER
+# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
+#else
+# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
+#endif
+
+#include <iosfwd>
+#include <string>
+#include <cstdint>
+
+// We need a dummy global operator<< so we can bring it into Catch namespace later
+struct Catch_global_namespace_dummy {};
+std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);
+
+namespace Catch {
+
+ struct CaseSensitive { enum Choice {
+ Yes,
+ No
+ }; };
+
+ class NonCopyable {
+ NonCopyable( NonCopyable const& ) = delete;
+ NonCopyable( NonCopyable && ) = delete;
+ NonCopyable& operator = ( NonCopyable const& ) = delete;
+ NonCopyable& operator = ( NonCopyable && ) = delete;
+
+ protected:
+ NonCopyable();
+ virtual ~NonCopyable();
+ };
+
+ struct SourceLineInfo {
+
+ SourceLineInfo() = delete;
+ SourceLineInfo( char const* _file, std::size_t _line ) noexcept
+ : file( _file ),
+ line( _line )
+ {}
+
+ SourceLineInfo( SourceLineInfo const& other ) = default;
+ SourceLineInfo& operator = ( SourceLineInfo const& ) = default;
+ SourceLineInfo( SourceLineInfo&& ) noexcept = default;
+ SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
+
+ bool empty() const noexcept { return file[0] == '\0'; }
+ bool operator == ( SourceLineInfo const& other ) const noexcept;
+ bool operator < ( SourceLineInfo const& other ) const noexcept;
+
+ char const* file;
+ std::size_t line;
+ };
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
+
+ // Bring in operator<< from global namespace into Catch namespace
+ // This is necessary because the overload of operator<< above makes
+ // lookup stop at namespace Catch
+ using ::operator<<;
+
+ // Use this in variadic streaming macros to allow
+ // >> +StreamEndStop
+ // as well as
+ // >> stuff +StreamEndStop
+ struct StreamEndStop {
+ std::string operator+() const;
+ };
+ template<typename T>
+ T const& operator + ( T const& value, StreamEndStop ) {
+ return value;
+ }
+}
+
+#define CATCH_INTERNAL_LINEINFO \
+ ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
+
+// end catch_common.h
+namespace Catch {
+
+ struct RegistrarForTagAliases {
+ RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );
+ };
+
+} // end namespace Catch
+
+#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+// end catch_tag_alias_autoregistrar.h
+// start catch_test_registry.h
+
+// start catch_interfaces_testcase.h
+
+#include <vector>
+
+namespace Catch {
+
+ class TestSpec;
+
+ struct ITestInvoker {
+ virtual void invoke () const = 0;
+ virtual ~ITestInvoker();
+ };
+
+ class TestCase;
+ struct IConfig;
+
+ struct ITestCaseRegistry {
+ virtual ~ITestCaseRegistry();
+ virtual std::vector<TestCase> const& getAllTests() const = 0;
+ virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;
+ };
+
+ bool isThrowSafe( TestCase const& testCase, IConfig const& config );
+ bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );
+ std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );
+ std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );
+
+}
+
+// end catch_interfaces_testcase.h
+// start catch_stringref.h
+
+#include <cstddef>
+#include <string>
+#include <iosfwd>
+#include <cassert>
+
+namespace Catch {
+
+ /// A non-owning string class (similar to the forthcoming std::string_view)
+ /// Note that, because a StringRef may be a substring of another string,
+ /// it may not be null terminated.
+ class StringRef {
+ public:
+ using size_type = std::size_t;
+ using const_iterator = const char*;
+
+ private:
+ static constexpr char const* const s_empty = "";
+
+ char const* m_start = s_empty;
+ size_type m_size = 0;
+
+ public: // construction
+ constexpr StringRef() noexcept = default;
+
+ StringRef( char const* rawChars ) noexcept;
+
+ constexpr StringRef( char const* rawChars, size_type size ) noexcept
+ : m_start( rawChars ),
+ m_size( size )
+ {}
+
+ StringRef( std::string const& stdString ) noexcept
+ : m_start( stdString.c_str() ),
+ m_size( stdString.size() )
+ {}
+
+ explicit operator std::string() const {
+ return std::string(m_start, m_size);
+ }
+
+ public: // operators
+ auto operator == ( StringRef const& other ) const noexcept -> bool;
+ auto operator != (StringRef const& other) const noexcept -> bool {
+ return !(*this == other);
+ }
+
+ auto operator[] ( size_type index ) const noexcept -> char {
+ assert(index < m_size);
+ return m_start[index];
+ }
+
+ public: // named queries
+ constexpr auto empty() const noexcept -> bool {
+ return m_size == 0;
+ }
+ constexpr auto size() const noexcept -> size_type {
+ return m_size;
+ }
+
+ // Returns the current start pointer. If the StringRef is not
+ // null-terminated, throws std::domain_exception
+ auto c_str() const -> char const*;
+
+ public: // substrings and searches
+ // Returns a substring of [start, start + length).
+ // If start + length > size(), then the substring is [start, size()).
+ // If start > size(), then the substring is empty.
+ auto substr( size_type start, size_type length ) const noexcept -> StringRef;
+
+ // Returns the current start pointer. May not be null-terminated.
+ auto data() const noexcept -> char const*;
+
+ constexpr auto isNullTerminated() const noexcept -> bool {
+ return m_start[m_size] == '\0';
+ }
+
+ public: // iterators
+ constexpr const_iterator begin() const { return m_start; }
+ constexpr const_iterator end() const { return m_start + m_size; }
+ };
+
+ auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&;
+ auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&;
+
+ constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef {
+ return StringRef( rawChars, size );
+ }
+} // namespace Catch
+
+constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef {
+ return Catch::StringRef( rawChars, size );
+}
+
+// end catch_stringref.h
+// start catch_preprocessor.hpp
+
+
+#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__
+#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))
+#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))
+#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))
+#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))
+#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))
+
+#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__
+// MSVC needs more evaluations
+#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))
+#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))
+#else
+#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__)
+#endif
+
+#define CATCH_REC_END(...)
+#define CATCH_REC_OUT
+
+#define CATCH_EMPTY()
+#define CATCH_DEFER(id) id CATCH_EMPTY()
+
+#define CATCH_REC_GET_END2() 0, CATCH_REC_END
+#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2
+#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1
+#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT
+#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0)
+#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)
+
+#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )
+#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ )
+#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )
+
+#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )
+#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ )
+#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )
+
+// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results,
+// and passes userdata as the first parameter to each invocation,
+// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c)
+#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
+
+#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
+
+#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)
+#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__
+#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__
+#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
+#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__
+#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))
+#else
+// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
+#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)
+#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__
+#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)
+#endif
+
+#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__
+#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)
+
+#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())
+#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))
+#else
+#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))
+#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
+#endif
+
+#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\
+ CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__)
+
+#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)
+#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)
+#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)
+#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)
+#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)
+#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)
+#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6)
+#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)
+#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)
+#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)
+#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)
+
+#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
+
+#define INTERNAL_CATCH_TYPE_GEN\
+ template<typename...> struct TypeList {};\
+ template<typename...Ts>\
+ constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\
+ template<template<typename...> class...> struct TemplateTypeList{};\
+ template<template<typename...> class...Cs>\
+ constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\
+ template<typename...>\
+ struct append;\
+ template<typename...>\
+ struct rewrap;\
+ template<template<typename...> class, typename...>\
+ struct create;\
+ template<template<typename...> class, typename>\
+ struct convert;\
+ \
+ template<typename T> \
+ struct append<T> { using type = T; };\
+ template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\
+ struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\
+ template< template<typename...> class L1, typename...E1, typename...Rest>\
+ struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\
+ \
+ template< template<typename...> class Container, template<typename...> class List, typename...elems>\
+ struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\
+ template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\
+ struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\
+ \
+ template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\
+ struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\
+ template<template <typename...> class Final, template <typename...> class List, typename...Ts>\
+ struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; };
+
+#define INTERNAL_CATCH_NTTP_1(signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \
+ template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\
+ template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\
+ constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \
+ \
+ template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\
+ template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\
+ struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\
+ template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\
+ struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; };
+
+#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)
+#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ static void TestName()
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ static void TestName()
+
+#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)
+#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ static void TestName()
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ static void TestName()
+
+#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\
+ template<typename Type>\
+ void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\
+ {\
+ Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\
+ }
+
+#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\
+ {\
+ Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\
+ }
+
+#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\
+ template<typename Type>\
+ void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\
+ {\
+ Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\
+ }
+
+#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
+ void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\
+ {\
+ Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\
+ }
+
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\
+ template<typename TestType> \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \
+ void test();\
+ }
+
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \
+ void test();\
+ }
+
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\
+ template<typename TestType> \
+ void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\
+ template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \
+ void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define INTERNAL_CATCH_NTTP_0
+#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0)
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)
+#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)
+#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)
+#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)
+#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)
+#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)
+#else
+#define INTERNAL_CATCH_NTTP_0(signature)
+#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__))
+#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__))
+#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__))
+#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__))
+#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__))
+#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__))
+#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__))
+#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__))
+#endif
+
+// end catch_preprocessor.hpp
+// start catch_meta.hpp
+
+
+#include <type_traits>
+
+namespace Catch {
+ template<typename T>
+ struct always_false : std::false_type {};
+
+ template <typename> struct true_given : std::true_type {};
+ struct is_callable_tester {
+ template <typename Fun, typename... Args>
+ true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);
+ template <typename...>
+ std::false_type static test(...);
+ };
+
+ template <typename T>
+ struct is_callable;
+
+ template <typename Fun, typename... Args>
+ struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};
+
+#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
+ // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
+ // replaced with std::invoke_result here.
+ template <typename Func, typename... U>
+ using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;
+#else
+ // Keep ::type here because we still support C++11
+ template <typename Func, typename... U>
+ using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;
+#endif
+
+} // namespace Catch
+
+namespace mpl_{
+ struct na;
+}
+
+// end catch_meta.hpp
+namespace Catch {
+
+template<typename C>
+class TestInvokerAsMethod : public ITestInvoker {
+ void (C::*m_testAsMethod)();
+public:
+ TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}
+
+ void invoke() const override {
+ C obj;
+ (obj.*m_testAsMethod)();
+ }
+};
+
+auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*;
+
+template<typename C>
+auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* {
+ return new(std::nothrow) TestInvokerAsMethod<C>( testAsMethod );
+}
+
+struct NameAndTags {
+ NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept;
+ StringRef name;
+ StringRef tags;
+};
+
+struct AutoReg : NonCopyable {
+ AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept;
+ ~AutoReg();
+};
+
+} // end namespace Catch
+
+#if defined(CATCH_CONFIG_DISABLE)
+ #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \
+ static void TestName()
+ #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \
+ namespace{ \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \
+ void test(); \
+ }; \
+ } \
+ void TestName::test()
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... ) \
+ INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
+ namespace{ \
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \
+ INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
+ } \
+ } \
+ INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))
+
+ #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ )
+ #else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) )
+ #endif
+
+ #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ )
+ #else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) )
+ #endif
+
+ #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )
+ #else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )
+ #endif
+
+ #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )
+ #else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )
+ #endif
+#endif
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
+ static void TestName(); \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ static void TestName()
+ #define INTERNAL_CATCH_TESTCASE( ... ) \
+ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), __VA_ARGS__ )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \
+ void test(); \
+ }; \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
+ } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ void TestName::test()
+ #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
+ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), ClassName, __VA_ARGS__ )
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+ ///////////////////////////////////////////////////////////////////////////////
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
+ INTERNAL_CATCH_TYPE_GEN\
+ INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
+ INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\
+ template<typename...Types> \
+ struct TestName{\
+ TestName(){\
+ int index = 0; \
+ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
+ using expander = int[];\
+ (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
+ }\
+ };\
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
+ TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\
+ return 0;\
+ }();\
+ }\
+ }\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename TestType, __VA_ARGS__ ) )
+#endif
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) )
+#endif
+
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ template<typename TestType> static void TestFuncName(); \
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \
+ INTERNAL_CATCH_TYPE_GEN \
+ INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature)) \
+ template<typename... Types> \
+ struct TestName { \
+ void reg_tests() { \
+ int index = 0; \
+ using expander = int[]; \
+ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
+ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
+ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\
+ } \
+ }; \
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
+ using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \
+ TestInit t; \
+ t.reg_tests(); \
+ return 0; \
+ }(); \
+ } \
+ } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ template<typename TestType> \
+ static void TestFuncName()
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\
+ INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename T,__VA_ARGS__)
+#else
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, typename T, __VA_ARGS__ ) )
+#endif
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\
+ INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__)
+#else
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, Signature, __VA_ARGS__ ) )
+#endif
+
+ #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ template<typename TestType> static void TestFunc(); \
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
+ INTERNAL_CATCH_TYPE_GEN\
+ template<typename... Types> \
+ struct TestName { \
+ void reg_tests() { \
+ int index = 0; \
+ using expander = int[]; \
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\
+ } \
+ };\
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
+ using TestInit = typename convert<TestName, TmplList>::type; \
+ TestInit t; \
+ t.reg_tests(); \
+ return 0; \
+ }(); \
+ }}\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ template<typename TestType> \
+ static void TestFunc()
+
+ #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \
+ INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), Name, Tags, TmplList )
+
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
+ INTERNAL_CATCH_TYPE_GEN\
+ INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
+ INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
+ INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\
+ template<typename...Types> \
+ struct TestNameClass{\
+ TestNameClass(){\
+ int index = 0; \
+ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
+ using expander = int[];\
+ (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
+ }\
+ };\
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
+ TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\
+ return 0;\
+ }();\
+ }\
+ }\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )
+#endif
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \
+ INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_C_L_A_S_S_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )
+#endif
+
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ template<typename TestType> \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
+ void test();\
+ };\
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\
+ INTERNAL_CATCH_TYPE_GEN \
+ INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
+ template<typename...Types>\
+ struct TestNameClass{\
+ void reg_tests(){\
+ int index = 0;\
+ using expander = int[];\
+ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
+ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
+ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \
+ }\
+ };\
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
+ using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\
+ TestInit t;\
+ t.reg_tests();\
+ return 0;\
+ }(); \
+ }\
+ }\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ template<typename TestType> \
+ void TestName<TestType>::test()
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\
+ INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, typename T, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) )
+#endif
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\
+ INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, Signature, __VA_ARGS__ )
+#else
+ #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\
+ INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) )
+#endif
+
+ #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ template<typename TestType> \
+ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
+ void test();\
+ };\
+ namespace {\
+ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
+ INTERNAL_CATCH_TYPE_GEN\
+ template<typename...Types>\
+ struct TestNameClass{\
+ void reg_tests(){\
+ int index = 0;\
+ using expander = int[];\
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \
+ }\
+ };\
+ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
+ using TestInit = typename convert<TestNameClass, TmplList>::type;\
+ TestInit t;\
+ t.reg_tests();\
+ return 0;\
+ }(); \
+ }}\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ template<typename TestType> \
+ void TestName<TestType>::test()
+
+#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \
+ INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_ ), INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_M_P_L_A_T_E_T_E_S_T_F_U_N_C_ ), ClassName, Name, Tags, TmplList )
+
+// end catch_test_registry.h
+// start catch_capture.hpp
+
+// start catch_assertionhandler.h
+
+// start catch_assertioninfo.h
+
+// start catch_result_type.h
+
+namespace Catch {
+
+ // ResultWas::OfType enum
+ struct ResultWas { enum OfType {
+ Unknown = -1,
+ Ok = 0,
+ Info = 1,
+ Warning = 2,
+
+ FailureBit = 0x10,
+
+ ExpressionFailed = FailureBit | 1,
+ ExplicitFailure = FailureBit | 2,
+
+ Exception = 0x100 | FailureBit,
+
+ ThrewException = Exception | 1,
+ DidntThrowException = Exception | 2,
+
+ FatalErrorCondition = 0x200 | FailureBit
+
+ }; };
+
+ bool isOk( ResultWas::OfType resultType );
+ bool isJustInfo( int flags );
+
+ // ResultDisposition::Flags enum
+ struct ResultDisposition { enum Flags {
+ Normal = 0x01,
+
+ ContinueOnFailure = 0x02, // Failures fail test, but execution continues
+ FalseTest = 0x04, // Prefix expression with !
+ SuppressFail = 0x08 // Failures are reported but do not fail the test
+ }; };
+
+ ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );
+
+ bool shouldContinueOnFailure( int flags );
+ inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
+ bool shouldSuppressFailure( int flags );
+
+} // end namespace Catch
+
+// end catch_result_type.h
+namespace Catch {
+
+ struct AssertionInfo
+ {
+ StringRef macroName;
+ SourceLineInfo lineInfo;
+ StringRef capturedExpression;
+ ResultDisposition::Flags resultDisposition;
+
+ // We want to delete this constructor but a compiler bug in 4.8 means
+ // the struct is then treated as non-aggregate
+ //AssertionInfo() = delete;
+ };
+
+} // end namespace Catch
+
+// end catch_assertioninfo.h
+// start catch_decomposer.h
+
+// start catch_tostring.h
+
+#include <vector>
+#include <cstddef>
+#include <type_traits>
+#include <string>
+// start catch_stream.h
+
+#include <iosfwd>
+#include <cstddef>
+#include <ostream>
+
+namespace Catch {
+
+ std::ostream& cout();
+ std::ostream& cerr();
+ std::ostream& clog();
+
+ class StringRef;
+
+ struct IStream {
+ virtual ~IStream();
+ virtual std::ostream& stream() const = 0;
+ };
+
+ auto makeStream( StringRef const &filename ) -> IStream const*;
+
+ class ReusableStringStream : NonCopyable {
+ std::size_t m_index;
+ std::ostream* m_oss;
+ public:
+ ReusableStringStream();
+ ~ReusableStringStream();
+
+ auto str() const -> std::string;
+
+ template<typename T>
+ auto operator << ( T const& value ) -> ReusableStringStream& {
+ *m_oss << value;
+ return *this;
+ }
+ auto get() -> std::ostream& { return *m_oss; }
+ };
+}
+
+// end catch_stream.h
+// start catch_interfaces_enum_values_registry.h
+
+#include <vector>
+
+namespace Catch {
+
+ namespace Detail {
+ struct EnumInfo {
+ StringRef m_name;
+ std::vector<std::pair<int, StringRef>> m_values;
+
+ ~EnumInfo();
+
+ StringRef lookup( int value ) const;
+ };
+ } // namespace Detail
+
+ struct IMutableEnumValuesRegistry {
+ virtual ~IMutableEnumValuesRegistry();
+
+ virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0;
+
+ template<typename E>
+ Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) {
+ static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int");
+ std::vector<int> intValues;
+ intValues.reserve( values.size() );
+ for( auto enumValue : values )
+ intValues.push_back( static_cast<int>( enumValue ) );
+ return registerEnum( enumName, allEnums, intValues );
+ }
+ };
+
+} // Catch
+
+// end catch_interfaces_enum_values_registry.h
+
+#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
+#include <string_view>
+#endif
+
+#ifdef __OBJC__
+// start catch_objc_arc.hpp
+
+#import <Foundation/Foundation.h>
+
+#ifdef __has_feature
+#define CATCH_ARC_ENABLED __has_feature(objc_arc)
+#else
+#define CATCH_ARC_ENABLED 0
+#endif
+
+void arcSafeRelease( NSObject* obj );
+id performOptionalSelector( id obj, SEL sel );
+
+#if !CATCH_ARC_ENABLED
+inline void arcSafeRelease( NSObject* obj ) {
+ [obj release];
+}
+inline id performOptionalSelector( id obj, SEL sel ) {
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED
+#define CATCH_ARC_STRONG
+#else
+inline void arcSafeRelease( NSObject* ){}
+inline id performOptionalSelector( id obj, SEL sel ) {
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+#endif
+ if( [obj respondsToSelector: sel] )
+ return [obj performSelector: sel];
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ return nil;
+}
+#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
+#define CATCH_ARC_STRONG __strong
+#endif
+
+// end catch_objc_arc.hpp
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless
+#endif
+
+namespace Catch {
+ namespace Detail {
+
+ extern const std::string unprintableString;
+
+ std::string rawMemoryToString( const void *object, std::size_t size );
+
+ template<typename T>
+ std::string rawMemoryToString( const T& object ) {
+ return rawMemoryToString( &object, sizeof(object) );
+ }
+
+ template<typename T>
+ class IsStreamInsertable {
+ template<typename Stream, typename U>
+ static auto test(int)
+ -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
+
+ template<typename, typename>
+ static auto test(...)->std::false_type;
+
+ public:
+ static const bool value = decltype(test<std::ostream, const T&>(0))::value;
+ };
+
+ template<typename E>
+ std::string convertUnknownEnumToString( E e );
+
+ template<typename T>
+ typename std::enable_if<
+ !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value,
+ std::string>::type convertUnstreamable( T const& ) {
+ return Detail::unprintableString;
+ }
+ template<typename T>
+ typename std::enable_if<
+ !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value,
+ std::string>::type convertUnstreamable(T const& ex) {
+ return ex.what();
+ }
+
+ template<typename T>
+ typename std::enable_if<
+ std::is_enum<T>::value
+ , std::string>::type convertUnstreamable( T const& value ) {
+ return convertUnknownEnumToString( value );
+ }
+
+#if defined(_MANAGED)
+ //! Convert a CLR string to a utf8 std::string
+ template<typename T>
+ std::string clrReferenceToString( T^ ref ) {
+ if (ref == nullptr)
+ return std::string("null");
+ auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());
+ cli::pin_ptr<System::Byte> p = &bytes[0];
+ return std::string(reinterpret_cast<char const *>(p), bytes->Length);
+ }
+#endif
+
+ } // namespace Detail
+
+ // If we decide for C++14, change these to enable_if_ts
+ template <typename T, typename = void>
+ struct StringMaker {
+ template <typename Fake = T>
+ static
+ typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type
+ convert(const Fake& value) {
+ ReusableStringStream rss;
+ // NB: call using the function-like syntax to avoid ambiguity with
+ // user-defined templated operator<< under clang.
+ rss.operator<<(value);
+ return rss.str();
+ }
+
+ template <typename Fake = T>
+ static
+ typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type
+ convert( const Fake& value ) {
+#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
+ return Detail::convertUnstreamable(value);
+#else
+ return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);
+#endif
+ }
+ };
+
+ namespace Detail {
+
+ // This function dispatches all stringification requests inside of Catch.
+ // Should be preferably called fully qualified, like ::Catch::Detail::stringify
+ template <typename T>
+ std::string stringify(const T& e) {
+ return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);
+ }
+
+ template<typename E>
+ std::string convertUnknownEnumToString( E e ) {
+ return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e));
+ }
+
+#if defined(_MANAGED)
+ template <typename T>
+ std::string stringify( T^ e ) {
+ return ::Catch::StringMaker<T^>::convert(e);
+ }
+#endif
+
+ } // namespace Detail
+
+ // Some predefined specializations
+
+ template<>
+ struct StringMaker<std::string> {
+ static std::string convert(const std::string& str);
+ };
+
+#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
+ template<>
+ struct StringMaker<std::string_view> {
+ static std::string convert(std::string_view str);
+ };
+#endif
+
+ template<>
+ struct StringMaker<char const *> {
+ static std::string convert(char const * str);
+ };
+ template<>
+ struct StringMaker<char *> {
+ static std::string convert(char * str);
+ };
+
+#ifdef CATCH_CONFIG_WCHAR
+ template<>
+ struct StringMaker<std::wstring> {
+ static std::string convert(const std::wstring& wstr);
+ };
+
+# ifdef CATCH_CONFIG_CPP17_STRING_VIEW
+ template<>
+ struct StringMaker<std::wstring_view> {
+ static std::string convert(std::wstring_view str);
+ };
+# endif
+
+ template<>
+ struct StringMaker<wchar_t const *> {
+ static std::string convert(wchar_t const * str);
+ };
+ template<>
+ struct StringMaker<wchar_t *> {
+ static std::string convert(wchar_t * str);
+ };
+#endif
+
+ // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer,
+ // while keeping string semantics?
+ template<int SZ>
+ struct StringMaker<char[SZ]> {
+ static std::string convert(char const* str) {
+ return ::Catch::Detail::stringify(std::string{ str });
+ }
+ };
+ template<int SZ>
+ struct StringMaker<signed char[SZ]> {
+ static std::string convert(signed char const* str) {
+ return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });
+ }
+ };
+ template<int SZ>
+ struct StringMaker<unsigned char[SZ]> {
+ static std::string convert(unsigned char const* str) {
+ return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });
+ }
+ };
+
+#if defined(CATCH_CONFIG_CPP17_BYTE)
+ template<>
+ struct StringMaker<std::byte> {
+ static std::string convert(std::byte value);
+ };
+#endif // defined(CATCH_CONFIG_CPP17_BYTE)
+ template<>
+ struct StringMaker<int> {
+ static std::string convert(int value);
+ };
+ template<>
+ struct StringMaker<long> {
+ static std::string convert(long value);
+ };
+ template<>
+ struct StringMaker<long long> {
+ static std::string convert(long long value);
+ };
+ template<>
+ struct StringMaker<unsigned int> {
+ static std::string convert(unsigned int value);
+ };
+ template<>
+ struct StringMaker<unsigned long> {
+ static std::string convert(unsigned long value);
+ };
+ template<>
+ struct StringMaker<unsigned long long> {
+ static std::string convert(unsigned long long value);
+ };
+
+ template<>
+ struct StringMaker<bool> {
+ static std::string convert(bool b);
+ };
+
+ template<>
+ struct StringMaker<char> {
+ static std::string convert(char c);
+ };
+ template<>
+ struct StringMaker<signed char> {
+ static std::string convert(signed char c);
+ };
+ template<>
+ struct StringMaker<unsigned char> {
+ static std::string convert(unsigned char c);
+ };
+
+ template<>
+ struct StringMaker<std::nullptr_t> {
+ static std::string convert(std::nullptr_t);
+ };
+
+ template<>
+ struct StringMaker<float> {
+ static std::string convert(float value);
+ static int precision;
+ };
+
+ template<>
+ struct StringMaker<double> {
+ static std::string convert(double value);
+ static int precision;
+ };
+
+ template <typename T>
+ struct StringMaker<T*> {
+ template <typename U>
+ static std::string convert(U* p) {
+ if (p) {
+ return ::Catch::Detail::rawMemoryToString(p);
+ } else {
+ return "nullptr";
+ }
+ }
+ };
+
+ template <typename R, typename C>
+ struct StringMaker<R C::*> {
+ static std::string convert(R C::* p) {
+ if (p) {
+ return ::Catch::Detail::rawMemoryToString(p);
+ } else {
+ return "nullptr";
+ }
+ }
+ };
+
+#if defined(_MANAGED)
+ template <typename T>
+ struct StringMaker<T^> {
+ static std::string convert( T^ ref ) {
+ return ::Catch::Detail::clrReferenceToString(ref);
+ }
+ };
+#endif
+
+ namespace Detail {
+ template<typename InputIterator, typename Sentinel = InputIterator>
+ std::string rangeToString(InputIterator first, Sentinel last) {
+ ReusableStringStream rss;
+ rss << "{ ";
+ if (first != last) {
+ rss << ::Catch::Detail::stringify(*first);
+ for (++first; first != last; ++first)
+ rss << ", " << ::Catch::Detail::stringify(*first);
+ }
+ rss << " }";
+ return rss.str();
+ }
+ }
+
+#ifdef __OBJC__
+ template<>
+ struct StringMaker<NSString*> {
+ static std::string convert(NSString * nsstring) {
+ if (!nsstring)
+ return "nil";
+ return std::string("@") + [nsstring UTF8String];
+ }
+ };
+ template<>
+ struct StringMaker<NSObject*> {
+ static std::string convert(NSObject* nsObject) {
+ return ::Catch::Detail::stringify([nsObject description]);
+ }
+
+ };
+ namespace Detail {
+ inline std::string stringify( NSString* nsstring ) {
+ return StringMaker<NSString*>::convert( nsstring );
+ }
+
+ } // namespace Detail
+#endif // __OBJC__
+
+} // namespace Catch
+
+//////////////////////////////////////////////////////
+// Separate std-lib types stringification, so it can be selectively enabled
+// This means that we do not bring in
+
+#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)
+# define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
+# define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
+# define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
+# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
+# define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER
+#endif
+
+// Separate std::pair specialization
+#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)
+#include <utility>
+namespace Catch {
+ template<typename T1, typename T2>
+ struct StringMaker<std::pair<T1, T2> > {
+ static std::string convert(const std::pair<T1, T2>& pair) {
+ ReusableStringStream rss;
+ rss << "{ "
+ << ::Catch::Detail::stringify(pair.first)
+ << ", "
+ << ::Catch::Detail::stringify(pair.second)
+ << " }";
+ return rss.str();
+ }
+ };
+}
+#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
+
+#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)
+#include <optional>
+namespace Catch {
+ template<typename T>
+ struct StringMaker<std::optional<T> > {
+ static std::string convert(const std::optional<T>& optional) {
+ ReusableStringStream rss;
+ if (optional.has_value()) {
+ rss << ::Catch::Detail::stringify(*optional);
+ } else {
+ rss << "{ }";
+ }
+ return rss.str();
+ }
+ };
+}
+#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER
+
+// Separate std::tuple specialization
+#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
+#include <tuple>
+namespace Catch {
+ namespace Detail {
+ template<
+ typename Tuple,
+ std::size_t N = 0,
+ bool = (N < std::tuple_size<Tuple>::value)
+ >
+ struct TupleElementPrinter {
+ static void print(const Tuple& tuple, std::ostream& os) {
+ os << (N ? ", " : " ")
+ << ::Catch::Detail::stringify(std::get<N>(tuple));
+ TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
+ }
+ };
+
+ template<
+ typename Tuple,
+ std::size_t N
+ >
+ struct TupleElementPrinter<Tuple, N, false> {
+ static void print(const Tuple&, std::ostream&) {}
+ };
+
+ }
+
+ template<typename ...Types>
+ struct StringMaker<std::tuple<Types...>> {
+ static std::string convert(const std::tuple<Types...>& tuple) {
+ ReusableStringStream rss;
+ rss << '{';
+ Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());
+ rss << " }";
+ return rss.str();
+ }
+ };
+}
+#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
+
+#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
+#include <variant>
+namespace Catch {
+ template<>
+ struct StringMaker<std::monostate> {
+ static std::string convert(const std::monostate&) {
+ return "{ }";
+ }
+ };
+
+ template<typename... Elements>
+ struct StringMaker<std::variant<Elements...>> {
+ static std::string convert(const std::variant<Elements...>& variant) {
+ if (variant.valueless_by_exception()) {
+ return "{valueless variant}";
+ } else {
+ return std::visit(
+ [](const auto& value) {
+ return ::Catch::Detail::stringify(value);
+ },
+ variant
+ );
+ }
+ }
+ };
+}
+#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
+
+namespace Catch {
+ // Import begin/ end from std here
+ using std::begin;
+ using std::end;
+
+ namespace detail {
+ template <typename...>
+ struct void_type {
+ using type = void;
+ };
+
+ template <typename T, typename = void>
+ struct is_range_impl : std::false_type {
+ };
+
+ template <typename T>
+ struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type {
+ };
+ } // namespace detail
+
+ template <typename T>
+ struct is_range : detail::is_range_impl<T> {
+ };
+
+#if defined(_MANAGED) // Managed types are never ranges
+ template <typename T>
+ struct is_range<T^> {
+ static const bool value = false;
+ };
+#endif
+
+ template<typename Range>
+ std::string rangeToString( Range const& range ) {
+ return ::Catch::Detail::rangeToString( begin( range ), end( range ) );
+ }
+
+ // Handle vector<bool> specially
+ template<typename Allocator>
+ std::string rangeToString( std::vector<bool, Allocator> const& v ) {
+ ReusableStringStream rss;
+ rss << "{ ";
+ bool first = true;
+ for( bool b : v ) {
+ if( first )
+ first = false;
+ else
+ rss << ", ";
+ rss << ::Catch::Detail::stringify( b );
+ }
+ rss << " }";
+ return rss.str();
+ }
+
+ template<typename R>
+ struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
+ static std::string convert( R const& range ) {
+ return rangeToString( range );
+ }
+ };
+
+ template <typename T, int SZ>
+ struct StringMaker<T[SZ]> {
+ static std::string convert(T const(&arr)[SZ]) {
+ return rangeToString(arr);
+ }
+ };
+
+} // namespace Catch
+
+// Separate std::chrono::duration specialization
+#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
+#include <ctime>
+#include <ratio>
+#include <chrono>
+
+namespace Catch {
+
+template <class Ratio>
+struct ratio_string {
+ static std::string symbol();
+};
+
+template <class Ratio>
+std::string ratio_string<Ratio>::symbol() {
+ Catch::ReusableStringStream rss;
+ rss << '[' << Ratio::num << '/'
+ << Ratio::den << ']';
+ return rss.str();
+}
+template <>
+struct ratio_string<std::atto> {
+ static std::string symbol();
+};
+template <>
+struct ratio_string<std::femto> {
+ static std::string symbol();
+};
+template <>
+struct ratio_string<std::pico> {
+ static std::string symbol();
+};
+template <>
+struct ratio_string<std::nano> {
+ static std::string symbol();
+};
+template <>
+struct ratio_string<std::micro> {
+ static std::string symbol();
+};
+template <>
+struct ratio_string<std::milli> {
+ static std::string symbol();
+};
+
+ ////////////
+ // std::chrono::duration specializations
+ template<typename Value, typename Ratio>
+ struct StringMaker<std::chrono::duration<Value, Ratio>> {
+ static std::string convert(std::chrono::duration<Value, Ratio> const& duration) {
+ ReusableStringStream rss;
+ rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's';
+ return rss.str();
+ }
+ };
+ template<typename Value>
+ struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
+ static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) {
+ ReusableStringStream rss;
+ rss << duration.count() << " s";
+ return rss.str();
+ }
+ };
+ template<typename Value>
+ struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
+ static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) {
+ ReusableStringStream rss;
+ rss << duration.count() << " m";
+ return rss.str();
+ }
+ };
+ template<typename Value>
+ struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
+ static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) {
+ ReusableStringStream rss;
+ rss << duration.count() << " h";
+ return rss.str();
+ }
+ };
+
+ ////////////
+ // std::chrono::time_point specialization
+ // Generic time_point cannot be specialized, only std::chrono::time_point<system_clock>
+ template<typename Clock, typename Duration>
+ struct StringMaker<std::chrono::time_point<Clock, Duration>> {
+ static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) {
+ return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch";
+ }
+ };
+ // std::chrono::time_point<system_clock> specialization
+ template<typename Duration>
+ struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {
+ static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {
+ auto converted = std::chrono::system_clock::to_time_t(time_point);
+
+#ifdef _MSC_VER
+ std::tm timeInfo = {};
+ gmtime_s(&timeInfo, &converted);
+#else
+ std::tm* timeInfo = std::gmtime(&converted);
+#endif
+
+ auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
+ char timeStamp[timeStampSize];
+ const char * const fmt = "%Y-%m-%dT%H:%M:%SZ";
+
+#ifdef _MSC_VER
+ std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
+#else
+ std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
+#endif
+ return std::string(timeStamp);
+ }
+ };
+}
+#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
+
+#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \
+namespace Catch { \
+ template<> struct StringMaker<enumName> { \
+ static std::string convert( enumName value ) { \
+ static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \
+ return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \
+ } \
+ }; \
+}
+
+#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ )
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// end catch_tostring.h
+#include <iosfwd>
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4389) // '==' : signed/unsigned mismatch
+#pragma warning(disable:4018) // more "signed/unsigned mismatch"
+#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform)
+#pragma warning(disable:4180) // qualifier applied to function type has no meaning
+#pragma warning(disable:4800) // Forcing result to true or false
+#endif
+
+namespace Catch {
+
+ struct ITransientExpression {
+ auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
+ auto getResult() const -> bool { return m_result; }
+ virtual void streamReconstructedExpression( std::ostream &os ) const = 0;
+
+ ITransientExpression( bool isBinaryExpression, bool result )
+ : m_isBinaryExpression( isBinaryExpression ),
+ m_result( result )
+ {}
+
+ // We don't actually need a virtual destructor, but many static analysers
+ // complain if it's not here :-(
+ virtual ~ITransientExpression();
+
+ bool m_isBinaryExpression;
+ bool m_result;
+
+ };
+
+ void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
+
+ template<typename LhsT, typename RhsT>
+ class BinaryExpr : public ITransientExpression {
+ LhsT m_lhs;
+ StringRef m_op;
+ RhsT m_rhs;
+
+ void streamReconstructedExpression( std::ostream &os ) const override {
+ formatReconstructedExpression
+ ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) );
+ }
+
+ public:
+ BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs )
+ : ITransientExpression{ true, comparisonResult },
+ m_lhs( lhs ),
+ m_op( op ),
+ m_rhs( rhs )
+ {}
+
+ template<typename T>
+ auto operator && ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator || ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator == ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator != ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator > ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator < ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator >= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename T>
+ auto operator <= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<T>::value,
+ "chained comparisons are not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+ };
+
+ template<typename LhsT>
+ class UnaryExpr : public ITransientExpression {
+ LhsT m_lhs;
+
+ void streamReconstructedExpression( std::ostream &os ) const override {
+ os << Catch::Detail::stringify( m_lhs );
+ }
+
+ public:
+ explicit UnaryExpr( LhsT lhs )
+ : ITransientExpression{ false, static_cast<bool>(lhs) },
+ m_lhs( lhs )
+ {}
+ };
+
+ // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)
+ template<typename LhsT, typename RhsT>
+ auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); }
+ template<typename T>
+ auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }
+ template<typename T>
+ auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }
+ template<typename T>
+ auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }
+ template<typename T>
+ auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }
+
+ template<typename LhsT, typename RhsT>
+ auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); }
+ template<typename T>
+ auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }
+ template<typename T>
+ auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }
+ template<typename T>
+ auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }
+ template<typename T>
+ auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }
+
+ template<typename LhsT>
+ class ExprLhs {
+ LhsT m_lhs;
+ public:
+ explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
+
+ template<typename RhsT>
+ auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { compareEqual( m_lhs, rhs ), m_lhs, "==", rhs };
+ }
+ auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
+ return { m_lhs == rhs, m_lhs, "==", rhs };
+ }
+
+ template<typename RhsT>
+ auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs };
+ }
+ auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const {
+ return { m_lhs != rhs, m_lhs, "!=", rhs };
+ }
+
+ template<typename RhsT>
+ auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs > rhs), m_lhs, ">", rhs };
+ }
+ template<typename RhsT>
+ auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs < rhs), m_lhs, "<", rhs };
+ }
+ template<typename RhsT>
+ auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs >= rhs), m_lhs, ">=", rhs };
+ }
+ template<typename RhsT>
+ auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs };
+ }
+ template <typename RhsT>
+ auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs };
+ }
+ template <typename RhsT>
+ auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs };
+ }
+ template <typename RhsT>
+ auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs };
+ }
+
+ template<typename RhsT>
+ auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<RhsT>::value,
+ "operator&& is not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ template<typename RhsT>
+ auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {
+ static_assert(always_false<RhsT>::value,
+ "operator|| is not supported inside assertions, "
+ "wrap the expression inside parentheses, or decompose it");
+ }
+
+ auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
+ return UnaryExpr<LhsT>{ m_lhs };
+ }
+ };
+
+ void handleExpression( ITransientExpression const& expr );
+
+ template<typename T>
+ void handleExpression( ExprLhs<T> const& expr ) {
+ handleExpression( expr.makeUnaryExpr() );
+ }
+
+ struct Decomposer {
+ template<typename T>
+ auto operator <= ( T const& lhs ) -> ExprLhs<T const&> {
+ return ExprLhs<T const&>{ lhs };
+ }
+
+ auto operator <=( bool value ) -> ExprLhs<bool> {
+ return ExprLhs<bool>{ value };
+ }
+ };
+
+} // end namespace Catch
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+// end catch_decomposer.h
+// start catch_interfaces_capture.h
+
+#include <string>
+#include <chrono>
+
+namespace Catch {
+
+ class AssertionResult;
+ struct AssertionInfo;
+ struct SectionInfo;
+ struct SectionEndInfo;
+ struct MessageInfo;
+ struct MessageBuilder;
+ struct Counts;
+ struct AssertionReaction;
+ struct SourceLineInfo;
+
+ struct ITransientExpression;
+ struct IGeneratorTracker;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ struct BenchmarkInfo;
+ template <typename Duration = std::chrono::duration<double, std::nano>>
+ struct BenchmarkStats;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ struct IResultCapture {
+
+ virtual ~IResultCapture();
+
+ virtual bool sectionStarted( SectionInfo const& sectionInfo,
+ Counts& assertions ) = 0;
+ virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;
+ virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;
+
+ virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ virtual void benchmarkPreparing( std::string const& name ) = 0;
+ virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0;
+ virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0;
+ virtual void benchmarkFailed( std::string const& error ) = 0;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ virtual void pushScopedMessage( MessageInfo const& message ) = 0;
+ virtual void popScopedMessage( MessageInfo const& message ) = 0;
+
+ virtual void emplaceUnscopedMessage( MessageBuilder const& builder ) = 0;
+
+ virtual void handleFatalErrorCondition( StringRef message ) = 0;
+
+ virtual void handleExpr
+ ( AssertionInfo const& info,
+ ITransientExpression const& expr,
+ AssertionReaction& reaction ) = 0;
+ virtual void handleMessage
+ ( AssertionInfo const& info,
+ ResultWas::OfType resultType,
+ StringRef const& message,
+ AssertionReaction& reaction ) = 0;
+ virtual void handleUnexpectedExceptionNotThrown
+ ( AssertionInfo const& info,
+ AssertionReaction& reaction ) = 0;
+ virtual void handleUnexpectedInflightException
+ ( AssertionInfo const& info,
+ std::string const& message,
+ AssertionReaction& reaction ) = 0;
+ virtual void handleIncomplete
+ ( AssertionInfo const& info ) = 0;
+ virtual void handleNonExpr
+ ( AssertionInfo const &info,
+ ResultWas::OfType resultType,
+ AssertionReaction &reaction ) = 0;
+
+ virtual bool lastAssertionPassed() = 0;
+ virtual void assertionPassed() = 0;
+
+ // Deprecated, do not use:
+ virtual std::string getCurrentTestName() const = 0;
+ virtual const AssertionResult* getLastResult() const = 0;
+ virtual void exceptionEarlyReported() = 0;
+ };
+
+ IResultCapture& getResultCapture();
+}
+
+// end catch_interfaces_capture.h
+namespace Catch {
+
+ struct TestFailureException{};
+ struct AssertionResultData;
+ struct IResultCapture;
+ class RunContext;
+
+ class LazyExpression {
+ friend class AssertionHandler;
+ friend struct AssertionStats;
+ friend class RunContext;
+
+ ITransientExpression const* m_transientExpression = nullptr;
+ bool m_isNegated;
+ public:
+ LazyExpression( bool isNegated );
+ LazyExpression( LazyExpression const& other );
+ LazyExpression& operator = ( LazyExpression const& ) = delete;
+
+ explicit operator bool() const;
+
+ friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&;
+ };
+
+ struct AssertionReaction {
+ bool shouldDebugBreak = false;
+ bool shouldThrow = false;
+ };
+
+ class AssertionHandler {
+ AssertionInfo m_assertionInfo;
+ AssertionReaction m_reaction;
+ bool m_completed = false;
+ IResultCapture& m_resultCapture;
+
+ public:
+ AssertionHandler
+ ( StringRef const& macroName,
+ SourceLineInfo const& lineInfo,
+ StringRef capturedExpression,
+ ResultDisposition::Flags resultDisposition );
+ ~AssertionHandler() {
+ if ( !m_completed ) {
+ m_resultCapture.handleIncomplete( m_assertionInfo );
+ }
+ }
+
+ template<typename T>
+ void handleExpr( ExprLhs<T> const& expr ) {
+ handleExpr( expr.makeUnaryExpr() );
+ }
+ void handleExpr( ITransientExpression const& expr );
+
+ void handleMessage(ResultWas::OfType resultType, StringRef const& message);
+
+ void handleExceptionThrownAsExpected();
+ void handleUnexpectedExceptionNotThrown();
+ void handleExceptionNotThrownAsExpected();
+ void handleThrowingCallSkipped();
+ void handleUnexpectedInflightException();
+
+ void complete();
+ void setCompleted();
+
+ // query
+ auto allowThrows() const -> bool;
+ };
+
+ void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString );
+
+} // namespace Catch
+
+// end catch_assertionhandler.h
+// start catch_message.h
+
+#include <string>
+#include <vector>
+
+namespace Catch {
+
+ struct MessageInfo {
+ MessageInfo( StringRef const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type );
+
+ StringRef macroName;
+ std::string message;
+ SourceLineInfo lineInfo;
+ ResultWas::OfType type;
+ unsigned int sequence;
+
+ bool operator == ( MessageInfo const& other ) const;
+ bool operator < ( MessageInfo const& other ) const;
+ private:
+ static unsigned int globalCount;
+ };
+
+ struct MessageStream {
+
+ template<typename T>
+ MessageStream& operator << ( T const& value ) {
+ m_stream << value;
+ return *this;
+ }
+
+ ReusableStringStream m_stream;
+ };
+
+ struct MessageBuilder : MessageStream {
+ MessageBuilder( StringRef const& macroName,
+ SourceLineInfo const& lineInfo,
+ ResultWas::OfType type );
+
+ template<typename T>
+ MessageBuilder& operator << ( T const& value ) {
+ m_stream << value;
+ return *this;
+ }
+
+ MessageInfo m_info;
+ };
+
+ class ScopedMessage {
+ public:
+ explicit ScopedMessage( MessageBuilder const& builder );
+ ScopedMessage( ScopedMessage& duplicate ) = delete;
+ ScopedMessage( ScopedMessage&& old );
+ ~ScopedMessage();
+
+ MessageInfo m_info;
+ bool m_moved;
+ };
+
+ class Capturer {
+ std::vector<MessageInfo> m_messages;
+ IResultCapture& m_resultCapture = getResultCapture();
+ size_t m_captured = 0;
+ public:
+ Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names );
+ ~Capturer();
+
+ void captureValue( size_t index, std::string const& value );
+
+ template<typename T>
+ void captureValues( size_t index, T const& value ) {
+ captureValue( index, Catch::Detail::stringify( value ) );
+ }
+
+ template<typename T, typename... Ts>
+ void captureValues( size_t index, T const& value, Ts const&... values ) {
+ captureValue( index, Catch::Detail::stringify(value) );
+ captureValues( index+1, values... );
+ }
+ };
+
+} // end namespace Catch
+
+// end catch_message.h
+#if !defined(CATCH_CONFIG_DISABLE)
+
+#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)
+ #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__
+#else
+ #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION"
+#endif
+
+#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+
+///////////////////////////////////////////////////////////////////////////////
+// Another way to speed-up compilation is to omit local try-catch for REQUIRE*
+// macros.
+#define INTERNAL_CATCH_TRY
+#define INTERNAL_CATCH_CATCH( capturer )
+
+#else // CATCH_CONFIG_FAST_COMPILE
+
+#define INTERNAL_CATCH_TRY try
+#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); }
+
+#endif
+
+#define INTERNAL_CATCH_REACT( handler ) handler.complete();
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
+ do { \
+ CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
+ INTERNAL_CATCH_TRY { \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \
+ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \
+ if( Catch::getResultCapture().lastAssertionPassed() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \
+ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \
+ if( !Catch::getResultCapture().lastAssertionPassed() )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
+ try { \
+ static_cast<void>(__VA_ARGS__); \
+ catchAssertionHandler.handleExceptionNotThrownAsExpected(); \
+ } \
+ catch( ... ) { \
+ catchAssertionHandler.handleUnexpectedInflightException(); \
+ } \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \
+ if( catchAssertionHandler.allowThrows() ) \
+ try { \
+ static_cast<void>(__VA_ARGS__); \
+ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
+ } \
+ catch( ... ) { \
+ catchAssertionHandler.handleExceptionThrownAsExpected(); \
+ } \
+ else \
+ catchAssertionHandler.handleThrowingCallSkipped(); \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \
+ if( catchAssertionHandler.allowThrows() ) \
+ try { \
+ static_cast<void>(expr); \
+ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
+ } \
+ catch( exceptionType const& ) { \
+ catchAssertionHandler.handleExceptionThrownAsExpected(); \
+ } \
+ catch( ... ) { \
+ catchAssertionHandler.handleUnexpectedInflightException(); \
+ } \
+ else \
+ catchAssertionHandler.handleThrowingCallSkipped(); \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
+ catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \
+ auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \
+ varName.captureValues( 0, __VA_ARGS__ )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_INFO( macroName, log ) \
+ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log );
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \
+ Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
+
+///////////////////////////////////////////////////////////////////////////////
+// Although this is matcher-based, it can be used with just a string
+#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
+ if( catchAssertionHandler.allowThrows() ) \
+ try { \
+ static_cast<void>(__VA_ARGS__); \
+ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
+ } \
+ catch( ... ) { \
+ Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \
+ } \
+ else \
+ catchAssertionHandler.handleThrowingCallSkipped(); \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+#endif // CATCH_CONFIG_DISABLE
+
+// end catch_capture.hpp
+// start catch_section.h
+
+// start catch_section_info.h
+
+// start catch_totals.h
+
+#include <cstddef>
+
+namespace Catch {
+
+ struct Counts {
+ Counts operator - ( Counts const& other ) const;
+ Counts& operator += ( Counts const& other );
+
+ std::size_t total() const;
+ bool allPassed() const;
+ bool allOk() const;
+
+ std::size_t passed = 0;
+ std::size_t failed = 0;
+ std::size_t failedButOk = 0;
+ };
+
+ struct Totals {
+
+ Totals operator - ( Totals const& other ) const;
+ Totals& operator += ( Totals const& other );
+
+ Totals delta( Totals const& prevTotals ) const;
+
+ int error = 0;
+ Counts assertions;
+ Counts testCases;
+ };
+}
+
+// end catch_totals.h
+#include <string>
+
+namespace Catch {
+
+ struct SectionInfo {
+ SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name );
+
+ // Deprecated
+ SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name,
+ std::string const& ) : SectionInfo( _lineInfo, _name ) {}
+
+ std::string name;
+ std::string description; // !Deprecated: this will always be empty
+ SourceLineInfo lineInfo;
+ };
+
+ struct SectionEndInfo {
+ SectionInfo sectionInfo;
+ Counts prevAssertions;
+ double durationInSeconds;
+ };
+
+} // end namespace Catch
+
+// end catch_section_info.h
+// start catch_timer.h
+
+#include <cstdint>
+
+namespace Catch {
+
+ auto getCurrentNanosecondsSinceEpoch() -> uint64_t;
+ auto getEstimatedClockResolution() -> uint64_t;
+
+ class Timer {
+ uint64_t m_nanoseconds = 0;
+ public:
+ void start();
+ auto getElapsedNanoseconds() const -> uint64_t;
+ auto getElapsedMicroseconds() const -> uint64_t;
+ auto getElapsedMilliseconds() const -> unsigned int;
+ auto getElapsedSeconds() const -> double;
+ };
+
+} // namespace Catch
+
+// end catch_timer.h
+#include <string>
+
+namespace Catch {
+
+ class Section : NonCopyable {
+ public:
+ Section( SectionInfo const& info );
+ ~Section();
+
+ // This indicates whether the section should be executed or not
+ explicit operator bool() const;
+
+ private:
+ SectionInfo m_info;
+
+ std::string m_name;
+ Counts m_assertions;
+ bool m_sectionIncluded;
+ Timer m_timer;
+ };
+
+} // end namespace Catch
+
+#define INTERNAL_CATCH_SECTION( ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
+ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+// end catch_section.h
+// start catch_interfaces_exception.h
+
+// start catch_interfaces_registry_hub.h
+
+#include <string>
+#include <memory>
+
+namespace Catch {
+
+ class TestCase;
+ struct ITestCaseRegistry;
+ struct IExceptionTranslatorRegistry;
+ struct IExceptionTranslator;
+ struct IReporterRegistry;
+ struct IReporterFactory;
+ struct ITagAliasRegistry;
+ struct IMutableEnumValuesRegistry;
+
+ class StartupExceptionRegistry;
+
+ using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
+
+ struct IRegistryHub {
+ virtual ~IRegistryHub();
+
+ virtual IReporterRegistry const& getReporterRegistry() const = 0;
+ virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
+ virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;
+ virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0;
+
+ virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0;
+ };
+
+ struct IMutableRegistryHub {
+ virtual ~IMutableRegistryHub();
+ virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0;
+ virtual void registerListener( IReporterFactoryPtr const& factory ) = 0;
+ virtual void registerTest( TestCase const& testInfo ) = 0;
+ virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
+ virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0;
+ virtual void registerStartupException() noexcept = 0;
+ virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0;
+ };
+
+ IRegistryHub const& getRegistryHub();
+ IMutableRegistryHub& getMutableRegistryHub();
+ void cleanUp();
+ std::string translateActiveException();
+
+}
+
+// end catch_interfaces_registry_hub.h
+#if defined(CATCH_CONFIG_DISABLE)
+ #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \
+ static std::string translatorName( signature )
+#endif
+
+#include <exception>
+#include <string>
+#include <vector>
+
+namespace Catch {
+ using exceptionTranslateFunction = std::string(*)();
+
+ struct IExceptionTranslator;
+ using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;
+
+ struct IExceptionTranslator {
+ virtual ~IExceptionTranslator();
+ virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;
+ };
+
+ struct IExceptionTranslatorRegistry {
+ virtual ~IExceptionTranslatorRegistry();
+
+ virtual std::string translateActiveException() const = 0;
+ };
+
+ class ExceptionTranslatorRegistrar {
+ template<typename T>
+ class ExceptionTranslator : public IExceptionTranslator {
+ public:
+
+ ExceptionTranslator( std::string(*translateFunction)( T& ) )
+ : m_translateFunction( translateFunction )
+ {}
+
+ std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ return "";
+#else
+ try {
+ if( it == itEnd )
+ std::rethrow_exception(std::current_exception());
+ else
+ return (*it)->translate( it+1, itEnd );
+ }
+ catch( T& ex ) {
+ return m_translateFunction( ex );
+ }
+#endif
+ }
+
+ protected:
+ std::string(*m_translateFunction)( T& );
+ };
+
+ public:
+ template<typename T>
+ ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
+ getMutableRegistryHub().registerTranslator
+ ( new ExceptionTranslator<T>( translateFunction ) );
+ }
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
+ static std::string translatorName( signature ); \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
+ static std::string translatorName( signature )
+
+#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
+
+// end catch_interfaces_exception.h
+// start catch_approx.h
+
+#include <type_traits>
+
+namespace Catch {
+namespace Detail {
+
+ class Approx {
+ private:
+ bool equalityComparisonImpl(double other) const;
+ // Validates the new margin (margin >= 0)
+ // out-of-line to avoid including stdexcept in the header
+ void setMargin(double margin);
+ // Validates the new epsilon (0 < epsilon < 1)
+ // out-of-line to avoid including stdexcept in the header
+ void setEpsilon(double epsilon);
+
+ public:
+ explicit Approx ( double value );
+
+ static Approx custom();
+
+ Approx operator-() const;
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx operator()( T const& value ) const {
+ Approx approx( static_cast<double>(value) );
+ approx.m_epsilon = m_epsilon;
+ approx.m_margin = m_margin;
+ approx.m_scale = m_scale;
+ return approx;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ explicit Approx( T const& value ): Approx(static_cast<double>(value))
+ {}
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator == ( const T& lhs, Approx const& rhs ) {
+ auto lhs_v = static_cast<double>(lhs);
+ return rhs.equalityComparisonImpl(lhs_v);
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator == ( Approx const& lhs, const T& rhs ) {
+ return operator==( rhs, lhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator != ( T const& lhs, Approx const& rhs ) {
+ return !operator==( lhs, rhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator != ( Approx const& lhs, T const& rhs ) {
+ return !operator==( rhs, lhs );
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator <= ( T const& lhs, Approx const& rhs ) {
+ return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator <= ( Approx const& lhs, T const& rhs ) {
+ return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator >= ( T const& lhs, Approx const& rhs ) {
+ return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ friend bool operator >= ( Approx const& lhs, T const& rhs ) {
+ return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& epsilon( T const& newEpsilon ) {
+ double epsilonAsDouble = static_cast<double>(newEpsilon);
+ setEpsilon(epsilonAsDouble);
+ return *this;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& margin( T const& newMargin ) {
+ double marginAsDouble = static_cast<double>(newMargin);
+ setMargin(marginAsDouble);
+ return *this;
+ }
+
+ template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ Approx& scale( T const& newScale ) {
+ m_scale = static_cast<double>(newScale);
+ return *this;
+ }
+
+ std::string toString() const;
+
+ private:
+ double m_epsilon;
+ double m_margin;
+ double m_scale;
+ double m_value;
+ };
+} // end namespace Detail
+
+namespace literals {
+ Detail::Approx operator "" _a(long double val);
+ Detail::Approx operator "" _a(unsigned long long val);
+} // end namespace literals
+
+template<>
+struct StringMaker<Catch::Detail::Approx> {
+ static std::string convert(Catch::Detail::Approx const& value);
+};
+
+} // end namespace Catch
+
+// end catch_approx.h
+// start catch_string_manip.h
+
+#include <string>
+#include <iosfwd>
+#include <vector>
+
+namespace Catch {
+
+ bool startsWith( std::string const& s, std::string const& prefix );
+ bool startsWith( std::string const& s, char prefix );
+ bool endsWith( std::string const& s, std::string const& suffix );
+ bool endsWith( std::string const& s, char suffix );
+ bool contains( std::string const& s, std::string const& infix );
+ void toLowerInPlace( std::string& s );
+ std::string toLower( std::string const& s );
+ //! Returns a new string without whitespace at the start/end
+ std::string trim( std::string const& str );
+ //! Returns a substring of the original ref without whitespace. Beware lifetimes!
+ StringRef trim(StringRef ref);
+
+ // !!! Be aware, returns refs into original string - make sure original string outlives them
+ std::vector<StringRef> splitStringRef( StringRef str, char delimiter );
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );
+
+ struct pluralise {
+ pluralise( std::size_t count, std::string const& label );
+
+ friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );
+
+ std::size_t m_count;
+ std::string m_label;
+ };
+}
+
+// end catch_string_manip.h
+#ifndef CATCH_CONFIG_DISABLE_MATCHERS
+// start catch_capture_matchers.h
+
+// start catch_matchers.h
+
+#include <string>
+#include <vector>
+
+namespace Catch {
+namespace Matchers {
+ namespace Impl {
+
+ template<typename ArgT> struct MatchAllOf;
+ template<typename ArgT> struct MatchAnyOf;
+ template<typename ArgT> struct MatchNotOf;
+
+ class MatcherUntypedBase {
+ public:
+ MatcherUntypedBase() = default;
+ MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
+ MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete;
+ std::string toString() const;
+
+ protected:
+ virtual ~MatcherUntypedBase();
+ virtual std::string describe() const = 0;
+ mutable std::string m_cachedToString;
+ };
+
+#ifdef __clang__
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wnon-virtual-dtor"
+#endif
+
+ template<typename ObjectT>
+ struct MatcherMethod {
+ virtual bool match( ObjectT const& arg ) const = 0;
+ };
+
+#if defined(__OBJC__)
+ // Hack to fix Catch GH issue #1661. Could use id for generic Object support.
+ // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation
+ template<>
+ struct MatcherMethod<NSString*> {
+ virtual bool match( NSString* arg ) const = 0;
+ };
+#endif
+
+#ifdef __clang__
+# pragma clang diagnostic pop
+#endif
+
+ template<typename T>
+ struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
+
+ MatchAllOf<T> operator && ( MatcherBase const& other ) const;
+ MatchAnyOf<T> operator || ( MatcherBase const& other ) const;
+ MatchNotOf<T> operator ! () const;
+ };
+
+ template<typename ArgT>
+ struct MatchAllOf : MatcherBase<ArgT> {
+ bool match( ArgT const& arg ) const override {
+ for( auto matcher : m_matchers ) {
+ if (!matcher->match(arg))
+ return false;
+ }
+ return true;
+ }
+ std::string describe() const override {
+ std::string description;
+ description.reserve( 4 + m_matchers.size()*32 );
+ description += "( ";
+ bool first = true;
+ for( auto matcher : m_matchers ) {
+ if( first )
+ first = false;
+ else
+ description += " and ";
+ description += matcher->toString();
+ }
+ description += " )";
+ return description;
+ }
+
+ MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) {
+ auto copy(*this);
+ copy.m_matchers.push_back( &other );
+ return copy;
+ }
+
+ std::vector<MatcherBase<ArgT> const*> m_matchers;
+ };
+ template<typename ArgT>
+ struct MatchAnyOf : MatcherBase<ArgT> {
+
+ bool match( ArgT const& arg ) const override {
+ for( auto matcher : m_matchers ) {
+ if (matcher->match(arg))
+ return true;
+ }
+ return false;
+ }
+ std::string describe() const override {
+ std::string description;
+ description.reserve( 4 + m_matchers.size()*32 );
+ description += "( ";
+ bool first = true;
+ for( auto matcher : m_matchers ) {
+ if( first )
+ first = false;
+ else
+ description += " or ";
+ description += matcher->toString();
+ }
+ description += " )";
+ return description;
+ }
+
+ MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) {
+ auto copy(*this);
+ copy.m_matchers.push_back( &other );
+ return copy;
+ }
+
+ std::vector<MatcherBase<ArgT> const*> m_matchers;
+ };
+
+ template<typename ArgT>
+ struct MatchNotOf : MatcherBase<ArgT> {
+
+ MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {}
+
+ bool match( ArgT const& arg ) const override {
+ return !m_underlyingMatcher.match( arg );
+ }
+
+ std::string describe() const override {
+ return "not " + m_underlyingMatcher.toString();
+ }
+ MatcherBase<ArgT> const& m_underlyingMatcher;
+ };
+
+ template<typename T>
+ MatchAllOf<T> MatcherBase<T>::operator && ( MatcherBase const& other ) const {
+ return MatchAllOf<T>() && *this && other;
+ }
+ template<typename T>
+ MatchAnyOf<T> MatcherBase<T>::operator || ( MatcherBase const& other ) const {
+ return MatchAnyOf<T>() || *this || other;
+ }
+ template<typename T>
+ MatchNotOf<T> MatcherBase<T>::operator ! () const {
+ return MatchNotOf<T>( *this );
+ }
+
+ } // namespace Impl
+
+} // namespace Matchers
+
+using namespace Matchers;
+using Matchers::Impl::MatcherBase;
+
+} // namespace Catch
+
+// end catch_matchers.h
+// start catch_matchers_exception.hpp
+
+namespace Catch {
+namespace Matchers {
+namespace Exception {
+
+class ExceptionMessageMatcher : public MatcherBase<std::exception> {
+ std::string m_message;
+public:
+
+ ExceptionMessageMatcher(std::string const& message):
+ m_message(message)
+ {}
+
+ bool match(std::exception const& ex) const override;
+
+ std::string describe() const override;
+};
+
+} // namespace Exception
+
+Exception::ExceptionMessageMatcher Message(std::string const& message);
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_exception.hpp
+// start catch_matchers_floating.h
+
+namespace Catch {
+namespace Matchers {
+
+ namespace Floating {
+
+ enum class FloatingPointKind : uint8_t;
+
+ struct WithinAbsMatcher : MatcherBase<double> {
+ WithinAbsMatcher(double target, double margin);
+ bool match(double const& matchee) const override;
+ std::string describe() const override;
+ private:
+ double m_target;
+ double m_margin;
+ };
+
+ struct WithinUlpsMatcher : MatcherBase<double> {
+ WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType);
+ bool match(double const& matchee) const override;
+ std::string describe() const override;
+ private:
+ double m_target;
+ uint64_t m_ulps;
+ FloatingPointKind m_type;
+ };
+
+ // Given IEEE-754 format for floats and doubles, we can assume
+ // that float -> double promotion is lossless. Given this, we can
+ // assume that if we do the standard relative comparison of
+ // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get
+ // the same result if we do this for floats, as if we do this for
+ // doubles that were promoted from floats.
+ struct WithinRelMatcher : MatcherBase<double> {
+ WithinRelMatcher(double target, double epsilon);
+ bool match(double const& matchee) const override;
+ std::string describe() const override;
+ private:
+ double m_target;
+ double m_epsilon;
+ };
+
+ } // namespace Floating
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+ Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff);
+ Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff);
+ Floating::WithinAbsMatcher WithinAbs(double target, double margin);
+ Floating::WithinRelMatcher WithinRel(double target, double eps);
+ // defaults epsilon to 100*numeric_limits<double>::epsilon()
+ Floating::WithinRelMatcher WithinRel(double target);
+ Floating::WithinRelMatcher WithinRel(float target, float eps);
+ // defaults epsilon to 100*numeric_limits<float>::epsilon()
+ Floating::WithinRelMatcher WithinRel(float target);
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_floating.h
+// start catch_matchers_generic.hpp
+
+#include <functional>
+#include <string>
+
+namespace Catch {
+namespace Matchers {
+namespace Generic {
+
+namespace Detail {
+ std::string finalizeDescription(const std::string& desc);
+}
+
+template <typename T>
+class PredicateMatcher : public MatcherBase<T> {
+ std::function<bool(T const&)> m_predicate;
+ std::string m_description;
+public:
+
+ PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr)
+ :m_predicate(std::move(elem)),
+ m_description(Detail::finalizeDescription(descr))
+ {}
+
+ bool match( T const& item ) const override {
+ return m_predicate(item);
+ }
+
+ std::string describe() const override {
+ return m_description;
+ }
+};
+
+} // namespace Generic
+
+ // The following functions create the actual matcher objects.
+ // The user has to explicitly specify type to the function, because
+ // inferring std::function<bool(T const&)> is hard (but possible) and
+ // requires a lot of TMP.
+ template<typename T>
+ Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") {
+ return Generic::PredicateMatcher<T>(predicate, description);
+ }
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_generic.hpp
+// start catch_matchers_string.h
+
+#include <string>
+
+namespace Catch {
+namespace Matchers {
+
+ namespace StdString {
+
+ struct CasedString
+ {
+ CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity );
+ std::string adjustString( std::string const& str ) const;
+ std::string caseSensitivitySuffix() const;
+
+ CaseSensitive::Choice m_caseSensitivity;
+ std::string m_str;
+ };
+
+ struct StringMatcherBase : MatcherBase<std::string> {
+ StringMatcherBase( std::string const& operation, CasedString const& comparator );
+ std::string describe() const override;
+
+ CasedString m_comparator;
+ std::string m_operation;
+ };
+
+ struct EqualsMatcher : StringMatcherBase {
+ EqualsMatcher( CasedString const& comparator );
+ bool match( std::string const& source ) const override;
+ };
+ struct ContainsMatcher : StringMatcherBase {
+ ContainsMatcher( CasedString const& comparator );
+ bool match( std::string const& source ) const override;
+ };
+ struct StartsWithMatcher : StringMatcherBase {
+ StartsWithMatcher( CasedString const& comparator );
+ bool match( std::string const& source ) const override;
+ };
+ struct EndsWithMatcher : StringMatcherBase {
+ EndsWithMatcher( CasedString const& comparator );
+ bool match( std::string const& source ) const override;
+ };
+
+ struct RegexMatcher : MatcherBase<std::string> {
+ RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity );
+ bool match( std::string const& matchee ) const override;
+ std::string describe() const override;
+
+ private:
+ std::string m_regex;
+ CaseSensitive::Choice m_caseSensitivity;
+ };
+
+ } // namespace StdString
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+
+ StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+ StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_string.h
+// start catch_matchers_vector.h
+
+#include <algorithm>
+
+namespace Catch {
+namespace Matchers {
+
+ namespace Vector {
+ template<typename T, typename Alloc>
+ struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
+
+ ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}
+
+ bool match(std::vector<T, Alloc> const &v) const override {
+ for (auto const& el : v) {
+ if (el == m_comparator) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ std::string describe() const override {
+ return "Contains: " + ::Catch::Detail::stringify( m_comparator );
+ }
+
+ T const& m_comparator;
+ };
+
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
+
+ ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}
+
+ bool match(std::vector<T, AllocMatch> const &v) const override {
+ // !TBD: see note in EqualsMatcher
+ if (m_comparator.size() > v.size())
+ return false;
+ for (auto const& comparator : m_comparator) {
+ auto present = false;
+ for (const auto& el : v) {
+ if (el == comparator) {
+ present = true;
+ break;
+ }
+ }
+ if (!present) {
+ return false;
+ }
+ }
+ return true;
+ }
+ std::string describe() const override {
+ return "Contains: " + ::Catch::Detail::stringify( m_comparator );
+ }
+
+ std::vector<T, AllocComp> const& m_comparator;
+ };
+
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
+
+ EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}
+
+ bool match(std::vector<T, AllocMatch> const &v) const override {
+ // !TBD: This currently works if all elements can be compared using !=
+ // - a more general approach would be via a compare template that defaults
+ // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc
+ // - then just call that directly
+ if (m_comparator.size() != v.size())
+ return false;
+ for (std::size_t i = 0; i < v.size(); ++i)
+ if (m_comparator[i] != v[i])
+ return false;
+ return true;
+ }
+ std::string describe() const override {
+ return "Equals: " + ::Catch::Detail::stringify( m_comparator );
+ }
+ std::vector<T, AllocComp> const& m_comparator;
+ };
+
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
+
+ ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {}
+
+ bool match(std::vector<T, AllocMatch> const &v) const override {
+ if (m_comparator.size() != v.size())
+ return false;
+ for (std::size_t i = 0; i < v.size(); ++i)
+ if (m_comparator[i] != approx(v[i]))
+ return false;
+ return true;
+ }
+ std::string describe() const override {
+ return "is approx: " + ::Catch::Detail::stringify( m_comparator );
+ }
+ template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ ApproxMatcher& epsilon( T const& newEpsilon ) {
+ approx.epsilon(newEpsilon);
+ return *this;
+ }
+ template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ ApproxMatcher& margin( T const& newMargin ) {
+ approx.margin(newMargin);
+ return *this;
+ }
+ template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
+ ApproxMatcher& scale( T const& newScale ) {
+ approx.scale(newScale);
+ return *this;
+ }
+
+ std::vector<T, AllocComp> const& m_comparator;
+ mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
+ };
+
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
+ UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {}
+ bool match(std::vector<T, AllocMatch> const& vec) const override {
+ if (m_target.size() != vec.size()) {
+ return false;
+ }
+ return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
+ }
+
+ std::string describe() const override {
+ return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target);
+ }
+ private:
+ std::vector<T, AllocComp> const& m_target;
+ };
+
+ } // namespace Vector
+
+ // The following functions create the actual matcher objects.
+ // This allows the types to be inferred
+
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator );
+ }
+
+ template<typename T, typename Alloc = std::allocator<T>>
+ Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) {
+ return Vector::ContainsElementMatcher<T, Alloc>( comparator );
+ }
+
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator );
+ }
+
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator );
+ }
+
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) {
+ return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target );
+ }
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_vector.h
+namespace Catch {
+
+ template<typename ArgT, typename MatcherT>
+ class MatchExpr : public ITransientExpression {
+ ArgT const& m_arg;
+ MatcherT m_matcher;
+ StringRef m_matcherString;
+ public:
+ MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString )
+ : ITransientExpression{ true, matcher.match( arg ) },
+ m_arg( arg ),
+ m_matcher( matcher ),
+ m_matcherString( matcherString )
+ {}
+
+ void streamReconstructedExpression( std::ostream &os ) const override {
+ auto matcherAsString = m_matcher.toString();
+ os << Catch::Detail::stringify( m_arg ) << ' ';
+ if( matcherAsString == Detail::unprintableString )
+ os << m_matcherString;
+ else
+ os << matcherAsString;
+ }
+ };
+
+ using StringMatcher = Matchers::Impl::MatcherBase<std::string>;
+
+ void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString );
+
+ template<typename ArgT, typename MatcherT>
+ auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) -> MatchExpr<ArgT, MatcherT> {
+ return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString );
+ }
+
+} // namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
+ INTERNAL_CATCH_TRY { \
+ catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \
+ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+///////////////////////////////////////////////////////////////////////////////
+#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \
+ do { \
+ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
+ if( catchAssertionHandler.allowThrows() ) \
+ try { \
+ static_cast<void>(__VA_ARGS__ ); \
+ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
+ } \
+ catch( exceptionType const& ex ) { \
+ catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \
+ } \
+ catch( ... ) { \
+ catchAssertionHandler.handleUnexpectedInflightException(); \
+ } \
+ else \
+ catchAssertionHandler.handleThrowingCallSkipped(); \
+ INTERNAL_CATCH_REACT( catchAssertionHandler ) \
+ } while( false )
+
+// end catch_capture_matchers.h
+#endif
+// start catch_generators.hpp
+
+// start catch_interfaces_generatortracker.h
+
+
+#include <memory>
+
+namespace Catch {
+
+ namespace Generators {
+ class GeneratorUntypedBase {
+ public:
+ GeneratorUntypedBase() = default;
+ virtual ~GeneratorUntypedBase();
+ // Attempts to move the generator to the next element
+ //
+ // Returns true iff the move succeeded (and a valid element
+ // can be retrieved).
+ virtual bool next() = 0;
+ };
+ using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>;
+
+ } // namespace Generators
+
+ struct IGeneratorTracker {
+ virtual ~IGeneratorTracker();
+ virtual auto hasGenerator() const -> bool = 0;
+ virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0;
+ virtual void setGenerator( Generators::GeneratorBasePtr&& generator ) = 0;
+ };
+
+} // namespace Catch
+
+// end catch_interfaces_generatortracker.h
+// start catch_enforce.h
+
+#include <exception>
+
+namespace Catch {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ template <typename Ex>
+ [[noreturn]]
+ void throw_exception(Ex const& e) {
+ throw e;
+ }
+#else // ^^ Exceptions are enabled // Exceptions are disabled vv
+ [[noreturn]]
+ void throw_exception(std::exception const& e);
+#endif
+
+ [[noreturn]]
+ void throw_logic_error(std::string const& msg);
+ [[noreturn]]
+ void throw_domain_error(std::string const& msg);
+ [[noreturn]]
+ void throw_runtime_error(std::string const& msg);
+
+} // namespace Catch;
+
+#define CATCH_MAKE_MSG(...) \
+ (Catch::ReusableStringStream() << __VA_ARGS__).str()
+
+#define CATCH_INTERNAL_ERROR(...) \
+ Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__))
+
+#define CATCH_ERROR(...) \
+ Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
+
+#define CATCH_RUNTIME_ERROR(...) \
+ Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
+
+#define CATCH_ENFORCE( condition, ... ) \
+ do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false)
+
+// end catch_enforce.h
+#include <memory>
+#include <vector>
+#include <cassert>
+
+#include <utility>
+#include <exception>
+
+namespace Catch {
+
+class GeneratorException : public std::exception {
+ const char* const m_msg = "";
+
+public:
+ GeneratorException(const char* msg):
+ m_msg(msg)
+ {}
+
+ const char* what() const noexcept override final;
+};
+
+namespace Generators {
+
+ // !TBD move this into its own location?
+ namespace pf{
+ template<typename T, typename... Args>
+ std::unique_ptr<T> make_unique( Args&&... args ) {
+ return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
+ }
+ }
+
+ template<typename T>
+ struct IGenerator : GeneratorUntypedBase {
+ virtual ~IGenerator() = default;
+
+ // Returns the current element of the generator
+ //
+ // \Precondition The generator is either freshly constructed,
+ // or the last call to `next()` returned true
+ virtual T const& get() const = 0;
+ using type = T;
+ };
+
+ template<typename T>
+ class SingleValueGenerator final : public IGenerator<T> {
+ T m_value;
+ public:
+ SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
+
+ T const& get() const override {
+ return m_value;
+ }
+ bool next() override {
+ return false;
+ }
+ };
+
+ template<typename T>
+ class FixedValuesGenerator final : public IGenerator<T> {
+ static_assert(!std::is_same<T, bool>::value,
+ "FixedValuesGenerator does not support bools because of std::vector<bool>"
+ "specialization, use SingleValue Generator instead.");
+ std::vector<T> m_values;
+ size_t m_idx = 0;
+ public:
+ FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {}
+
+ T const& get() const override {
+ return m_values[m_idx];
+ }
+ bool next() override {
+ ++m_idx;
+ return m_idx < m_values.size();
+ }
+ };
+
+ template <typename T>
+ class GeneratorWrapper final {
+ std::unique_ptr<IGenerator<T>> m_generator;
+ public:
+ GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):
+ m_generator(std::move(generator))
+ {}
+ T const& get() const {
+ return m_generator->get();
+ }
+ bool next() {
+ return m_generator->next();
+ }
+ };
+
+ template <typename T>
+ GeneratorWrapper<T> value(T&& value) {
+ return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));
+ }
+ template <typename T>
+ GeneratorWrapper<T> values(std::initializer_list<T> values) {
+ return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values));
+ }
+
+ template<typename T>
+ class Generators : public IGenerator<T> {
+ std::vector<GeneratorWrapper<T>> m_generators;
+ size_t m_current = 0;
+
+ void populate(GeneratorWrapper<T>&& generator) {
+ m_generators.emplace_back(std::move(generator));
+ }
+ void populate(T&& val) {
+ m_generators.emplace_back(value(std::forward<T>(val)));
+ }
+ template<typename U>
+ void populate(U&& val) {
+ populate(T(std::forward<U>(val)));
+ }
+ template<typename U, typename... Gs>
+ void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
+ populate(std::forward<U>(valueOrGenerator));
+ populate(std::forward<Gs>(moreGenerators)...);
+ }
+
+ public:
+ template <typename... Gs>
+ Generators(Gs &&... moreGenerators) {
+ m_generators.reserve(sizeof...(Gs));
+ populate(std::forward<Gs>(moreGenerators)...);
+ }
+
+ T const& get() const override {
+ return m_generators[m_current].get();
+ }
+
+ bool next() override {
+ if (m_current >= m_generators.size()) {
+ return false;
+ }
+ const bool current_status = m_generators[m_current].next();
+ if (!current_status) {
+ ++m_current;
+ }
+ return m_current < m_generators.size();
+ }
+ };
+
+ template<typename... Ts>
+ GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) {
+ return values<std::tuple<Ts...>>( tuples );
+ }
+
+ // Tag type to signal that a generator sequence should convert arguments to a specific type
+ template <typename T>
+ struct as {};
+
+ template<typename T, typename... Gs>
+ auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> {
+ return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);
+ }
+ template<typename T>
+ auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators<T> {
+ return Generators<T>(std::move(generator));
+ }
+ template<typename T, typename... Gs>
+ auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> {
+ return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... );
+ }
+ template<typename T, typename U, typename... Gs>
+ auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> {
+ return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... );
+ }
+
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&;
+
+ template<typename L>
+ // Note: The type after -> is weird, because VS2015 cannot parse
+ // the expression used in the typedef inside, when it is in
+ // return type. Yeah.
+ auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) {
+ using UnderlyingType = typename decltype(generatorExpression())::type;
+
+ IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo );
+ if (!tracker.hasGenerator()) {
+ tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));
+ }
+
+ auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() );
+ return generator.get();
+ }
+
+} // namespace Generators
+} // namespace Catch
+
+#define GENERATE( ... ) \
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
+#define GENERATE_COPY( ... ) \
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
+#define GENERATE_REF( ... ) \
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
+
+// end catch_generators.hpp
+// start catch_generators_generic.hpp
+
+namespace Catch {
+namespace Generators {
+
+ template <typename T>
+ class TakeGenerator : public IGenerator<T> {
+ GeneratorWrapper<T> m_generator;
+ size_t m_returned = 0;
+ size_t m_target;
+ public:
+ TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
+ m_generator(std::move(generator)),
+ m_target(target)
+ {
+ assert(target != 0 && "Empty generators are not allowed");
+ }
+ T const& get() const override {
+ return m_generator.get();
+ }
+ bool next() override {
+ ++m_returned;
+ if (m_returned >= m_target) {
+ return false;
+ }
+
+ const auto success = m_generator.next();
+ // If the underlying generator does not contain enough values
+ // then we cut short as well
+ if (!success) {
+ m_returned = m_target;
+ }
+ return success;
+ }
+ };
+
+ template <typename T>
+ GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {
+ return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator)));
+ }
+
+ template <typename T, typename Predicate>
+ class FilterGenerator : public IGenerator<T> {
+ GeneratorWrapper<T> m_generator;
+ Predicate m_predicate;
+ public:
+ template <typename P = Predicate>
+ FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
+ m_generator(std::move(generator)),
+ m_predicate(std::forward<P>(pred))
+ {
+ if (!m_predicate(m_generator.get())) {
+ // It might happen that there are no values that pass the
+ // filter. In that case we throw an exception.
+ auto has_initial_value = nextImpl();
+ if (!has_initial_value) {
+ Catch::throw_exception(GeneratorException("No valid value found in filtered generator"));
+ }
+ }
+ }
+
+ T const& get() const override {
+ return m_generator.get();
+ }
+
+ bool next() override {
+ return nextImpl();
+ }
+
+ private:
+ bool nextImpl() {
+ bool success = m_generator.next();
+ if (!success) {
+ return false;
+ }
+ while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true);
+ return success;
+ }
+ };
+
+ template <typename T, typename Predicate>
+ GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {
+ return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator))));
+ }
+
+ template <typename T>
+ class RepeatGenerator : public IGenerator<T> {
+ static_assert(!std::is_same<T, bool>::value,
+ "RepeatGenerator currently does not support bools"
+ "because of std::vector<bool> specialization");
+ GeneratorWrapper<T> m_generator;
+ mutable std::vector<T> m_returned;
+ size_t m_target_repeats;
+ size_t m_current_repeat = 0;
+ size_t m_repeat_index = 0;
+ public:
+ RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
+ m_generator(std::move(generator)),
+ m_target_repeats(repeats)
+ {
+ assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
+ }
+
+ T const& get() const override {
+ if (m_current_repeat == 0) {
+ m_returned.push_back(m_generator.get());
+ return m_returned.back();
+ }
+ return m_returned[m_repeat_index];
+ }
+
+ bool next() override {
+ // There are 2 basic cases:
+ // 1) We are still reading the generator
+ // 2) We are reading our own cache
+
+ // In the first case, we need to poke the underlying generator.
+ // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache
+ if (m_current_repeat == 0) {
+ const auto success = m_generator.next();
+ if (!success) {
+ ++m_current_repeat;
+ }
+ return m_current_repeat < m_target_repeats;
+ }
+
+ // In the second case, we need to move indices forward and check that we haven't run up against the end
+ ++m_repeat_index;
+ if (m_repeat_index == m_returned.size()) {
+ m_repeat_index = 0;
+ ++m_current_repeat;
+ }
+ return m_current_repeat < m_target_repeats;
+ }
+ };
+
+ template <typename T>
+ GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {
+ return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));
+ }
+
+ template <typename T, typename U, typename Func>
+ class MapGenerator : public IGenerator<T> {
+ // TBD: provide static assert for mapping function, for friendly error message
+ GeneratorWrapper<U> m_generator;
+ Func m_function;
+ // To avoid returning dangling reference, we have to save the values
+ T m_cache;
+ public:
+ template <typename F2 = Func>
+ MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
+ m_generator(std::move(generator)),
+ m_function(std::forward<F2>(function)),
+ m_cache(m_function(m_generator.get()))
+ {}
+
+ T const& get() const override {
+ return m_cache;
+ }
+ bool next() override {
+ const auto success = m_generator.next();
+ if (success) {
+ m_cache = m_function(m_generator.get());
+ }
+ return success;
+ }
+ };
+
+ template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>
+ GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
+ return GeneratorWrapper<T>(
+ pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
+ );
+ }
+
+ template <typename T, typename U, typename Func>
+ GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
+ return GeneratorWrapper<T>(
+ pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
+ );
+ }
+
+ template <typename T>
+ class ChunkGenerator final : public IGenerator<std::vector<T>> {
+ std::vector<T> m_chunk;
+ size_t m_chunk_size;
+ GeneratorWrapper<T> m_generator;
+ bool m_used_up = false;
+ public:
+ ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
+ m_chunk_size(size), m_generator(std::move(generator))
+ {
+ m_chunk.reserve(m_chunk_size);
+ if (m_chunk_size != 0) {
+ m_chunk.push_back(m_generator.get());
+ for (size_t i = 1; i < m_chunk_size; ++i) {
+ if (!m_generator.next()) {
+ Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk"));
+ }
+ m_chunk.push_back(m_generator.get());
+ }
+ }
+ }
+ std::vector<T> const& get() const override {
+ return m_chunk;
+ }
+ bool next() override {
+ m_chunk.clear();
+ for (size_t idx = 0; idx < m_chunk_size; ++idx) {
+ if (!m_generator.next()) {
+ return false;
+ }
+ m_chunk.push_back(m_generator.get());
+ }
+ return true;
+ }
+ };
+
+ template <typename T>
+ GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {
+ return GeneratorWrapper<std::vector<T>>(
+ pf::make_unique<ChunkGenerator<T>>(size, std::move(generator))
+ );
+ }
+
+} // namespace Generators
+} // namespace Catch
+
+// end catch_generators_generic.hpp
+// start catch_generators_specific.hpp
+
+// start catch_context.h
+
+#include <memory>
+
+namespace Catch {
+
+ struct IResultCapture;
+ struct IRunner;
+ struct IConfig;
+ struct IMutableContext;
+
+ using IConfigPtr = std::shared_ptr<IConfig const>;
+
+ struct IContext
+ {
+ virtual ~IContext();
+
+ virtual IResultCapture* getResultCapture() = 0;
+ virtual IRunner* getRunner() = 0;
+ virtual IConfigPtr const& getConfig() const = 0;
+ };
+
+ struct IMutableContext : IContext
+ {
+ virtual ~IMutableContext();
+ virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
+ virtual void setRunner( IRunner* runner ) = 0;
+ virtual void setConfig( IConfigPtr const& config ) = 0;
+
+ private:
+ static IMutableContext *currentContext;
+ friend IMutableContext& getCurrentMutableContext();
+ friend void cleanUpContext();
+ static void createContext();
+ };
+
+ inline IMutableContext& getCurrentMutableContext()
+ {
+ if( !IMutableContext::currentContext )
+ IMutableContext::createContext();
+ // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
+ return *IMutableContext::currentContext;
+ }
+
+ inline IContext& getCurrentContext()
+ {
+ return getCurrentMutableContext();
+ }
+
+ void cleanUpContext();
+
+ class SimplePcg32;
+ SimplePcg32& rng();
+}
+
+// end catch_context.h
+// start catch_interfaces_config.h
+
+// start catch_option.hpp
+
+namespace Catch {
+
+ // An optional type
+ template<typename T>
+ class Option {
+ public:
+ Option() : nullableValue( nullptr ) {}
+ Option( T const& _value )
+ : nullableValue( new( storage ) T( _value ) )
+ {}
+ Option( Option const& _other )
+ : nullableValue( _other ? new( storage ) T( *_other ) : nullptr )
+ {}
+
+ ~Option() {
+ reset();
+ }
+
+ Option& operator= ( Option const& _other ) {
+ if( &_other != this ) {
+ reset();
+ if( _other )
+ nullableValue = new( storage ) T( *_other );
+ }
+ return *this;
+ }
+ Option& operator = ( T const& _value ) {
+ reset();
+ nullableValue = new( storage ) T( _value );
+ return *this;
+ }
+
+ void reset() {
+ if( nullableValue )
+ nullableValue->~T();
+ nullableValue = nullptr;
+ }
+
+ T& operator*() { return *nullableValue; }
+ T const& operator*() const { return *nullableValue; }
+ T* operator->() { return nullableValue; }
+ const T* operator->() const { return nullableValue; }
+
+ T valueOr( T const& defaultValue ) const {
+ return nullableValue ? *nullableValue : defaultValue;
+ }
+
+ bool some() const { return nullableValue != nullptr; }
+ bool none() const { return nullableValue == nullptr; }
+
+ bool operator !() const { return nullableValue == nullptr; }
+ explicit operator bool() const {
+ return some();
+ }
+
+ private:
+ T *nullableValue;
+ alignas(alignof(T)) char storage[sizeof(T)];
+ };
+
+} // end namespace Catch
+
+// end catch_option.hpp
+#include <chrono>
+#include <iosfwd>
+#include <string>
+#include <vector>
+#include <memory>
+
+namespace Catch {
+
+ enum class Verbosity {
+ Quiet = 0,
+ Normal,
+ High
+ };
+
+ struct WarnAbout { enum What {
+ Nothing = 0x00,
+ NoAssertions = 0x01,
+ NoTests = 0x02
+ }; };
+
+ struct ShowDurations { enum OrNot {
+ DefaultForReporter,
+ Always,
+ Never
+ }; };
+ struct RunTests { enum InWhatOrder {
+ InDeclarationOrder,
+ InLexicographicalOrder,
+ InRandomOrder
+ }; };
+ struct UseColour { enum YesOrNo {
+ Auto,
+ Yes,
+ No
+ }; };
+ struct WaitForKeypress { enum When {
+ Never,
+ BeforeStart = 1,
+ BeforeExit = 2,
+ BeforeStartAndExit = BeforeStart | BeforeExit
+ }; };
+
+ class TestSpec;
+
+ struct IConfig : NonCopyable {
+
+ virtual ~IConfig();
+
+ virtual bool allowThrows() const = 0;
+ virtual std::ostream& stream() const = 0;
+ virtual std::string name() const = 0;
+ virtual bool includeSuccessfulResults() const = 0;
+ virtual bool shouldDebugBreak() const = 0;
+ virtual bool warnAboutMissingAssertions() const = 0;
+ virtual bool warnAboutNoTests() const = 0;
+ virtual int abortAfter() const = 0;
+ virtual bool showInvisibles() const = 0;
+ virtual ShowDurations::OrNot showDurations() const = 0;
+ virtual double minDuration() const = 0;
+ virtual TestSpec const& testSpec() const = 0;
+ virtual bool hasTestFilters() const = 0;
+ virtual std::vector<std::string> const& getTestsOrTags() const = 0;
+ virtual RunTests::InWhatOrder runOrder() const = 0;
+ virtual unsigned int rngSeed() const = 0;
+ virtual UseColour::YesOrNo useColour() const = 0;
+ virtual std::vector<std::string> const& getSectionsToRun() const = 0;
+ virtual Verbosity verbosity() const = 0;
+
+ virtual bool benchmarkNoAnalysis() const = 0;
+ virtual int benchmarkSamples() const = 0;
+ virtual double benchmarkConfidenceInterval() const = 0;
+ virtual unsigned int benchmarkResamples() const = 0;
+ virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0;
+ };
+
+ using IConfigPtr = std::shared_ptr<IConfig const>;
+}
+
+// end catch_interfaces_config.h
+// start catch_random_number_generator.h
+
+#include <cstdint>
+
+namespace Catch {
+
+ // This is a simple implementation of C++11 Uniform Random Number
+ // Generator. It does not provide all operators, because Catch2
+ // does not use it, but it should behave as expected inside stdlib's
+ // distributions.
+ // The implementation is based on the PCG family (http://pcg-random.org)
+ class SimplePcg32 {
+ using state_type = std::uint64_t;
+ public:
+ using result_type = std::uint32_t;
+ static constexpr result_type (min)() {
+ return 0;
+ }
+ static constexpr result_type (max)() {
+ return static_cast<result_type>(-1);
+ }
+
+ // Provide some default initial state for the default constructor
+ SimplePcg32():SimplePcg32(0xed743cc4U) {}
+
+ explicit SimplePcg32(result_type seed_);
+
+ void seed(result_type seed_);
+ void discard(uint64_t skip);
+
+ result_type operator()();
+
+ private:
+ friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
+ friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
+
+ // In theory we also need operator<< and operator>>
+ // In practice we do not use them, so we will skip them for now
+
+ std::uint64_t m_state;
+ // This part of the state determines which "stream" of the numbers
+ // is chosen -- we take it as a constant for Catch2, so we only
+ // need to deal with seeding the main state.
+ // Picked by reading 8 bytes from `/dev/random` :-)
+ static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;
+ };
+
+} // end namespace Catch
+
+// end catch_random_number_generator.h
+#include <random>
+
+namespace Catch {
+namespace Generators {
+
+template <typename Float>
+class RandomFloatingGenerator final : public IGenerator<Float> {
+ Catch::SimplePcg32& m_rng;
+ std::uniform_real_distribution<Float> m_dist;
+ Float m_current_number;
+public:
+
+ RandomFloatingGenerator(Float a, Float b):
+ m_rng(rng()),
+ m_dist(a, b) {
+ static_cast<void>(next());
+ }
+
+ Float const& get() const override {
+ return m_current_number;
+ }
+ bool next() override {
+ m_current_number = m_dist(m_rng);
+ return true;
+ }
+};
+
+template <typename Integer>
+class RandomIntegerGenerator final : public IGenerator<Integer> {
+ Catch::SimplePcg32& m_rng;
+ std::uniform_int_distribution<Integer> m_dist;
+ Integer m_current_number;
+public:
+
+ RandomIntegerGenerator(Integer a, Integer b):
+ m_rng(rng()),
+ m_dist(a, b) {
+ static_cast<void>(next());
+ }
+
+ Integer const& get() const override {
+ return m_current_number;
+ }
+ bool next() override {
+ m_current_number = m_dist(m_rng);
+ return true;
+ }
+};
+
+// TODO: Ideally this would be also constrained against the various char types,
+// but I don't expect users to run into that in practice.
+template <typename T>
+typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value,
+GeneratorWrapper<T>>::type
+random(T a, T b) {
+ return GeneratorWrapper<T>(
+ pf::make_unique<RandomIntegerGenerator<T>>(a, b)
+ );
+}
+
+template <typename T>
+typename std::enable_if<std::is_floating_point<T>::value,
+GeneratorWrapper<T>>::type
+random(T a, T b) {
+ return GeneratorWrapper<T>(
+ pf::make_unique<RandomFloatingGenerator<T>>(a, b)
+ );
+}
+
+template <typename T>
+class RangeGenerator final : public IGenerator<T> {
+ T m_current;
+ T m_end;
+ T m_step;
+ bool m_positive;
+
+public:
+ RangeGenerator(T const& start, T const& end, T const& step):
+ m_current(start),
+ m_end(end),
+ m_step(step),
+ m_positive(m_step > T(0))
+ {
+ assert(m_current != m_end && "Range start and end cannot be equal");
+ assert(m_step != T(0) && "Step size cannot be zero");
+ assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && "Step moves away from end");
+ }
+
+ RangeGenerator(T const& start, T const& end):
+ RangeGenerator(start, end, (start < end) ? T(1) : T(-1))
+ {}
+
+ T const& get() const override {
+ return m_current;
+ }
+
+ bool next() override {
+ m_current += m_step;
+ return (m_positive) ? (m_current < m_end) : (m_current > m_end);
+ }
+};
+
+template <typename T>
+GeneratorWrapper<T> range(T const& start, T const& end, T const& step) {
+ static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric");
+ return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));
+}
+
+template <typename T>
+GeneratorWrapper<T> range(T const& start, T const& end) {
+ static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer");
+ return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));
+}
+
+template <typename T>
+class IteratorGenerator final : public IGenerator<T> {
+ static_assert(!std::is_same<T, bool>::value,
+ "IteratorGenerator currently does not support bools"
+ "because of std::vector<bool> specialization");
+
+ std::vector<T> m_elems;
+ size_t m_current = 0;
+public:
+ template <typename InputIterator, typename InputSentinel>
+ IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) {
+ if (m_elems.empty()) {
+ Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values"));
+ }
+ }
+
+ T const& get() const override {
+ return m_elems[m_current];
+ }
+
+ bool next() override {
+ ++m_current;
+ return m_current != m_elems.size();
+ }
+};
+
+template <typename InputIterator,
+ typename InputSentinel,
+ typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
+GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
+ return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to));
+}
+
+template <typename Container,
+ typename ResultType = typename Container::value_type>
+GeneratorWrapper<ResultType> from_range(Container const& cnt) {
+ return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));
+}
+
+} // namespace Generators
+} // namespace Catch
+
+// end catch_generators_specific.hpp
+
+// These files are included here so the single_include script doesn't put them
+// in the conditionally compiled sections
+// start catch_test_case_info.h
+
+#include <string>
+#include <vector>
+#include <memory>
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+namespace Catch {
+
+ struct ITestInvoker;
+
+ struct TestCaseInfo {
+ enum SpecialProperties{
+ None = 0,
+ IsHidden = 1 << 1,
+ ShouldFail = 1 << 2,
+ MayFail = 1 << 3,
+ Throws = 1 << 4,
+ NonPortable = 1 << 5,
+ Benchmark = 1 << 6
+ };
+
+ TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::vector<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo );
+
+ friend void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags );
+
+ bool isHidden() const;
+ bool throws() const;
+ bool okToFail() const;
+ bool expectedToFail() const;
+
+ std::string tagsAsString() const;
+
+ std::string name;
+ std::string className;
+ std::string description;
+ std::vector<std::string> tags;
+ std::vector<std::string> lcaseTags;
+ SourceLineInfo lineInfo;
+ SpecialProperties properties;
+ };
+
+ class TestCase : public TestCaseInfo {
+ public:
+
+ TestCase( ITestInvoker* testCase, TestCaseInfo&& info );
+
+ TestCase withName( std::string const& _newName ) const;
+
+ void invoke() const;
+
+ TestCaseInfo const& getTestCaseInfo() const;
+
+ bool operator == ( TestCase const& other ) const;
+ bool operator < ( TestCase const& other ) const;
+
+ private:
+ std::shared_ptr<ITestInvoker> test;
+ };
+
+ TestCase makeTestCase( ITestInvoker* testCase,
+ std::string const& className,
+ NameAndTags const& nameAndTags,
+ SourceLineInfo const& lineInfo );
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// end catch_test_case_info.h
+// start catch_interfaces_runner.h
+
+namespace Catch {
+
+ struct IRunner {
+ virtual ~IRunner();
+ virtual bool aborting() const = 0;
+ };
+}
+
+// end catch_interfaces_runner.h
+
+#ifdef __OBJC__
+// start catch_objc.hpp
+
+#import <objc/runtime.h>
+
+#include <string>
+
+// NB. Any general catch headers included here must be included
+// in catch.hpp first to make sure they are included by the single
+// header for non obj-usage
+
+///////////////////////////////////////////////////////////////////////////////
+// This protocol is really only here for (self) documenting purposes, since
+// all its methods are optional.
+@protocol OcFixture
+
+@optional
+
+-(void) setUp;
+-(void) tearDown;
+
+@end
+
+namespace Catch {
+
+ class OcMethod : public ITestInvoker {
+
+ public:
+ OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}
+
+ virtual void invoke() const {
+ id obj = [[m_cls alloc] init];
+
+ performOptionalSelector( obj, @selector(setUp) );
+ performOptionalSelector( obj, m_sel );
+ performOptionalSelector( obj, @selector(tearDown) );
+
+ arcSafeRelease( obj );
+ }
+ private:
+ virtual ~OcMethod() {}
+
+ Class m_cls;
+ SEL m_sel;
+ };
+
+ namespace Detail{
+
+ inline std::string getAnnotation( Class cls,
+ std::string const& annotationName,
+ std::string const& testCaseName ) {
+ NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
+ SEL sel = NSSelectorFromString( selStr );
+ arcSafeRelease( selStr );
+ id value = performOptionalSelector( cls, sel );
+ if( value )
+ return [(NSString*)value UTF8String];
+ return "";
+ }
+ }
+
+ inline std::size_t registerTestMethods() {
+ std::size_t noTestMethods = 0;
+ int noClasses = objc_getClassList( nullptr, 0 );
+
+ Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);
+ objc_getClassList( classes, noClasses );
+
+ for( int c = 0; c < noClasses; c++ ) {
+ Class cls = classes[c];
+ {
+ u_int count;
+ Method* methods = class_copyMethodList( cls, &count );
+ for( u_int m = 0; m < count ; m++ ) {
+ SEL selector = method_getName(methods[m]);
+ std::string methodName = sel_getName(selector);
+ if( startsWith( methodName, "Catch_TestCase_" ) ) {
+ std::string testCaseName = methodName.substr( 15 );
+ std::string name = Detail::getAnnotation( cls, "Name", testCaseName );
+ std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
+ const char* className = class_getName( cls );
+
+ getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo("",0) ) );
+ noTestMethods++;
+ }
+ }
+ free(methods);
+ }
+ }
+ return noTestMethods;
+ }
+
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+
+ namespace Matchers {
+ namespace Impl {
+ namespace NSStringMatchers {
+
+ struct StringHolder : MatcherBase<NSString*>{
+ StringHolder( NSString* substr ) : m_substr( [substr copy] ){}
+ StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}
+ StringHolder() {
+ arcSafeRelease( m_substr );
+ }
+
+ bool match( NSString* str ) const override {
+ return false;
+ }
+
+ NSString* CATCH_ARC_STRONG m_substr;
+ };
+
+ struct Equals : StringHolder {
+ Equals( NSString* substr ) : StringHolder( substr ){}
+
+ bool match( NSString* str ) const override {
+ return (str != nil || m_substr == nil ) &&
+ [str isEqualToString:m_substr];
+ }
+
+ std::string describe() const override {
+ return "equals string: " + Catch::Detail::stringify( m_substr );
+ }
+ };
+
+ struct Contains : StringHolder {
+ Contains( NSString* substr ) : StringHolder( substr ){}
+
+ bool match( NSString* str ) const override {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location != NSNotFound;
+ }
+
+ std::string describe() const override {
+ return "contains string: " + Catch::Detail::stringify( m_substr );
+ }
+ };
+
+ struct StartsWith : StringHolder {
+ StartsWith( NSString* substr ) : StringHolder( substr ){}
+
+ bool match( NSString* str ) const override {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == 0;
+ }
+
+ std::string describe() const override {
+ return "starts with: " + Catch::Detail::stringify( m_substr );
+ }
+ };
+ struct EndsWith : StringHolder {
+ EndsWith( NSString* substr ) : StringHolder( substr ){}
+
+ bool match( NSString* str ) const override {
+ return (str != nil || m_substr == nil ) &&
+ [str rangeOfString:m_substr].location == [str length] - [m_substr length];
+ }
+
+ std::string describe() const override {
+ return "ends with: " + Catch::Detail::stringify( m_substr );
+ }
+ };
+
+ } // namespace NSStringMatchers
+ } // namespace Impl
+
+ inline Impl::NSStringMatchers::Equals
+ Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }
+
+ inline Impl::NSStringMatchers::Contains
+ Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }
+
+ inline Impl::NSStringMatchers::StartsWith
+ StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }
+
+ inline Impl::NSStringMatchers::EndsWith
+ EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }
+
+ } // namespace Matchers
+
+ using namespace Matchers;
+
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+
+} // namespace Catch
+
+///////////////////////////////////////////////////////////////////////////////
+#define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix
+#define OC_TEST_CASE2( name, desc, uniqueSuffix ) \
++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \
+{ \
+return @ name; \
+} \
++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \
+{ \
+return @ desc; \
+} \
+-(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix )
+
+#define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ )
+
+// end catch_objc.hpp
+#endif
+
+// Benchmarking needs the externally-facing parts of reporters to work
+#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+// start catch_external_interfaces.h
+
+// start catch_reporter_bases.hpp
+
+// start catch_interfaces_reporter.h
+
+// start catch_config.hpp
+
+// start catch_test_spec_parser.h
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// start catch_test_spec.h
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpadded"
+#endif
+
+// start catch_wildcard_pattern.h
+
+namespace Catch
+{
+ class WildcardPattern {
+ enum WildcardPosition {
+ NoWildcard = 0,
+ WildcardAtStart = 1,
+ WildcardAtEnd = 2,
+ WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
+ };
+
+ public:
+
+ WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity );
+ virtual ~WildcardPattern() = default;
+ virtual bool matches( std::string const& str ) const;
+
+ private:
+ std::string normaliseString( std::string const& str ) const;
+ CaseSensitive::Choice m_caseSensitivity;
+ WildcardPosition m_wildcard = NoWildcard;
+ std::string m_pattern;
+ };
+}
+
+// end catch_wildcard_pattern.h
+#include <string>
+#include <vector>
+#include <memory>
+
+namespace Catch {
+
+ struct IConfig;
+
+ class TestSpec {
+ class Pattern {
+ public:
+ explicit Pattern( std::string const& name );
+ virtual ~Pattern();
+ virtual bool matches( TestCaseInfo const& testCase ) const = 0;
+ std::string const& name() const;
+ private:
+ std::string const m_name;
+ };
+ using PatternPtr = std::shared_ptr<Pattern>;
+
+ class NamePattern : public Pattern {
+ public:
+ explicit NamePattern( std::string const& name, std::string const& filterString );
+ bool matches( TestCaseInfo const& testCase ) const override;
+ private:
+ WildcardPattern m_wildcardPattern;
+ };
+
+ class TagPattern : public Pattern {
+ public:
+ explicit TagPattern( std::string const& tag, std::string const& filterString );
+ bool matches( TestCaseInfo const& testCase ) const override;
+ private:
+ std::string m_tag;
+ };
+
+ class ExcludedPattern : public Pattern {
+ public:
+ explicit ExcludedPattern( PatternPtr const& underlyingPattern );
+ bool matches( TestCaseInfo const& testCase ) const override;
+ private:
+ PatternPtr m_underlyingPattern;
+ };
+
+ struct Filter {
+ std::vector<PatternPtr> m_patterns;
+
+ bool matches( TestCaseInfo const& testCase ) const;
+ std::string name() const;
+ };
+
+ public:
+ struct FilterMatch {
+ std::string name;
+ std::vector<TestCase const*> tests;
+ };
+ using Matches = std::vector<FilterMatch>;
+ using vectorStrings = std::vector<std::string>;
+
+ bool hasFilters() const;
+ bool matches( TestCaseInfo const& testCase ) const;
+ Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const;
+ const vectorStrings & getInvalidArgs() const;
+
+ private:
+ std::vector<Filter> m_filters;
+ std::vector<std::string> m_invalidArgs;
+ friend class TestSpecParser;
+ };
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// end catch_test_spec.h
+// start catch_interfaces_tag_alias_registry.h
+
+#include <string>
+
+namespace Catch {
+
+ struct TagAlias;
+
+ struct ITagAliasRegistry {
+ virtual ~ITagAliasRegistry();
+ // Nullptr if not present
+ virtual TagAlias const* find( std::string const& alias ) const = 0;
+ virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;
+
+ static ITagAliasRegistry const& get();
+ };
+
+} // end namespace Catch
+
+// end catch_interfaces_tag_alias_registry.h
+namespace Catch {
+
+ class TestSpecParser {
+ enum Mode{ None, Name, QuotedName, Tag, EscapedName };
+ Mode m_mode = None;
+ Mode lastMode = None;
+ bool m_exclusion = false;
+ std::size_t m_pos = 0;
+ std::size_t m_realPatternPos = 0;
+ std::string m_arg;
+ std::string m_substring;
+ std::string m_patternName;
+ std::vector<std::size_t> m_escapeChars;
+ TestSpec::Filter m_currentFilter;
+ TestSpec m_testSpec;
+ ITagAliasRegistry const* m_tagAliases = nullptr;
+
+ public:
+ TestSpecParser( ITagAliasRegistry const& tagAliases );
+
+ TestSpecParser& parse( std::string const& arg );
+ TestSpec testSpec();
+
+ private:
+ bool visitChar( char c );
+ void startNewMode( Mode mode );
+ bool processNoneChar( char c );
+ void processNameChar( char c );
+ bool processOtherChar( char c );
+ void endMode();
+ void escape();
+ bool isControlChar( char c ) const;
+ void saveLastMode();
+ void revertBackToLastMode();
+ void addFilter();
+ bool separate();
+
+ // Handles common preprocessing of the pattern for name/tag patterns
+ std::string preprocessPattern();
+ // Adds the current pattern as a test name
+ void addNamePattern();
+ // Adds the current pattern as a tag
+ void addTagPattern();
+
+ inline void addCharToPattern(char c) {
+ m_substring += c;
+ m_patternName += c;
+ m_realPatternPos++;
+ }
+
+ };
+ TestSpec parseTestSpec( std::string const& arg );
+
+} // namespace Catch
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// end catch_test_spec_parser.h
+// Libstdc++ doesn't like incomplete classes for unique_ptr
+
+#include <memory>
+#include <vector>
+#include <string>
+
+#ifndef CATCH_CONFIG_CONSOLE_WIDTH
+#define CATCH_CONFIG_CONSOLE_WIDTH 80
+#endif
+
+namespace Catch {
+
+ struct IStream;
+
+ struct ConfigData {
+ bool listTests = false;
+ bool listTags = false;
+ bool listReporters = false;
+ bool listTestNamesOnly = false;
+
+ bool showSuccessfulTests = false;
+ bool shouldDebugBreak = false;
+ bool noThrow = false;
+ bool showHelp = false;
+ bool showInvisibles = false;
+ bool filenamesAsTags = false;
+ bool libIdentify = false;
+
+ int abortAfter = -1;
+ unsigned int rngSeed = 0;
+
+ bool benchmarkNoAnalysis = false;
+ unsigned int benchmarkSamples = 100;
+ double benchmarkConfidenceInterval = 0.95;
+ unsigned int benchmarkResamples = 100000;
+ std::chrono::milliseconds::rep benchmarkWarmupTime = 100;
+
+ Verbosity verbosity = Verbosity::Normal;
+ WarnAbout::What warnings = WarnAbout::Nothing;
+ ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;
+ double minDuration = -1;
+ RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;
+ UseColour::YesOrNo useColour = UseColour::Auto;
+ WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
+
+ std::string outputFilename;
+ std::string name;
+ std::string processName;
+#ifndef CATCH_CONFIG_DEFAULT_REPORTER
+#define CATCH_CONFIG_DEFAULT_REPORTER "console"
+#endif
+ std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER;
+#undef CATCH_CONFIG_DEFAULT_REPORTER
+
+ std::vector<std::string> testsOrTags;
+ std::vector<std::string> sectionsToRun;
+ };
+
+ class Config : public IConfig {
+ public:
+
+ Config() = default;
+ Config( ConfigData const& data );
+ virtual ~Config() = default;
+
+ std::string const& getFilename() const;
+
+ bool listTests() const;
+ bool listTestNamesOnly() const;
+ bool listTags() const;
+ bool listReporters() const;
+
+ std::string getProcessName() const;
+ std::string const& getReporterName() const;
+
+ std::vector<std::string> const& getTestsOrTags() const override;
+ std::vector<std::string> const& getSectionsToRun() const override;
+
+ TestSpec const& testSpec() const override;
+ bool hasTestFilters() const override;
+
+ bool showHelp() const;
+
+ // IConfig interface
+ bool allowThrows() const override;
+ std::ostream& stream() const override;
+ std::string name() const override;
+ bool includeSuccessfulResults() const override;
+ bool warnAboutMissingAssertions() const override;
+ bool warnAboutNoTests() const override;
+ ShowDurations::OrNot showDurations() const override;
+ double minDuration() const override;
+ RunTests::InWhatOrder runOrder() const override;
+ unsigned int rngSeed() const override;
+ UseColour::YesOrNo useColour() const override;
+ bool shouldDebugBreak() const override;
+ int abortAfter() const override;
+ bool showInvisibles() const override;
+ Verbosity verbosity() const override;
+ bool benchmarkNoAnalysis() const override;
+ int benchmarkSamples() const override;
+ double benchmarkConfidenceInterval() const override;
+ unsigned int benchmarkResamples() const override;
+ std::chrono::milliseconds benchmarkWarmupTime() const override;
+
+ private:
+
+ IStream const* openStream();
+ ConfigData m_data;
+
+ std::unique_ptr<IStream const> m_stream;
+ TestSpec m_testSpec;
+ bool m_hasTestFilters = false;
+ };
+
+} // end namespace Catch
+
+// end catch_config.hpp
+// start catch_assertionresult.h
+
+#include <string>
+
+namespace Catch {
+
+ struct AssertionResultData
+ {
+ AssertionResultData() = delete;
+
+ AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression );
+
+ std::string message;
+ mutable std::string reconstructedExpression;
+ LazyExpression lazyExpression;
+ ResultWas::OfType resultType;
+
+ std::string reconstructExpression() const;
+ };
+
+ class AssertionResult {
+ public:
+ AssertionResult() = delete;
+ AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
+
+ bool isOk() const;
+ bool succeeded() const;
+ ResultWas::OfType getResultType() const;
+ bool hasExpression() const;
+ bool hasMessage() const;
+ std::string getExpression() const;
+ std::string getExpressionInMacro() const;
+ bool hasExpandedExpression() const;
+ std::string getExpandedExpression() const;
+ std::string getMessage() const;
+ SourceLineInfo getSourceInfo() const;
+ StringRef getTestMacroName() const;
+
+ //protected:
+ AssertionInfo m_info;
+ AssertionResultData m_resultData;
+ };
+
+} // end namespace Catch
+
+// end catch_assertionresult.h
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+// start catch_estimate.hpp
+
+ // Statistics estimates
+
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Duration>
+ struct Estimate {
+ Duration point;
+ Duration lower_bound;
+ Duration upper_bound;
+ double confidence_interval;
+
+ template <typename Duration2>
+ operator Estimate<Duration2>() const {
+ return { point, lower_bound, upper_bound, confidence_interval };
+ }
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_estimate.hpp
+// start catch_outlier_classification.hpp
+
+// Outlier information
+
+namespace Catch {
+ namespace Benchmark {
+ struct OutlierClassification {
+ int samples_seen = 0;
+ int low_severe = 0; // more than 3 times IQR below Q1
+ int low_mild = 0; // 1.5 to 3 times IQR below Q1
+ int high_mild = 0; // 1.5 to 3 times IQR above Q3
+ int high_severe = 0; // more than 3 times IQR above Q3
+
+ int total() const {
+ return low_severe + low_mild + high_mild + high_severe;
+ }
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_outlier_classification.hpp
+
+#include <iterator>
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+#include <string>
+#include <iosfwd>
+#include <map>
+#include <set>
+#include <memory>
+#include <algorithm>
+
+namespace Catch {
+
+ struct ReporterConfig {
+ explicit ReporterConfig( IConfigPtr const& _fullConfig );
+
+ ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream );
+
+ std::ostream& stream() const;
+ IConfigPtr fullConfig() const;
+
+ private:
+ std::ostream* m_stream;
+ IConfigPtr m_fullConfig;
+ };
+
+ struct ReporterPreferences {
+ bool shouldRedirectStdOut = false;
+ bool shouldReportAllAssertions = false;
+ };
+
+ template<typename T>
+ struct LazyStat : Option<T> {
+ LazyStat& operator=( T const& _value ) {
+ Option<T>::operator=( _value );
+ used = false;
+ return *this;
+ }
+ void reset() {
+ Option<T>::reset();
+ used = false;
+ }
+ bool used = false;
+ };
+
+ struct TestRunInfo {
+ TestRunInfo( std::string const& _name );
+ std::string name;
+ };
+ struct GroupInfo {
+ GroupInfo( std::string const& _name,
+ std::size_t _groupIndex,
+ std::size_t _groupsCount );
+
+ std::string name;
+ std::size_t groupIndex;
+ std::size_t groupsCounts;
+ };
+
+ struct AssertionStats {
+ AssertionStats( AssertionResult const& _assertionResult,
+ std::vector<MessageInfo> const& _infoMessages,
+ Totals const& _totals );
+
+ AssertionStats( AssertionStats const& ) = default;
+ AssertionStats( AssertionStats && ) = default;
+ AssertionStats& operator = ( AssertionStats const& ) = delete;
+ AssertionStats& operator = ( AssertionStats && ) = delete;
+ virtual ~AssertionStats();
+
+ AssertionResult assertionResult;
+ std::vector<MessageInfo> infoMessages;
+ Totals totals;
+ };
+
+ struct SectionStats {
+ SectionStats( SectionInfo const& _sectionInfo,
+ Counts const& _assertions,
+ double _durationInSeconds,
+ bool _missingAssertions );
+ SectionStats( SectionStats const& ) = default;
+ SectionStats( SectionStats && ) = default;
+ SectionStats& operator = ( SectionStats const& ) = default;
+ SectionStats& operator = ( SectionStats && ) = default;
+ virtual ~SectionStats();
+
+ SectionInfo sectionInfo;
+ Counts assertions;
+ double durationInSeconds;
+ bool missingAssertions;
+ };
+
+ struct TestCaseStats {
+ TestCaseStats( TestCaseInfo const& _testInfo,
+ Totals const& _totals,
+ std::string const& _stdOut,
+ std::string const& _stdErr,
+ bool _aborting );
+
+ TestCaseStats( TestCaseStats const& ) = default;
+ TestCaseStats( TestCaseStats && ) = default;
+ TestCaseStats& operator = ( TestCaseStats const& ) = default;
+ TestCaseStats& operator = ( TestCaseStats && ) = default;
+ virtual ~TestCaseStats();
+
+ TestCaseInfo testInfo;
+ Totals totals;
+ std::string stdOut;
+ std::string stdErr;
+ bool aborting;
+ };
+
+ struct TestGroupStats {
+ TestGroupStats( GroupInfo const& _groupInfo,
+ Totals const& _totals,
+ bool _aborting );
+ TestGroupStats( GroupInfo const& _groupInfo );
+
+ TestGroupStats( TestGroupStats const& ) = default;
+ TestGroupStats( TestGroupStats && ) = default;
+ TestGroupStats& operator = ( TestGroupStats const& ) = default;
+ TestGroupStats& operator = ( TestGroupStats && ) = default;
+ virtual ~TestGroupStats();
+
+ GroupInfo groupInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+ struct TestRunStats {
+ TestRunStats( TestRunInfo const& _runInfo,
+ Totals const& _totals,
+ bool _aborting );
+
+ TestRunStats( TestRunStats const& ) = default;
+ TestRunStats( TestRunStats && ) = default;
+ TestRunStats& operator = ( TestRunStats const& ) = default;
+ TestRunStats& operator = ( TestRunStats && ) = default;
+ virtual ~TestRunStats();
+
+ TestRunInfo runInfo;
+ Totals totals;
+ bool aborting;
+ };
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ struct BenchmarkInfo {
+ std::string name;
+ double estimatedDuration;
+ int iterations;
+ int samples;
+ unsigned int resamples;
+ double clockResolution;
+ double clockCost;
+ };
+
+ template <class Duration>
+ struct BenchmarkStats {
+ BenchmarkInfo info;
+
+ std::vector<Duration> samples;
+ Benchmark::Estimate<Duration> mean;
+ Benchmark::Estimate<Duration> standardDeviation;
+ Benchmark::OutlierClassification outliers;
+ double outlierVariance;
+
+ template <typename Duration2>
+ operator BenchmarkStats<Duration2>() const {
+ std::vector<Duration2> samples2;
+ samples2.reserve(samples.size());
+ std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });
+ return {
+ info,
+ std::move(samples2),
+ mean,
+ standardDeviation,
+ outliers,
+ outlierVariance,
+ };
+ }
+ };
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ struct IStreamingReporter {
+ virtual ~IStreamingReporter() = default;
+
+ // Implementing class must also provide the following static methods:
+ // static std::string getDescription();
+ // static std::set<Verbosity> getSupportedVerbosities()
+
+ virtual ReporterPreferences getPreferences() const = 0;
+
+ virtual void noMatchingTestCases( std::string const& spec ) = 0;
+
+ virtual void reportInvalidArguments(std::string const&) {}
+
+ virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
+ virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
+
+ virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
+ virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ virtual void benchmarkPreparing( std::string const& ) {}
+ virtual void benchmarkStarting( BenchmarkInfo const& ) {}
+ virtual void benchmarkEnded( BenchmarkStats<> const& ) {}
+ virtual void benchmarkFailed( std::string const& ) {}
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
+
+ // The return value indicates if the messages buffer should be cleared:
+ virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
+
+ virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
+ virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
+ virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
+ virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
+
+ virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
+
+ // Default empty implementation provided
+ virtual void fatalErrorEncountered( StringRef name );
+
+ virtual bool isMulti() const;
+ };
+ using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;
+
+ struct IReporterFactory {
+ virtual ~IReporterFactory();
+ virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0;
+ virtual std::string getDescription() const = 0;
+ };
+ using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
+
+ struct IReporterRegistry {
+ using FactoryMap = std::map<std::string, IReporterFactoryPtr>;
+ using Listeners = std::vector<IReporterFactoryPtr>;
+
+ virtual ~IReporterRegistry();
+ virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0;
+ virtual FactoryMap const& getFactories() const = 0;
+ virtual Listeners const& getListeners() const = 0;
+ };
+
+} // end namespace Catch
+
+// end catch_interfaces_reporter.h
+#include <algorithm>
+#include <cstring>
+#include <cfloat>
+#include <cstdio>
+#include <cassert>
+#include <memory>
+#include <ostream>
+
+namespace Catch {
+ void prepareExpandedExpression(AssertionResult& result);
+
+ // Returns double formatted as %.3f (format expected on output)
+ std::string getFormattedDuration( double duration );
+
+ //! Should the reporter show
+ bool shouldShowDuration( IConfig const& config, double duration );
+
+ std::string serializeFilters( std::vector<std::string> const& container );
+
+ template<typename DerivedT>
+ struct StreamingReporterBase : IStreamingReporter {
+
+ StreamingReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = false;
+ if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )
+ CATCH_ERROR( "Verbosity level not supported by this reporter" );
+ }
+
+ ReporterPreferences getPreferences() const override {
+ return m_reporterPrefs;
+ }
+
+ static std::set<Verbosity> getSupportedVerbosities() {
+ return { Verbosity::Normal };
+ }
+
+ ~StreamingReporterBase() override = default;
+
+ void noMatchingTestCases(std::string const&) override {}
+
+ void reportInvalidArguments(std::string const&) override {}
+
+ void testRunStarting(TestRunInfo const& _testRunInfo) override {
+ currentTestRunInfo = _testRunInfo;
+ }
+
+ void testGroupStarting(GroupInfo const& _groupInfo) override {
+ currentGroupInfo = _groupInfo;
+ }
+
+ void testCaseStarting(TestCaseInfo const& _testInfo) override {
+ currentTestCaseInfo = _testInfo;
+ }
+ void sectionStarting(SectionInfo const& _sectionInfo) override {
+ m_sectionStack.push_back(_sectionInfo);
+ }
+
+ void sectionEnded(SectionStats const& /* _sectionStats */) override {
+ m_sectionStack.pop_back();
+ }
+ void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {
+ currentTestCaseInfo.reset();
+ }
+ void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {
+ currentGroupInfo.reset();
+ }
+ void testRunEnded(TestRunStats const& /* _testRunStats */) override {
+ currentTestCaseInfo.reset();
+ currentGroupInfo.reset();
+ currentTestRunInfo.reset();
+ }
+
+ void skipTest(TestCaseInfo const&) override {
+ // Don't do anything with this by default.
+ // It can optionally be overridden in the derived class.
+ }
+
+ IConfigPtr m_config;
+ std::ostream& stream;
+
+ LazyStat<TestRunInfo> currentTestRunInfo;
+ LazyStat<GroupInfo> currentGroupInfo;
+ LazyStat<TestCaseInfo> currentTestCaseInfo;
+
+ std::vector<SectionInfo> m_sectionStack;
+ ReporterPreferences m_reporterPrefs;
+ };
+
+ template<typename DerivedT>
+ struct CumulativeReporterBase : IStreamingReporter {
+ template<typename T, typename ChildNodeT>
+ struct Node {
+ explicit Node( T const& _value ) : value( _value ) {}
+ virtual ~Node() {}
+
+ using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>;
+ T value;
+ ChildNodes children;
+ };
+ struct SectionNode {
+ explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}
+ virtual ~SectionNode() = default;
+
+ bool operator == (SectionNode const& other) const {
+ return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
+ }
+ bool operator == (std::shared_ptr<SectionNode> const& other) const {
+ return operator==(*other);
+ }
+
+ SectionStats stats;
+ using ChildSections = std::vector<std::shared_ptr<SectionNode>>;
+ using Assertions = std::vector<AssertionStats>;
+ ChildSections childSections;
+ Assertions assertions;
+ std::string stdOut;
+ std::string stdErr;
+ };
+
+ struct BySectionInfo {
+ BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
+ BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
+ bool operator() (std::shared_ptr<SectionNode> const& node) const {
+ return ((node->stats.sectionInfo.name == m_other.name) &&
+ (node->stats.sectionInfo.lineInfo == m_other.lineInfo));
+ }
+ void operator=(BySectionInfo const&) = delete;
+
+ private:
+ SectionInfo const& m_other;
+ };
+
+ using TestCaseNode = Node<TestCaseStats, SectionNode>;
+ using TestGroupNode = Node<TestGroupStats, TestCaseNode>;
+ using TestRunNode = Node<TestRunStats, TestGroupNode>;
+
+ CumulativeReporterBase( ReporterConfig const& _config )
+ : m_config( _config.fullConfig() ),
+ stream( _config.stream() )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = false;
+ if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )
+ CATCH_ERROR( "Verbosity level not supported by this reporter" );
+ }
+ ~CumulativeReporterBase() override = default;
+
+ ReporterPreferences getPreferences() const override {
+ return m_reporterPrefs;
+ }
+
+ static std::set<Verbosity> getSupportedVerbosities() {
+ return { Verbosity::Normal };
+ }
+
+ void testRunStarting( TestRunInfo const& ) override {}
+ void testGroupStarting( GroupInfo const& ) override {}
+
+ void testCaseStarting( TestCaseInfo const& ) override {}
+
+ void sectionStarting( SectionInfo const& sectionInfo ) override {
+ SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
+ std::shared_ptr<SectionNode> node;
+ if( m_sectionStack.empty() ) {
+ if( !m_rootSection )
+ m_rootSection = std::make_shared<SectionNode>( incompleteStats );
+ node = m_rootSection;
+ }
+ else {
+ SectionNode& parentNode = *m_sectionStack.back();
+ auto it =
+ std::find_if( parentNode.childSections.begin(),
+ parentNode.childSections.end(),
+ BySectionInfo( sectionInfo ) );
+ if( it == parentNode.childSections.end() ) {
+ node = std::make_shared<SectionNode>( incompleteStats );
+ parentNode.childSections.push_back( node );
+ }
+ else
+ node = *it;
+ }
+ m_sectionStack.push_back( node );
+ m_deepestSection = std::move(node);
+ }
+
+ void assertionStarting(AssertionInfo const&) override {}
+
+ bool assertionEnded(AssertionStats const& assertionStats) override {
+ assert(!m_sectionStack.empty());
+ // AssertionResult holds a pointer to a temporary DecomposedExpression,
+ // which getExpandedExpression() calls to build the expression string.
+ // Our section stack copy of the assertionResult will likely outlive the
+ // temporary, so it must be expanded or discarded now to avoid calling
+ // a destroyed object later.
+ prepareExpandedExpression(const_cast<AssertionResult&>( assertionStats.assertionResult ) );
+ SectionNode& sectionNode = *m_sectionStack.back();
+ sectionNode.assertions.push_back(assertionStats);
+ return true;
+ }
+ void sectionEnded(SectionStats const& sectionStats) override {
+ assert(!m_sectionStack.empty());
+ SectionNode& node = *m_sectionStack.back();
+ node.stats = sectionStats;
+ m_sectionStack.pop_back();
+ }
+ void testCaseEnded(TestCaseStats const& testCaseStats) override {
+ auto node = std::make_shared<TestCaseNode>(testCaseStats);
+ assert(m_sectionStack.size() == 0);
+ node->children.push_back(m_rootSection);
+ m_testCases.push_back(node);
+ m_rootSection.reset();
+
+ assert(m_deepestSection);
+ m_deepestSection->stdOut = testCaseStats.stdOut;
+ m_deepestSection->stdErr = testCaseStats.stdErr;
+ }
+ void testGroupEnded(TestGroupStats const& testGroupStats) override {
+ auto node = std::make_shared<TestGroupNode>(testGroupStats);
+ node->children.swap(m_testCases);
+ m_testGroups.push_back(node);
+ }
+ void testRunEnded(TestRunStats const& testRunStats) override {
+ auto node = std::make_shared<TestRunNode>(testRunStats);
+ node->children.swap(m_testGroups);
+ m_testRuns.push_back(node);
+ testRunEndedCumulative();
+ }
+ virtual void testRunEndedCumulative() = 0;
+
+ void skipTest(TestCaseInfo const&) override {}
+
+ IConfigPtr m_config;
+ std::ostream& stream;
+ std::vector<AssertionStats> m_assertions;
+ std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections;
+ std::vector<std::shared_ptr<TestCaseNode>> m_testCases;
+ std::vector<std::shared_ptr<TestGroupNode>> m_testGroups;
+
+ std::vector<std::shared_ptr<TestRunNode>> m_testRuns;
+
+ std::shared_ptr<SectionNode> m_rootSection;
+ std::shared_ptr<SectionNode> m_deepestSection;
+ std::vector<std::shared_ptr<SectionNode>> m_sectionStack;
+ ReporterPreferences m_reporterPrefs;
+ };
+
+ template<char C>
+ char const* getLineOfChars() {
+ static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
+ if( !*line ) {
+ std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );
+ line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;
+ }
+ return line;
+ }
+
+ struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {
+ TestEventListenerBase( ReporterConfig const& _config );
+
+ static std::set<Verbosity> getSupportedVerbosities();
+
+ void assertionStarting(AssertionInfo const&) override;
+ bool assertionEnded(AssertionStats const&) override;
+ };
+
+} // end namespace Catch
+
+// end catch_reporter_bases.hpp
+// start catch_console_colour.h
+
+namespace Catch {
+
+ struct Colour {
+ enum Code {
+ None = 0,
+
+ White,
+ Red,
+ Green,
+ Blue,
+ Cyan,
+ Yellow,
+ Grey,
+
+ Bright = 0x10,
+
+ BrightRed = Bright | Red,
+ BrightGreen = Bright | Green,
+ LightGrey = Bright | Grey,
+ BrightWhite = Bright | White,
+ BrightYellow = Bright | Yellow,
+
+ // By intention
+ FileName = LightGrey,
+ Warning = BrightYellow,
+ ResultError = BrightRed,
+ ResultSuccess = BrightGreen,
+ ResultExpectedFailure = Warning,
+
+ Error = BrightRed,
+ Success = Green,
+
+ OriginalExpression = Cyan,
+ ReconstructedExpression = BrightYellow,
+
+ SecondaryText = LightGrey,
+ Headers = White
+ };
+
+ // Use constructed object for RAII guard
+ Colour( Code _colourCode );
+ Colour( Colour&& other ) noexcept;
+ Colour& operator=( Colour&& other ) noexcept;
+ ~Colour();
+
+ // Use static method for one-shot changes
+ static void use( Code _colourCode );
+
+ private:
+ bool m_moved = false;
+ };
+
+ std::ostream& operator << ( std::ostream& os, Colour const& );
+
+} // end namespace Catch
+
+// end catch_console_colour.h
+// start catch_reporter_registrars.hpp
+
+
+namespace Catch {
+
+ template<typename T>
+ class ReporterRegistrar {
+
+ class ReporterFactory : public IReporterFactory {
+
+ IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+ return std::unique_ptr<T>( new T( config ) );
+ }
+
+ std::string getDescription() const override {
+ return T::getDescription();
+ }
+ };
+
+ public:
+
+ explicit ReporterRegistrar( std::string const& name ) {
+ getMutableRegistryHub().registerReporter( name, std::make_shared<ReporterFactory>() );
+ }
+ };
+
+ template<typename T>
+ class ListenerRegistrar {
+
+ class ListenerFactory : public IReporterFactory {
+
+ IStreamingReporterPtr create( ReporterConfig const& config ) const override {
+ return std::unique_ptr<T>( new T( config ) );
+ }
+ std::string getDescription() const override {
+ return std::string();
+ }
+ };
+
+ public:
+
+ ListenerRegistrar() {
+ getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() );
+ }
+ };
+}
+
+#if !defined(CATCH_CONFIG_DISABLE)
+
+#define CATCH_REGISTER_REPORTER( name, reporterType ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+#define CATCH_REGISTER_LISTENER( listenerType ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+#else // CATCH_CONFIG_DISABLE
+
+#define CATCH_REGISTER_REPORTER(name, reporterType)
+#define CATCH_REGISTER_LISTENER(listenerType)
+
+#endif // CATCH_CONFIG_DISABLE
+
+// end catch_reporter_registrars.hpp
+// Allow users to base their work off existing reporters
+// start catch_reporter_compact.h
+
+namespace Catch {
+
+ struct CompactReporter : StreamingReporterBase<CompactReporter> {
+
+ using StreamingReporterBase::StreamingReporterBase;
+
+ ~CompactReporter() override;
+
+ static std::string getDescription();
+
+ void noMatchingTestCases(std::string const& spec) override;
+
+ void assertionStarting(AssertionInfo const&) override;
+
+ bool assertionEnded(AssertionStats const& _assertionStats) override;
+
+ void sectionEnded(SectionStats const& _sectionStats) override;
+
+ void testRunEnded(TestRunStats const& _testRunStats) override;
+
+ };
+
+} // end namespace Catch
+
+// end catch_reporter_compact.h
+// start catch_reporter_console.h
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch
+ // Note that 4062 (not all labels are handled
+ // and default is missing) is enabled
+#endif
+
+namespace Catch {
+ // Fwd decls
+ struct SummaryColumn;
+ class TablePrinter;
+
+ struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> {
+ std::unique_ptr<TablePrinter> m_tablePrinter;
+
+ ConsoleReporter(ReporterConfig const& config);
+ ~ConsoleReporter() override;
+ static std::string getDescription();
+
+ void noMatchingTestCases(std::string const& spec) override;
+
+ void reportInvalidArguments(std::string const&arg) override;
+
+ void assertionStarting(AssertionInfo const&) override;
+
+ bool assertionEnded(AssertionStats const& _assertionStats) override;
+
+ void sectionStarting(SectionInfo const& _sectionInfo) override;
+ void sectionEnded(SectionStats const& _sectionStats) override;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void benchmarkPreparing(std::string const& name) override;
+ void benchmarkStarting(BenchmarkInfo const& info) override;
+ void benchmarkEnded(BenchmarkStats<> const& stats) override;
+ void benchmarkFailed(std::string const& error) override;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ void testCaseEnded(TestCaseStats const& _testCaseStats) override;
+ void testGroupEnded(TestGroupStats const& _testGroupStats) override;
+ void testRunEnded(TestRunStats const& _testRunStats) override;
+ void testRunStarting(TestRunInfo const& _testRunInfo) override;
+ private:
+
+ void lazyPrint();
+
+ void lazyPrintWithoutClosingBenchmarkTable();
+ void lazyPrintRunInfo();
+ void lazyPrintGroupInfo();
+ void printTestCaseAndSectionHeader();
+
+ void printClosedHeader(std::string const& _name);
+ void printOpenHeader(std::string const& _name);
+
+ // if string has a : in first line will set indent to follow it on
+ // subsequent lines
+ void printHeaderString(std::string const& _string, std::size_t indent = 0);
+
+ void printTotals(Totals const& totals);
+ void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row);
+
+ void printTotalsDivider(Totals const& totals);
+ void printSummaryDivider();
+ void printTestFilters();
+
+ private:
+ bool m_headerPrinted = false;
+ };
+
+} // end namespace Catch
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+// end catch_reporter_console.h
+// start catch_reporter_junit.h
+
+// start catch_xmlwriter.h
+
+#include <vector>
+
+namespace Catch {
+ enum class XmlFormatting {
+ None = 0x00,
+ Indent = 0x01,
+ Newline = 0x02,
+ };
+
+ XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);
+ XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);
+
+ class XmlEncode {
+ public:
+ enum ForWhat { ForTextNodes, ForAttributes };
+
+ XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );
+
+ void encodeTo( std::ostream& os ) const;
+
+ friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );
+
+ private:
+ std::string m_str;
+ ForWhat m_forWhat;
+ };
+
+ class XmlWriter {
+ public:
+
+ class ScopedElement {
+ public:
+ ScopedElement( XmlWriter* writer, XmlFormatting fmt );
+
+ ScopedElement( ScopedElement&& other ) noexcept;
+ ScopedElement& operator=( ScopedElement&& other ) noexcept;
+
+ ~ScopedElement();
+
+ ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent );
+
+ template<typename T>
+ ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
+ m_writer->writeAttribute( name, attribute );
+ return *this;
+ }
+
+ private:
+ mutable XmlWriter* m_writer = nullptr;
+ XmlFormatting m_fmt;
+ };
+
+ XmlWriter( std::ostream& os = Catch::cout() );
+ ~XmlWriter();
+
+ XmlWriter( XmlWriter const& ) = delete;
+ XmlWriter& operator=( XmlWriter const& ) = delete;
+
+ XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
+
+ ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
+
+ XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
+
+ XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );
+
+ XmlWriter& writeAttribute( std::string const& name, bool attribute );
+
+ template<typename T>
+ XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
+ ReusableStringStream rss;
+ rss << attribute;
+ return writeAttribute( name, rss.str() );
+ }
+
+ XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
+
+ XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
+
+ void writeStylesheetRef( std::string const& url );
+
+ XmlWriter& writeBlankLine();
+
+ void ensureTagClosed();
+
+ private:
+
+ void applyFormatting(XmlFormatting fmt);
+
+ void writeDeclaration();
+
+ void newlineIfNecessary();
+
+ bool m_tagIsOpen = false;
+ bool m_needsNewline = false;
+ std::vector<std::string> m_tags;
+ std::string m_indent;
+ std::ostream& m_os;
+ };
+
+}
+
+// end catch_xmlwriter.h
+namespace Catch {
+
+ class JunitReporter : public CumulativeReporterBase<JunitReporter> {
+ public:
+ JunitReporter(ReporterConfig const& _config);
+
+ ~JunitReporter() override;
+
+ static std::string getDescription();
+
+ void noMatchingTestCases(std::string const& /*spec*/) override;
+
+ void testRunStarting(TestRunInfo const& runInfo) override;
+
+ void testGroupStarting(GroupInfo const& groupInfo) override;
+
+ void testCaseStarting(TestCaseInfo const& testCaseInfo) override;
+ bool assertionEnded(AssertionStats const& assertionStats) override;
+
+ void testCaseEnded(TestCaseStats const& testCaseStats) override;
+
+ void testGroupEnded(TestGroupStats const& testGroupStats) override;
+
+ void testRunEndedCumulative() override;
+
+ void writeGroup(TestGroupNode const& groupNode, double suiteTime);
+
+ void writeTestCase(TestCaseNode const& testCaseNode);
+
+ void writeSection( std::string const& className,
+ std::string const& rootName,
+ SectionNode const& sectionNode,
+ bool testOkToFail );
+
+ void writeAssertions(SectionNode const& sectionNode);
+ void writeAssertion(AssertionStats const& stats);
+
+ XmlWriter xml;
+ Timer suiteTimer;
+ std::string stdOutForSuite;
+ std::string stdErrForSuite;
+ unsigned int unexpectedExceptions = 0;
+ bool m_okToFail = false;
+ };
+
+} // end namespace Catch
+
+// end catch_reporter_junit.h
+// start catch_reporter_xml.h
+
+namespace Catch {
+ class XmlReporter : public StreamingReporterBase<XmlReporter> {
+ public:
+ XmlReporter(ReporterConfig const& _config);
+
+ ~XmlReporter() override;
+
+ static std::string getDescription();
+
+ virtual std::string getStylesheetRef() const;
+
+ void writeSourceInfo(SourceLineInfo const& sourceInfo);
+
+ public: // StreamingReporterBase
+
+ void noMatchingTestCases(std::string const& s) override;
+
+ void testRunStarting(TestRunInfo const& testInfo) override;
+
+ void testGroupStarting(GroupInfo const& groupInfo) override;
+
+ void testCaseStarting(TestCaseInfo const& testInfo) override;
+
+ void sectionStarting(SectionInfo const& sectionInfo) override;
+
+ void assertionStarting(AssertionInfo const&) override;
+
+ bool assertionEnded(AssertionStats const& assertionStats) override;
+
+ void sectionEnded(SectionStats const& sectionStats) override;
+
+ void testCaseEnded(TestCaseStats const& testCaseStats) override;
+
+ void testGroupEnded(TestGroupStats const& testGroupStats) override;
+
+ void testRunEnded(TestRunStats const& testRunStats) override;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void benchmarkPreparing(std::string const& name) override;
+ void benchmarkStarting(BenchmarkInfo const&) override;
+ void benchmarkEnded(BenchmarkStats<> const&) override;
+ void benchmarkFailed(std::string const&) override;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ private:
+ Timer m_testCaseTimer;
+ XmlWriter m_xml;
+ int m_sectionDepth = 0;
+ };
+
+} // end namespace Catch
+
+// end catch_reporter_xml.h
+
+// end catch_external_interfaces.h
+#endif
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+// start catch_benchmarking_all.hpp
+
+// A proxy header that includes all of the benchmarking headers to allow
+// concise include of the benchmarking features. You should prefer the
+// individual includes in standard use.
+
+// start catch_benchmark.hpp
+
+ // Benchmark
+
+// start catch_chronometer.hpp
+
+// User-facing chronometer
+
+
+// start catch_clock.hpp
+
+// Clocks
+
+
+#include <chrono>
+#include <ratio>
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Clock>
+ using ClockDuration = typename Clock::duration;
+ template <typename Clock>
+ using FloatDuration = std::chrono::duration<double, typename Clock::period>;
+
+ template <typename Clock>
+ using TimePoint = typename Clock::time_point;
+
+ using default_clock = std::chrono::steady_clock;
+
+ template <typename Clock>
+ struct now {
+ TimePoint<Clock> operator()() const {
+ return Clock::now();
+ }
+ };
+
+ using fp_seconds = std::chrono::duration<double, std::ratio<1>>;
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_clock.hpp
+// start catch_optimizer.hpp
+
+ // Hinting the optimizer
+
+
+#if defined(_MSC_VER)
+# include <atomic> // atomic_thread_fence
+#endif
+
+namespace Catch {
+ namespace Benchmark {
+#if defined(__GNUC__) || defined(__clang__)
+ template <typename T>
+ inline void keep_memory(T* p) {
+ asm volatile("" : : "g"(p) : "memory");
+ }
+ inline void keep_memory() {
+ asm volatile("" : : : "memory");
+ }
+
+ namespace Detail {
+ inline void optimizer_barrier() { keep_memory(); }
+ } // namespace Detail
+#elif defined(_MSC_VER)
+
+#pragma optimize("", off)
+ template <typename T>
+ inline void keep_memory(T* p) {
+ // thanks @milleniumbug
+ *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p);
+ }
+ // TODO equivalent keep_memory()
+#pragma optimize("", on)
+
+ namespace Detail {
+ inline void optimizer_barrier() {
+ std::atomic_thread_fence(std::memory_order_seq_cst);
+ }
+ } // namespace Detail
+
+#endif
+
+ template <typename T>
+ inline void deoptimize_value(T&& x) {
+ keep_memory(&x);
+ }
+
+ template <typename Fn, typename... Args>
+ inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type {
+ deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...)));
+ }
+
+ template <typename Fn, typename... Args>
+ inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type {
+ std::forward<Fn>(fn) (std::forward<Args...>(args...));
+ }
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_optimizer.hpp
+// start catch_complete_invoke.hpp
+
+// Invoke with a special case for void
+
+
+#include <type_traits>
+#include <utility>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename T>
+ struct CompleteType { using type = T; };
+ template <>
+ struct CompleteType<void> { struct type {}; };
+
+ template <typename T>
+ using CompleteType_t = typename CompleteType<T>::type;
+
+ template <typename Result>
+ struct CompleteInvoker {
+ template <typename Fun, typename... Args>
+ static Result invoke(Fun&& fun, Args&&... args) {
+ return std::forward<Fun>(fun)(std::forward<Args>(args)...);
+ }
+ };
+ template <>
+ struct CompleteInvoker<void> {
+ template <typename Fun, typename... Args>
+ static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
+ std::forward<Fun>(fun)(std::forward<Args>(args)...);
+ return {};
+ }
+ };
+
+ // invoke and not return void :(
+ template <typename Fun, typename... Args>
+ CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) {
+ return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
+ }
+
+ const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
+ } // namespace Detail
+
+ template <typename Fun>
+ Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {
+ CATCH_TRY{
+ return Detail::complete_invoke(std::forward<Fun>(fun));
+ } CATCH_CATCH_ALL{
+ getResultCapture().benchmarkFailed(translateActiveException());
+ CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);
+ }
+ }
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_complete_invoke.hpp
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ struct ChronometerConcept {
+ virtual void start() = 0;
+ virtual void finish() = 0;
+ virtual ~ChronometerConcept() = default;
+ };
+ template <typename Clock>
+ struct ChronometerModel final : public ChronometerConcept {
+ void start() override { started = Clock::now(); }
+ void finish() override { finished = Clock::now(); }
+
+ ClockDuration<Clock> elapsed() const { return finished - started; }
+
+ TimePoint<Clock> started;
+ TimePoint<Clock> finished;
+ };
+ } // namespace Detail
+
+ struct Chronometer {
+ public:
+ template <typename Fun>
+ void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); }
+
+ int runs() const { return k; }
+
+ Chronometer(Detail::ChronometerConcept& meter, int k)
+ : impl(&meter)
+ , k(k) {}
+
+ private:
+ template <typename Fun>
+ void measure(Fun&& fun, std::false_type) {
+ measure([&fun](int) { return fun(); }, std::true_type());
+ }
+
+ template <typename Fun>
+ void measure(Fun&& fun, std::true_type) {
+ Detail::optimizer_barrier();
+ impl->start();
+ for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i);
+ impl->finish();
+ Detail::optimizer_barrier();
+ }
+
+ Detail::ChronometerConcept* impl;
+ int k;
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_chronometer.hpp
+// start catch_environment.hpp
+
+// Environment information
+
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Duration>
+ struct EnvironmentEstimate {
+ Duration mean;
+ OutlierClassification outliers;
+
+ template <typename Duration2>
+ operator EnvironmentEstimate<Duration2>() const {
+ return { mean, outliers };
+ }
+ };
+ template <typename Clock>
+ struct Environment {
+ using clock_type = Clock;
+ EnvironmentEstimate<FloatDuration<Clock>> clock_resolution;
+ EnvironmentEstimate<FloatDuration<Clock>> clock_cost;
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_environment.hpp
+// start catch_execution_plan.hpp
+
+ // Execution plan
+
+
+// start catch_benchmark_function.hpp
+
+ // Dumb std::function implementation for consistent call overhead
+
+
+#include <cassert>
+#include <type_traits>
+#include <utility>
+#include <memory>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename T>
+ using Decay = typename std::decay<T>::type;
+ template <typename T, typename U>
+ struct is_related
+ : std::is_same<Decay<T>, Decay<U>> {};
+
+ /// We need to reinvent std::function because every piece of code that might add overhead
+ /// in a measurement context needs to have consistent performance characteristics so that we
+ /// can account for it in the measurement.
+ /// Implementations of std::function with optimizations that aren't always applicable, like
+ /// small buffer optimizations, are not uncommon.
+ /// This is effectively an implementation of std::function without any such optimizations;
+ /// it may be slow, but it is consistently slow.
+ struct BenchmarkFunction {
+ private:
+ struct callable {
+ virtual void call(Chronometer meter) const = 0;
+ virtual callable* clone() const = 0;
+ virtual ~callable() = default;
+ };
+ template <typename Fun>
+ struct model : public callable {
+ model(Fun&& fun) : fun(std::move(fun)) {}
+ model(Fun const& fun) : fun(fun) {}
+
+ model<Fun>* clone() const override { return new model<Fun>(*this); }
+
+ void call(Chronometer meter) const override {
+ call(meter, is_callable<Fun(Chronometer)>());
+ }
+ void call(Chronometer meter, std::true_type) const {
+ fun(meter);
+ }
+ void call(Chronometer meter, std::false_type) const {
+ meter.measure(fun);
+ }
+
+ Fun fun;
+ };
+
+ struct do_nothing { void operator()() const {} };
+
+ template <typename T>
+ BenchmarkFunction(model<T>* c) : f(c) {}
+
+ public:
+ BenchmarkFunction()
+ : f(new model<do_nothing>{ {} }) {}
+
+ template <typename Fun,
+ typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0>
+ BenchmarkFunction(Fun&& fun)
+ : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {}
+
+ BenchmarkFunction(BenchmarkFunction&& that)
+ : f(std::move(that.f)) {}
+
+ BenchmarkFunction(BenchmarkFunction const& that)
+ : f(that.f->clone()) {}
+
+ BenchmarkFunction& operator=(BenchmarkFunction&& that) {
+ f = std::move(that.f);
+ return *this;
+ }
+
+ BenchmarkFunction& operator=(BenchmarkFunction const& that) {
+ f.reset(that.f->clone());
+ return *this;
+ }
+
+ void operator()(Chronometer meter) const { f->call(meter); }
+
+ private:
+ std::unique_ptr<callable> f;
+ };
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_benchmark_function.hpp
+// start catch_repeat.hpp
+
+// repeat algorithm
+
+
+#include <type_traits>
+#include <utility>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename Fun>
+ struct repeater {
+ void operator()(int k) const {
+ for (int i = 0; i < k; ++i) {
+ fun();
+ }
+ }
+ Fun fun;
+ };
+ template <typename Fun>
+ repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
+ return { std::forward<Fun>(fun) };
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_repeat.hpp
+// start catch_run_for_at_least.hpp
+
+// Run a function for a minimum amount of time
+
+
+// start catch_measure.hpp
+
+// Measure
+
+
+// start catch_timing.hpp
+
+// Timing
+
+
+#include <tuple>
+#include <type_traits>
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Duration, typename Result>
+ struct Timing {
+ Duration elapsed;
+ Result result;
+ int iterations;
+ };
+ template <typename Clock, typename Func, typename... Args>
+ using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_timing.hpp
+#include <utility>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename Clock, typename Fun, typename... Args>
+ TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
+ auto start = Clock::now();
+ auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);
+ auto end = Clock::now();
+ auto delta = end - start;
+ return { delta, std::forward<decltype(r)>(r), 1 };
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_measure.hpp
+#include <utility>
+#include <type_traits>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename Clock, typename Fun>
+ TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {
+ return Detail::measure<Clock>(fun, iters);
+ }
+ template <typename Clock, typename Fun>
+ TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {
+ Detail::ChronometerModel<Clock> meter;
+ auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));
+
+ return { meter.elapsed(), std::move(result), iters };
+ }
+
+ template <typename Clock, typename Fun>
+ using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type;
+
+ struct optimized_away_error : std::exception {
+ const char* what() const noexcept override {
+ return "could not measure benchmark, maybe it was optimized away";
+ }
+ };
+
+ template <typename Clock, typename Fun>
+ TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
+ auto iters = seed;
+ while (iters < (1 << 30)) {
+ auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());
+
+ if (Timing.elapsed >= how_long) {
+ return { Timing.elapsed, std::move(Timing.result), iters };
+ }
+ iters *= 2;
+ }
+ Catch::throw_exception(optimized_away_error{});
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_run_for_at_least.hpp
+#include <algorithm>
+#include <iterator>
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Duration>
+ struct ExecutionPlan {
+ int iterations_per_sample;
+ Duration estimated_duration;
+ Detail::BenchmarkFunction benchmark;
+ Duration warmup_time;
+ int warmup_iterations;
+
+ template <typename Duration2>
+ operator ExecutionPlan<Duration2>() const {
+ return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations };
+ }
+
+ template <typename Clock>
+ std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {
+ // warmup a bit
+ Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{}));
+
+ std::vector<FloatDuration<Clock>> times;
+ times.reserve(cfg.benchmarkSamples());
+ std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {
+ Detail::ChronometerModel<Clock> model;
+ this->benchmark(Chronometer(model, iterations_per_sample));
+ auto sample_time = model.elapsed() - env.clock_cost.mean;
+ if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero();
+ return sample_time / iterations_per_sample;
+ });
+ return times;
+ }
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_execution_plan.hpp
+// start catch_estimate_clock.hpp
+
+ // Environment measurement
+
+
+// start catch_stats.hpp
+
+// Statistical analysis tools
+
+
+#include <algorithm>
+#include <functional>
+#include <vector>
+#include <iterator>
+#include <numeric>
+#include <tuple>
+#include <cmath>
+#include <utility>
+#include <cstddef>
+#include <random>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ using sample = std::vector<double>;
+
+ double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last);
+
+ template <typename Iterator>
+ OutlierClassification classify_outliers(Iterator first, Iterator last) {
+ std::vector<double> copy(first, last);
+
+ auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end());
+ auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end());
+ auto iqr = q3 - q1;
+ auto los = q1 - (iqr * 3.);
+ auto lom = q1 - (iqr * 1.5);
+ auto him = q3 + (iqr * 1.5);
+ auto his = q3 + (iqr * 3.);
+
+ OutlierClassification o;
+ for (; first != last; ++first) {
+ auto&& t = *first;
+ if (t < los) ++o.low_severe;
+ else if (t < lom) ++o.low_mild;
+ else if (t > his) ++o.high_severe;
+ else if (t > him) ++o.high_mild;
+ ++o.samples_seen;
+ }
+ return o;
+ }
+
+ template <typename Iterator>
+ double mean(Iterator first, Iterator last) {
+ auto count = last - first;
+ double sum = std::accumulate(first, last, 0.);
+ return sum / count;
+ }
+
+ template <typename URng, typename Iterator, typename Estimator>
+ sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) {
+ auto n = last - first;
+ std::uniform_int_distribution<decltype(n)> dist(0, n - 1);
+
+ sample out;
+ out.reserve(resamples);
+ std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] {
+ std::vector<double> resampled;
+ resampled.reserve(n);
+ std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; });
+ return estimator(resampled.begin(), resampled.end());
+ });
+ std::sort(out.begin(), out.end());
+ return out;
+ }
+
+ template <typename Estimator, typename Iterator>
+ sample jackknife(Estimator&& estimator, Iterator first, Iterator last) {
+ auto n = last - first;
+ auto second = std::next(first);
+ sample results;
+ results.reserve(n);
+
+ for (auto it = first; it != last; ++it) {
+ std::iter_swap(it, first);
+ results.push_back(estimator(second, last));
+ }
+
+ return results;
+ }
+
+ inline double normal_cdf(double x) {
+ return std::erfc(-x / std::sqrt(2.0)) / 2.0;
+ }
+
+ double erfc_inv(double x);
+
+ double normal_quantile(double p);
+
+ template <typename Iterator, typename Estimator>
+ Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) {
+ auto n_samples = last - first;
+
+ double point = estimator(first, last);
+ // Degenerate case with a single sample
+ if (n_samples == 1) return { point, point, point, confidence_level };
+
+ sample jack = jackknife(estimator, first, last);
+ double jack_mean = mean(jack.begin(), jack.end());
+ double sum_squares, sum_cubes;
+ std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> {
+ auto d = jack_mean - x;
+ auto d2 = d * d;
+ auto d3 = d2 * d;
+ return { sqcb.first + d2, sqcb.second + d3 };
+ });
+
+ double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5));
+ int n = static_cast<int>(resample.size());
+ double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n;
+ // degenerate case with uniform samples
+ if (prob_n == 0) return { point, point, point, confidence_level };
+
+ double bias = normal_quantile(prob_n);
+ double z1 = normal_quantile((1. - confidence_level) / 2.);
+
+ auto cumn = [n](double x) -> int {
+ return std::lround(normal_cdf(x) * n); };
+ auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); };
+ double b1 = bias + z1;
+ double b2 = bias - z1;
+ double a1 = a(b1);
+ double a2 = a(b2);
+ auto lo = (std::max)(cumn(a1), 0);
+ auto hi = (std::min)(cumn(a2), n - 1);
+
+ return { point, resample[lo], resample[hi], confidence_level };
+ }
+
+ double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n);
+
+ struct bootstrap_analysis {
+ Estimate<double> mean;
+ Estimate<double> standard_deviation;
+ double outlier_variance;
+ };
+
+ bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last);
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_stats.hpp
+#include <algorithm>
+#include <iterator>
+#include <tuple>
+#include <vector>
+#include <cmath>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename Clock>
+ std::vector<double> resolution(int k) {
+ std::vector<TimePoint<Clock>> times;
+ times.reserve(k + 1);
+ std::generate_n(std::back_inserter(times), k + 1, now<Clock>{});
+
+ std::vector<double> deltas;
+ deltas.reserve(k);
+ std::transform(std::next(times.begin()), times.end(), times.begin(),
+ std::back_inserter(deltas),
+ [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); });
+
+ return deltas;
+ }
+
+ const auto warmup_iterations = 10000;
+ const auto warmup_time = std::chrono::milliseconds(100);
+ const auto minimum_ticks = 1000;
+ const auto warmup_seed = 10000;
+ const auto clock_resolution_estimation_time = std::chrono::milliseconds(500);
+ const auto clock_cost_estimation_time_limit = std::chrono::seconds(1);
+ const auto clock_cost_estimation_tick_limit = 100000;
+ const auto clock_cost_estimation_time = std::chrono::milliseconds(10);
+ const auto clock_cost_estimation_iterations = 10000;
+
+ template <typename Clock>
+ int warmup() {
+ return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>)
+ .iterations;
+ }
+ template <typename Clock>
+ EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) {
+ auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>)
+ .result;
+ return {
+ FloatDuration<Clock>(mean(r.begin(), r.end())),
+ classify_outliers(r.begin(), r.end()),
+ };
+ }
+ template <typename Clock>
+ EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) {
+ auto time_limit = (std::min)(
+ resolution * clock_cost_estimation_tick_limit,
+ FloatDuration<Clock>(clock_cost_estimation_time_limit));
+ auto time_clock = [](int k) {
+ return Detail::measure<Clock>([k] {
+ for (int i = 0; i < k; ++i) {
+ volatile auto ignored = Clock::now();
+ (void)ignored;
+ }
+ }).elapsed;
+ };
+ time_clock(1);
+ int iters = clock_cost_estimation_iterations;
+ auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock);
+ std::vector<double> times;
+ int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));
+ times.reserve(nsamples);
+ std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] {
+ return static_cast<double>((time_clock(r.iterations) / r.iterations).count());
+ });
+ return {
+ FloatDuration<Clock>(mean(times.begin(), times.end())),
+ classify_outliers(times.begin(), times.end()),
+ };
+ }
+
+ template <typename Clock>
+ Environment<FloatDuration<Clock>> measure_environment() {
+ static Environment<FloatDuration<Clock>>* env = nullptr;
+ if (env) {
+ return *env;
+ }
+
+ auto iters = Detail::warmup<Clock>();
+ auto resolution = Detail::estimate_clock_resolution<Clock>(iters);
+ auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean);
+
+ env = new Environment<FloatDuration<Clock>>{ resolution, cost };
+ return *env;
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_estimate_clock.hpp
+// start catch_analyse.hpp
+
+ // Run and analyse one benchmark
+
+
+// start catch_sample_analysis.hpp
+
+// Benchmark results
+
+
+#include <algorithm>
+#include <vector>
+#include <string>
+#include <iterator>
+
+namespace Catch {
+ namespace Benchmark {
+ template <typename Duration>
+ struct SampleAnalysis {
+ std::vector<Duration> samples;
+ Estimate<Duration> mean;
+ Estimate<Duration> standard_deviation;
+ OutlierClassification outliers;
+ double outlier_variance;
+
+ template <typename Duration2>
+ operator SampleAnalysis<Duration2>() const {
+ std::vector<Duration2> samples2;
+ samples2.reserve(samples.size());
+ std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });
+ return {
+ std::move(samples2),
+ mean,
+ standard_deviation,
+ outliers,
+ outlier_variance,
+ };
+ }
+ };
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_sample_analysis.hpp
+#include <algorithm>
+#include <iterator>
+#include <vector>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename Duration, typename Iterator>
+ SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) {
+ if (!cfg.benchmarkNoAnalysis()) {
+ std::vector<double> samples;
+ samples.reserve(last - first);
+ std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); });
+
+ auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end());
+ auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end());
+
+ auto wrap_estimate = [](Estimate<double> e) {
+ return Estimate<Duration> {
+ Duration(e.point),
+ Duration(e.lower_bound),
+ Duration(e.upper_bound),
+ e.confidence_interval,
+ };
+ };
+ std::vector<Duration> samples2;
+ samples2.reserve(samples.size());
+ std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); });
+ return {
+ std::move(samples2),
+ wrap_estimate(analysis.mean),
+ wrap_estimate(analysis.standard_deviation),
+ outliers,
+ analysis.outlier_variance,
+ };
+ } else {
+ std::vector<Duration> samples;
+ samples.reserve(last - first);
+
+ Duration mean = Duration(0);
+ int i = 0;
+ for (auto it = first; it < last; ++it, ++i) {
+ samples.push_back(Duration(*it));
+ mean += Duration(*it);
+ }
+ mean /= i;
+
+ return {
+ std::move(samples),
+ Estimate<Duration>{mean, mean, mean, 0.0},
+ Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0},
+ OutlierClassification{},
+ 0.0
+ };
+ }
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+// end catch_analyse.hpp
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <vector>
+#include <cmath>
+
+namespace Catch {
+ namespace Benchmark {
+ struct Benchmark {
+ Benchmark(std::string &&name)
+ : name(std::move(name)) {}
+
+ template <class FUN>
+ Benchmark(std::string &&name, FUN &&func)
+ : fun(std::move(func)), name(std::move(name)) {}
+
+ template <typename Clock>
+ ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {
+ auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;
+ auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));
+ auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);
+ int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));
+ return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations };
+ }
+
+ template <typename Clock = default_clock>
+ void run() {
+ IConfigPtr cfg = getCurrentContext().getConfig();
+
+ auto env = Detail::measure_environment<Clock>();
+
+ getResultCapture().benchmarkPreparing(name);
+ CATCH_TRY{
+ auto plan = user_code([&] {
+ return prepare<Clock>(*cfg, env);
+ });
+
+ BenchmarkInfo info {
+ name,
+ plan.estimated_duration.count(),
+ plan.iterations_per_sample,
+ cfg->benchmarkSamples(),
+ cfg->benchmarkResamples(),
+ env.clock_resolution.mean.count(),
+ env.clock_cost.mean.count()
+ };
+
+ getResultCapture().benchmarkStarting(info);
+
+ auto samples = user_code([&] {
+ return plan.template run<Clock>(*cfg, env);
+ });
+
+ auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());
+ BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };
+ getResultCapture().benchmarkEnded(stats);
+
+ } CATCH_CATCH_ALL{
+ if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow.
+ std::rethrow_exception(std::current_exception());
+ }
+ }
+
+ // sets lambda to be used in fun *and* executes benchmark!
+ template <typename Fun,
+ typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0>
+ Benchmark & operator=(Fun func) {
+ fun = Detail::BenchmarkFunction(func);
+ run();
+ return *this;
+ }
+
+ explicit operator bool() {
+ return true;
+ }
+
+ private:
+ Detail::BenchmarkFunction fun;
+ std::string name;
+ };
+ }
+} // namespace Catch
+
+#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1
+#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2
+
+#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\
+ if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \
+ BenchmarkName = [&](int benchmarkIndex)
+
+#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\
+ if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \
+ BenchmarkName = [&]
+
+// end catch_benchmark.hpp
+// start catch_constructor.hpp
+
+// Constructor and destructor helpers
+
+
+#include <type_traits>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename T, bool Destruct>
+ struct ObjectStorage
+ {
+ using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
+
+ ObjectStorage() : data() {}
+
+ ObjectStorage(const ObjectStorage& other)
+ {
+ new(&data) T(other.stored_object());
+ }
+
+ ObjectStorage(ObjectStorage&& other)
+ {
+ new(&data) T(std::move(other.stored_object()));
+ }
+
+ ~ObjectStorage() { destruct_on_exit<T>(); }
+
+ template <typename... Args>
+ void construct(Args&&... args)
+ {
+ new (&data) T(std::forward<Args>(args)...);
+ }
+
+ template <bool AllowManualDestruction = !Destruct>
+ typename std::enable_if<AllowManualDestruction>::type destruct()
+ {
+ stored_object().~T();
+ }
+
+ private:
+ // If this is a constructor benchmark, destruct the underlying object
+ template <typename U>
+ void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); }
+ // Otherwise, don't
+ template <typename U>
+ void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { }
+
+ T& stored_object() {
+ return *static_cast<T*>(static_cast<void*>(&data));
+ }
+
+ T const& stored_object() const {
+ return *static_cast<T*>(static_cast<void*>(&data));
+ }
+
+ TStorage data;
+ };
+ }
+
+ template <typename T>
+ using storage_for = Detail::ObjectStorage<T, true>;
+
+ template <typename T>
+ using destructable_object = Detail::ObjectStorage<T, false>;
+ }
+}
+
+// end catch_constructor.hpp
+// end catch_benchmarking_all.hpp
+#endif
+
+#endif // ! CATCH_CONFIG_IMPL_ONLY
+
+#ifdef CATCH_IMPL
+// start catch_impl.hpp
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+#endif
+
+// Keep these here for external reporters
+// start catch_test_case_tracker.h
+
+#include <string>
+#include <vector>
+#include <memory>
+
+namespace Catch {
+namespace TestCaseTracking {
+
+ struct NameAndLocation {
+ std::string name;
+ SourceLineInfo location;
+
+ NameAndLocation( std::string const& _name, SourceLineInfo const& _location );
+ friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {
+ return lhs.name == rhs.name
+ && lhs.location == rhs.location;
+ }
+ };
+
+ class ITracker;
+
+ using ITrackerPtr = std::shared_ptr<ITracker>;
+
+ class ITracker {
+ NameAndLocation m_nameAndLocation;
+
+ public:
+ ITracker(NameAndLocation const& nameAndLoc) :
+ m_nameAndLocation(nameAndLoc)
+ {}
+
+ // static queries
+ NameAndLocation const& nameAndLocation() const {
+ return m_nameAndLocation;
+ }
+
+ virtual ~ITracker();
+
+ // dynamic queries
+ virtual bool isComplete() const = 0; // Successfully completed or failed
+ virtual bool isSuccessfullyCompleted() const = 0;
+ virtual bool isOpen() const = 0; // Started but not complete
+ virtual bool hasChildren() const = 0;
+ virtual bool hasStarted() const = 0;
+
+ virtual ITracker& parent() = 0;
+
+ // actions
+ virtual void close() = 0; // Successfully complete
+ virtual void fail() = 0;
+ virtual void markAsNeedingAnotherRun() = 0;
+
+ virtual void addChild( ITrackerPtr const& child ) = 0;
+ virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0;
+ virtual void openChild() = 0;
+
+ // Debug/ checking
+ virtual bool isSectionTracker() const = 0;
+ virtual bool isGeneratorTracker() const = 0;
+ };
+
+ class TrackerContext {
+
+ enum RunState {
+ NotStarted,
+ Executing,
+ CompletedCycle
+ };
+
+ ITrackerPtr m_rootTracker;
+ ITracker* m_currentTracker = nullptr;
+ RunState m_runState = NotStarted;
+
+ public:
+
+ ITracker& startRun();
+ void endRun();
+
+ void startCycle();
+ void completeCycle();
+
+ bool completedCycle() const;
+ ITracker& currentTracker();
+ void setCurrentTracker( ITracker* tracker );
+ };
+
+ class TrackerBase : public ITracker {
+ protected:
+ enum CycleState {
+ NotStarted,
+ Executing,
+ ExecutingChildren,
+ NeedsAnotherRun,
+ CompletedSuccessfully,
+ Failed
+ };
+
+ using Children = std::vector<ITrackerPtr>;
+ TrackerContext& m_ctx;
+ ITracker* m_parent;
+ Children m_children;
+ CycleState m_runState = NotStarted;
+
+ public:
+ TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
+
+ bool isComplete() const override;
+ bool isSuccessfullyCompleted() const override;
+ bool isOpen() const override;
+ bool hasChildren() const override;
+ bool hasStarted() const override {
+ return m_runState != NotStarted;
+ }
+
+ void addChild( ITrackerPtr const& child ) override;
+
+ ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override;
+ ITracker& parent() override;
+
+ void openChild() override;
+
+ bool isSectionTracker() const override;
+ bool isGeneratorTracker() const override;
+
+ void open();
+
+ void close() override;
+ void fail() override;
+ void markAsNeedingAnotherRun() override;
+
+ private:
+ void moveToParent();
+ void moveToThis();
+ };
+
+ class SectionTracker : public TrackerBase {
+ std::vector<std::string> m_filters;
+ std::string m_trimmed_name;
+ public:
+ SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
+
+ bool isSectionTracker() const override;
+
+ bool isComplete() const override;
+
+ static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation );
+
+ void tryOpen();
+
+ void addInitialFilters( std::vector<std::string> const& filters );
+ void addNextFilters( std::vector<std::string> const& filters );
+ //! Returns filters active in this tracker
+ std::vector<std::string> const& getFilters() const;
+ //! Returns whitespace-trimmed name of the tracked section
+ std::string const& trimmedName() const;
+ };
+
+} // namespace TestCaseTracking
+
+using TestCaseTracking::ITracker;
+using TestCaseTracking::TrackerContext;
+using TestCaseTracking::SectionTracker;
+
+} // namespace Catch
+
+// end catch_test_case_tracker.h
+
+// start catch_leak_detector.h
+
+namespace Catch {
+
+ struct LeakDetector {
+ LeakDetector();
+ ~LeakDetector();
+ };
+
+}
+// end catch_leak_detector.h
+// Cpp files will be included in the single-header file here
+// start catch_stats.cpp
+
+// Statistical analysis tools
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+
+#include <cassert>
+#include <random>
+
+#if defined(CATCH_CONFIG_USE_ASYNC)
+#include <future>
+#endif
+
+namespace {
+ double erf_inv(double x) {
+ // Code accompanying the article "Approximating the erfinv function" in GPU Computing Gems, Volume 2
+ double w, p;
+
+ w = -log((1.0 - x) * (1.0 + x));
+
+ if (w < 6.250000) {
+ w = w - 3.125000;
+ p = -3.6444120640178196996e-21;
+ p = -1.685059138182016589e-19 + p * w;
+ p = 1.2858480715256400167e-18 + p * w;
+ p = 1.115787767802518096e-17 + p * w;
+ p = -1.333171662854620906e-16 + p * w;
+ p = 2.0972767875968561637e-17 + p * w;
+ p = 6.6376381343583238325e-15 + p * w;
+ p = -4.0545662729752068639e-14 + p * w;
+ p = -8.1519341976054721522e-14 + p * w;
+ p = 2.6335093153082322977e-12 + p * w;
+ p = -1.2975133253453532498e-11 + p * w;
+ p = -5.4154120542946279317e-11 + p * w;
+ p = 1.051212273321532285e-09 + p * w;
+ p = -4.1126339803469836976e-09 + p * w;
+ p = -2.9070369957882005086e-08 + p * w;
+ p = 4.2347877827932403518e-07 + p * w;
+ p = -1.3654692000834678645e-06 + p * w;
+ p = -1.3882523362786468719e-05 + p * w;
+ p = 0.0001867342080340571352 + p * w;
+ p = -0.00074070253416626697512 + p * w;
+ p = -0.0060336708714301490533 + p * w;
+ p = 0.24015818242558961693 + p * w;
+ p = 1.6536545626831027356 + p * w;
+ } else if (w < 16.000000) {
+ w = sqrt(w) - 3.250000;
+ p = 2.2137376921775787049e-09;
+ p = 9.0756561938885390979e-08 + p * w;
+ p = -2.7517406297064545428e-07 + p * w;
+ p = 1.8239629214389227755e-08 + p * w;
+ p = 1.5027403968909827627e-06 + p * w;
+ p = -4.013867526981545969e-06 + p * w;
+ p = 2.9234449089955446044e-06 + p * w;
+ p = 1.2475304481671778723e-05 + p * w;
+ p = -4.7318229009055733981e-05 + p * w;
+ p = 6.8284851459573175448e-05 + p * w;
+ p = 2.4031110387097893999e-05 + p * w;
+ p = -0.0003550375203628474796 + p * w;
+ p = 0.00095328937973738049703 + p * w;
+ p = -0.0016882755560235047313 + p * w;
+ p = 0.0024914420961078508066 + p * w;
+ p = -0.0037512085075692412107 + p * w;
+ p = 0.005370914553590063617 + p * w;
+ p = 1.0052589676941592334 + p * w;
+ p = 3.0838856104922207635 + p * w;
+ } else {
+ w = sqrt(w) - 5.000000;
+ p = -2.7109920616438573243e-11;
+ p = -2.5556418169965252055e-10 + p * w;
+ p = 1.5076572693500548083e-09 + p * w;
+ p = -3.7894654401267369937e-09 + p * w;
+ p = 7.6157012080783393804e-09 + p * w;
+ p = -1.4960026627149240478e-08 + p * w;
+ p = 2.9147953450901080826e-08 + p * w;
+ p = -6.7711997758452339498e-08 + p * w;
+ p = 2.2900482228026654717e-07 + p * w;
+ p = -9.9298272942317002539e-07 + p * w;
+ p = 4.5260625972231537039e-06 + p * w;
+ p = -1.9681778105531670567e-05 + p * w;
+ p = 7.5995277030017761139e-05 + p * w;
+ p = -0.00021503011930044477347 + p * w;
+ p = -0.00013871931833623122026 + p * w;
+ p = 1.0103004648645343977 + p * w;
+ p = 4.8499064014085844221 + p * w;
+ }
+ return p * x;
+ }
+
+ double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) {
+ auto m = Catch::Benchmark::Detail::mean(first, last);
+ double variance = std::accumulate(first, last, 0., [m](double a, double b) {
+ double diff = b - m;
+ return a + diff * diff;
+ }) / (last - first);
+ return std::sqrt(variance);
+ }
+
+}
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+
+ double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) {
+ auto count = last - first;
+ double idx = (count - 1) * k / static_cast<double>(q);
+ int j = static_cast<int>(idx);
+ double g = idx - j;
+ std::nth_element(first, first + j, last);
+ auto xj = first[j];
+ if (g == 0) return xj;
+
+ auto xj1 = *std::min_element(first + (j + 1), last);
+ return xj + g * (xj1 - xj);
+ }
+
+ double erfc_inv(double x) {
+ return erf_inv(1.0 - x);
+ }
+
+ double normal_quantile(double p) {
+ static const double ROOT_TWO = std::sqrt(2.0);
+
+ double result = 0.0;
+ assert(p >= 0 && p <= 1);
+ if (p < 0 || p > 1) {
+ return result;
+ }
+
+ result = -erfc_inv(2.0 * p);
+ // result *= normal distribution standard deviation (1.0) * sqrt(2)
+ result *= /*sd * */ ROOT_TWO;
+ // result += normal disttribution mean (0)
+ return result;
+ }
+
+ double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) {
+ double sb = stddev.point;
+ double mn = mean.point / n;
+ double mg_min = mn / 2.;
+ double sg = (std::min)(mg_min / 4., sb / std::sqrt(n));
+ double sg2 = sg * sg;
+ double sb2 = sb * sb;
+
+ auto c_max = [n, mn, sb2, sg2](double x) -> double {
+ double k = mn - x;
+ double d = k * k;
+ double nd = n * d;
+ double k0 = -n * nd;
+ double k1 = sb2 - n * sg2 + nd;
+ double det = k1 * k1 - 4 * sg2 * k0;
+ return (int)(-2. * k0 / (k1 + std::sqrt(det)));
+ };
+
+ auto var_out = [n, sb2, sg2](double c) {
+ double nc = n - c;
+ return (nc / n) * (sb2 - nc * sg2);
+ };
+
+ return (std::min)(var_out(1), var_out((std::min)(c_max(0.), c_max(mg_min)))) / sb2;
+ }
+
+ bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) {
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
+ static std::random_device entropy;
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+
+ auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++
+
+ auto mean = &Detail::mean<std::vector<double>::iterator>;
+ auto stddev = &standard_deviation;
+
+#if defined(CATCH_CONFIG_USE_ASYNC)
+ auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
+ auto seed = entropy();
+ return std::async(std::launch::async, [=] {
+ std::mt19937 rng(seed);
+ auto resampled = resample(rng, n_resamples, first, last, f);
+ return bootstrap(confidence_level, first, last, resampled, f);
+ });
+ };
+
+ auto mean_future = Estimate(mean);
+ auto stddev_future = Estimate(stddev);
+
+ auto mean_estimate = mean_future.get();
+ auto stddev_estimate = stddev_future.get();
+#else
+ auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
+ auto seed = entropy();
+ std::mt19937 rng(seed);
+ auto resampled = resample(rng, n_resamples, first, last, f);
+ return bootstrap(confidence_level, first, last, resampled, f);
+ };
+
+ auto mean_estimate = Estimate(mean);
+ auto stddev_estimate = Estimate(stddev);
+#endif // CATCH_USE_ASYNC
+
+ double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n);
+
+ return { mean_estimate, stddev_estimate, outlier_variance };
+ }
+ } // namespace Detail
+ } // namespace Benchmark
+} // namespace Catch
+
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+// end catch_stats.cpp
+// start catch_approx.cpp
+
+#include <cmath>
+#include <limits>
+
+namespace {
+
+// Performs equivalent check of std::fabs(lhs - rhs) <= margin
+// But without the subtraction to allow for INFINITY in comparison
+bool marginComparison(double lhs, double rhs, double margin) {
+ return (lhs + margin >= rhs) && (rhs + margin >= lhs);
+}
+
+}
+
+namespace Catch {
+namespace Detail {
+
+ Approx::Approx ( double value )
+ : m_epsilon( std::numeric_limits<float>::epsilon()*100 ),
+ m_margin( 0.0 ),
+ m_scale( 0.0 ),
+ m_value( value )
+ {}
+
+ Approx Approx::custom() {
+ return Approx( 0 );
+ }
+
+ Approx Approx::operator-() const {
+ auto temp(*this);
+ temp.m_value = -temp.m_value;
+ return temp;
+ }
+
+ std::string Approx::toString() const {
+ ReusableStringStream rss;
+ rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )";
+ return rss.str();
+ }
+
+ bool Approx::equalityComparisonImpl(const double other) const {
+ // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value
+ // Thanks to Richard Harris for his help refining the scaled margin value
+ return marginComparison(m_value, other, m_margin)
+ || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value)));
+ }
+
+ void Approx::setMargin(double newMargin) {
+ CATCH_ENFORCE(newMargin >= 0,
+ "Invalid Approx::margin: " << newMargin << '.'
+ << " Approx::Margin has to be non-negative.");
+ m_margin = newMargin;
+ }
+
+ void Approx::setEpsilon(double newEpsilon) {
+ CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,
+ "Invalid Approx::epsilon: " << newEpsilon << '.'
+ << " Approx::epsilon has to be in [0, 1]");
+ m_epsilon = newEpsilon;
+ }
+
+} // end namespace Detail
+
+namespace literals {
+ Detail::Approx operator "" _a(long double val) {
+ return Detail::Approx(val);
+ }
+ Detail::Approx operator "" _a(unsigned long long val) {
+ return Detail::Approx(val);
+ }
+} // end namespace literals
+
+std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
+ return value.toString();
+}
+
+} // end namespace Catch
+// end catch_approx.cpp
+// start catch_assertionhandler.cpp
+
+// start catch_debugger.h
+
+namespace Catch {
+ bool isDebuggerActive();
+}
+
+#ifdef CATCH_PLATFORM_MAC
+
+ #if defined(__i386__) || defined(__x86_64__)
+ #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */
+ #elif defined(__aarch64__)
+ #define CATCH_TRAP() __asm__(".inst 0xd4200000")
+ #endif
+
+#elif defined(CATCH_PLATFORM_IPHONE)
+
+ // use inline assembler
+ #if defined(__i386__) || defined(__x86_64__)
+ #define CATCH_TRAP() __asm__("int $3")
+ #elif defined(__aarch64__)
+ #define CATCH_TRAP() __asm__(".inst 0xd4200000")
+ #elif defined(__arm__) && !defined(__thumb__)
+ #define CATCH_TRAP() __asm__(".inst 0xe7f001f0")
+ #elif defined(__arm__) && defined(__thumb__)
+ #define CATCH_TRAP() __asm__(".inst 0xde01")
+ #endif
+
+#elif defined(CATCH_PLATFORM_LINUX)
+ // If we can use inline assembler, do it because this allows us to break
+ // directly at the location of the failing check instead of breaking inside
+ // raise() called from it, i.e. one stack frame below.
+ #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
+ #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */
+ #else // Fall back to the generic way.
+ #include <signal.h>
+
+ #define CATCH_TRAP() raise(SIGTRAP)
+ #endif
+#elif defined(_MSC_VER)
+ #define CATCH_TRAP() __debugbreak()
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+ #define CATCH_TRAP() DebugBreak()
+#endif
+
+#ifndef CATCH_BREAK_INTO_DEBUGGER
+ #ifdef CATCH_TRAP
+ #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()
+ #else
+ #define CATCH_BREAK_INTO_DEBUGGER() []{}()
+ #endif
+#endif
+
+// end catch_debugger.h
+// start catch_run_context.h
+
+// start catch_fatal_condition.h
+
+#include <cassert>
+
+namespace Catch {
+
+ // Wrapper for platform-specific fatal error (signals/SEH) handlers
+ //
+ // Tries to be cooperative with other handlers, and not step over
+ // other handlers. This means that unknown structured exceptions
+ // are passed on, previous signal handlers are called, and so on.
+ //
+ // Can only be instantiated once, and assumes that once a signal
+ // is caught, the binary will end up terminating. Thus, there
+ class FatalConditionHandler {
+ bool m_started = false;
+
+ // Install/disengage implementation for specific platform.
+ // Should be if-defed to work on current platform, can assume
+ // engage-disengage 1:1 pairing.
+ void engage_platform();
+ void disengage_platform();
+ public:
+ // Should also have platform-specific implementations as needed
+ FatalConditionHandler();
+ ~FatalConditionHandler();
+
+ void engage() {
+ assert(!m_started && "Handler cannot be installed twice.");
+ m_started = true;
+ engage_platform();
+ }
+
+ void disengage() {
+ assert(m_started && "Handler cannot be uninstalled without being installed first");
+ m_started = false;
+ disengage_platform();
+ }
+ };
+
+ //! Simple RAII guard for (dis)engaging the FatalConditionHandler
+ class FatalConditionHandlerGuard {
+ FatalConditionHandler* m_handler;
+ public:
+ FatalConditionHandlerGuard(FatalConditionHandler* handler):
+ m_handler(handler) {
+ m_handler->engage();
+ }
+ ~FatalConditionHandlerGuard() {
+ m_handler->disengage();
+ }
+ };
+
+} // end namespace Catch
+
+// end catch_fatal_condition.h
+#include <string>
+
+namespace Catch {
+
+ struct IMutableContext;
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class RunContext : public IResultCapture, public IRunner {
+
+ public:
+ RunContext( RunContext const& ) = delete;
+ RunContext& operator =( RunContext const& ) = delete;
+
+ explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter );
+
+ ~RunContext() override;
+
+ void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount );
+ void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount );
+
+ Totals runTest(TestCase const& testCase);
+
+ IConfigPtr config() const;
+ IStreamingReporter& reporter() const;
+
+ public: // IResultCapture
+
+ // Assertion handlers
+ void handleExpr
+ ( AssertionInfo const& info,
+ ITransientExpression const& expr,
+ AssertionReaction& reaction ) override;
+ void handleMessage
+ ( AssertionInfo const& info,
+ ResultWas::OfType resultType,
+ StringRef const& message,
+ AssertionReaction& reaction ) override;
+ void handleUnexpectedExceptionNotThrown
+ ( AssertionInfo const& info,
+ AssertionReaction& reaction ) override;
+ void handleUnexpectedInflightException
+ ( AssertionInfo const& info,
+ std::string const& message,
+ AssertionReaction& reaction ) override;
+ void handleIncomplete
+ ( AssertionInfo const& info ) override;
+ void handleNonExpr
+ ( AssertionInfo const &info,
+ ResultWas::OfType resultType,
+ AssertionReaction &reaction ) override;
+
+ bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override;
+
+ void sectionEnded( SectionEndInfo const& endInfo ) override;
+ void sectionEndedEarly( SectionEndInfo const& endInfo ) override;
+
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override;
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void benchmarkPreparing( std::string const& name ) override;
+ void benchmarkStarting( BenchmarkInfo const& info ) override;
+ void benchmarkEnded( BenchmarkStats<> const& stats ) override;
+ void benchmarkFailed( std::string const& error ) override;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ void pushScopedMessage( MessageInfo const& message ) override;
+ void popScopedMessage( MessageInfo const& message ) override;
+
+ void emplaceUnscopedMessage( MessageBuilder const& builder ) override;
+
+ std::string getCurrentTestName() const override;
+
+ const AssertionResult* getLastResult() const override;
+
+ void exceptionEarlyReported() override;
+
+ void handleFatalErrorCondition( StringRef message ) override;
+
+ bool lastAssertionPassed() override;
+
+ void assertionPassed() override;
+
+ public:
+ // !TBD We need to do this another way!
+ bool aborting() const final;
+
+ private:
+
+ void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr );
+ void invokeActiveTestCase();
+
+ void resetAssertionInfo();
+ bool testForMissingAssertions( Counts& assertions );
+
+ void assertionEnded( AssertionResult const& result );
+ void reportExpr
+ ( AssertionInfo const &info,
+ ResultWas::OfType resultType,
+ ITransientExpression const *expr,
+ bool negated );
+
+ void populateReaction( AssertionReaction& reaction );
+
+ private:
+
+ void handleUnfinishedSections();
+
+ TestRunInfo m_runInfo;
+ IMutableContext& m_context;
+ TestCase const* m_activeTestCase = nullptr;
+ ITracker* m_testCaseTracker = nullptr;
+ Option<AssertionResult> m_lastResult;
+
+ IConfigPtr m_config;
+ Totals m_totals;
+ IStreamingReporterPtr m_reporter;
+ std::vector<MessageInfo> m_messages;
+ std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */
+ AssertionInfo m_lastAssertionInfo;
+ std::vector<SectionEndInfo> m_unfinishedSections;
+ std::vector<ITracker*> m_activeSections;
+ TrackerContext m_trackerContext;
+ FatalConditionHandler m_fatalConditionhandler;
+ bool m_lastAssertionPassed = false;
+ bool m_shouldReportUnexpected = true;
+ bool m_includeSuccessfulResults;
+ };
+
+ void seedRng(IConfig const& config);
+ unsigned int rngSeed();
+} // end namespace Catch
+
+// end catch_run_context.h
+namespace Catch {
+
+ namespace {
+ auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& {
+ expr.streamReconstructedExpression( os );
+ return os;
+ }
+ }
+
+ LazyExpression::LazyExpression( bool isNegated )
+ : m_isNegated( isNegated )
+ {}
+
+ LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {}
+
+ LazyExpression::operator bool() const {
+ return m_transientExpression != nullptr;
+ }
+
+ auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& {
+ if( lazyExpr.m_isNegated )
+ os << "!";
+
+ if( lazyExpr ) {
+ if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() )
+ os << "(" << *lazyExpr.m_transientExpression << ")";
+ else
+ os << *lazyExpr.m_transientExpression;
+ }
+ else {
+ os << "{** error - unchecked empty expression requested **}";
+ }
+ return os;
+ }
+
+ AssertionHandler::AssertionHandler
+ ( StringRef const& macroName,
+ SourceLineInfo const& lineInfo,
+ StringRef capturedExpression,
+ ResultDisposition::Flags resultDisposition )
+ : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },
+ m_resultCapture( getResultCapture() )
+ {}
+
+ void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
+ m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
+ }
+ void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {
+ m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
+ }
+
+ auto AssertionHandler::allowThrows() const -> bool {
+ return getCurrentContext().getConfig()->allowThrows();
+ }
+
+ void AssertionHandler::complete() {
+ setCompleted();
+ if( m_reaction.shouldDebugBreak ) {
+
+ // If you find your debugger stopping you here then go one level up on the
+ // call-stack for the code that caused it (typically a failed assertion)
+
+ // (To go back to the test and change execution, jump over the throw, next)
+ CATCH_BREAK_INTO_DEBUGGER();
+ }
+ if (m_reaction.shouldThrow) {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ throw Catch::TestFailureException();
+#else
+ CATCH_ERROR( "Test failure requires aborting test!" );
+#endif
+ }
+ }
+ void AssertionHandler::setCompleted() {
+ m_completed = true;
+ }
+
+ void AssertionHandler::handleUnexpectedInflightException() {
+ m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );
+ }
+
+ void AssertionHandler::handleExceptionThrownAsExpected() {
+ m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
+ }
+ void AssertionHandler::handleExceptionNotThrownAsExpected() {
+ m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
+ }
+
+ void AssertionHandler::handleUnexpectedExceptionNotThrown() {
+ m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );
+ }
+
+ void AssertionHandler::handleThrowingCallSkipped() {
+ m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
+ }
+
+ // This is the overload that takes a string and infers the Equals matcher from it
+ // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp
+ void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ) {
+ handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );
+ }
+
+} // namespace Catch
+// end catch_assertionhandler.cpp
+// start catch_assertionresult.cpp
+
+namespace Catch {
+ AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):
+ lazyExpression(_lazyExpression),
+ resultType(_resultType) {}
+
+ std::string AssertionResultData::reconstructExpression() const {
+
+ if( reconstructedExpression.empty() ) {
+ if( lazyExpression ) {
+ ReusableStringStream rss;
+ rss << lazyExpression;
+ reconstructedExpression = rss.str();
+ }
+ }
+ return reconstructedExpression;
+ }
+
+ AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
+ : m_info( info ),
+ m_resultData( data )
+ {}
+
+ // Result was a success
+ bool AssertionResult::succeeded() const {
+ return Catch::isOk( m_resultData.resultType );
+ }
+
+ // Result was a success, or failure is suppressed
+ bool AssertionResult::isOk() const {
+ return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );
+ }
+
+ ResultWas::OfType AssertionResult::getResultType() const {
+ return m_resultData.resultType;
+ }
+
+ bool AssertionResult::hasExpression() const {
+ return !m_info.capturedExpression.empty();
+ }
+
+ bool AssertionResult::hasMessage() const {
+ return !m_resultData.message.empty();
+ }
+
+ std::string AssertionResult::getExpression() const {
+ // Possibly overallocating by 3 characters should be basically free
+ std::string expr; expr.reserve(m_info.capturedExpression.size() + 3);
+ if (isFalseTest(m_info.resultDisposition)) {
+ expr += "!(";
+ }
+ expr += m_info.capturedExpression;
+ if (isFalseTest(m_info.resultDisposition)) {
+ expr += ')';
+ }
+ return expr;
+ }
+
+ std::string AssertionResult::getExpressionInMacro() const {
+ std::string expr;
+ if( m_info.macroName.empty() )
+ expr = static_cast<std::string>(m_info.capturedExpression);
+ else {
+ expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 );
+ expr += m_info.macroName;
+ expr += "( ";
+ expr += m_info.capturedExpression;
+ expr += " )";
+ }
+ return expr;
+ }
+
+ bool AssertionResult::hasExpandedExpression() const {
+ return hasExpression() && getExpandedExpression() != getExpression();
+ }
+
+ std::string AssertionResult::getExpandedExpression() const {
+ std::string expr = m_resultData.reconstructExpression();
+ return expr.empty()
+ ? getExpression()
+ : expr;
+ }
+
+ std::string AssertionResult::getMessage() const {
+ return m_resultData.message;
+ }
+ SourceLineInfo AssertionResult::getSourceInfo() const {
+ return m_info.lineInfo;
+ }
+
+ StringRef AssertionResult::getTestMacroName() const {
+ return m_info.macroName;
+ }
+
+} // end namespace Catch
+// end catch_assertionresult.cpp
+// start catch_capture_matchers.cpp
+
+namespace Catch {
+
+ using StringMatcher = Matchers::Impl::MatcherBase<std::string>;
+
+ // This is the general overload that takes a any string matcher
+ // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers
+ // the Equals matcher (so the header does not mention matchers)
+ void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ) {
+ std::string exceptionMessage = Catch::translateActiveException();
+ MatchExpr<std::string, StringMatcher const&> expr( exceptionMessage, matcher, matcherString );
+ handler.handleExpr( expr );
+ }
+
+} // namespace Catch
+// end catch_capture_matchers.cpp
+// start catch_commandline.cpp
+
+// start catch_commandline.h
+
+// start catch_clara.h
+
+// Use Catch's value for console width (store Clara's off to the side, if present)
+#ifdef CLARA_CONFIG_CONSOLE_WIDTH
+#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
+#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
+#endif
+#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1
+
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wweak-vtables"
+#pragma clang diagnostic ignored "-Wexit-time-destructors"
+#pragma clang diagnostic ignored "-Wshadow"
+#endif
+
+// start clara.hpp
+// Copyright 2017 Two Blue Cubes Ltd. All rights reserved.
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See https://github.com/philsquared/Clara for more details
+
+// Clara v1.1.5
+
+
+#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH
+#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80
+#endif
+
+#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
+#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+
+#ifndef CLARA_CONFIG_OPTIONAL_TYPE
+#ifdef __has_include
+#if __has_include(<optional>) && __cplusplus >= 201703L
+#include <optional>
+#define CLARA_CONFIG_OPTIONAL_TYPE std::optional
+#endif
+#endif
+#endif
+
+// ----------- #included from clara_textflow.hpp -----------
+
+// TextFlowCpp
+//
+// A single-header library for wrapping and laying out basic text, by Phil Nash
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// This project is hosted at https://github.com/philsquared/textflowcpp
+
+
+#include <cassert>
+#include <ostream>
+#include <sstream>
+#include <vector>
+
+#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
+#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80
+#endif
+
+namespace Catch {
+namespace clara {
+namespace TextFlow {
+
+inline auto isWhitespace(char c) -> bool {
+ static std::string chars = " \t\n\r";
+ return chars.find(c) != std::string::npos;
+}
+inline auto isBreakableBefore(char c) -> bool {
+ static std::string chars = "[({<|";
+ return chars.find(c) != std::string::npos;
+}
+inline auto isBreakableAfter(char c) -> bool {
+ static std::string chars = "])}>.,:;*+-=&/\\";
+ return chars.find(c) != std::string::npos;
+}
+
+class Columns;
+
+class Column {
+ std::vector<std::string> m_strings;
+ size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
+ size_t m_indent = 0;
+ size_t m_initialIndent = std::string::npos;
+
+public:
+ class iterator {
+ friend Column;
+
+ Column const& m_column;
+ size_t m_stringIndex = 0;
+ size_t m_pos = 0;
+
+ size_t m_len = 0;
+ size_t m_end = 0;
+ bool m_suffix = false;
+
+ iterator(Column const& column, size_t stringIndex)
+ : m_column(column),
+ m_stringIndex(stringIndex) {}
+
+ auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }
+
+ auto isBoundary(size_t at) const -> bool {
+ assert(at > 0);
+ assert(at <= line().size());
+
+ return at == line().size() ||
+ (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||
+ isBreakableBefore(line()[at]) ||
+ isBreakableAfter(line()[at - 1]);
+ }
+
+ void calcLength() {
+ assert(m_stringIndex < m_column.m_strings.size());
+
+ m_suffix = false;
+ auto width = m_column.m_width - indent();
+ m_end = m_pos;
+ if (line()[m_pos] == '\n') {
+ ++m_end;
+ }
+ while (m_end < line().size() && line()[m_end] != '\n')
+ ++m_end;
+
+ if (m_end < m_pos + width) {
+ m_len = m_end - m_pos;
+ } else {
+ size_t len = width;
+ while (len > 0 && !isBoundary(m_pos + len))
+ --len;
+ while (len > 0 && isWhitespace(line()[m_pos + len - 1]))
+ --len;
+
+ if (len > 0) {
+ m_len = len;
+ } else {
+ m_suffix = true;
+ m_len = width - 1;
+ }
+ }
+ }
+
+ auto indent() const -> size_t {
+ auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos;
+ return initial == std::string::npos ? m_column.m_indent : initial;
+ }
+
+ auto addIndentAndSuffix(std::string const &plain) const -> std::string {
+ return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain);
+ }
+
+ public:
+ using difference_type = std::ptrdiff_t;
+ using value_type = std::string;
+ using pointer = value_type * ;
+ using reference = value_type & ;
+ using iterator_category = std::forward_iterator_tag;
+
+ explicit iterator(Column const& column) : m_column(column) {
+ assert(m_column.m_width > m_column.m_indent);
+ assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent);
+ calcLength();
+ if (m_len == 0)
+ m_stringIndex++; // Empty string
+ }
+
+ auto operator *() const -> std::string {
+ assert(m_stringIndex < m_column.m_strings.size());
+ assert(m_pos <= m_end);
+ return addIndentAndSuffix(line().substr(m_pos, m_len));
+ }
+
+ auto operator ++() -> iterator& {
+ m_pos += m_len;
+ if (m_pos < line().size() && line()[m_pos] == '\n')
+ m_pos += 1;
+ else
+ while (m_pos < line().size() && isWhitespace(line()[m_pos]))
+ ++m_pos;
+
+ if (m_pos == line().size()) {
+ m_pos = 0;
+ ++m_stringIndex;
+ }
+ if (m_stringIndex < m_column.m_strings.size())
+ calcLength();
+ return *this;
+ }
+ auto operator ++(int) -> iterator {
+ iterator prev(*this);
+ operator++();
+ return prev;
+ }
+
+ auto operator ==(iterator const& other) const -> bool {
+ return
+ m_pos == other.m_pos &&
+ m_stringIndex == other.m_stringIndex &&
+ &m_column == &other.m_column;
+ }
+ auto operator !=(iterator const& other) const -> bool {
+ return !operator==(other);
+ }
+ };
+ using const_iterator = iterator;
+
+ explicit Column(std::string const& text) { m_strings.push_back(text); }
+
+ auto width(size_t newWidth) -> Column& {
+ assert(newWidth > 0);
+ m_width = newWidth;
+ return *this;
+ }
+ auto indent(size_t newIndent) -> Column& {
+ m_indent = newIndent;
+ return *this;
+ }
+ auto initialIndent(size_t newIndent) -> Column& {
+ m_initialIndent = newIndent;
+ return *this;
+ }
+
+ auto width() const -> size_t { return m_width; }
+ auto begin() const -> iterator { return iterator(*this); }
+ auto end() const -> iterator { return { *this, m_strings.size() }; }
+
+ inline friend std::ostream& operator << (std::ostream& os, Column const& col) {
+ bool first = true;
+ for (auto line : col) {
+ if (first)
+ first = false;
+ else
+ os << "\n";
+ os << line;
+ }
+ return os;
+ }
+
+ auto operator + (Column const& other)->Columns;
+
+ auto toString() const -> std::string {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+};
+
+class Spacer : public Column {
+
+public:
+ explicit Spacer(size_t spaceWidth) : Column("") {
+ width(spaceWidth);
+ }
+};
+
+class Columns {
+ std::vector<Column> m_columns;
+
+public:
+
+ class iterator {
+ friend Columns;
+ struct EndTag {};
+
+ std::vector<Column> const& m_columns;
+ std::vector<Column::iterator> m_iterators;
+ size_t m_activeIterators;
+
+ iterator(Columns const& columns, EndTag)
+ : m_columns(columns.m_columns),
+ m_activeIterators(0) {
+ m_iterators.reserve(m_columns.size());
+
+ for (auto const& col : m_columns)
+ m_iterators.push_back(col.end());
+ }
+
+ public:
+ using difference_type = std::ptrdiff_t;
+ using value_type = std::string;
+ using pointer = value_type * ;
+ using reference = value_type & ;
+ using iterator_category = std::forward_iterator_tag;
+
+ explicit iterator(Columns const& columns)
+ : m_columns(columns.m_columns),
+ m_activeIterators(m_columns.size()) {
+ m_iterators.reserve(m_columns.size());
+
+ for (auto const& col : m_columns)
+ m_iterators.push_back(col.begin());
+ }
+
+ auto operator ==(iterator const& other) const -> bool {
+ return m_iterators == other.m_iterators;
+ }
+ auto operator !=(iterator const& other) const -> bool {
+ return m_iterators != other.m_iterators;
+ }
+ auto operator *() const -> std::string {
+ std::string row, padding;
+
+ for (size_t i = 0; i < m_columns.size(); ++i) {
+ auto width = m_columns[i].width();
+ if (m_iterators[i] != m_columns[i].end()) {
+ std::string col = *m_iterators[i];
+ row += padding + col;
+ if (col.size() < width)
+ padding = std::string(width - col.size(), ' ');
+ else
+ padding = "";
+ } else {
+ padding += std::string(width, ' ');
+ }
+ }
+ return row;
+ }
+ auto operator ++() -> iterator& {
+ for (size_t i = 0; i < m_columns.size(); ++i) {
+ if (m_iterators[i] != m_columns[i].end())
+ ++m_iterators[i];
+ }
+ return *this;
+ }
+ auto operator ++(int) -> iterator {
+ iterator prev(*this);
+ operator++();
+ return prev;
+ }
+ };
+ using const_iterator = iterator;
+
+ auto begin() const -> iterator { return iterator(*this); }
+ auto end() const -> iterator { return { *this, iterator::EndTag() }; }
+
+ auto operator += (Column const& col) -> Columns& {
+ m_columns.push_back(col);
+ return *this;
+ }
+ auto operator + (Column const& col) -> Columns {
+ Columns combined = *this;
+ combined += col;
+ return combined;
+ }
+
+ inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) {
+
+ bool first = true;
+ for (auto line : cols) {
+ if (first)
+ first = false;
+ else
+ os << "\n";
+ os << line;
+ }
+ return os;
+ }
+
+ auto toString() const -> std::string {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
+};
+
+inline auto Column::operator + (Column const& other) -> Columns {
+ Columns cols;
+ cols += *this;
+ cols += other;
+ return cols;
+}
+}
+
+}
+}
+
+// ----------- end of #include from clara_textflow.hpp -----------
+// ........... back in clara.hpp
+
+#include <cctype>
+#include <string>
+#include <memory>
+#include <set>
+#include <algorithm>
+
+#if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) )
+#define CATCH_PLATFORM_WINDOWS
+#endif
+
+namespace Catch { namespace clara {
+namespace detail {
+
+ // Traits for extracting arg and return type of lambdas (for single argument lambdas)
+ template<typename L>
+ struct UnaryLambdaTraits : UnaryLambdaTraits<decltype( &L::operator() )> {};
+
+ template<typename ClassT, typename ReturnT, typename... Args>
+ struct UnaryLambdaTraits<ReturnT( ClassT::* )( Args... ) const> {
+ static const bool isValid = false;
+ };
+
+ template<typename ClassT, typename ReturnT, typename ArgT>
+ struct UnaryLambdaTraits<ReturnT( ClassT::* )( ArgT ) const> {
+ static const bool isValid = true;
+ using ArgType = typename std::remove_const<typename std::remove_reference<ArgT>::type>::type;
+ using ReturnType = ReturnT;
+ };
+
+ class TokenStream;
+
+ // Transport for raw args (copied from main args, or supplied via init list for testing)
+ class Args {
+ friend TokenStream;
+ std::string m_exeName;
+ std::vector<std::string> m_args;
+
+ public:
+ Args( int argc, char const* const* argv )
+ : m_exeName(argv[0]),
+ m_args(argv + 1, argv + argc) {}
+
+ Args( std::initializer_list<std::string> args )
+ : m_exeName( *args.begin() ),
+ m_args( args.begin()+1, args.end() )
+ {}
+
+ auto exeName() const -> std::string {
+ return m_exeName;
+ }
+ };
+
+ // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string
+ // may encode an option + its argument if the : or = form is used
+ enum class TokenType {
+ Option, Argument
+ };
+ struct Token {
+ TokenType type;
+ std::string token;
+ };
+
+ inline auto isOptPrefix( char c ) -> bool {
+ return c == '-'
+#ifdef CATCH_PLATFORM_WINDOWS
+ || c == '/'
+#endif
+ ;
+ }
+
+ // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled
+ class TokenStream {
+ using Iterator = std::vector<std::string>::const_iterator;
+ Iterator it;
+ Iterator itEnd;
+ std::vector<Token> m_tokenBuffer;
+
+ void loadBuffer() {
+ m_tokenBuffer.resize( 0 );
+
+ // Skip any empty strings
+ while( it != itEnd && it->empty() )
+ ++it;
+
+ if( it != itEnd ) {
+ auto const &next = *it;
+ if( isOptPrefix( next[0] ) ) {
+ auto delimiterPos = next.find_first_of( " :=" );
+ if( delimiterPos != std::string::npos ) {
+ m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } );
+ m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } );
+ } else {
+ if( next[1] != '-' && next.size() > 2 ) {
+ std::string opt = "- ";
+ for( size_t i = 1; i < next.size(); ++i ) {
+ opt[1] = next[i];
+ m_tokenBuffer.push_back( { TokenType::Option, opt } );
+ }
+ } else {
+ m_tokenBuffer.push_back( { TokenType::Option, next } );
+ }
+ }
+ } else {
+ m_tokenBuffer.push_back( { TokenType::Argument, next } );
+ }
+ }
+ }
+
+ public:
+ explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {}
+
+ TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) {
+ loadBuffer();
+ }
+
+ explicit operator bool() const {
+ return !m_tokenBuffer.empty() || it != itEnd;
+ }
+
+ auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); }
+
+ auto operator*() const -> Token {
+ assert( !m_tokenBuffer.empty() );
+ return m_tokenBuffer.front();
+ }
+
+ auto operator->() const -> Token const * {
+ assert( !m_tokenBuffer.empty() );
+ return &m_tokenBuffer.front();
+ }
+
+ auto operator++() -> TokenStream & {
+ if( m_tokenBuffer.size() >= 2 ) {
+ m_tokenBuffer.erase( m_tokenBuffer.begin() );
+ } else {
+ if( it != itEnd )
+ ++it;
+ loadBuffer();
+ }
+ return *this;
+ }
+ };
+
+ class ResultBase {
+ public:
+ enum Type {
+ Ok, LogicError, RuntimeError
+ };
+
+ protected:
+ ResultBase( Type type ) : m_type( type ) {}
+ virtual ~ResultBase() = default;
+
+ virtual void enforceOk() const = 0;
+
+ Type m_type;
+ };
+
+ template<typename T>
+ class ResultValueBase : public ResultBase {
+ public:
+ auto value() const -> T const & {
+ enforceOk();
+ return m_value;
+ }
+
+ protected:
+ ResultValueBase( Type type ) : ResultBase( type ) {}
+
+ ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) {
+ if( m_type == ResultBase::Ok )
+ new( &m_value ) T( other.m_value );
+ }
+
+ ResultValueBase( Type, T const &value ) : ResultBase( Ok ) {
+ new( &m_value ) T( value );
+ }
+
+ auto operator=( ResultValueBase const &other ) -> ResultValueBase & {
+ if( m_type == ResultBase::Ok )
+ m_value.~T();
+ ResultBase::operator=(other);
+ if( m_type == ResultBase::Ok )
+ new( &m_value ) T( other.m_value );
+ return *this;
+ }
+
+ ~ResultValueBase() override {
+ if( m_type == Ok )
+ m_value.~T();
+ }
+
+ union {
+ T m_value;
+ };
+ };
+
+ template<>
+ class ResultValueBase<void> : public ResultBase {
+ protected:
+ using ResultBase::ResultBase;
+ };
+
+ template<typename T = void>
+ class BasicResult : public ResultValueBase<T> {
+ public:
+ template<typename U>
+ explicit BasicResult( BasicResult<U> const &other )
+ : ResultValueBase<T>( other.type() ),
+ m_errorMessage( other.errorMessage() )
+ {
+ assert( type() != ResultBase::Ok );
+ }
+
+ template<typename U>
+ static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; }
+ static auto ok() -> BasicResult { return { ResultBase::Ok }; }
+ static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; }
+ static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; }
+
+ explicit operator bool() const { return m_type == ResultBase::Ok; }
+ auto type() const -> ResultBase::Type { return m_type; }
+ auto errorMessage() const -> std::string { return m_errorMessage; }
+
+ protected:
+ void enforceOk() const override {
+
+ // Errors shouldn't reach this point, but if they do
+ // the actual error message will be in m_errorMessage
+ assert( m_type != ResultBase::LogicError );
+ assert( m_type != ResultBase::RuntimeError );
+ if( m_type != ResultBase::Ok )
+ std::abort();
+ }
+
+ std::string m_errorMessage; // Only populated if resultType is an error
+
+ BasicResult( ResultBase::Type type, std::string const &message )
+ : ResultValueBase<T>(type),
+ m_errorMessage(message)
+ {
+ assert( m_type != ResultBase::Ok );
+ }
+
+ using ResultValueBase<T>::ResultValueBase;
+ using ResultBase::m_type;
+ };
+
+ enum class ParseResultType {
+ Matched, NoMatch, ShortCircuitAll, ShortCircuitSame
+ };
+
+ class ParseState {
+ public:
+
+ ParseState( ParseResultType type, TokenStream const &remainingTokens )
+ : m_type(type),
+ m_remainingTokens( remainingTokens )
+ {}
+
+ auto type() const -> ParseResultType { return m_type; }
+ auto remainingTokens() const -> TokenStream { return m_remainingTokens; }
+
+ private:
+ ParseResultType m_type;
+ TokenStream m_remainingTokens;
+ };
+
+ using Result = BasicResult<void>;
+ using ParserResult = BasicResult<ParseResultType>;
+ using InternalParseResult = BasicResult<ParseState>;
+
+ struct HelpColumns {
+ std::string left;
+ std::string right;
+ };
+
+ template<typename T>
+ inline auto convertInto( std::string const &source, T& target ) -> ParserResult {
+ std::stringstream ss;
+ ss << source;
+ ss >> target;
+ if( ss.fail() )
+ return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" );
+ else
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+ inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult {
+ target = source;
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+ inline auto convertInto( std::string const &source, bool &target ) -> ParserResult {
+ std::string srcLC = source;
+ std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast<char>( std::tolower(c) ); } );
+ if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on")
+ target = true;
+ else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off")
+ target = false;
+ else
+ return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" );
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+#ifdef CLARA_CONFIG_OPTIONAL_TYPE
+ template<typename T>
+ inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE<T>& target ) -> ParserResult {
+ T temp;
+ auto result = convertInto( source, temp );
+ if( result )
+ target = std::move(temp);
+ return result;
+ }
+#endif // CLARA_CONFIG_OPTIONAL_TYPE
+
+ struct NonCopyable {
+ NonCopyable() = default;
+ NonCopyable( NonCopyable const & ) = delete;
+ NonCopyable( NonCopyable && ) = delete;
+ NonCopyable &operator=( NonCopyable const & ) = delete;
+ NonCopyable &operator=( NonCopyable && ) = delete;
+ };
+
+ struct BoundRef : NonCopyable {
+ virtual ~BoundRef() = default;
+ virtual auto isContainer() const -> bool { return false; }
+ virtual auto isFlag() const -> bool { return false; }
+ };
+ struct BoundValueRefBase : BoundRef {
+ virtual auto setValue( std::string const &arg ) -> ParserResult = 0;
+ };
+ struct BoundFlagRefBase : BoundRef {
+ virtual auto setFlag( bool flag ) -> ParserResult = 0;
+ virtual auto isFlag() const -> bool { return true; }
+ };
+
+ template<typename T>
+ struct BoundValueRef : BoundValueRefBase {
+ T &m_ref;
+
+ explicit BoundValueRef( T &ref ) : m_ref( ref ) {}
+
+ auto setValue( std::string const &arg ) -> ParserResult override {
+ return convertInto( arg, m_ref );
+ }
+ };
+
+ template<typename T>
+ struct BoundValueRef<std::vector<T>> : BoundValueRefBase {
+ std::vector<T> &m_ref;
+
+ explicit BoundValueRef( std::vector<T> &ref ) : m_ref( ref ) {}
+
+ auto isContainer() const -> bool override { return true; }
+
+ auto setValue( std::string const &arg ) -> ParserResult override {
+ T temp;
+ auto result = convertInto( arg, temp );
+ if( result )
+ m_ref.push_back( temp );
+ return result;
+ }
+ };
+
+ struct BoundFlagRef : BoundFlagRefBase {
+ bool &m_ref;
+
+ explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {}
+
+ auto setFlag( bool flag ) -> ParserResult override {
+ m_ref = flag;
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+ };
+
+ template<typename ReturnType>
+ struct LambdaInvoker {
+ static_assert( std::is_same<ReturnType, ParserResult>::value, "Lambda must return void or clara::ParserResult" );
+
+ template<typename L, typename ArgType>
+ static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {
+ return lambda( arg );
+ }
+ };
+
+ template<>
+ struct LambdaInvoker<void> {
+ template<typename L, typename ArgType>
+ static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {
+ lambda( arg );
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+ };
+
+ template<typename ArgType, typename L>
+ inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult {
+ ArgType temp{};
+ auto result = convertInto( arg, temp );
+ return !result
+ ? result
+ : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( lambda, temp );
+ }
+
+ template<typename L>
+ struct BoundLambda : BoundValueRefBase {
+ L m_lambda;
+
+ static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" );
+ explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {}
+
+ auto setValue( std::string const &arg ) -> ParserResult override {
+ return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>( m_lambda, arg );
+ }
+ };
+
+ template<typename L>
+ struct BoundFlagLambda : BoundFlagRefBase {
+ L m_lambda;
+
+ static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" );
+ static_assert( std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value, "flags must be boolean" );
+
+ explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {}
+
+ auto setFlag( bool flag ) -> ParserResult override {
+ return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( m_lambda, flag );
+ }
+ };
+
+ enum class Optionality { Optional, Required };
+
+ struct Parser;
+
+ class ParserBase {
+ public:
+ virtual ~ParserBase() = default;
+ virtual auto validate() const -> Result { return Result::ok(); }
+ virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0;
+ virtual auto cardinality() const -> size_t { return 1; }
+
+ auto parse( Args const &args ) const -> InternalParseResult {
+ return parse( args.exeName(), TokenStream( args ) );
+ }
+ };
+
+ template<typename DerivedT>
+ class ComposableParserImpl : public ParserBase {
+ public:
+ template<typename T>
+ auto operator|( T const &other ) const -> Parser;
+
+ template<typename T>
+ auto operator+( T const &other ) const -> Parser;
+ };
+
+ // Common code and state for Args and Opts
+ template<typename DerivedT>
+ class ParserRefImpl : public ComposableParserImpl<DerivedT> {
+ protected:
+ Optionality m_optionality = Optionality::Optional;
+ std::shared_ptr<BoundRef> m_ref;
+ std::string m_hint;
+ std::string m_description;
+
+ explicit ParserRefImpl( std::shared_ptr<BoundRef> const &ref ) : m_ref( ref ) {}
+
+ public:
+ template<typename T>
+ ParserRefImpl( T &ref, std::string const &hint )
+ : m_ref( std::make_shared<BoundValueRef<T>>( ref ) ),
+ m_hint( hint )
+ {}
+
+ template<typename LambdaT>
+ ParserRefImpl( LambdaT const &ref, std::string const &hint )
+ : m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ),
+ m_hint(hint)
+ {}
+
+ auto operator()( std::string const &description ) -> DerivedT & {
+ m_description = description;
+ return static_cast<DerivedT &>( *this );
+ }
+
+ auto optional() -> DerivedT & {
+ m_optionality = Optionality::Optional;
+ return static_cast<DerivedT &>( *this );
+ };
+
+ auto required() -> DerivedT & {
+ m_optionality = Optionality::Required;
+ return static_cast<DerivedT &>( *this );
+ };
+
+ auto isOptional() const -> bool {
+ return m_optionality == Optionality::Optional;
+ }
+
+ auto cardinality() const -> size_t override {
+ if( m_ref->isContainer() )
+ return 0;
+ else
+ return 1;
+ }
+
+ auto hint() const -> std::string { return m_hint; }
+ };
+
+ class ExeName : public ComposableParserImpl<ExeName> {
+ std::shared_ptr<std::string> m_name;
+ std::shared_ptr<BoundValueRefBase> m_ref;
+
+ template<typename LambdaT>
+ static auto makeRef(LambdaT const &lambda) -> std::shared_ptr<BoundValueRefBase> {
+ return std::make_shared<BoundLambda<LambdaT>>( lambda) ;
+ }
+
+ public:
+ ExeName() : m_name( std::make_shared<std::string>( "<executable>" ) ) {}
+
+ explicit ExeName( std::string &ref ) : ExeName() {
+ m_ref = std::make_shared<BoundValueRef<std::string>>( ref );
+ }
+
+ template<typename LambdaT>
+ explicit ExeName( LambdaT const& lambda ) : ExeName() {
+ m_ref = std::make_shared<BoundLambda<LambdaT>>( lambda );
+ }
+
+ // The exe name is not parsed out of the normal tokens, but is handled specially
+ auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {
+ return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );
+ }
+
+ auto name() const -> std::string { return *m_name; }
+ auto set( std::string const& newName ) -> ParserResult {
+
+ auto lastSlash = newName.find_last_of( "\\/" );
+ auto filename = ( lastSlash == std::string::npos )
+ ? newName
+ : newName.substr( lastSlash+1 );
+
+ *m_name = filename;
+ if( m_ref )
+ return m_ref->setValue( filename );
+ else
+ return ParserResult::ok( ParseResultType::Matched );
+ }
+ };
+
+ class Arg : public ParserRefImpl<Arg> {
+ public:
+ using ParserRefImpl::ParserRefImpl;
+
+ auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override {
+ auto validationResult = validate();
+ if( !validationResult )
+ return InternalParseResult( validationResult );
+
+ auto remainingTokens = tokens;
+ auto const &token = *remainingTokens;
+ if( token.type != TokenType::Argument )
+ return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );
+
+ assert( !m_ref->isFlag() );
+ auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );
+
+ auto result = valueRef->setValue( remainingTokens->token );
+ if( !result )
+ return InternalParseResult( result );
+ else
+ return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );
+ }
+ };
+
+ inline auto normaliseOpt( std::string const &optName ) -> std::string {
+#ifdef CATCH_PLATFORM_WINDOWS
+ if( optName[0] == '/' )
+ return "-" + optName.substr( 1 );
+ else
+#endif
+ return optName;
+ }
+
+ class Opt : public ParserRefImpl<Opt> {
+ protected:
+ std::vector<std::string> m_optNames;
+
+ public:
+ template<typename LambdaT>
+ explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared<BoundFlagLambda<LambdaT>>( ref ) ) {}
+
+ explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared<BoundFlagRef>( ref ) ) {}
+
+ template<typename LambdaT>
+ Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}
+
+ template<typename T>
+ Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}
+
+ auto operator[]( std::string const &optName ) -> Opt & {
+ m_optNames.push_back( optName );
+ return *this;
+ }
+
+ auto getHelpColumns() const -> std::vector<HelpColumns> {
+ std::ostringstream oss;
+ bool first = true;
+ for( auto const &opt : m_optNames ) {
+ if (first)
+ first = false;
+ else
+ oss << ", ";
+ oss << opt;
+ }
+ if( !m_hint.empty() )
+ oss << " <" << m_hint << ">";
+ return { { oss.str(), m_description } };
+ }
+
+ auto isMatch( std::string const &optToken ) const -> bool {
+ auto normalisedToken = normaliseOpt( optToken );
+ for( auto const &name : m_optNames ) {
+ if( normaliseOpt( name ) == normalisedToken )
+ return true;
+ }
+ return false;
+ }
+
+ using ParserBase::parse;
+
+ auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {
+ auto validationResult = validate();
+ if( !validationResult )
+ return InternalParseResult( validationResult );
+
+ auto remainingTokens = tokens;
+ if( remainingTokens && remainingTokens->type == TokenType::Option ) {
+ auto const &token = *remainingTokens;
+ if( isMatch(token.token ) ) {
+ if( m_ref->isFlag() ) {
+ auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() );
+ auto result = flagRef->setFlag( true );
+ if( !result )
+ return InternalParseResult( result );
+ if( result.value() == ParseResultType::ShortCircuitAll )
+ return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );
+ } else {
+ auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );
+ ++remainingTokens;
+ if( !remainingTokens )
+ return InternalParseResult::runtimeError( "Expected argument following " + token.token );
+ auto const &argToken = *remainingTokens;
+ if( argToken.type != TokenType::Argument )
+ return InternalParseResult::runtimeError( "Expected argument following " + token.token );
+ auto result = valueRef->setValue( argToken.token );
+ if( !result )
+ return InternalParseResult( result );
+ if( result.value() == ParseResultType::ShortCircuitAll )
+ return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );
+ }
+ return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );
+ }
+ }
+ return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );
+ }
+
+ auto validate() const -> Result override {
+ if( m_optNames.empty() )
+ return Result::logicError( "No options supplied to Opt" );
+ for( auto const &name : m_optNames ) {
+ if( name.empty() )
+ return Result::logicError( "Option name cannot be empty" );
+#ifdef CATCH_PLATFORM_WINDOWS
+ if( name[0] != '-' && name[0] != '/' )
+ return Result::logicError( "Option name must begin with '-' or '/'" );
+#else
+ if( name[0] != '-' )
+ return Result::logicError( "Option name must begin with '-'" );
+#endif
+ }
+ return ParserRefImpl::validate();
+ }
+ };
+
+ struct Help : Opt {
+ Help( bool &showHelpFlag )
+ : Opt([&]( bool flag ) {
+ showHelpFlag = flag;
+ return ParserResult::ok( ParseResultType::ShortCircuitAll );
+ })
+ {
+ static_cast<Opt &>( *this )
+ ("display usage information")
+ ["-?"]["-h"]["--help"]
+ .optional();
+ }
+ };
+
+ struct Parser : ParserBase {
+
+ mutable ExeName m_exeName;
+ std::vector<Opt> m_options;
+ std::vector<Arg> m_args;
+
+ auto operator|=( ExeName const &exeName ) -> Parser & {
+ m_exeName = exeName;
+ return *this;
+ }
+
+ auto operator|=( Arg const &arg ) -> Parser & {
+ m_args.push_back(arg);
+ return *this;
+ }
+
+ auto operator|=( Opt const &opt ) -> Parser & {
+ m_options.push_back(opt);
+ return *this;
+ }
+
+ auto operator|=( Parser const &other ) -> Parser & {
+ m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end());
+ m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end());
+ return *this;
+ }
+
+ template<typename T>
+ auto operator|( T const &other ) const -> Parser {
+ return Parser( *this ) |= other;
+ }
+
+ // Forward deprecated interface with '+' instead of '|'
+ template<typename T>
+ auto operator+=( T const &other ) -> Parser & { return operator|=( other ); }
+ template<typename T>
+ auto operator+( T const &other ) const -> Parser { return operator|( other ); }
+
+ auto getHelpColumns() const -> std::vector<HelpColumns> {
+ std::vector<HelpColumns> cols;
+ for (auto const &o : m_options) {
+ auto childCols = o.getHelpColumns();
+ cols.insert( cols.end(), childCols.begin(), childCols.end() );
+ }
+ return cols;
+ }
+
+ void writeToStream( std::ostream &os ) const {
+ if (!m_exeName.name().empty()) {
+ os << "usage:\n" << " " << m_exeName.name() << " ";
+ bool required = true, first = true;
+ for( auto const &arg : m_args ) {
+ if (first)
+ first = false;
+ else
+ os << " ";
+ if( arg.isOptional() && required ) {
+ os << "[";
+ required = false;
+ }
+ os << "<" << arg.hint() << ">";
+ if( arg.cardinality() == 0 )
+ os << " ... ";
+ }
+ if( !required )
+ os << "]";
+ if( !m_options.empty() )
+ os << " options";
+ os << "\n\nwhere options are:" << std::endl;
+ }
+
+ auto rows = getHelpColumns();
+ size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH;
+ size_t optWidth = 0;
+ for( auto const &cols : rows )
+ optWidth = (std::max)(optWidth, cols.left.size() + 2);
+
+ optWidth = (std::min)(optWidth, consoleWidth/2);
+
+ for( auto const &cols : rows ) {
+ auto row =
+ TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) +
+ TextFlow::Spacer(4) +
+ TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth );
+ os << row << std::endl;
+ }
+ }
+
+ friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& {
+ parser.writeToStream( os );
+ return os;
+ }
+
+ auto validate() const -> Result override {
+ for( auto const &opt : m_options ) {
+ auto result = opt.validate();
+ if( !result )
+ return result;
+ }
+ for( auto const &arg : m_args ) {
+ auto result = arg.validate();
+ if( !result )
+ return result;
+ }
+ return Result::ok();
+ }
+
+ using ParserBase::parse;
+
+ auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override {
+
+ struct ParserInfo {
+ ParserBase const* parser = nullptr;
+ size_t count = 0;
+ };
+ const size_t totalParsers = m_options.size() + m_args.size();
+ assert( totalParsers < 512 );
+ // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do
+ ParserInfo parseInfos[512];
+
+ {
+ size_t i = 0;
+ for (auto const &opt : m_options) parseInfos[i++].parser = &opt;
+ for (auto const &arg : m_args) parseInfos[i++].parser = &arg;
+ }
+
+ m_exeName.set( exeName );
+
+ auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );
+ while( result.value().remainingTokens() ) {
+ bool tokenParsed = false;
+
+ for( size_t i = 0; i < totalParsers; ++i ) {
+ auto& parseInfo = parseInfos[i];
+ if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) {
+ result = parseInfo.parser->parse(exeName, result.value().remainingTokens());
+ if (!result)
+ return result;
+ if (result.value().type() != ParseResultType::NoMatch) {
+ tokenParsed = true;
+ ++parseInfo.count;
+ break;
+ }
+ }
+ }
+
+ if( result.value().type() == ParseResultType::ShortCircuitAll )
+ return result;
+ if( !tokenParsed )
+ return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token );
+ }
+ // !TBD Check missing required options
+ return result;
+ }
+ };
+
+ template<typename DerivedT>
+ template<typename T>
+ auto ComposableParserImpl<DerivedT>::operator|( T const &other ) const -> Parser {
+ return Parser() | static_cast<DerivedT const &>( *this ) | other;
+ }
+} // namespace detail
+
+// A Combined parser
+using detail::Parser;
+
+// A parser for options
+using detail::Opt;
+
+// A parser for arguments
+using detail::Arg;
+
+// Wrapper for argc, argv from main()
+using detail::Args;
+
+// Specifies the name of the executable
+using detail::ExeName;
+
+// Convenience wrapper for option parser that specifies the help option
+using detail::Help;
+
+// enum of result types from a parse
+using detail::ParseResultType;
+
+// Result type for parser operation
+using detail::ParserResult;
+
+}} // namespace Catch::clara
+
+// end clara.hpp
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// Restore Clara's value for console width, if present
+#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
+#endif
+
+// end catch_clara.h
+namespace Catch {
+
+ clara::Parser makeCommandLineParser( ConfigData& config );
+
+} // end namespace Catch
+
+// end catch_commandline.h
+#include <fstream>
+#include <ctime>
+
+namespace Catch {
+
+ clara::Parser makeCommandLineParser( ConfigData& config ) {
+
+ using namespace clara;
+
+ auto const setWarning = [&]( std::string const& warning ) {
+ auto warningSet = [&]() {
+ if( warning == "NoAssertions" )
+ return WarnAbout::NoAssertions;
+
+ if ( warning == "NoTests" )
+ return WarnAbout::NoTests;
+
+ return WarnAbout::Nothing;
+ }();
+
+ if (warningSet == WarnAbout::Nothing)
+ return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" );
+ config.warnings = static_cast<WarnAbout::What>( config.warnings | warningSet );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const loadTestNamesFromFile = [&]( std::string const& filename ) {
+ std::ifstream f( filename.c_str() );
+ if( !f.is_open() )
+ return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" );
+
+ std::string line;
+ while( std::getline( f, line ) ) {
+ line = trim(line);
+ if( !line.empty() && !startsWith( line, '#' ) ) {
+ if( !startsWith( line, '"' ) )
+ line = '"' + line + '"';
+ config.testsOrTags.push_back( line );
+ config.testsOrTags.emplace_back( "," );
+ }
+ }
+ //Remove comma in the end
+ if(!config.testsOrTags.empty())
+ config.testsOrTags.erase( config.testsOrTags.end()-1 );
+
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setTestOrder = [&]( std::string const& order ) {
+ if( startsWith( "declared", order ) )
+ config.runOrder = RunTests::InDeclarationOrder;
+ else if( startsWith( "lexical", order ) )
+ config.runOrder = RunTests::InLexicographicalOrder;
+ else if( startsWith( "random", order ) )
+ config.runOrder = RunTests::InRandomOrder;
+ else
+ return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setRngSeed = [&]( std::string const& seed ) {
+ if( seed != "time" )
+ return clara::detail::convertInto( seed, config.rngSeed );
+ config.rngSeed = static_cast<unsigned int>( std::time(nullptr) );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setColourUsage = [&]( std::string const& useColour ) {
+ auto mode = toLower( useColour );
+
+ if( mode == "yes" )
+ config.useColour = UseColour::Yes;
+ else if( mode == "no" )
+ config.useColour = UseColour::No;
+ else if( mode == "auto" )
+ config.useColour = UseColour::Auto;
+ else
+ return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setWaitForKeypress = [&]( std::string const& keypress ) {
+ auto keypressLc = toLower( keypress );
+ if (keypressLc == "never")
+ config.waitForKeypress = WaitForKeypress::Never;
+ else if( keypressLc == "start" )
+ config.waitForKeypress = WaitForKeypress::BeforeStart;
+ else if( keypressLc == "exit" )
+ config.waitForKeypress = WaitForKeypress::BeforeExit;
+ else if( keypressLc == "both" )
+ config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;
+ else
+ return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setVerbosity = [&]( std::string const& verbosity ) {
+ auto lcVerbosity = toLower( verbosity );
+ if( lcVerbosity == "quiet" )
+ config.verbosity = Verbosity::Quiet;
+ else if( lcVerbosity == "normal" )
+ config.verbosity = Verbosity::Normal;
+ else if( lcVerbosity == "high" )
+ config.verbosity = Verbosity::High;
+ else
+ return ParserResult::runtimeError( "Unrecognised verbosity, '" + verbosity + "'" );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+ auto const setReporter = [&]( std::string const& reporter ) {
+ IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
+
+ auto lcReporter = toLower( reporter );
+ auto result = factories.find( lcReporter );
+
+ if( factories.end() != result )
+ config.reporterName = lcReporter;
+ else
+ return ParserResult::runtimeError( "Unrecognized reporter, '" + reporter + "'. Check available with --list-reporters" );
+ return ParserResult::ok( ParseResultType::Matched );
+ };
+
+ auto cli
+ = ExeName( config.processName )
+ | Help( config.showHelp )
+ | Opt( config.listTests )
+ ["-l"]["--list-tests"]
+ ( "list all/matching test cases" )
+ | Opt( config.listTags )
+ ["-t"]["--list-tags"]
+ ( "list all/matching tags" )
+ | Opt( config.showSuccessfulTests )
+ ["-s"]["--success"]
+ ( "include successful tests in output" )
+ | Opt( config.shouldDebugBreak )
+ ["-b"]["--break"]
+ ( "break into debugger on failure" )
+ | Opt( config.noThrow )
+ ["-e"]["--nothrow"]
+ ( "skip exception tests" )
+ | Opt( config.showInvisibles )
+ ["-i"]["--invisibles"]
+ ( "show invisibles (tabs, newlines)" )
+ | Opt( config.outputFilename, "filename" )
+ ["-o"]["--out"]
+ ( "output filename" )
+ | Opt( setReporter, "name" )
+ ["-r"]["--reporter"]
+ ( "reporter to use (defaults to console)" )
+ | Opt( config.name, "name" )
+ ["-n"]["--name"]
+ ( "suite name" )
+ | Opt( [&]( bool ){ config.abortAfter = 1; } )
+ ["-a"]["--abort"]
+ ( "abort at first failure" )
+ | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" )
+ ["-x"]["--abortx"]
+ ( "abort after x failures" )
+ | Opt( setWarning, "warning name" )
+ ["-w"]["--warn"]
+ ( "enable warnings" )
+ | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" )
+ ["-d"]["--durations"]
+ ( "show test durations" )
+ | Opt( config.minDuration, "seconds" )
+ ["-D"]["--min-duration"]
+ ( "show test durations for tests taking at least the given number of seconds" )
+ | Opt( loadTestNamesFromFile, "filename" )
+ ["-f"]["--input-file"]
+ ( "load test names to run from a file" )
+ | Opt( config.filenamesAsTags )
+ ["-#"]["--filenames-as-tags"]
+ ( "adds a tag for the filename" )
+ | Opt( config.sectionsToRun, "section name" )
+ ["-c"]["--section"]
+ ( "specify section to run" )
+ | Opt( setVerbosity, "quiet|normal|high" )
+ ["-v"]["--verbosity"]
+ ( "set output verbosity" )
+ | Opt( config.listTestNamesOnly )
+ ["--list-test-names-only"]
+ ( "list all/matching test cases names only" )
+ | Opt( config.listReporters )
+ ["--list-reporters"]
+ ( "list all reporters" )
+ | Opt( setTestOrder, "decl|lex|rand" )
+ ["--order"]
+ ( "test case order (defaults to decl)" )
+ | Opt( setRngSeed, "'time'|number" )
+ ["--rng-seed"]
+ ( "set a specific seed for random numbers" )
+ | Opt( setColourUsage, "yes|no" )
+ ["--use-colour"]
+ ( "should output be colourised" )
+ | Opt( config.libIdentify )
+ ["--libidentify"]
+ ( "report name and version according to libidentify standard" )
+ | Opt( setWaitForKeypress, "never|start|exit|both" )
+ ["--wait-for-keypress"]
+ ( "waits for a keypress before exiting" )
+ | Opt( config.benchmarkSamples, "samples" )
+ ["--benchmark-samples"]
+ ( "number of samples to collect (default: 100)" )
+ | Opt( config.benchmarkResamples, "resamples" )
+ ["--benchmark-resamples"]
+ ( "number of resamples for the bootstrap (default: 100000)" )
+ | Opt( config.benchmarkConfidenceInterval, "confidence interval" )
+ ["--benchmark-confidence-interval"]
+ ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" )
+ | Opt( config.benchmarkNoAnalysis )
+ ["--benchmark-no-analysis"]
+ ( "perform only measurements; do not perform any analysis" )
+ | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" )
+ ["--benchmark-warmup-time"]
+ ( "amount of time in milliseconds spent on warming up each test (default: 100)" )
+ | Arg( config.testsOrTags, "test name|pattern|tags" )
+ ( "which test or tests to use" );
+
+ return cli;
+ }
+
+} // end namespace Catch
+// end catch_commandline.cpp
+// start catch_common.cpp
+
+#include <cstring>
+#include <ostream>
+
+namespace Catch {
+
+ bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept {
+ return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);
+ }
+ bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept {
+ // We can assume that the same file will usually have the same pointer.
+ // Thus, if the pointers are the same, there is no point in calling the strcmp
+ return line < other.line || ( line == other.line && file != other.file && (std::strcmp(file, other.file) < 0));
+ }
+
+ std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
+#ifndef __GNUG__
+ os << info.file << '(' << info.line << ')';
+#else
+ os << info.file << ':' << info.line;
+#endif
+ return os;
+ }
+
+ std::string StreamEndStop::operator+() const {
+ return std::string();
+ }
+
+ NonCopyable::NonCopyable() = default;
+ NonCopyable::~NonCopyable() = default;
+
+}
+// end catch_common.cpp
+// start catch_config.cpp
+
+namespace Catch {
+
+ Config::Config( ConfigData const& data )
+ : m_data( data ),
+ m_stream( openStream() )
+ {
+ // We need to trim filter specs to avoid trouble with superfluous
+ // whitespace (esp. important for bdd macros, as those are manually
+ // aligned with whitespace).
+
+ for (auto& elem : m_data.testsOrTags) {
+ elem = trim(elem);
+ }
+ for (auto& elem : m_data.sectionsToRun) {
+ elem = trim(elem);
+ }
+
+ TestSpecParser parser(ITagAliasRegistry::get());
+ if (!m_data.testsOrTags.empty()) {
+ m_hasTestFilters = true;
+ for (auto const& testOrTags : m_data.testsOrTags) {
+ parser.parse(testOrTags);
+ }
+ }
+ m_testSpec = parser.testSpec();
+ }
+
+ std::string const& Config::getFilename() const {
+ return m_data.outputFilename ;
+ }
+
+ bool Config::listTests() const { return m_data.listTests; }
+ bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; }
+ bool Config::listTags() const { return m_data.listTags; }
+ bool Config::listReporters() const { return m_data.listReporters; }
+
+ std::string Config::getProcessName() const { return m_data.processName; }
+ std::string const& Config::getReporterName() const { return m_data.reporterName; }
+
+ std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; }
+ std::vector<std::string> const& Config::getSectionsToRun() const { return m_data.sectionsToRun; }
+
+ TestSpec const& Config::testSpec() const { return m_testSpec; }
+ bool Config::hasTestFilters() const { return m_hasTestFilters; }
+
+ bool Config::showHelp() const { return m_data.showHelp; }
+
+ // IConfig interface
+ bool Config::allowThrows() const { return !m_data.noThrow; }
+ std::ostream& Config::stream() const { return m_stream->stream(); }
+ std::string Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
+ bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
+ bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); }
+ bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); }
+ ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }
+ double Config::minDuration() const { return m_data.minDuration; }
+ RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; }
+ unsigned int Config::rngSeed() const { return m_data.rngSeed; }
+ UseColour::YesOrNo Config::useColour() const { return m_data.useColour; }
+ bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; }
+ int Config::abortAfter() const { return m_data.abortAfter; }
+ bool Config::showInvisibles() const { return m_data.showInvisibles; }
+ Verbosity Config::verbosity() const { return m_data.verbosity; }
+
+ bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; }
+ int Config::benchmarkSamples() const { return m_data.benchmarkSamples; }
+ double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; }
+ unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; }
+ std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); }
+
+ IStream const* Config::openStream() {
+ return Catch::makeStream(m_data.outputFilename);
+ }
+
+} // end namespace Catch
+// end catch_config.cpp
+// start catch_console_colour.cpp
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wexit-time-destructors"
+#endif
+
+// start catch_errno_guard.h
+
+namespace Catch {
+
+ class ErrnoGuard {
+ public:
+ ErrnoGuard();
+ ~ErrnoGuard();
+ private:
+ int m_oldErrno;
+ };
+
+}
+
+// end catch_errno_guard.h
+// start catch_windows_h_proxy.h
+
+
+#if defined(CATCH_PLATFORM_WINDOWS)
+
+#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)
+# define CATCH_DEFINED_NOMINMAX
+# define NOMINMAX
+#endif
+#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)
+# define CATCH_DEFINED_WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+
+#ifdef __AFXDLL
+#include <AfxWin.h>
+#else
+#include <windows.h>
+#endif
+
+#ifdef CATCH_DEFINED_NOMINMAX
+# undef NOMINMAX
+#endif
+#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN
+# undef WIN32_LEAN_AND_MEAN
+#endif
+
+#endif // defined(CATCH_PLATFORM_WINDOWS)
+
+// end catch_windows_h_proxy.h
+#include <sstream>
+
+namespace Catch {
+ namespace {
+
+ struct IColourImpl {
+ virtual ~IColourImpl() = default;
+ virtual void use( Colour::Code _colourCode ) = 0;
+ };
+
+ struct NoColourImpl : IColourImpl {
+ void use( Colour::Code ) override {}
+
+ static IColourImpl* instance() {
+ static NoColourImpl s_instance;
+ return &s_instance;
+ }
+ };
+
+ } // anon namespace
+} // namespace Catch
+
+#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )
+# ifdef CATCH_PLATFORM_WINDOWS
+# define CATCH_CONFIG_COLOUR_WINDOWS
+# else
+# define CATCH_CONFIG_COLOUR_ANSI
+# endif
+#endif
+
+#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
+
+namespace Catch {
+namespace {
+
+ class Win32ColourImpl : public IColourImpl {
+ public:
+ Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )
+ {
+ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+ GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );
+ originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
+ originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
+ }
+
+ void use( Colour::Code _colourCode ) override {
+ switch( _colourCode ) {
+ case Colour::None: return setTextAttribute( originalForegroundAttributes );
+ case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+ case Colour::Red: return setTextAttribute( FOREGROUND_RED );
+ case Colour::Green: return setTextAttribute( FOREGROUND_GREEN );
+ case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE );
+ case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );
+ case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );
+ case Colour::Grey: return setTextAttribute( 0 );
+
+ case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY );
+ case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
+ case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
+ case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+ case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );
+
+ case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" );
+
+ default:
+ CATCH_ERROR( "Unknown colour requested" );
+ }
+ }
+
+ private:
+ void setTextAttribute( WORD _textAttribute ) {
+ SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );
+ }
+ HANDLE stdoutHandle;
+ WORD originalForegroundAttributes;
+ WORD originalBackgroundAttributes;
+ };
+
+ IColourImpl* platformColourInstance() {
+ static Win32ColourImpl s_instance;
+
+ IConfigPtr config = getCurrentContext().getConfig();
+ UseColour::YesOrNo colourMode = config
+ ? config->useColour()
+ : UseColour::Auto;
+ if( colourMode == UseColour::Auto )
+ colourMode = UseColour::Yes;
+ return colourMode == UseColour::Yes
+ ? &s_instance
+ : NoColourImpl::instance();
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////
+
+#include <unistd.h>
+
+namespace Catch {
+namespace {
+
+ // use POSIX/ ANSI console terminal codes
+ // Thanks to Adam Strzelecki for original contribution
+ // (http://github.com/nanoant)
+ // https://github.com/philsquared/Catch/pull/131
+ class PosixColourImpl : public IColourImpl {
+ public:
+ void use( Colour::Code _colourCode ) override {
+ switch( _colourCode ) {
+ case Colour::None:
+ case Colour::White: return setColour( "[0m" );
+ case Colour::Red: return setColour( "[0;31m" );
+ case Colour::Green: return setColour( "[0;32m" );
+ case Colour::Blue: return setColour( "[0;34m" );
+ case Colour::Cyan: return setColour( "[0;36m" );
+ case Colour::Yellow: return setColour( "[0;33m" );
+ case Colour::Grey: return setColour( "[1;30m" );
+
+ case Colour::LightGrey: return setColour( "[0;37m" );
+ case Colour::BrightRed: return setColour( "[1;31m" );
+ case Colour::BrightGreen: return setColour( "[1;32m" );
+ case Colour::BrightWhite: return setColour( "[1;37m" );
+ case Colour::BrightYellow: return setColour( "[1;33m" );
+
+ case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" );
+ default: CATCH_INTERNAL_ERROR( "Unknown colour requested" );
+ }
+ }
+ static IColourImpl* instance() {
+ static PosixColourImpl s_instance;
+ return &s_instance;
+ }
+
+ private:
+ void setColour( const char* _escapeCode ) {
+ getCurrentContext().getConfig()->stream()
+ << '\033' << _escapeCode;
+ }
+ };
+
+ bool useColourOnPlatform() {
+ return
+#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
+ !isDebuggerActive() &&
+#endif
+#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))
+ isatty(STDOUT_FILENO)
+#else
+ false
+#endif
+ ;
+ }
+ IColourImpl* platformColourInstance() {
+ ErrnoGuard guard;
+ IConfigPtr config = getCurrentContext().getConfig();
+ UseColour::YesOrNo colourMode = config
+ ? config->useColour()
+ : UseColour::Auto;
+ if( colourMode == UseColour::Auto )
+ colourMode = useColourOnPlatform()
+ ? UseColour::Yes
+ : UseColour::No;
+ return colourMode == UseColour::Yes
+ ? PosixColourImpl::instance()
+ : NoColourImpl::instance();
+ }
+
+} // end anon namespace
+} // end namespace Catch
+
+#else // not Windows or ANSI ///////////////////////////////////////////////
+
+namespace Catch {
+
+ static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }
+
+} // end namespace Catch
+
+#endif // Windows/ ANSI/ None
+
+namespace Catch {
+
+ Colour::Colour( Code _colourCode ) { use( _colourCode ); }
+ Colour::Colour( Colour&& other ) noexcept {
+ m_moved = other.m_moved;
+ other.m_moved = true;
+ }
+ Colour& Colour::operator=( Colour&& other ) noexcept {
+ m_moved = other.m_moved;
+ other.m_moved = true;
+ return *this;
+ }
+
+ Colour::~Colour(){ if( !m_moved ) use( None ); }
+
+ void Colour::use( Code _colourCode ) {
+ static IColourImpl* impl = platformColourInstance();
+ // Strictly speaking, this cannot possibly happen.
+ // However, under some conditions it does happen (see #1626),
+ // and this change is small enough that we can let practicality
+ // triumph over purity in this case.
+ if (impl != nullptr) {
+ impl->use( _colourCode );
+ }
+ }
+
+ std::ostream& operator << ( std::ostream& os, Colour const& ) {
+ return os;
+ }
+
+} // end namespace Catch
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#endif
+
+// end catch_console_colour.cpp
+// start catch_context.cpp
+
+namespace Catch {
+
+ class Context : public IMutableContext, NonCopyable {
+
+ public: // IContext
+ IResultCapture* getResultCapture() override {
+ return m_resultCapture;
+ }
+ IRunner* getRunner() override {
+ return m_runner;
+ }
+
+ IConfigPtr const& getConfig() const override {
+ return m_config;
+ }
+
+ ~Context() override;
+
+ public: // IMutableContext
+ void setResultCapture( IResultCapture* resultCapture ) override {
+ m_resultCapture = resultCapture;
+ }
+ void setRunner( IRunner* runner ) override {
+ m_runner = runner;
+ }
+ void setConfig( IConfigPtr const& config ) override {
+ m_config = config;
+ }
+
+ friend IMutableContext& getCurrentMutableContext();
+
+ private:
+ IConfigPtr m_config;
+ IRunner* m_runner = nullptr;
+ IResultCapture* m_resultCapture = nullptr;
+ };
+
+ IMutableContext *IMutableContext::currentContext = nullptr;
+
+ void IMutableContext::createContext()
+ {
+ currentContext = new Context();
+ }
+
+ void cleanUpContext() {
+ delete IMutableContext::currentContext;
+ IMutableContext::currentContext = nullptr;
+ }
+ IContext::~IContext() = default;
+ IMutableContext::~IMutableContext() = default;
+ Context::~Context() = default;
+
+ SimplePcg32& rng() {
+ static SimplePcg32 s_rng;
+ return s_rng;
+ }
+
+}
+// end catch_context.cpp
+// start catch_debug_console.cpp
+
+// start catch_debug_console.h
+
+#include <string>
+
+namespace Catch {
+ void writeToDebugConsole( std::string const& text );
+}
+
+// end catch_debug_console.h
+#if defined(CATCH_CONFIG_ANDROID_LOGWRITE)
+#include <android/log.h>
+
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ __android_log_write( ANDROID_LOG_DEBUG, "Catch", text.c_str() );
+ }
+ }
+
+#elif defined(CATCH_PLATFORM_WINDOWS)
+
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ ::OutputDebugStringA( text.c_str() );
+ }
+ }
+
+#else
+
+ namespace Catch {
+ void writeToDebugConsole( std::string const& text ) {
+ // !TBD: Need a version for Mac/ XCode and other IDEs
+ Catch::cout() << text;
+ }
+ }
+
+#endif // Platform
+// end catch_debug_console.cpp
+// start catch_debugger.cpp
+
+#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
+
+# include <cassert>
+# include <sys/types.h>
+# include <unistd.h>
+# include <cstddef>
+# include <ostream>
+
+#ifdef __apple_build_version__
+ // These headers will only compile with AppleClang (XCode)
+ // For other compilers (Clang, GCC, ... ) we need to exclude them
+# include <sys/sysctl.h>
+#endif
+
+ namespace Catch {
+ #ifdef __apple_build_version__
+ // The following function is taken directly from the following technical note:
+ // https://developer.apple.com/library/archive/qa/qa1361/_index.html
+
+ // Returns true if the current process is being debugged (either
+ // running under the debugger or has a debugger attached post facto).
+ bool isDebuggerActive(){
+ int mib[4];
+ struct kinfo_proc info;
+ std::size_t size;
+
+ // Initialize the flags so that, if sysctl fails for some bizarre
+ // reason, we get a predictable result.
+
+ info.kp_proc.p_flag = 0;
+
+ // Initialize mib, which tells sysctl the info we want, in this case
+ // we're looking for information about a specific process ID.
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ // Call sysctl.
+
+ size = sizeof(info);
+ if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) {
+ Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl;
+ return false;
+ }
+
+ // We're being debugged if the P_TRACED flag is set.
+
+ return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
+ }
+ #else
+ bool isDebuggerActive() {
+ // We need to find another way to determine this for non-appleclang compilers on macOS
+ return false;
+ }
+ #endif
+ } // namespace Catch
+
+#elif defined(CATCH_PLATFORM_LINUX)
+ #include <fstream>
+ #include <string>
+
+ namespace Catch{
+ // The standard POSIX way of detecting a debugger is to attempt to
+ // ptrace() the process, but this needs to be done from a child and not
+ // this process itself to still allow attaching to this process later
+ // if wanted, so is rather heavy. Under Linux we have the PID of the
+ // "debugger" (which doesn't need to be gdb, of course, it could also
+ // be strace, for example) in /proc/$PID/status, so just get it from
+ // there instead.
+ bool isDebuggerActive(){
+ // Libstdc++ has a bug, where std::ifstream sets errno to 0
+ // This way our users can properly assert over errno values
+ ErrnoGuard guard;
+ std::ifstream in("/proc/self/status");
+ for( std::string line; std::getline(in, line); ) {
+ static const int PREFIX_LEN = 11;
+ if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) {
+ // We're traced if the PID is not 0 and no other PID starts
+ // with 0 digit, so it's enough to check for just a single
+ // character.
+ return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
+ }
+ }
+
+ return false;
+ }
+ } // namespace Catch
+#elif defined(_MSC_VER)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#elif defined(__MINGW32__)
+ extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
+ namespace Catch {
+ bool isDebuggerActive() {
+ return IsDebuggerPresent() != 0;
+ }
+ }
+#else
+ namespace Catch {
+ bool isDebuggerActive() { return false; }
+ }
+#endif // Platform
+// end catch_debugger.cpp
+// start catch_decomposer.cpp
+
+namespace Catch {
+
+ ITransientExpression::~ITransientExpression() = default;
+
+ void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) {
+ if( lhs.size() + rhs.size() < 40 &&
+ lhs.find('\n') == std::string::npos &&
+ rhs.find('\n') == std::string::npos )
+ os << lhs << " " << op << " " << rhs;
+ else
+ os << lhs << "\n" << op << "\n" << rhs;
+ }
+}
+// end catch_decomposer.cpp
+// start catch_enforce.cpp
+
+#include <stdexcept>
+
+namespace Catch {
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER)
+ [[noreturn]]
+ void throw_exception(std::exception const& e) {
+ Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n"
+ << "The message was: " << e.what() << '\n';
+ std::terminate();
+ }
+#endif
+
+ [[noreturn]]
+ void throw_logic_error(std::string const& msg) {
+ throw_exception(std::logic_error(msg));
+ }
+
+ [[noreturn]]
+ void throw_domain_error(std::string const& msg) {
+ throw_exception(std::domain_error(msg));
+ }
+
+ [[noreturn]]
+ void throw_runtime_error(std::string const& msg) {
+ throw_exception(std::runtime_error(msg));
+ }
+
+} // namespace Catch;
+// end catch_enforce.cpp
+// start catch_enum_values_registry.cpp
+// start catch_enum_values_registry.h
+
+#include <vector>
+#include <memory>
+
+namespace Catch {
+
+ namespace Detail {
+
+ std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values );
+
+ class EnumValuesRegistry : public IMutableEnumValuesRegistry {
+
+ std::vector<std::unique_ptr<EnumInfo>> m_enumInfos;
+
+ EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override;
+ };
+
+ std::vector<StringRef> parseEnums( StringRef enums );
+
+ } // Detail
+
+} // Catch
+
+// end catch_enum_values_registry.h
+
+#include <map>
+#include <cassert>
+
+namespace Catch {
+
+ IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}
+
+ namespace Detail {
+
+ namespace {
+ // Extracts the actual name part of an enum instance
+ // In other words, it returns the Blue part of Bikeshed::Colour::Blue
+ StringRef extractInstanceName(StringRef enumInstance) {
+ // Find last occurrence of ":"
+ size_t name_start = enumInstance.size();
+ while (name_start > 0 && enumInstance[name_start - 1] != ':') {
+ --name_start;
+ }
+ return enumInstance.substr(name_start, enumInstance.size() - name_start);
+ }
+ }
+
+ std::vector<StringRef> parseEnums( StringRef enums ) {
+ auto enumValues = splitStringRef( enums, ',' );
+ std::vector<StringRef> parsed;
+ parsed.reserve( enumValues.size() );
+ for( auto const& enumValue : enumValues ) {
+ parsed.push_back(trim(extractInstanceName(enumValue)));
+ }
+ return parsed;
+ }
+
+ EnumInfo::~EnumInfo() {}
+
+ StringRef EnumInfo::lookup( int value ) const {
+ for( auto const& valueToName : m_values ) {
+ if( valueToName.first == value )
+ return valueToName.second;
+ }
+ return "{** unexpected enum value **}"_sr;
+ }
+
+ std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
+ std::unique_ptr<EnumInfo> enumInfo( new EnumInfo );
+ enumInfo->m_name = enumName;
+ enumInfo->m_values.reserve( values.size() );
+
+ const auto valueNames = Catch::Detail::parseEnums( allValueNames );
+ assert( valueNames.size() == values.size() );
+ std::size_t i = 0;
+ for( auto value : values )
+ enumInfo->m_values.emplace_back(value, valueNames[i++]);
+
+ return enumInfo;
+ }
+
+ EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
+ m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));
+ return *m_enumInfos.back();
+ }
+
+ } // Detail
+} // Catch
+
+// end catch_enum_values_registry.cpp
+// start catch_errno_guard.cpp
+
+#include <cerrno>
+
+namespace Catch {
+ ErrnoGuard::ErrnoGuard():m_oldErrno(errno){}
+ ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; }
+}
+// end catch_errno_guard.cpp
+// start catch_exception_translator_registry.cpp
+
+// start catch_exception_translator_registry.h
+
+#include <vector>
+#include <string>
+#include <memory>
+
+namespace Catch {
+
+ class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
+ public:
+ ~ExceptionTranslatorRegistry();
+ virtual void registerTranslator( const IExceptionTranslator* translator );
+ std::string translateActiveException() const override;
+ std::string tryTranslators() const;
+
+ private:
+ std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators;
+ };
+}
+
+// end catch_exception_translator_registry.h
+#ifdef __OBJC__
+#import "Foundation/Foundation.h"
+#endif
+
+namespace Catch {
+
+ ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {
+ }
+
+ void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) {
+ m_translators.push_back( std::unique_ptr<const IExceptionTranslator>( translator ) );
+ }
+
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ std::string ExceptionTranslatorRegistry::translateActiveException() const {
+ try {
+#ifdef __OBJC__
+ // In Objective-C try objective-c exceptions first
+ @try {
+ return tryTranslators();
+ }
+ @catch (NSException *exception) {
+ return Catch::Detail::stringify( [exception description] );
+ }
+#else
+ // Compiling a mixed mode project with MSVC means that CLR
+ // exceptions will be caught in (...) as well. However, these
+ // do not fill-in std::current_exception and thus lead to crash
+ // when attempting rethrow.
+ // /EHa switch also causes structured exceptions to be caught
+ // here, but they fill-in current_exception properly, so
+ // at worst the output should be a little weird, instead of
+ // causing a crash.
+ if (std::current_exception() == nullptr) {
+ return "Non C++ exception. Possibly a CLR exception.";
+ }
+ return tryTranslators();
+#endif
+ }
+ catch( TestFailureException& ) {
+ std::rethrow_exception(std::current_exception());
+ }
+ catch( std::exception& ex ) {
+ return ex.what();
+ }
+ catch( std::string& msg ) {
+ return msg;
+ }
+ catch( const char* msg ) {
+ return msg;
+ }
+ catch(...) {
+ return "Unknown exception";
+ }
+ }
+
+ std::string ExceptionTranslatorRegistry::tryTranslators() const {
+ if (m_translators.empty()) {
+ std::rethrow_exception(std::current_exception());
+ } else {
+ return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());
+ }
+ }
+
+#else // ^^ Exceptions are enabled // Exceptions are disabled vv
+ std::string ExceptionTranslatorRegistry::translateActiveException() const {
+ CATCH_INTERNAL_ERROR("Attempted to translate active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
+ }
+
+ std::string ExceptionTranslatorRegistry::tryTranslators() const {
+ CATCH_INTERNAL_ERROR("Attempted to use exception translators under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
+ }
+#endif
+
+}
+// end catch_exception_translator_registry.cpp
+// start catch_fatal_condition.cpp
+
+#include <algorithm>
+
+#if !defined( CATCH_CONFIG_WINDOWS_SEH ) && !defined( CATCH_CONFIG_POSIX_SIGNALS )
+
+namespace Catch {
+
+ // If neither SEH nor signal handling is required, the handler impls
+ // do not have to do anything, and can be empty.
+ void FatalConditionHandler::engage_platform() {}
+ void FatalConditionHandler::disengage_platform() {}
+ FatalConditionHandler::FatalConditionHandler() = default;
+ FatalConditionHandler::~FatalConditionHandler() = default;
+
+} // end namespace Catch
+
+#endif // !CATCH_CONFIG_WINDOWS_SEH && !CATCH_CONFIG_POSIX_SIGNALS
+
+#if defined( CATCH_CONFIG_WINDOWS_SEH ) && defined( CATCH_CONFIG_POSIX_SIGNALS )
+#error "Inconsistent configuration: Windows' SEH handling and POSIX signals cannot be enabled at the same time"
+#endif // CATCH_CONFIG_WINDOWS_SEH && CATCH_CONFIG_POSIX_SIGNALS
+
+#if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS )
+
+namespace {
+ //! Signals fatal error message to the run context
+ void reportFatal( char const * const message ) {
+ Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message );
+ }
+
+ //! Minimal size Catch2 needs for its own fatal error handling.
+ //! Picked anecdotally, so it might not be sufficient on all
+ //! platforms, and for all configurations.
+ constexpr std::size_t minStackSizeForErrors = 32 * 1024;
+} // end unnamed namespace
+
+#endif // CATCH_CONFIG_WINDOWS_SEH || CATCH_CONFIG_POSIX_SIGNALS
+
+#if defined( CATCH_CONFIG_WINDOWS_SEH )
+
+namespace Catch {
+
+ struct SignalDefs { DWORD id; const char* name; };
+
+ // There is no 1-1 mapping between signals and windows exceptions.
+ // Windows can easily distinguish between SO and SigSegV,
+ // but SigInt, SigTerm, etc are handled differently.
+ static SignalDefs signalDefs[] = {
+ { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal" },
+ { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" },
+ { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" },
+ { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" },
+ };
+
+ static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
+ for (auto const& def : signalDefs) {
+ if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {
+ reportFatal(def.name);
+ }
+ }
+ // If its not an exception we care about, pass it along.
+ // This stops us from eating debugger breaks etc.
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+
+ // Since we do not support multiple instantiations, we put these
+ // into global variables and rely on cleaning them up in outlined
+ // constructors/destructors
+ static PVOID exceptionHandlerHandle = nullptr;
+
+ // For MSVC, we reserve part of the stack memory for handling
+ // memory overflow structured exception.
+ FatalConditionHandler::FatalConditionHandler() {
+ ULONG guaranteeSize = static_cast<ULONG>(minStackSizeForErrors);
+ if (!SetThreadStackGuarantee(&guaranteeSize)) {
+ // We do not want to fully error out, because needing
+ // the stack reserve should be rare enough anyway.
+ Catch::cerr()
+ << "Failed to reserve piece of stack."
+ << " Stack overflows will not be reported successfully.";
+ }
+ }
+
+ // We do not attempt to unset the stack guarantee, because
+ // Windows does not support lowering the stack size guarantee.
+ FatalConditionHandler::~FatalConditionHandler() = default;
+
+ void FatalConditionHandler::engage_platform() {
+ // Register as first handler in current chain
+ exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
+ if (!exceptionHandlerHandle) {
+ CATCH_RUNTIME_ERROR("Could not register vectored exception handler");
+ }
+ }
+
+ void FatalConditionHandler::disengage_platform() {
+ if (!RemoveVectoredExceptionHandler(exceptionHandlerHandle)) {
+ CATCH_RUNTIME_ERROR("Could not unregister vectored exception handler");
+ }
+ exceptionHandlerHandle = nullptr;
+ }
+
+} // end namespace Catch
+
+#endif // CATCH_CONFIG_WINDOWS_SEH
+
+#if defined( CATCH_CONFIG_POSIX_SIGNALS )
+
+#include <signal.h>
+
+namespace Catch {
+
+ struct SignalDefs {
+ int id;
+ const char* name;
+ };
+
+ static SignalDefs signalDefs[] = {
+ { SIGINT, "SIGINT - Terminal interrupt signal" },
+ { SIGILL, "SIGILL - Illegal instruction signal" },
+ { SIGFPE, "SIGFPE - Floating point error signal" },
+ { SIGSEGV, "SIGSEGV - Segmentation violation signal" },
+ { SIGTERM, "SIGTERM - Termination request signal" },
+ { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" }
+ };
+
+// Older GCCs trigger -Wmissing-field-initializers for T foo = {}
+// which is zero initialization, but not explicit. We want to avoid
+// that.
+#if defined(__GNUC__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#endif
+
+ static char* altStackMem = nullptr;
+ static std::size_t altStackSize = 0;
+ static stack_t oldSigStack{};
+ static struct sigaction oldSigActions[sizeof(signalDefs) / sizeof(SignalDefs)]{};
+
+ static void restorePreviousSignalHandlers() {
+ // We set signal handlers back to the previous ones. Hopefully
+ // nobody overwrote them in the meantime, and doesn't expect
+ // their signal handlers to live past ours given that they
+ // installed them after ours..
+ for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
+ sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
+ }
+ // Return the old stack
+ sigaltstack(&oldSigStack, nullptr);
+ }
+
+ static void handleSignal( int sig ) {
+ char const * name = "<unknown signal>";
+ for (auto const& def : signalDefs) {
+ if (sig == def.id) {
+ name = def.name;
+ break;
+ }
+ }
+ // We need to restore previous signal handlers and let them do
+ // their thing, so that the users can have the debugger break
+ // when a signal is raised, and so on.
+ restorePreviousSignalHandlers();
+ reportFatal( name );
+ raise( sig );
+ }
+
+ FatalConditionHandler::FatalConditionHandler() {
+ assert(!altStackMem && "Cannot initialize POSIX signal handler when one already exists");
+ if (altStackSize == 0) {
+ altStackSize = std::max(static_cast<size_t>(SIGSTKSZ), minStackSizeForErrors);
+ }
+ altStackMem = new char[altStackSize]();
+ }
+
+ FatalConditionHandler::~FatalConditionHandler() {
+ delete[] altStackMem;
+ // We signal that another instance can be constructed by zeroing
+ // out the pointer.
+ altStackMem = nullptr;
+ }
+
+ void FatalConditionHandler::engage_platform() {
+ stack_t sigStack;
+ sigStack.ss_sp = altStackMem;
+ sigStack.ss_size = altStackSize;
+ sigStack.ss_flags = 0;
+ sigaltstack(&sigStack, &oldSigStack);
+ struct sigaction sa = { };
+
+ sa.sa_handler = handleSignal;
+ sa.sa_flags = SA_ONSTACK;
+ for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) {
+ sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
+ }
+ }
+
+#if defined(__GNUC__)
+# pragma GCC diagnostic pop
+#endif
+
+ void FatalConditionHandler::disengage_platform() {
+ restorePreviousSignalHandlers();
+ }
+
+} // end namespace Catch
+
+#endif // CATCH_CONFIG_POSIX_SIGNALS
+// end catch_fatal_condition.cpp
+// start catch_generators.cpp
+
+#include <limits>
+#include <set>
+
+namespace Catch {
+
+IGeneratorTracker::~IGeneratorTracker() {}
+
+const char* GeneratorException::what() const noexcept {
+ return m_msg;
+}
+
+namespace Generators {
+
+ GeneratorUntypedBase::~GeneratorUntypedBase() {}
+
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
+ return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo );
+ }
+
+} // namespace Generators
+} // namespace Catch
+// end catch_generators.cpp
+// start catch_interfaces_capture.cpp
+
+namespace Catch {
+ IResultCapture::~IResultCapture() = default;
+}
+// end catch_interfaces_capture.cpp
+// start catch_interfaces_config.cpp
+
+namespace Catch {
+ IConfig::~IConfig() = default;
+}
+// end catch_interfaces_config.cpp
+// start catch_interfaces_exception.cpp
+
+namespace Catch {
+ IExceptionTranslator::~IExceptionTranslator() = default;
+ IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default;
+}
+// end catch_interfaces_exception.cpp
+// start catch_interfaces_registry_hub.cpp
+
+namespace Catch {
+ IRegistryHub::~IRegistryHub() = default;
+ IMutableRegistryHub::~IMutableRegistryHub() = default;
+}
+// end catch_interfaces_registry_hub.cpp
+// start catch_interfaces_reporter.cpp
+
+// start catch_reporter_listening.h
+
+namespace Catch {
+
+ class ListeningReporter : public IStreamingReporter {
+ using Reporters = std::vector<IStreamingReporterPtr>;
+ Reporters m_listeners;
+ IStreamingReporterPtr m_reporter = nullptr;
+ ReporterPreferences m_preferences;
+
+ public:
+ ListeningReporter();
+
+ void addListener( IStreamingReporterPtr&& listener );
+ void addReporter( IStreamingReporterPtr&& reporter );
+
+ public: // IStreamingReporter
+
+ ReporterPreferences getPreferences() const override;
+
+ void noMatchingTestCases( std::string const& spec ) override;
+
+ void reportInvalidArguments(std::string const&arg) override;
+
+ static std::set<Verbosity> getSupportedVerbosities();
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void benchmarkPreparing(std::string const& name) override;
+ void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override;
+ void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override;
+ void benchmarkFailed(std::string const&) override;
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ void testRunStarting( TestRunInfo const& testRunInfo ) override;
+ void testGroupStarting( GroupInfo const& groupInfo ) override;
+ void testCaseStarting( TestCaseInfo const& testInfo ) override;
+ void sectionStarting( SectionInfo const& sectionInfo ) override;
+ void assertionStarting( AssertionInfo const& assertionInfo ) override;
+
+ // The return value indicates if the messages buffer should be cleared:
+ bool assertionEnded( AssertionStats const& assertionStats ) override;
+ void sectionEnded( SectionStats const& sectionStats ) override;
+ void testCaseEnded( TestCaseStats const& testCaseStats ) override;
+ void testGroupEnded( TestGroupStats const& testGroupStats ) override;
+ void testRunEnded( TestRunStats const& testRunStats ) override;
+
+ void skipTest( TestCaseInfo const& testInfo ) override;
+ bool isMulti() const override;
+
+ };
+
+} // end namespace Catch
+
+// end catch_reporter_listening.h
+namespace Catch {
+
+ ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig )
+ : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}
+
+ ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream )
+ : m_stream( &_stream ), m_fullConfig( _fullConfig ) {}
+
+ std::ostream& ReporterConfig::stream() const { return *m_stream; }
+ IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; }
+
+ TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {}
+
+ GroupInfo::GroupInfo( std::string const& _name,
+ std::size_t _groupIndex,
+ std::size_t _groupsCount )
+ : name( _name ),
+ groupIndex( _groupIndex ),
+ groupsCounts( _groupsCount )
+ {}
+
+ AssertionStats::AssertionStats( AssertionResult const& _assertionResult,
+ std::vector<MessageInfo> const& _infoMessages,
+ Totals const& _totals )
+ : assertionResult( _assertionResult ),
+ infoMessages( _infoMessages ),
+ totals( _totals )
+ {
+ assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression;
+
+ if( assertionResult.hasMessage() ) {
+ // Copy message into messages list.
+ // !TBD This should have been done earlier, somewhere
+ MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );
+ builder << assertionResult.getMessage();
+ builder.m_info.message = builder.m_stream.str();
+
+ infoMessages.push_back( builder.m_info );
+ }
+ }
+
+ AssertionStats::~AssertionStats() = default;
+
+ SectionStats::SectionStats( SectionInfo const& _sectionInfo,
+ Counts const& _assertions,
+ double _durationInSeconds,
+ bool _missingAssertions )
+ : sectionInfo( _sectionInfo ),
+ assertions( _assertions ),
+ durationInSeconds( _durationInSeconds ),
+ missingAssertions( _missingAssertions )
+ {}
+
+ SectionStats::~SectionStats() = default;
+
+ TestCaseStats::TestCaseStats( TestCaseInfo const& _testInfo,
+ Totals const& _totals,
+ std::string const& _stdOut,
+ std::string const& _stdErr,
+ bool _aborting )
+ : testInfo( _testInfo ),
+ totals( _totals ),
+ stdOut( _stdOut ),
+ stdErr( _stdErr ),
+ aborting( _aborting )
+ {}
+
+ TestCaseStats::~TestCaseStats() = default;
+
+ TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : groupInfo( _groupInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+
+ TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo )
+ : groupInfo( _groupInfo ),
+ aborting( false )
+ {}
+
+ TestGroupStats::~TestGroupStats() = default;
+
+ TestRunStats::TestRunStats( TestRunInfo const& _runInfo,
+ Totals const& _totals,
+ bool _aborting )
+ : runInfo( _runInfo ),
+ totals( _totals ),
+ aborting( _aborting )
+ {}
+
+ TestRunStats::~TestRunStats() = default;
+
+ void IStreamingReporter::fatalErrorEncountered( StringRef ) {}
+ bool IStreamingReporter::isMulti() const { return false; }
+
+ IReporterFactory::~IReporterFactory() = default;
+ IReporterRegistry::~IReporterRegistry() = default;
+
+} // end namespace Catch
+// end catch_interfaces_reporter.cpp
+// start catch_interfaces_runner.cpp
+
+namespace Catch {
+ IRunner::~IRunner() = default;
+}
+// end catch_interfaces_runner.cpp
+// start catch_interfaces_testcase.cpp
+
+namespace Catch {
+ ITestInvoker::~ITestInvoker() = default;
+ ITestCaseRegistry::~ITestCaseRegistry() = default;
+}
+// end catch_interfaces_testcase.cpp
+// start catch_leak_detector.cpp
+
+#ifdef CATCH_CONFIG_WINDOWS_CRTDBG
+#include <crtdbg.h>
+
+namespace Catch {
+
+ LeakDetector::LeakDetector() {
+ int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
+ flag |= _CRTDBG_LEAK_CHECK_DF;
+ flag |= _CRTDBG_ALLOC_MEM_DF;
+ _CrtSetDbgFlag(flag);
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+ _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+ // Change this to leaking allocation's number to break there
+ _CrtSetBreakAlloc(-1);
+ }
+}
+
+#else
+
+ Catch::LeakDetector::LeakDetector() {}
+
+#endif
+
+Catch::LeakDetector::~LeakDetector() {
+ Catch::cleanUp();
+}
+// end catch_leak_detector.cpp
+// start catch_list.cpp
+
+// start catch_list.h
+
+#include <set>
+
+namespace Catch {
+
+ std::size_t listTests( Config const& config );
+
+ std::size_t listTestsNamesOnly( Config const& config );
+
+ struct TagInfo {
+ void add( std::string const& spelling );
+ std::string all() const;
+
+ std::set<std::string> spellings;
+ std::size_t count = 0;
+ };
+
+ std::size_t listTags( Config const& config );
+
+ std::size_t listReporters();
+
+ Option<std::size_t> list( std::shared_ptr<Config> const& config );
+
+} // end namespace Catch
+
+// end catch_list.h
+// start catch_text.h
+
+namespace Catch {
+ using namespace clara::TextFlow;
+}
+
+// end catch_text.h
+#include <limits>
+#include <algorithm>
+#include <iomanip>
+
+namespace Catch {
+
+ std::size_t listTests( Config const& config ) {
+ TestSpec const& testSpec = config.testSpec();
+ if( config.hasTestFilters() )
+ Catch::cout() << "Matching test cases:\n";
+ else {
+ Catch::cout() << "All available test cases:\n";
+ }
+
+ auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( auto const& testCaseInfo : matchedTestCases ) {
+ Colour::Code colour = testCaseInfo.isHidden()
+ ? Colour::SecondaryText
+ : Colour::None;
+ Colour colourGuard( colour );
+
+ Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << "\n";
+ if( config.verbosity() >= Verbosity::High ) {
+ Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl;
+ std::string description = testCaseInfo.description;
+ if( description.empty() )
+ description = "(NO DESCRIPTION)";
+ Catch::cout() << Column( description ).indent(4) << std::endl;
+ }
+ if( !testCaseInfo.tags.empty() )
+ Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << "\n";
+ }
+
+ if( !config.hasTestFilters() )
+ Catch::cout() << pluralise( matchedTestCases.size(), "test case" ) << '\n' << std::endl;
+ else
+ Catch::cout() << pluralise( matchedTestCases.size(), "matching test case" ) << '\n' << std::endl;
+ return matchedTestCases.size();
+ }
+
+ std::size_t listTestsNamesOnly( Config const& config ) {
+ TestSpec const& testSpec = config.testSpec();
+ std::size_t matchedTests = 0;
+ std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( auto const& testCaseInfo : matchedTestCases ) {
+ matchedTests++;
+ if( startsWith( testCaseInfo.name, '#' ) )
+ Catch::cout() << '"' << testCaseInfo.name << '"';
+ else
+ Catch::cout() << testCaseInfo.name;
+ if ( config.verbosity() >= Verbosity::High )
+ Catch::cout() << "\t@" << testCaseInfo.lineInfo;
+ Catch::cout() << std::endl;
+ }
+ return matchedTests;
+ }
+
+ void TagInfo::add( std::string const& spelling ) {
+ ++count;
+ spellings.insert( spelling );
+ }
+
+ std::string TagInfo::all() const {
+ size_t size = 0;
+ for (auto const& spelling : spellings) {
+ // Add 2 for the brackes
+ size += spelling.size() + 2;
+ }
+
+ std::string out; out.reserve(size);
+ for (auto const& spelling : spellings) {
+ out += '[';
+ out += spelling;
+ out += ']';
+ }
+ return out;
+ }
+
+ std::size_t listTags( Config const& config ) {
+ TestSpec const& testSpec = config.testSpec();
+ if( config.hasTestFilters() )
+ Catch::cout() << "Tags for matching test cases:\n";
+ else {
+ Catch::cout() << "All available tags:\n";
+ }
+
+ std::map<std::string, TagInfo> tagCounts;
+
+ std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
+ for( auto const& testCase : matchedTestCases ) {
+ for( auto const& tagName : testCase.getTestCaseInfo().tags ) {
+ std::string lcaseTagName = toLower( tagName );
+ auto countIt = tagCounts.find( lcaseTagName );
+ if( countIt == tagCounts.end() )
+ countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;
+ countIt->second.add( tagName );
+ }
+ }
+
+ for( auto const& tagCount : tagCounts ) {
+ ReusableStringStream rss;
+ rss << " " << std::setw(2) << tagCount.second.count << " ";
+ auto str = rss.str();
+ auto wrapper = Column( tagCount.second.all() )
+ .initialIndent( 0 )
+ .indent( str.size() )
+ .width( CATCH_CONFIG_CONSOLE_WIDTH-10 );
+ Catch::cout() << str << wrapper << '\n';
+ }
+ Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl;
+ return tagCounts.size();
+ }
+
+ std::size_t listReporters() {
+ Catch::cout() << "Available reporters:\n";
+ IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
+ std::size_t maxNameLen = 0;
+ for( auto const& factoryKvp : factories )
+ maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() );
+
+ for( auto const& factoryKvp : factories ) {
+ Catch::cout()
+ << Column( factoryKvp.first + ":" )
+ .indent(2)
+ .width( 5+maxNameLen )
+ + Column( factoryKvp.second->getDescription() )
+ .initialIndent(0)
+ .indent(2)
+ .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 )
+ << "\n";
+ }
+ Catch::cout() << std::endl;
+ return factories.size();
+ }
+
+ Option<std::size_t> list( std::shared_ptr<Config> const& config ) {
+ Option<std::size_t> listedCount;
+ getCurrentMutableContext().setConfig( config );
+ if( config->listTests() )
+ listedCount = listedCount.valueOr(0) + listTests( *config );
+ if( config->listTestNamesOnly() )
+ listedCount = listedCount.valueOr(0) + listTestsNamesOnly( *config );
+ if( config->listTags() )
+ listedCount = listedCount.valueOr(0) + listTags( *config );
+ if( config->listReporters() )
+ listedCount = listedCount.valueOr(0) + listReporters();
+ return listedCount;
+ }
+
+} // end namespace Catch
+// end catch_list.cpp
+// start catch_matchers.cpp
+
+namespace Catch {
+namespace Matchers {
+ namespace Impl {
+
+ std::string MatcherUntypedBase::toString() const {
+ if( m_cachedToString.empty() )
+ m_cachedToString = describe();
+ return m_cachedToString;
+ }
+
+ MatcherUntypedBase::~MatcherUntypedBase() = default;
+
+ } // namespace Impl
+} // namespace Matchers
+
+using namespace Matchers;
+using Matchers::Impl::MatcherBase;
+
+} // namespace Catch
+// end catch_matchers.cpp
+// start catch_matchers_exception.cpp
+
+namespace Catch {
+namespace Matchers {
+namespace Exception {
+
+bool ExceptionMessageMatcher::match(std::exception const& ex) const {
+ return ex.what() == m_message;
+}
+
+std::string ExceptionMessageMatcher::describe() const {
+ return "exception message matches \"" + m_message + "\"";
+}
+
+}
+Exception::ExceptionMessageMatcher Message(std::string const& message) {
+ return Exception::ExceptionMessageMatcher(message);
+}
+
+// namespace Exception
+} // namespace Matchers
+} // namespace Catch
+// end catch_matchers_exception.cpp
+// start catch_matchers_floating.cpp
+
+// start catch_polyfills.hpp
+
+namespace Catch {
+ bool isnan(float f);
+ bool isnan(double d);
+}
+
+// end catch_polyfills.hpp
+// start catch_to_string.hpp
+
+#include <string>
+
+namespace Catch {
+ template <typename T>
+ std::string to_string(T const& t) {
+#if defined(CATCH_CONFIG_CPP11_TO_STRING)
+ return std::to_string(t);
+#else
+ ReusableStringStream rss;
+ rss << t;
+ return rss.str();
+#endif
+ }
+} // end namespace Catch
+
+// end catch_to_string.hpp
+#include <algorithm>
+#include <cmath>
+#include <cstdlib>
+#include <cstdint>
+#include <cstring>
+#include <sstream>
+#include <type_traits>
+#include <iomanip>
+#include <limits>
+
+namespace Catch {
+namespace {
+
+ int32_t convert(float f) {
+ static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated");
+ int32_t i;
+ std::memcpy(&i, &f, sizeof(f));
+ return i;
+ }
+
+ int64_t convert(double d) {
+ static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated");
+ int64_t i;
+ std::memcpy(&i, &d, sizeof(d));
+ return i;
+ }
+
+ template <typename FP>
+ bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) {
+ // Comparison with NaN should always be false.
+ // This way we can rule it out before getting into the ugly details
+ if (Catch::isnan(lhs) || Catch::isnan(rhs)) {
+ return false;
+ }
+
+ auto lc = convert(lhs);
+ auto rc = convert(rhs);
+
+ if ((lc < 0) != (rc < 0)) {
+ // Potentially we can have +0 and -0
+ return lhs == rhs;
+ }
+
+ // static cast as a workaround for IBM XLC
+ auto ulpDiff = std::abs(static_cast<FP>(lc - rc));
+ return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff;
+ }
+
+#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
+
+ float nextafter(float x, float y) {
+ return ::nextafterf(x, y);
+ }
+
+ double nextafter(double x, double y) {
+ return ::nextafter(x, y);
+ }
+
+#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^
+
+template <typename FP>
+FP step(FP start, FP direction, uint64_t steps) {
+ for (uint64_t i = 0; i < steps; ++i) {
+#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
+ start = Catch::nextafter(start, direction);
+#else
+ start = std::nextafter(start, direction);
+#endif
+ }
+ return start;
+}
+
+// Performs equivalent check of std::fabs(lhs - rhs) <= margin
+// But without the subtraction to allow for INFINITY in comparison
+bool marginComparison(double lhs, double rhs, double margin) {
+ return (lhs + margin >= rhs) && (rhs + margin >= lhs);
+}
+
+template <typename FloatingPoint>
+void write(std::ostream& out, FloatingPoint num) {
+ out << std::scientific
+ << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1)
+ << num;
+}
+
+} // end anonymous namespace
+
+namespace Matchers {
+namespace Floating {
+
+ enum class FloatingPointKind : uint8_t {
+ Float,
+ Double
+ };
+
+ WithinAbsMatcher::WithinAbsMatcher(double target, double margin)
+ :m_target{ target }, m_margin{ margin } {
+ CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.'
+ << " Margin has to be non-negative.");
+ }
+
+ // Performs equivalent check of std::fabs(lhs - rhs) <= margin
+ // But without the subtraction to allow for INFINITY in comparison
+ bool WithinAbsMatcher::match(double const& matchee) const {
+ return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee);
+ }
+
+ std::string WithinAbsMatcher::describe() const {
+ return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target);
+ }
+
+ WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType)
+ :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } {
+ CATCH_ENFORCE(m_type == FloatingPointKind::Double
+ || m_ulps < (std::numeric_limits<uint32_t>::max)(),
+ "Provided ULP is impossibly large for a float comparison.");
+ }
+
+#if defined(__clang__)
+#pragma clang diagnostic push
+// Clang <3.5 reports on the default branch in the switch below
+#pragma clang diagnostic ignored "-Wunreachable-code"
+#endif
+
+ bool WithinUlpsMatcher::match(double const& matchee) const {
+ switch (m_type) {
+ case FloatingPointKind::Float:
+ return almostEqualUlps<float>(static_cast<float>(matchee), static_cast<float>(m_target), m_ulps);
+ case FloatingPointKind::Double:
+ return almostEqualUlps<double>(matchee, m_target, m_ulps);
+ default:
+ CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" );
+ }
+ }
+
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#endif
+
+ std::string WithinUlpsMatcher::describe() const {
+ std::stringstream ret;
+
+ ret << "is within " << m_ulps << " ULPs of ";
+
+ if (m_type == FloatingPointKind::Float) {
+ write(ret, static_cast<float>(m_target));
+ ret << 'f';
+ } else {
+ write(ret, m_target);
+ }
+
+ ret << " ([";
+ if (m_type == FloatingPointKind::Double) {
+ write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps));
+ ret << ", ";
+ write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps));
+ } else {
+ // We have to cast INFINITY to float because of MinGW, see #1782
+ write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps));
+ ret << ", ";
+ write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps));
+ }
+ ret << "])";
+
+ return ret.str();
+ }
+
+ WithinRelMatcher::WithinRelMatcher(double target, double epsilon):
+ m_target(target),
+ m_epsilon(epsilon){
+ CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense.");
+ CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense.");
+ }
+
+ bool WithinRelMatcher::match(double const& matchee) const {
+ const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target));
+ return marginComparison(matchee, m_target,
+ std::isinf(relMargin)? 0 : relMargin);
+ }
+
+ std::string WithinRelMatcher::describe() const {
+ Catch::ReusableStringStream sstr;
+ sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other";
+ return sstr.str();
+ }
+
+}// namespace Floating
+
+Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) {
+ return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double);
+}
+
+Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) {
+ return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float);
+}
+
+Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
+ return Floating::WithinAbsMatcher(target, margin);
+}
+
+Floating::WithinRelMatcher WithinRel(double target, double eps) {
+ return Floating::WithinRelMatcher(target, eps);
+}
+
+Floating::WithinRelMatcher WithinRel(double target) {
+ return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100);
+}
+
+Floating::WithinRelMatcher WithinRel(float target, float eps) {
+ return Floating::WithinRelMatcher(target, eps);
+}
+
+Floating::WithinRelMatcher WithinRel(float target) {
+ return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100);
+}
+
+} // namespace Matchers
+} // namespace Catch
+// end catch_matchers_floating.cpp
+// start catch_matchers_generic.cpp
+
+std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) {
+ if (desc.empty()) {
+ return "matches undescribed predicate";
+ } else {
+ return "matches predicate: \"" + desc + '"';
+ }
+}
+// end catch_matchers_generic.cpp
+// start catch_matchers_string.cpp
+
+#include <regex>
+
+namespace Catch {
+namespace Matchers {
+
+ namespace StdString {
+
+ CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )
+ : m_caseSensitivity( caseSensitivity ),
+ m_str( adjustString( str ) )
+ {}
+ std::string CasedString::adjustString( std::string const& str ) const {
+ return m_caseSensitivity == CaseSensitive::No
+ ? toLower( str )
+ : str;
+ }
+ std::string CasedString::caseSensitivitySuffix() const {
+ return m_caseSensitivity == CaseSensitive::No
+ ? " (case insensitive)"
+ : std::string();
+ }
+
+ StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator )
+ : m_comparator( comparator ),
+ m_operation( operation ) {
+ }
+
+ std::string StringMatcherBase::describe() const {
+ std::string description;
+ description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +
+ m_comparator.caseSensitivitySuffix().size());
+ description += m_operation;
+ description += ": \"";
+ description += m_comparator.m_str;
+ description += "\"";
+ description += m_comparator.caseSensitivitySuffix();
+ return description;
+ }
+
+ EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {}
+
+ bool EqualsMatcher::match( std::string const& source ) const {
+ return m_comparator.adjustString( source ) == m_comparator.m_str;
+ }
+
+ ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {}
+
+ bool ContainsMatcher::match( std::string const& source ) const {
+ return contains( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {}
+
+ bool StartsWithMatcher::match( std::string const& source ) const {
+ return startsWith( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {}
+
+ bool EndsWithMatcher::match( std::string const& source ) const {
+ return endsWith( m_comparator.adjustString( source ), m_comparator.m_str );
+ }
+
+ RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {}
+
+ bool RegexMatcher::match(std::string const& matchee) const {
+ auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway
+ if (m_caseSensitivity == CaseSensitive::Choice::No) {
+ flags |= std::regex::icase;
+ }
+ auto reg = std::regex(m_regex, flags);
+ return std::regex_match(matchee, reg);
+ }
+
+ std::string RegexMatcher::describe() const {
+ return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively");
+ }
+
+ } // namespace StdString
+
+ StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+ StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {
+ return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) );
+ }
+
+ StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) {
+ return StdString::RegexMatcher(regex, caseSensitivity);
+ }
+
+} // namespace Matchers
+} // namespace Catch
+// end catch_matchers_string.cpp
+// start catch_message.cpp
+
+// start catch_uncaught_exceptions.h
+
+namespace Catch {
+ bool uncaught_exceptions();
+} // end namespace Catch
+
+// end catch_uncaught_exceptions.h
+#include <cassert>
+#include <stack>
+
+namespace Catch {
+
+ MessageInfo::MessageInfo( StringRef const& _macroName,
+ SourceLineInfo const& _lineInfo,
+ ResultWas::OfType _type )
+ : macroName( _macroName ),
+ lineInfo( _lineInfo ),
+ type( _type ),
+ sequence( ++globalCount )
+ {}
+
+ bool MessageInfo::operator==( MessageInfo const& other ) const {
+ return sequence == other.sequence;
+ }
+
+ bool MessageInfo::operator<( MessageInfo const& other ) const {
+ return sequence < other.sequence;
+ }
+
+ // This may need protecting if threading support is added
+ unsigned int MessageInfo::globalCount = 0;
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ Catch::MessageBuilder::MessageBuilder( StringRef const& macroName,
+ SourceLineInfo const& lineInfo,
+ ResultWas::OfType type )
+ :m_info(macroName, lineInfo, type) {}
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ ScopedMessage::ScopedMessage( MessageBuilder const& builder )
+ : m_info( builder.m_info ), m_moved()
+ {
+ m_info.message = builder.m_stream.str();
+ getResultCapture().pushScopedMessage( m_info );
+ }
+
+ ScopedMessage::ScopedMessage( ScopedMessage&& old )
+ : m_info( old.m_info ), m_moved()
+ {
+ old.m_moved = true;
+ }
+
+ ScopedMessage::~ScopedMessage() {
+ if ( !uncaught_exceptions() && !m_moved ){
+ getResultCapture().popScopedMessage(m_info);
+ }
+ }
+
+ Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
+ auto trimmed = [&] (size_t start, size_t end) {
+ while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
+ ++start;
+ }
+ while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {
+ --end;
+ }
+ return names.substr(start, end - start + 1);
+ };
+ auto skipq = [&] (size_t start, char quote) {
+ for (auto i = start + 1; i < names.size() ; ++i) {
+ if (names[i] == quote)
+ return i;
+ if (names[i] == '\\')
+ ++i;
+ }
+ CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote");
+ };
+
+ size_t start = 0;
+ std::stack<char> openings;
+ for (size_t pos = 0; pos < names.size(); ++pos) {
+ char c = names[pos];
+ switch (c) {
+ case '[':
+ case '{':
+ case '(':
+ // It is basically impossible to disambiguate between
+ // comparison and start of template args in this context
+// case '<':
+ openings.push(c);
+ break;
+ case ']':
+ case '}':
+ case ')':
+// case '>':
+ openings.pop();
+ break;
+ case '"':
+ case '\'':
+ pos = skipq(pos, c);
+ break;
+ case ',':
+ if (start != pos && openings.empty()) {
+ m_messages.emplace_back(macroName, lineInfo, resultType);
+ m_messages.back().message = static_cast<std::string>(trimmed(start, pos));
+ m_messages.back().message += " := ";
+ start = pos;
+ }
+ }
+ }
+ assert(openings.empty() && "Mismatched openings");
+ m_messages.emplace_back(macroName, lineInfo, resultType);
+ m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
+ m_messages.back().message += " := ";
+ }
+ Capturer::~Capturer() {
+ if ( !uncaught_exceptions() ){
+ assert( m_captured == m_messages.size() );
+ for( size_t i = 0; i < m_captured; ++i )
+ m_resultCapture.popScopedMessage( m_messages[i] );
+ }
+ }
+
+ void Capturer::captureValue( size_t index, std::string const& value ) {
+ assert( index < m_messages.size() );
+ m_messages[index].message += value;
+ m_resultCapture.pushScopedMessage( m_messages[index] );
+ m_captured++;
+ }
+
+} // end namespace Catch
+// end catch_message.cpp
+// start catch_output_redirect.cpp
+
+// start catch_output_redirect.h
+#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
+#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
+
+#include <cstdio>
+#include <iosfwd>
+#include <string>
+
+namespace Catch {
+
+ class RedirectedStream {
+ std::ostream& m_originalStream;
+ std::ostream& m_redirectionStream;
+ std::streambuf* m_prevBuf;
+
+ public:
+ RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream );
+ ~RedirectedStream();
+ };
+
+ class RedirectedStdOut {
+ ReusableStringStream m_rss;
+ RedirectedStream m_cout;
+ public:
+ RedirectedStdOut();
+ auto str() const -> std::string;
+ };
+
+ // StdErr has two constituent streams in C++, std::cerr and std::clog
+ // This means that we need to redirect 2 streams into 1 to keep proper
+ // order of writes
+ class RedirectedStdErr {
+ ReusableStringStream m_rss;
+ RedirectedStream m_cerr;
+ RedirectedStream m_clog;
+ public:
+ RedirectedStdErr();
+ auto str() const -> std::string;
+ };
+
+ class RedirectedStreams {
+ public:
+ RedirectedStreams(RedirectedStreams const&) = delete;
+ RedirectedStreams& operator=(RedirectedStreams const&) = delete;
+ RedirectedStreams(RedirectedStreams&&) = delete;
+ RedirectedStreams& operator=(RedirectedStreams&&) = delete;
+
+ RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr);
+ ~RedirectedStreams();
+ private:
+ std::string& m_redirectedCout;
+ std::string& m_redirectedCerr;
+ RedirectedStdOut m_redirectedStdOut;
+ RedirectedStdErr m_redirectedStdErr;
+ };
+
+#if defined(CATCH_CONFIG_NEW_CAPTURE)
+
+ // Windows's implementation of std::tmpfile is terrible (it tries
+ // to create a file inside system folder, thus requiring elevated
+ // privileges for the binary), so we have to use tmpnam(_s) and
+ // create the file ourselves there.
+ class TempFile {
+ public:
+ TempFile(TempFile const&) = delete;
+ TempFile& operator=(TempFile const&) = delete;
+ TempFile(TempFile&&) = delete;
+ TempFile& operator=(TempFile&&) = delete;
+
+ TempFile();
+ ~TempFile();
+
+ std::FILE* getFile();
+ std::string getContents();
+
+ private:
+ std::FILE* m_file = nullptr;
+ #if defined(_MSC_VER)
+ char m_buffer[L_tmpnam] = { 0 };
+ #endif
+ };
+
+ class OutputRedirect {
+ public:
+ OutputRedirect(OutputRedirect const&) = delete;
+ OutputRedirect& operator=(OutputRedirect const&) = delete;
+ OutputRedirect(OutputRedirect&&) = delete;
+ OutputRedirect& operator=(OutputRedirect&&) = delete;
+
+ OutputRedirect(std::string& stdout_dest, std::string& stderr_dest);
+ ~OutputRedirect();
+
+ private:
+ int m_originalStdout = -1;
+ int m_originalStderr = -1;
+ TempFile m_stdoutFile;
+ TempFile m_stderrFile;
+ std::string& m_stdoutDest;
+ std::string& m_stderrDest;
+ };
+
+#endif
+
+} // end namespace Catch
+
+#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
+// end catch_output_redirect.h
+#include <cstdio>
+#include <cstring>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#if defined(CATCH_CONFIG_NEW_CAPTURE)
+ #if defined(_MSC_VER)
+ #include <io.h> //_dup and _dup2
+ #define dup _dup
+ #define dup2 _dup2
+ #define fileno _fileno
+ #else
+ #include <unistd.h> // dup and dup2
+ #endif
+#endif
+
+namespace Catch {
+
+ RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream )
+ : m_originalStream( originalStream ),
+ m_redirectionStream( redirectionStream ),
+ m_prevBuf( m_originalStream.rdbuf() )
+ {
+ m_originalStream.rdbuf( m_redirectionStream.rdbuf() );
+ }
+
+ RedirectedStream::~RedirectedStream() {
+ m_originalStream.rdbuf( m_prevBuf );
+ }
+
+ RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {}
+ auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); }
+
+ RedirectedStdErr::RedirectedStdErr()
+ : m_cerr( Catch::cerr(), m_rss.get() ),
+ m_clog( Catch::clog(), m_rss.get() )
+ {}
+ auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); }
+
+ RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr)
+ : m_redirectedCout(redirectedCout),
+ m_redirectedCerr(redirectedCerr)
+ {}
+
+ RedirectedStreams::~RedirectedStreams() {
+ m_redirectedCout += m_redirectedStdOut.str();
+ m_redirectedCerr += m_redirectedStdErr.str();
+ }
+
+#if defined(CATCH_CONFIG_NEW_CAPTURE)
+
+#if defined(_MSC_VER)
+ TempFile::TempFile() {
+ if (tmpnam_s(m_buffer)) {
+ CATCH_RUNTIME_ERROR("Could not get a temp filename");
+ }
+ if (fopen_s(&m_file, m_buffer, "w+")) {
+ char buffer[100];
+ if (strerror_s(buffer, errno)) {
+ CATCH_RUNTIME_ERROR("Could not translate errno to a string");
+ }
+ CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer << "' because: " << buffer);
+ }
+ }
+#else
+ TempFile::TempFile() {
+ m_file = std::tmpfile();
+ if (!m_file) {
+ CATCH_RUNTIME_ERROR("Could not create a temp file.");
+ }
+ }
+
+#endif
+
+ TempFile::~TempFile() {
+ // TBD: What to do about errors here?
+ std::fclose(m_file);
+ // We manually create the file on Windows only, on Linux
+ // it will be autodeleted
+#if defined(_MSC_VER)
+ std::remove(m_buffer);
+#endif
+ }
+
+ FILE* TempFile::getFile() {
+ return m_file;
+ }
+
+ std::string TempFile::getContents() {
+ std::stringstream sstr;
+ char buffer[100] = {};
+ std::rewind(m_file);
+ while (std::fgets(buffer, sizeof(buffer), m_file)) {
+ sstr << buffer;
+ }
+ return sstr.str();
+ }
+
+ OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) :
+ m_originalStdout(dup(1)),
+ m_originalStderr(dup(2)),
+ m_stdoutDest(stdout_dest),
+ m_stderrDest(stderr_dest) {
+ dup2(fileno(m_stdoutFile.getFile()), 1);
+ dup2(fileno(m_stderrFile.getFile()), 2);
+ }
+
+ OutputRedirect::~OutputRedirect() {
+ Catch::cout() << std::flush;
+ fflush(stdout);
+ // Since we support overriding these streams, we flush cerr
+ // even though std::cerr is unbuffered
+ Catch::cerr() << std::flush;
+ Catch::clog() << std::flush;
+ fflush(stderr);
+
+ dup2(m_originalStdout, 1);
+ dup2(m_originalStderr, 2);
+
+ m_stdoutDest += m_stdoutFile.getContents();
+ m_stderrDest += m_stderrFile.getContents();
+ }
+
+#endif // CATCH_CONFIG_NEW_CAPTURE
+
+} // namespace Catch
+
+#if defined(CATCH_CONFIG_NEW_CAPTURE)
+ #if defined(_MSC_VER)
+ #undef dup
+ #undef dup2
+ #undef fileno
+ #endif
+#endif
+// end catch_output_redirect.cpp
+// start catch_polyfills.cpp
+
+#include <cmath>
+
+namespace Catch {
+
+#if !defined(CATCH_CONFIG_POLYFILL_ISNAN)
+ bool isnan(float f) {
+ return std::isnan(f);
+ }
+ bool isnan(double d) {
+ return std::isnan(d);
+ }
+#else
+ // For now we only use this for embarcadero
+ bool isnan(float f) {
+ return std::_isnan(f);
+ }
+ bool isnan(double d) {
+ return std::_isnan(d);
+ }
+#endif
+
+} // end namespace Catch
+// end catch_polyfills.cpp
+// start catch_random_number_generator.cpp
+
+namespace Catch {
+
+namespace {
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4146) // we negate uint32 during the rotate
+#endif
+ // Safe rotr implementation thanks to John Regehr
+ uint32_t rotate_right(uint32_t val, uint32_t count) {
+ const uint32_t mask = 31;
+ count &= mask;
+ return (val >> count) | (val << (-count & mask));
+ }
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+}
+
+ SimplePcg32::SimplePcg32(result_type seed_) {
+ seed(seed_);
+ }
+
+ void SimplePcg32::seed(result_type seed_) {
+ m_state = 0;
+ (*this)();
+ m_state += seed_;
+ (*this)();
+ }
+
+ void SimplePcg32::discard(uint64_t skip) {
+ // We could implement this to run in O(log n) steps, but this
+ // should suffice for our use case.
+ for (uint64_t s = 0; s < skip; ++s) {
+ static_cast<void>((*this)());
+ }
+ }
+
+ SimplePcg32::result_type SimplePcg32::operator()() {
+ // prepare the output value
+ const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
+ const auto output = rotate_right(xorshifted, m_state >> 59u);
+
+ // advance state
+ m_state = m_state * 6364136223846793005ULL + s_inc;
+
+ return output;
+ }
+
+ bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
+ return lhs.m_state == rhs.m_state;
+ }
+
+ bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
+ return lhs.m_state != rhs.m_state;
+ }
+}
+// end catch_random_number_generator.cpp
+// start catch_registry_hub.cpp
+
+// start catch_test_case_registry_impl.h
+
+#include <vector>
+#include <set>
+#include <algorithm>
+#include <ios>
+
+namespace Catch {
+
+ class TestCase;
+ struct IConfig;
+
+ std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases );
+
+ bool isThrowSafe( TestCase const& testCase, IConfig const& config );
+ bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );
+
+ void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions );
+
+ std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );
+ std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );
+
+ class TestRegistry : public ITestCaseRegistry {
+ public:
+ virtual ~TestRegistry() = default;
+
+ virtual void registerTest( TestCase const& testCase );
+
+ std::vector<TestCase> const& getAllTests() const override;
+ std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override;
+
+ private:
+ std::vector<TestCase> m_functions;
+ mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;
+ mutable std::vector<TestCase> m_sortedFunctions;
+ std::size_t m_unnamedCount = 0;
+ std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class TestInvokerAsFunction : public ITestInvoker {
+ void(*m_testAsFunction)();
+ public:
+ TestInvokerAsFunction( void(*testAsFunction)() ) noexcept;
+
+ void invoke() const override;
+ };
+
+ std::string extractClassName( StringRef const& classOrQualifiedMethodName );
+
+ ///////////////////////////////////////////////////////////////////////////
+
+} // end namespace Catch
+
+// end catch_test_case_registry_impl.h
+// start catch_reporter_registry.h
+
+#include <map>
+
+namespace Catch {
+
+ class ReporterRegistry : public IReporterRegistry {
+
+ public:
+
+ ~ReporterRegistry() override;
+
+ IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override;
+
+ void registerReporter( std::string const& name, IReporterFactoryPtr const& factory );
+ void registerListener( IReporterFactoryPtr const& factory );
+
+ FactoryMap const& getFactories() const override;
+ Listeners const& getListeners() const override;
+
+ private:
+ FactoryMap m_factories;
+ Listeners m_listeners;
+ };
+}
+
+// end catch_reporter_registry.h
+// start catch_tag_alias_registry.h
+
+// start catch_tag_alias.h
+
+#include <string>
+
+namespace Catch {
+
+ struct TagAlias {
+ TagAlias(std::string const& _tag, SourceLineInfo _lineInfo);
+
+ std::string tag;
+ SourceLineInfo lineInfo;
+ };
+
+} // end namespace Catch
+
+// end catch_tag_alias.h
+#include <map>
+
+namespace Catch {
+
+ class TagAliasRegistry : public ITagAliasRegistry {
+ public:
+ ~TagAliasRegistry() override;
+ TagAlias const* find( std::string const& alias ) const override;
+ std::string expandAliases( std::string const& unexpandedTestSpec ) const override;
+ void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo );
+
+ private:
+ std::map<std::string, TagAlias> m_registry;
+ };
+
+} // end namespace Catch
+
+// end catch_tag_alias_registry.h
+// start catch_startup_exception_registry.h
+
+#include <vector>
+#include <exception>
+
+namespace Catch {
+
+ class StartupExceptionRegistry {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ public:
+ void add(std::exception_ptr const& exception) noexcept;
+ std::vector<std::exception_ptr> const& getExceptions() const noexcept;
+ private:
+ std::vector<std::exception_ptr> m_exceptions;
+#endif
+ };
+
+} // end namespace Catch
+
+// end catch_startup_exception_registry.h
+// start catch_singletons.hpp
+
+namespace Catch {
+
+ struct ISingleton {
+ virtual ~ISingleton();
+ };
+
+ void addSingleton( ISingleton* singleton );
+ void cleanupSingletons();
+
+ template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT>
+ class Singleton : SingletonImplT, public ISingleton {
+
+ static auto getInternal() -> Singleton* {
+ static Singleton* s_instance = nullptr;
+ if( !s_instance ) {
+ s_instance = new Singleton;
+ addSingleton( s_instance );
+ }
+ return s_instance;
+ }
+
+ public:
+ static auto get() -> InterfaceT const& {
+ return *getInternal();
+ }
+ static auto getMutable() -> MutableInterfaceT& {
+ return *getInternal();
+ }
+ };
+
+} // namespace Catch
+
+// end catch_singletons.hpp
+namespace Catch {
+
+ namespace {
+
+ class RegistryHub : public IRegistryHub, public IMutableRegistryHub,
+ private NonCopyable {
+
+ public: // IRegistryHub
+ RegistryHub() = default;
+ IReporterRegistry const& getReporterRegistry() const override {
+ return m_reporterRegistry;
+ }
+ ITestCaseRegistry const& getTestCaseRegistry() const override {
+ return m_testCaseRegistry;
+ }
+ IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override {
+ return m_exceptionTranslatorRegistry;
+ }
+ ITagAliasRegistry const& getTagAliasRegistry() const override {
+ return m_tagAliasRegistry;
+ }
+ StartupExceptionRegistry const& getStartupExceptionRegistry() const override {
+ return m_exceptionRegistry;
+ }
+
+ public: // IMutableRegistryHub
+ void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override {
+ m_reporterRegistry.registerReporter( name, factory );
+ }
+ void registerListener( IReporterFactoryPtr const& factory ) override {
+ m_reporterRegistry.registerListener( factory );
+ }
+ void registerTest( TestCase const& testInfo ) override {
+ m_testCaseRegistry.registerTest( testInfo );
+ }
+ void registerTranslator( const IExceptionTranslator* translator ) override {
+ m_exceptionTranslatorRegistry.registerTranslator( translator );
+ }
+ void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override {
+ m_tagAliasRegistry.add( alias, tag, lineInfo );
+ }
+ void registerStartupException() noexcept override {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ m_exceptionRegistry.add(std::current_exception());
+#else
+ CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
+#endif
+ }
+ IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {
+ return m_enumValuesRegistry;
+ }
+
+ private:
+ TestRegistry m_testCaseRegistry;
+ ReporterRegistry m_reporterRegistry;
+ ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
+ TagAliasRegistry m_tagAliasRegistry;
+ StartupExceptionRegistry m_exceptionRegistry;
+ Detail::EnumValuesRegistry m_enumValuesRegistry;
+ };
+ }
+
+ using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>;
+
+ IRegistryHub const& getRegistryHub() {
+ return RegistryHubSingleton::get();
+ }
+ IMutableRegistryHub& getMutableRegistryHub() {
+ return RegistryHubSingleton::getMutable();
+ }
+ void cleanUp() {
+ cleanupSingletons();
+ cleanUpContext();
+ }
+ std::string translateActiveException() {
+ return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
+ }
+
+} // end namespace Catch
+// end catch_registry_hub.cpp
+// start catch_reporter_registry.cpp
+
+namespace Catch {
+
+ ReporterRegistry::~ReporterRegistry() = default;
+
+ IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const {
+ auto it = m_factories.find( name );
+ if( it == m_factories.end() )
+ return nullptr;
+ return it->second->create( ReporterConfig( config ) );
+ }
+
+ void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) {
+ m_factories.emplace(name, factory);
+ }
+ void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) {
+ m_listeners.push_back( factory );
+ }
+
+ IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {
+ return m_factories;
+ }
+ IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const {
+ return m_listeners;
+ }
+
+}
+// end catch_reporter_registry.cpp
+// start catch_result_type.cpp
+
+namespace Catch {
+
+ bool isOk( ResultWas::OfType resultType ) {
+ return ( resultType & ResultWas::FailureBit ) == 0;
+ }
+ bool isJustInfo( int flags ) {
+ return flags == ResultWas::Info;
+ }
+
+ ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
+ return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
+ }
+
+ bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
+ bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
+
+} // end namespace Catch
+// end catch_result_type.cpp
+// start catch_run_context.cpp
+
+#include <cassert>
+#include <algorithm>
+#include <sstream>
+
+namespace Catch {
+
+ namespace Generators {
+ struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker {
+ GeneratorBasePtr m_generator;
+
+ GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
+ : TrackerBase( nameAndLocation, ctx, parent )
+ {}
+ ~GeneratorTracker();
+
+ static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) {
+ std::shared_ptr<GeneratorTracker> tracker;
+
+ ITracker& currentTracker = ctx.currentTracker();
+ // Under specific circumstances, the generator we want
+ // to acquire is also the current tracker. If this is
+ // the case, we have to avoid looking through current
+ // tracker's children, and instead return the current
+ // tracker.
+ // A case where this check is important is e.g.
+ // for (int i = 0; i < 5; ++i) {
+ // int n = GENERATE(1, 2);
+ // }
+ //
+ // without it, the code above creates 5 nested generators.
+ if (currentTracker.nameAndLocation() == nameAndLocation) {
+ auto thisTracker = currentTracker.parent().findChild(nameAndLocation);
+ assert(thisTracker);
+ assert(thisTracker->isGeneratorTracker());
+ tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker);
+ } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {
+ assert( childTracker );
+ assert( childTracker->isGeneratorTracker() );
+ tracker = std::static_pointer_cast<GeneratorTracker>( childTracker );
+ } else {
+ tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, &currentTracker );
+ currentTracker.addChild( tracker );
+ }
+
+ if( !tracker->isComplete() ) {
+ tracker->open();
+ }
+
+ return *tracker;
+ }
+
+ // TrackerBase interface
+ bool isGeneratorTracker() const override { return true; }
+ auto hasGenerator() const -> bool override {
+ return !!m_generator;
+ }
+ void close() override {
+ TrackerBase::close();
+ // If a generator has a child (it is followed by a section)
+ // and none of its children have started, then we must wait
+ // until later to start consuming its values.
+ // This catches cases where `GENERATE` is placed between two
+ // `SECTION`s.
+ // **The check for m_children.empty cannot be removed**.
+ // doing so would break `GENERATE` _not_ followed by `SECTION`s.
+ const bool should_wait_for_child = [&]() {
+ // No children -> nobody to wait for
+ if ( m_children.empty() ) {
+ return false;
+ }
+ // If at least one child started executing, don't wait
+ if ( std::find_if(
+ m_children.begin(),
+ m_children.end(),
+ []( TestCaseTracking::ITrackerPtr tracker ) {
+ return tracker->hasStarted();
+ } ) != m_children.end() ) {
+ return false;
+ }
+
+ // No children have started. We need to check if they _can_
+ // start, and thus we should wait for them, or they cannot
+ // start (due to filters), and we shouldn't wait for them
+ auto* parent = m_parent;
+ // This is safe: there is always at least one section
+ // tracker in a test case tracking tree
+ while ( !parent->isSectionTracker() ) {
+ parent = &( parent->parent() );
+ }
+ assert( parent &&
+ "Missing root (test case) level section" );
+
+ auto const& parentSection =
+ static_cast<SectionTracker&>( *parent );
+ auto const& filters = parentSection.getFilters();
+ // No filters -> no restrictions on running sections
+ if ( filters.empty() ) {
+ return true;
+ }
+
+ for ( auto const& child : m_children ) {
+ if ( child->isSectionTracker() &&
+ std::find( filters.begin(),
+ filters.end(),
+ static_cast<SectionTracker&>( *child )
+ .trimmedName() ) !=
+ filters.end() ) {
+ return true;
+ }
+ }
+ return false;
+ }();
+
+ // This check is a bit tricky, because m_generator->next()
+ // has a side-effect, where it consumes generator's current
+ // value, but we do not want to invoke the side-effect if
+ // this generator is still waiting for any child to start.
+ if ( should_wait_for_child ||
+ ( m_runState == CompletedSuccessfully &&
+ m_generator->next() ) ) {
+ m_children.clear();
+ m_runState = Executing;
+ }
+ }
+
+ // IGeneratorTracker interface
+ auto getGenerator() const -> GeneratorBasePtr const& override {
+ return m_generator;
+ }
+ void setGenerator( GeneratorBasePtr&& generator ) override {
+ m_generator = std::move( generator );
+ }
+ };
+ GeneratorTracker::~GeneratorTracker() {}
+ }
+
+ RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter)
+ : m_runInfo(_config->name()),
+ m_context(getCurrentMutableContext()),
+ m_config(_config),
+ m_reporter(std::move(reporter)),
+ m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal },
+ m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions )
+ {
+ m_context.setRunner(this);
+ m_context.setConfig(m_config);
+ m_context.setResultCapture(this);
+ m_reporter->testRunStarting(m_runInfo);
+ }
+
+ RunContext::~RunContext() {
+ m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));
+ }
+
+ void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) {
+ m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));
+ }
+
+ void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) {
+ m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));
+ }
+
+ Totals RunContext::runTest(TestCase const& testCase) {
+ Totals prevTotals = m_totals;
+
+ std::string redirectedCout;
+ std::string redirectedCerr;
+
+ auto const& testInfo = testCase.getTestCaseInfo();
+
+ m_reporter->testCaseStarting(testInfo);
+
+ m_activeTestCase = &testCase;
+
+ ITracker& rootTracker = m_trackerContext.startRun();
+ assert(rootTracker.isSectionTracker());
+ static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun());
+ do {
+ m_trackerContext.startCycle();
+ m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo));
+ runCurrentTest(redirectedCout, redirectedCerr);
+ } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());
+
+ Totals deltaTotals = m_totals.delta(prevTotals);
+ if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) {
+ deltaTotals.assertions.failed++;
+ deltaTotals.testCases.passed--;
+ deltaTotals.testCases.failed++;
+ }
+ m_totals.testCases += deltaTotals.testCases;
+ m_reporter->testCaseEnded(TestCaseStats(testInfo,
+ deltaTotals,
+ redirectedCout,
+ redirectedCerr,
+ aborting()));
+
+ m_activeTestCase = nullptr;
+ m_testCaseTracker = nullptr;
+
+ return deltaTotals;
+ }
+
+ IConfigPtr RunContext::config() const {
+ return m_config;
+ }
+
+ IStreamingReporter& RunContext::reporter() const {
+ return *m_reporter;
+ }
+
+ void RunContext::assertionEnded(AssertionResult const & result) {
+ if (result.getResultType() == ResultWas::Ok) {
+ m_totals.assertions.passed++;
+ m_lastAssertionPassed = true;
+ } else if (!result.isOk()) {
+ m_lastAssertionPassed = false;
+ if( m_activeTestCase->getTestCaseInfo().okToFail() )
+ m_totals.assertions.failedButOk++;
+ else
+ m_totals.assertions.failed++;
+ }
+ else {
+ m_lastAssertionPassed = true;
+ }
+
+ // We have no use for the return value (whether messages should be cleared), because messages were made scoped
+ // and should be let to clear themselves out.
+ static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
+
+ if (result.getResultType() != ResultWas::Warning)
+ m_messageScopes.clear();
+
+ // Reset working state
+ resetAssertionInfo();
+ m_lastResult = result;
+ }
+ void RunContext::resetAssertionInfo() {
+ m_lastAssertionInfo.macroName = StringRef();
+ m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr;
+ }
+
+ bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) {
+ ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo));
+ if (!sectionTracker.isOpen())
+ return false;
+ m_activeSections.push_back(&sectionTracker);
+
+ m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
+
+ m_reporter->sectionStarting(sectionInfo);
+
+ assertions = m_totals.assertions;
+
+ return true;
+ }
+ auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
+ using namespace Generators;
+ GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext,
+ TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) );
+ m_lastAssertionInfo.lineInfo = lineInfo;
+ return tracker;
+ }
+
+ bool RunContext::testForMissingAssertions(Counts& assertions) {
+ if (assertions.total() != 0)
+ return false;
+ if (!m_config->warnAboutMissingAssertions())
+ return false;
+ if (m_trackerContext.currentTracker().hasChildren())
+ return false;
+ m_totals.assertions.failed++;
+ assertions.failed++;
+ return true;
+ }
+
+ void RunContext::sectionEnded(SectionEndInfo const & endInfo) {
+ Counts assertions = m_totals.assertions - endInfo.prevAssertions;
+ bool missingAssertions = testForMissingAssertions(assertions);
+
+ if (!m_activeSections.empty()) {
+ m_activeSections.back()->close();
+ m_activeSections.pop_back();
+ }
+
+ m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));
+ m_messages.clear();
+ m_messageScopes.clear();
+ }
+
+ void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) {
+ if (m_unfinishedSections.empty())
+ m_activeSections.back()->fail();
+ else
+ m_activeSections.back()->close();
+ m_activeSections.pop_back();
+
+ m_unfinishedSections.push_back(endInfo);
+ }
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void RunContext::benchmarkPreparing(std::string const& name) {
+ m_reporter->benchmarkPreparing(name);
+ }
+ void RunContext::benchmarkStarting( BenchmarkInfo const& info ) {
+ m_reporter->benchmarkStarting( info );
+ }
+ void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) {
+ m_reporter->benchmarkEnded( stats );
+ }
+ void RunContext::benchmarkFailed(std::string const & error) {
+ m_reporter->benchmarkFailed(error);
+ }
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ void RunContext::pushScopedMessage(MessageInfo const & message) {
+ m_messages.push_back(message);
+ }
+
+ void RunContext::popScopedMessage(MessageInfo const & message) {
+ m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end());
+ }
+
+ void RunContext::emplaceUnscopedMessage( MessageBuilder const& builder ) {
+ m_messageScopes.emplace_back( builder );
+ }
+
+ std::string RunContext::getCurrentTestName() const {
+ return m_activeTestCase
+ ? m_activeTestCase->getTestCaseInfo().name
+ : std::string();
+ }
+
+ const AssertionResult * RunContext::getLastResult() const {
+ return &(*m_lastResult);
+ }
+
+ void RunContext::exceptionEarlyReported() {
+ m_shouldReportUnexpected = false;
+ }
+
+ void RunContext::handleFatalErrorCondition( StringRef message ) {
+ // First notify reporter that bad things happened
+ m_reporter->fatalErrorEncountered(message);
+
+ // Don't rebuild the result -- the stringification itself can cause more fatal errors
+ // Instead, fake a result data.
+ AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } );
+ tempResult.message = static_cast<std::string>(message);
+ AssertionResult result(m_lastAssertionInfo, tempResult);
+
+ assertionEnded(result);
+
+ handleUnfinishedSections();
+
+ // Recreate section for test case (as we will lose the one that was in scope)
+ auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);
+
+ Counts assertions;
+ assertions.failed = 1;
+ SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);
+ m_reporter->sectionEnded(testCaseSectionStats);
+
+ auto const& testInfo = m_activeTestCase->getTestCaseInfo();
+
+ Totals deltaTotals;
+ deltaTotals.testCases.failed = 1;
+ deltaTotals.assertions.failed = 1;
+ m_reporter->testCaseEnded(TestCaseStats(testInfo,
+ deltaTotals,
+ std::string(),
+ std::string(),
+ false));
+ m_totals.testCases.failed++;
+ testGroupEnded(std::string(), m_totals, 1, 1);
+ m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));
+ }
+
+ bool RunContext::lastAssertionPassed() {
+ return m_lastAssertionPassed;
+ }
+
+ void RunContext::assertionPassed() {
+ m_lastAssertionPassed = true;
+ ++m_totals.assertions.passed;
+ resetAssertionInfo();
+ m_messageScopes.clear();
+ }
+
+ bool RunContext::aborting() const {
+ return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter());
+ }
+
+ void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) {
+ auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
+ SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);
+ m_reporter->sectionStarting(testCaseSection);
+ Counts prevAssertions = m_totals.assertions;
+ double duration = 0;
+ m_shouldReportUnexpected = true;
+ m_lastAssertionInfo = { "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal };
+
+ seedRng(*m_config);
+
+ Timer timer;
+ CATCH_TRY {
+ if (m_reporter->getPreferences().shouldRedirectStdOut) {
+#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
+ RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr);
+
+ timer.start();
+ invokeActiveTestCase();
+#else
+ OutputRedirect r(redirectedCout, redirectedCerr);
+ timer.start();
+ invokeActiveTestCase();
+#endif
+ } else {
+ timer.start();
+ invokeActiveTestCase();
+ }
+ duration = timer.getElapsedSeconds();
+ } CATCH_CATCH_ANON (TestFailureException&) {
+ // This just means the test was aborted due to failure
+ } CATCH_CATCH_ALL {
+ // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions
+ // are reported without translation at the point of origin.
+ if( m_shouldReportUnexpected ) {
+ AssertionReaction dummyReaction;
+ handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction );
+ }
+ }
+ Counts assertions = m_totals.assertions - prevAssertions;
+ bool missingAssertions = testForMissingAssertions(assertions);
+
+ m_testCaseTracker->close();
+ handleUnfinishedSections();
+ m_messages.clear();
+ m_messageScopes.clear();
+
+ SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);
+ m_reporter->sectionEnded(testCaseSectionStats);
+ }
+
+ void RunContext::invokeActiveTestCase() {
+ FatalConditionHandlerGuard _(&m_fatalConditionhandler);
+ m_activeTestCase->invoke();
+ }
+
+ void RunContext::handleUnfinishedSections() {
+ // If sections ended prematurely due to an exception we stored their
+ // infos here so we can tear them down outside the unwind process.
+ for (auto it = m_unfinishedSections.rbegin(),
+ itEnd = m_unfinishedSections.rend();
+ it != itEnd;
+ ++it)
+ sectionEnded(*it);
+ m_unfinishedSections.clear();
+ }
+
+ void RunContext::handleExpr(
+ AssertionInfo const& info,
+ ITransientExpression const& expr,
+ AssertionReaction& reaction
+ ) {
+ m_reporter->assertionStarting( info );
+
+ bool negated = isFalseTest( info.resultDisposition );
+ bool result = expr.getResult() != negated;
+
+ if( result ) {
+ if (!m_includeSuccessfulResults) {
+ assertionPassed();
+ }
+ else {
+ reportExpr(info, ResultWas::Ok, &expr, negated);
+ }
+ }
+ else {
+ reportExpr(info, ResultWas::ExpressionFailed, &expr, negated );
+ populateReaction( reaction );
+ }
+ }
+ void RunContext::reportExpr(
+ AssertionInfo const &info,
+ ResultWas::OfType resultType,
+ ITransientExpression const *expr,
+ bool negated ) {
+
+ m_lastAssertionInfo = info;
+ AssertionResultData data( resultType, LazyExpression( negated ) );
+
+ AssertionResult assertionResult{ info, data };
+ assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;
+
+ assertionEnded( assertionResult );
+ }
+
+ void RunContext::handleMessage(
+ AssertionInfo const& info,
+ ResultWas::OfType resultType,
+ StringRef const& message,
+ AssertionReaction& reaction
+ ) {
+ m_reporter->assertionStarting( info );
+
+ m_lastAssertionInfo = info;
+
+ AssertionResultData data( resultType, LazyExpression( false ) );
+ data.message = static_cast<std::string>(message);
+ AssertionResult assertionResult{ m_lastAssertionInfo, data };
+ assertionEnded( assertionResult );
+ if( !assertionResult.isOk() )
+ populateReaction( reaction );
+ }
+ void RunContext::handleUnexpectedExceptionNotThrown(
+ AssertionInfo const& info,
+ AssertionReaction& reaction
+ ) {
+ handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction);
+ }
+
+ void RunContext::handleUnexpectedInflightException(
+ AssertionInfo const& info,
+ std::string const& message,
+ AssertionReaction& reaction
+ ) {
+ m_lastAssertionInfo = info;
+
+ AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );
+ data.message = message;
+ AssertionResult assertionResult{ info, data };
+ assertionEnded( assertionResult );
+ populateReaction( reaction );
+ }
+
+ void RunContext::populateReaction( AssertionReaction& reaction ) {
+ reaction.shouldDebugBreak = m_config->shouldDebugBreak();
+ reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal);
+ }
+
+ void RunContext::handleIncomplete(
+ AssertionInfo const& info
+ ) {
+ m_lastAssertionInfo = info;
+
+ AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );
+ data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
+ AssertionResult assertionResult{ info, data };
+ assertionEnded( assertionResult );
+ }
+ void RunContext::handleNonExpr(
+ AssertionInfo const &info,
+ ResultWas::OfType resultType,
+ AssertionReaction &reaction
+ ) {
+ m_lastAssertionInfo = info;
+
+ AssertionResultData data( resultType, LazyExpression( false ) );
+ AssertionResult assertionResult{ info, data };
+ assertionEnded( assertionResult );
+
+ if( !assertionResult.isOk() )
+ populateReaction( reaction );
+ }
+
+ IResultCapture& getResultCapture() {
+ if (auto* capture = getCurrentContext().getResultCapture())
+ return *capture;
+ else
+ CATCH_INTERNAL_ERROR("No result capture instance");
+ }
+
+ void seedRng(IConfig const& config) {
+ if (config.rngSeed() != 0) {
+ std::srand(config.rngSeed());
+ rng().seed(config.rngSeed());
+ }
+ }
+
+ unsigned int rngSeed() {
+ return getCurrentContext().getConfig()->rngSeed();
+ }
+
+}
+// end catch_run_context.cpp
+// start catch_section.cpp
+
+namespace Catch {
+
+ Section::Section( SectionInfo const& info )
+ : m_info( info ),
+ m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )
+ {
+ m_timer.start();
+ }
+
+ Section::~Section() {
+ if( m_sectionIncluded ) {
+ SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() };
+ if( uncaught_exceptions() )
+ getResultCapture().sectionEndedEarly( endInfo );
+ else
+ getResultCapture().sectionEnded( endInfo );
+ }
+ }
+
+ // This indicates whether the section should be executed or not
+ Section::operator bool() const {
+ return m_sectionIncluded;
+ }
+
+} // end namespace Catch
+// end catch_section.cpp
+// start catch_section_info.cpp
+
+namespace Catch {
+
+ SectionInfo::SectionInfo
+ ( SourceLineInfo const& _lineInfo,
+ std::string const& _name )
+ : name( _name ),
+ lineInfo( _lineInfo )
+ {}
+
+} // end namespace Catch
+// end catch_section_info.cpp
+// start catch_session.cpp
+
+// start catch_session.h
+
+#include <memory>
+
+namespace Catch {
+
+ class Session : NonCopyable {
+ public:
+
+ Session();
+ ~Session() override;
+
+ void showHelp() const;
+ void libIdentify();
+
+ int applyCommandLine( int argc, char const * const * argv );
+ #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
+ int applyCommandLine( int argc, wchar_t const * const * argv );
+ #endif
+
+ void useConfigData( ConfigData const& configData );
+
+ template<typename CharT>
+ int run(int argc, CharT const * const argv[]) {
+ if (m_startupExceptions)
+ return 1;
+ int returnCode = applyCommandLine(argc, argv);
+ if (returnCode == 0)
+ returnCode = run();
+ return returnCode;
+ }
+
+ int run();
+
+ clara::Parser const& cli() const;
+ void cli( clara::Parser const& newParser );
+ ConfigData& configData();
+ Config& config();
+ private:
+ int runInternal();
+
+ clara::Parser m_cli;
+ ConfigData m_configData;
+ std::shared_ptr<Config> m_config;
+ bool m_startupExceptions = false;
+ };
+
+} // end namespace Catch
+
+// end catch_session.h
+// start catch_version.h
+
+#include <iosfwd>
+
+namespace Catch {
+
+ // Versioning information
+ struct Version {
+ Version( Version const& ) = delete;
+ Version& operator=( Version const& ) = delete;
+ Version( unsigned int _majorVersion,
+ unsigned int _minorVersion,
+ unsigned int _patchNumber,
+ char const * const _branchName,
+ unsigned int _buildNumber );
+
+ unsigned int const majorVersion;
+ unsigned int const minorVersion;
+ unsigned int const patchNumber;
+
+ // buildNumber is only used if branchName is not null
+ char const * const branchName;
+ unsigned int const buildNumber;
+
+ friend std::ostream& operator << ( std::ostream& os, Version const& version );
+ };
+
+ Version const& libraryVersion();
+}
+
+// end catch_version.h
+#include <cstdlib>
+#include <iomanip>
+#include <set>
+#include <iterator>
+
+namespace Catch {
+
+ namespace {
+ const int MaxExitCode = 255;
+
+ IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) {
+ auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config);
+ CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'");
+
+ return reporter;
+ }
+
+ IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) {
+ if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) {
+ return createReporter(config->getReporterName(), config);
+ }
+
+ // On older platforms, returning std::unique_ptr<ListeningReporter>
+ // when the return type is std::unique_ptr<IStreamingReporter>
+ // doesn't compile without a std::move call. However, this causes
+ // a warning on newer platforms. Thus, we have to work around
+ // it a bit and downcast the pointer manually.
+ auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter);
+ auto& multi = static_cast<ListeningReporter&>(*ret);
+ auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners();
+ for (auto const& listener : listeners) {
+ multi.addListener(listener->create(Catch::ReporterConfig(config)));
+ }
+ multi.addReporter(createReporter(config->getReporterName(), config));
+ return ret;
+ }
+
+ class TestGroup {
+ public:
+ explicit TestGroup(std::shared_ptr<Config> const& config)
+ : m_config{config}
+ , m_context{config, makeReporter(config)}
+ {
+ auto const& allTestCases = getAllTestCasesSorted(*m_config);
+ m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config);
+ auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
+
+ if (m_matches.empty() && invalidArgs.empty()) {
+ for (auto const& test : allTestCases)
+ if (!test.isHidden())
+ m_tests.emplace(&test);
+ } else {
+ for (auto const& match : m_matches)
+ m_tests.insert(match.tests.begin(), match.tests.end());
+ }
+ }
+
+ Totals execute() {
+ auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
+ Totals totals;
+ m_context.testGroupStarting(m_config->name(), 1, 1);
+ for (auto const& testCase : m_tests) {
+ if (!m_context.aborting())
+ totals += m_context.runTest(*testCase);
+ else
+ m_context.reporter().skipTest(*testCase);
+ }
+
+ for (auto const& match : m_matches) {
+ if (match.tests.empty()) {
+ m_context.reporter().noMatchingTestCases(match.name);
+ totals.error = -1;
+ }
+ }
+
+ if (!invalidArgs.empty()) {
+ for (auto const& invalidArg: invalidArgs)
+ m_context.reporter().reportInvalidArguments(invalidArg);
+ }
+
+ m_context.testGroupEnded(m_config->name(), totals, 1, 1);
+ return totals;
+ }
+
+ private:
+ using Tests = std::set<TestCase const*>;
+
+ std::shared_ptr<Config> m_config;
+ RunContext m_context;
+ Tests m_tests;
+ TestSpec::Matches m_matches;
+ };
+
+ void applyFilenamesAsTags(Catch::IConfig const& config) {
+ auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config));
+ for (auto& testCase : tests) {
+ auto tags = testCase.tags;
+
+ std::string filename = testCase.lineInfo.file;
+ auto lastSlash = filename.find_last_of("\\/");
+ if (lastSlash != std::string::npos) {
+ filename.erase(0, lastSlash);
+ filename[0] = '#';
+ }
+ else
+ {
+ filename.insert(0, "#");
+ }
+
+ auto lastDot = filename.find_last_of('.');
+ if (lastDot != std::string::npos) {
+ filename.erase(lastDot);
+ }
+
+ tags.push_back(std::move(filename));
+ setTags(testCase, tags);
+ }
+ }
+
+ } // anon namespace
+
+ Session::Session() {
+ static bool alreadyInstantiated = false;
+ if( alreadyInstantiated ) {
+ CATCH_TRY { CATCH_INTERNAL_ERROR( "Only one instance of Catch::Session can ever be used" ); }
+ CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); }
+ }
+
+ // There cannot be exceptions at startup in no-exception mode.
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions();
+ if ( !exceptions.empty() ) {
+ config();
+ getCurrentMutableContext().setConfig(m_config);
+
+ m_startupExceptions = true;
+ Colour colourGuard( Colour::Red );
+ Catch::cerr() << "Errors occurred during startup!" << '\n';
+ // iterate over all exceptions and notify user
+ for ( const auto& ex_ptr : exceptions ) {
+ try {
+ std::rethrow_exception(ex_ptr);
+ } catch ( std::exception const& ex ) {
+ Catch::cerr() << Column( ex.what() ).indent(2) << '\n';
+ }
+ }
+ }
+#endif
+
+ alreadyInstantiated = true;
+ m_cli = makeCommandLineParser( m_configData );
+ }
+ Session::~Session() {
+ Catch::cleanUp();
+ }
+
+ void Session::showHelp() const {
+ Catch::cout()
+ << "\nCatch v" << libraryVersion() << "\n"
+ << m_cli << std::endl
+ << "For more detailed usage please see the project docs\n" << std::endl;
+ }
+ void Session::libIdentify() {
+ Catch::cout()
+ << std::left << std::setw(16) << "description: " << "A Catch2 test executable\n"
+ << std::left << std::setw(16) << "category: " << "testframework\n"
+ << std::left << std::setw(16) << "framework: " << "Catch Test\n"
+ << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl;
+ }
+
+ int Session::applyCommandLine( int argc, char const * const * argv ) {
+ if( m_startupExceptions )
+ return 1;
+
+ auto result = m_cli.parse( clara::Args( argc, argv ) );
+ if( !result ) {
+ config();
+ getCurrentMutableContext().setConfig(m_config);
+ Catch::cerr()
+ << Colour( Colour::Red )
+ << "\nError(s) in input:\n"
+ << Column( result.errorMessage() ).indent( 2 )
+ << "\n\n";
+ Catch::cerr() << "Run with -? for usage\n" << std::endl;
+ return MaxExitCode;
+ }
+
+ if( m_configData.showHelp )
+ showHelp();
+ if( m_configData.libIdentify )
+ libIdentify();
+ m_config.reset();
+ return 0;
+ }
+
+#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
+ int Session::applyCommandLine( int argc, wchar_t const * const * argv ) {
+
+ char **utf8Argv = new char *[ argc ];
+
+ for ( int i = 0; i < argc; ++i ) {
+ int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr );
+
+ utf8Argv[ i ] = new char[ bufSize ];
+
+ WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr );
+ }
+
+ int returnCode = applyCommandLine( argc, utf8Argv );
+
+ for ( int i = 0; i < argc; ++i )
+ delete [] utf8Argv[ i ];
+
+ delete [] utf8Argv;
+
+ return returnCode;
+ }
+#endif
+
+ void Session::useConfigData( ConfigData const& configData ) {
+ m_configData = configData;
+ m_config.reset();
+ }
+
+ int Session::run() {
+ if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) {
+ Catch::cout() << "...waiting for enter/ return before starting" << std::endl;
+ static_cast<void>(std::getchar());
+ }
+ int exitCode = runInternal();
+ if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) {
+ Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl;
+ static_cast<void>(std::getchar());
+ }
+ return exitCode;
+ }
+
+ clara::Parser const& Session::cli() const {
+ return m_cli;
+ }
+ void Session::cli( clara::Parser const& newParser ) {
+ m_cli = newParser;
+ }
+ ConfigData& Session::configData() {
+ return m_configData;
+ }
+ Config& Session::config() {
+ if( !m_config )
+ m_config = std::make_shared<Config>( m_configData );
+ return *m_config;
+ }
+
+ int Session::runInternal() {
+ if( m_startupExceptions )
+ return 1;
+
+ if (m_configData.showHelp || m_configData.libIdentify) {
+ return 0;
+ }
+
+ CATCH_TRY {
+ config(); // Force config to be constructed
+
+ seedRng( *m_config );
+
+ if( m_configData.filenamesAsTags )
+ applyFilenamesAsTags( *m_config );
+
+ // Handle list request
+ if( Option<std::size_t> listed = list( m_config ) )
+ return static_cast<int>( *listed );
+
+ TestGroup tests { m_config };
+ auto const totals = tests.execute();
+
+ if( m_config->warnAboutNoTests() && totals.error == -1 )
+ return 2;
+
+ // Note that on unices only the lower 8 bits are usually used, clamping
+ // the return value to 255 prevents false negative when some multiple
+ // of 256 tests has failed
+ return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast<int>(totals.assertions.failed)));
+ }
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ catch( std::exception& ex ) {
+ Catch::cerr() << ex.what() << std::endl;
+ return MaxExitCode;
+ }
+#endif
+ }
+
+} // end namespace Catch
+// end catch_session.cpp
+// start catch_singletons.cpp
+
+#include <vector>
+
+namespace Catch {
+
+ namespace {
+ static auto getSingletons() -> std::vector<ISingleton*>*& {
+ static std::vector<ISingleton*>* g_singletons = nullptr;
+ if( !g_singletons )
+ g_singletons = new std::vector<ISingleton*>();
+ return g_singletons;
+ }
+ }
+
+ ISingleton::~ISingleton() {}
+
+ void addSingleton(ISingleton* singleton ) {
+ getSingletons()->push_back( singleton );
+ }
+ void cleanupSingletons() {
+ auto& singletons = getSingletons();
+ for( auto singleton : *singletons )
+ delete singleton;
+ delete singletons;
+ singletons = nullptr;
+ }
+
+} // namespace Catch
+// end catch_singletons.cpp
+// start catch_startup_exception_registry.cpp
+
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+namespace Catch {
+void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept {
+ CATCH_TRY {
+ m_exceptions.push_back(exception);
+ } CATCH_CATCH_ALL {
+ // If we run out of memory during start-up there's really not a lot more we can do about it
+ std::terminate();
+ }
+ }
+
+ std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept {
+ return m_exceptions;
+ }
+
+} // end namespace Catch
+#endif
+// end catch_startup_exception_registry.cpp
+// start catch_stream.cpp
+
+#include <cstdio>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <vector>
+#include <memory>
+
+namespace Catch {
+
+ Catch::IStream::~IStream() = default;
+
+ namespace Detail { namespace {
+ template<typename WriterF, std::size_t bufferSize=256>
+ class StreamBufImpl : public std::streambuf {
+ char data[bufferSize];
+ WriterF m_writer;
+
+ public:
+ StreamBufImpl() {
+ setp( data, data + sizeof(data) );
+ }
+
+ ~StreamBufImpl() noexcept {
+ StreamBufImpl::sync();
+ }
+
+ private:
+ int overflow( int c ) override {
+ sync();
+
+ if( c != EOF ) {
+ if( pbase() == epptr() )
+ m_writer( std::string( 1, static_cast<char>( c ) ) );
+ else
+ sputc( static_cast<char>( c ) );
+ }
+ return 0;
+ }
+
+ int sync() override {
+ if( pbase() != pptr() ) {
+ m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );
+ setp( pbase(), epptr() );
+ }
+ return 0;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ struct OutputDebugWriter {
+
+ void operator()( std::string const&str ) {
+ writeToDebugConsole( str );
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class FileStream : public IStream {
+ mutable std::ofstream m_ofs;
+ public:
+ FileStream( StringRef filename ) {
+ m_ofs.open( filename.c_str() );
+ CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" );
+ }
+ ~FileStream() override = default;
+ public: // IStream
+ std::ostream& stream() const override {
+ return m_ofs;
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class CoutStream : public IStream {
+ mutable std::ostream m_os;
+ public:
+ // Store the streambuf from cout up-front because
+ // cout may get redirected when running tests
+ CoutStream() : m_os( Catch::cout().rdbuf() ) {}
+ ~CoutStream() override = default;
+
+ public: // IStream
+ std::ostream& stream() const override { return m_os; }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ class DebugOutStream : public IStream {
+ std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;
+ mutable std::ostream m_os;
+ public:
+ DebugOutStream()
+ : m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),
+ m_os( m_streamBuf.get() )
+ {}
+
+ ~DebugOutStream() override = default;
+
+ public: // IStream
+ std::ostream& stream() const override { return m_os; }
+ };
+
+ }} // namespace anon::detail
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ auto makeStream( StringRef const &filename ) -> IStream const* {
+ if( filename.empty() )
+ return new Detail::CoutStream();
+ else if( filename[0] == '%' ) {
+ if( filename == "%debug" )
+ return new Detail::DebugOutStream();
+ else
+ CATCH_ERROR( "Unrecognised stream: '" << filename << "'" );
+ }
+ else
+ return new Detail::FileStream( filename );
+ }
+
+ // This class encapsulates the idea of a pool of ostringstreams that can be reused.
+ struct StringStreams {
+ std::vector<std::unique_ptr<std::ostringstream>> m_streams;
+ std::vector<std::size_t> m_unused;
+ std::ostringstream m_referenceStream; // Used for copy state/ flags from
+
+ auto add() -> std::size_t {
+ if( m_unused.empty() ) {
+ m_streams.push_back( std::unique_ptr<std::ostringstream>( new std::ostringstream ) );
+ return m_streams.size()-1;
+ }
+ else {
+ auto index = m_unused.back();
+ m_unused.pop_back();
+ return index;
+ }
+ }
+
+ void release( std::size_t index ) {
+ m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state
+ m_unused.push_back(index);
+ }
+ };
+
+ ReusableStringStream::ReusableStringStream()
+ : m_index( Singleton<StringStreams>::getMutable().add() ),
+ m_oss( Singleton<StringStreams>::getMutable().m_streams[m_index].get() )
+ {}
+
+ ReusableStringStream::~ReusableStringStream() {
+ static_cast<std::ostringstream*>( m_oss )->str("");
+ m_oss->clear();
+ Singleton<StringStreams>::getMutable().release( m_index );
+ }
+
+ auto ReusableStringStream::str() const -> std::string {
+ return static_cast<std::ostringstream*>( m_oss )->str();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+
+#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
+ std::ostream& cout() { return std::cout; }
+ std::ostream& cerr() { return std::cerr; }
+ std::ostream& clog() { return std::clog; }
+#endif
+}
+// end catch_stream.cpp
+// start catch_string_manip.cpp
+
+#include <algorithm>
+#include <ostream>
+#include <cstring>
+#include <cctype>
+#include <vector>
+
+namespace Catch {
+
+ namespace {
+ char toLowerCh(char c) {
+ return static_cast<char>( std::tolower( static_cast<unsigned char>(c) ) );
+ }
+ }
+
+ bool startsWith( std::string const& s, std::string const& prefix ) {
+ return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
+ }
+ bool startsWith( std::string const& s, char prefix ) {
+ return !s.empty() && s[0] == prefix;
+ }
+ bool endsWith( std::string const& s, std::string const& suffix ) {
+ return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
+ }
+ bool endsWith( std::string const& s, char suffix ) {
+ return !s.empty() && s[s.size()-1] == suffix;
+ }
+ bool contains( std::string const& s, std::string const& infix ) {
+ return s.find( infix ) != std::string::npos;
+ }
+ void toLowerInPlace( std::string& s ) {
+ std::transform( s.begin(), s.end(), s.begin(), toLowerCh );
+ }
+ std::string toLower( std::string const& s ) {
+ std::string lc = s;
+ toLowerInPlace( lc );
+ return lc;
+ }
+ std::string trim( std::string const& str ) {
+ static char const* whitespaceChars = "\n\r\t ";
+ std::string::size_type start = str.find_first_not_of( whitespaceChars );
+ std::string::size_type end = str.find_last_not_of( whitespaceChars );
+
+ return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();
+ }
+
+ StringRef trim(StringRef ref) {
+ const auto is_ws = [](char c) {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+ };
+ size_t real_begin = 0;
+ while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; }
+ size_t real_end = ref.size();
+ while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; }
+
+ return ref.substr(real_begin, real_end - real_begin);
+ }
+
+ bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
+ bool replaced = false;
+ std::size_t i = str.find( replaceThis );
+ while( i != std::string::npos ) {
+ replaced = true;
+ str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );
+ if( i < str.size()-withThis.size() )
+ i = str.find( replaceThis, i+withThis.size() );
+ else
+ i = std::string::npos;
+ }
+ return replaced;
+ }
+
+ std::vector<StringRef> splitStringRef( StringRef str, char delimiter ) {
+ std::vector<StringRef> subStrings;
+ std::size_t start = 0;
+ for(std::size_t pos = 0; pos < str.size(); ++pos ) {
+ if( str[pos] == delimiter ) {
+ if( pos - start > 1 )
+ subStrings.push_back( str.substr( start, pos-start ) );
+ start = pos+1;
+ }
+ }
+ if( start < str.size() )
+ subStrings.push_back( str.substr( start, str.size()-start ) );
+ return subStrings;
+ }
+
+ pluralise::pluralise( std::size_t count, std::string const& label )
+ : m_count( count ),
+ m_label( label )
+ {}
+
+ std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
+ os << pluraliser.m_count << ' ' << pluraliser.m_label;
+ if( pluraliser.m_count != 1 )
+ os << 's';
+ return os;
+ }
+
+}
+// end catch_string_manip.cpp
+// start catch_stringref.cpp
+
+#include <algorithm>
+#include <ostream>
+#include <cstring>
+#include <cstdint>
+
+namespace Catch {
+ StringRef::StringRef( char const* rawChars ) noexcept
+ : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) )
+ {}
+
+ auto StringRef::c_str() const -> char const* {
+ CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance");
+ return m_start;
+ }
+ auto StringRef::data() const noexcept -> char const* {
+ return m_start;
+ }
+
+ auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef {
+ if (start < m_size) {
+ return StringRef(m_start + start, (std::min)(m_size - start, size));
+ } else {
+ return StringRef();
+ }
+ }
+ auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {
+ return m_size == other.m_size
+ && (std::memcmp( m_start, other.m_start, m_size ) == 0);
+ }
+
+ auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& {
+ return os.write(str.data(), str.size());
+ }
+
+ auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& {
+ lhs.append(rhs.data(), rhs.size());
+ return lhs;
+ }
+
+} // namespace Catch
+// end catch_stringref.cpp
+// start catch_tag_alias.cpp
+
+namespace Catch {
+ TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {}
+}
+// end catch_tag_alias.cpp
+// start catch_tag_alias_autoregistrar.cpp
+
+namespace Catch {
+
+ RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) {
+ CATCH_TRY {
+ getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo);
+ } CATCH_CATCH_ALL {
+ // Do not throw when constructing global objects, instead register the exception to be processed later
+ getMutableRegistryHub().registerStartupException();
+ }
+ }
+
+}
+// end catch_tag_alias_autoregistrar.cpp
+// start catch_tag_alias_registry.cpp
+
+#include <sstream>
+
+namespace Catch {
+
+ TagAliasRegistry::~TagAliasRegistry() {}
+
+ TagAlias const* TagAliasRegistry::find( std::string const& alias ) const {
+ auto it = m_registry.find( alias );
+ if( it != m_registry.end() )
+ return &(it->second);
+ else
+ return nullptr;
+ }
+
+ std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {
+ std::string expandedTestSpec = unexpandedTestSpec;
+ for( auto const& registryKvp : m_registry ) {
+ std::size_t pos = expandedTestSpec.find( registryKvp.first );
+ if( pos != std::string::npos ) {
+ expandedTestSpec = expandedTestSpec.substr( 0, pos ) +
+ registryKvp.second.tag +
+ expandedTestSpec.substr( pos + registryKvp.first.size() );
+ }
+ }
+ return expandedTestSpec;
+ }
+
+ void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) {
+ CATCH_ENFORCE( startsWith(alias, "[@") && endsWith(alias, ']'),
+ "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo );
+
+ CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second,
+ "error: tag alias, '" << alias << "' already registered.\n"
+ << "\tFirst seen at: " << find(alias)->lineInfo << "\n"
+ << "\tRedefined at: " << lineInfo );
+ }
+
+ ITagAliasRegistry::~ITagAliasRegistry() {}
+
+ ITagAliasRegistry const& ITagAliasRegistry::get() {
+ return getRegistryHub().getTagAliasRegistry();
+ }
+
+} // end namespace Catch
+// end catch_tag_alias_registry.cpp
+// start catch_test_case_info.cpp
+
+#include <cctype>
+#include <exception>
+#include <algorithm>
+#include <sstream>
+
+namespace Catch {
+
+ namespace {
+ TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {
+ if( startsWith( tag, '.' ) ||
+ tag == "!hide" )
+ return TestCaseInfo::IsHidden;
+ else if( tag == "!throws" )
+ return TestCaseInfo::Throws;
+ else if( tag == "!shouldfail" )
+ return TestCaseInfo::ShouldFail;
+ else if( tag == "!mayfail" )
+ return TestCaseInfo::MayFail;
+ else if( tag == "!nonportable" )
+ return TestCaseInfo::NonPortable;
+ else if( tag == "!benchmark" )
+ return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden );
+ else
+ return TestCaseInfo::None;
+ }
+ bool isReservedTag( std::string const& tag ) {
+ return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) );
+ }
+ void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {
+ CATCH_ENFORCE( !isReservedTag(tag),
+ "Tag name: [" << tag << "] is not allowed.\n"
+ << "Tag names starting with non alphanumeric characters are reserved\n"
+ << _lineInfo );
+ }
+ }
+
+ TestCase makeTestCase( ITestInvoker* _testCase,
+ std::string const& _className,
+ NameAndTags const& nameAndTags,
+ SourceLineInfo const& _lineInfo )
+ {
+ bool isHidden = false;
+
+ // Parse out tags
+ std::vector<std::string> tags;
+ std::string desc, tag;
+ bool inTag = false;
+ for (char c : nameAndTags.tags) {
+ if( !inTag ) {
+ if( c == '[' )
+ inTag = true;
+ else
+ desc += c;
+ }
+ else {
+ if( c == ']' ) {
+ TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );
+ if( ( prop & TestCaseInfo::IsHidden ) != 0 )
+ isHidden = true;
+ else if( prop == TestCaseInfo::None )
+ enforceNotReservedTag( tag, _lineInfo );
+
+ // Merged hide tags like `[.approvals]` should be added as
+ // `[.][approvals]`. The `[.]` is added at later point, so
+ // we only strip the prefix
+ if (startsWith(tag, '.') && tag.size() > 1) {
+ tag.erase(0, 1);
+ }
+ tags.push_back( tag );
+ tag.clear();
+ inTag = false;
+ }
+ else
+ tag += c;
+ }
+ }
+ if( isHidden ) {
+ // Add all "hidden" tags to make them behave identically
+ tags.insert( tags.end(), { ".", "!hide" } );
+ }
+
+ TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo );
+ return TestCase( _testCase, std::move(info) );
+ }
+
+ void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ) {
+ std::sort(begin(tags), end(tags));
+ tags.erase(std::unique(begin(tags), end(tags)), end(tags));
+ testCaseInfo.lcaseTags.clear();
+
+ for( auto const& tag : tags ) {
+ std::string lcaseTag = toLower( tag );
+ testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );
+ testCaseInfo.lcaseTags.push_back( lcaseTag );
+ }
+ testCaseInfo.tags = std::move(tags);
+ }
+
+ TestCaseInfo::TestCaseInfo( std::string const& _name,
+ std::string const& _className,
+ std::string const& _description,
+ std::vector<std::string> const& _tags,
+ SourceLineInfo const& _lineInfo )
+ : name( _name ),
+ className( _className ),
+ description( _description ),
+ lineInfo( _lineInfo ),
+ properties( None )
+ {
+ setTags( *this, _tags );
+ }
+
+ bool TestCaseInfo::isHidden() const {
+ return ( properties & IsHidden ) != 0;
+ }
+ bool TestCaseInfo::throws() const {
+ return ( properties & Throws ) != 0;
+ }
+ bool TestCaseInfo::okToFail() const {
+ return ( properties & (ShouldFail | MayFail ) ) != 0;
+ }
+ bool TestCaseInfo::expectedToFail() const {
+ return ( properties & (ShouldFail ) ) != 0;
+ }
+
+ std::string TestCaseInfo::tagsAsString() const {
+ std::string ret;
+ // '[' and ']' per tag
+ std::size_t full_size = 2 * tags.size();
+ for (const auto& tag : tags) {
+ full_size += tag.size();
+ }
+ ret.reserve(full_size);
+ for (const auto& tag : tags) {
+ ret.push_back('[');
+ ret.append(tag);
+ ret.push_back(']');
+ }
+
+ return ret;
+ }
+
+ TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {}
+
+ TestCase TestCase::withName( std::string const& _newName ) const {
+ TestCase other( *this );
+ other.name = _newName;
+ return other;
+ }
+
+ void TestCase::invoke() const {
+ test->invoke();
+ }
+
+ bool TestCase::operator == ( TestCase const& other ) const {
+ return test.get() == other.test.get() &&
+ name == other.name &&
+ className == other.className;
+ }
+
+ bool TestCase::operator < ( TestCase const& other ) const {
+ return name < other.name;
+ }
+
+ TestCaseInfo const& TestCase::getTestCaseInfo() const
+ {
+ return *this;
+ }
+
+} // end namespace Catch
+// end catch_test_case_info.cpp
+// start catch_test_case_registry_impl.cpp
+
+#include <algorithm>
+#include <sstream>
+
+namespace Catch {
+
+ namespace {
+ struct TestHasher {
+ using hash_t = uint64_t;
+
+ explicit TestHasher( hash_t hashSuffix ):
+ m_hashSuffix{ hashSuffix } {}
+
+ uint32_t operator()( TestCase const& t ) const {
+ // FNV-1a hash with multiplication fold.
+ const hash_t prime = 1099511628211u;
+ hash_t hash = 14695981039346656037u;
+ for ( const char c : t.name ) {
+ hash ^= c;
+ hash *= prime;
+ }
+ hash ^= m_hashSuffix;
+ hash *= prime;
+ const uint32_t low{ static_cast<uint32_t>( hash ) };
+ const uint32_t high{ static_cast<uint32_t>( hash >> 32 ) };
+ return low * high;
+ }
+
+ private:
+ hash_t m_hashSuffix;
+ };
+ } // end unnamed namespace
+
+ std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
+ switch( config.runOrder() ) {
+ case RunTests::InDeclarationOrder:
+ // already in declaration order
+ break;
+
+ case RunTests::InLexicographicalOrder: {
+ std::vector<TestCase> sorted = unsortedTestCases;
+ std::sort( sorted.begin(), sorted.end() );
+ return sorted;
+ }
+
+ case RunTests::InRandomOrder: {
+ seedRng( config );
+ TestHasher h{ config.rngSeed() };
+
+ using hashedTest = std::pair<TestHasher::hash_t, TestCase const*>;
+ std::vector<hashedTest> indexed_tests;
+ indexed_tests.reserve( unsortedTestCases.size() );
+
+ for (auto const& testCase : unsortedTestCases) {
+ indexed_tests.emplace_back(h(testCase), &testCase);
+ }
+
+ std::sort(indexed_tests.begin(), indexed_tests.end(),
+ [](hashedTest const& lhs, hashedTest const& rhs) {
+ if (lhs.first == rhs.first) {
+ return lhs.second->name < rhs.second->name;
+ }
+ return lhs.first < rhs.first;
+ });
+
+ std::vector<TestCase> sorted;
+ sorted.reserve( indexed_tests.size() );
+
+ for (auto const& hashed : indexed_tests) {
+ sorted.emplace_back(*hashed.second);
+ }
+
+ return sorted;
+ }
+ }
+ return unsortedTestCases;
+ }
+
+ bool isThrowSafe( TestCase const& testCase, IConfig const& config ) {
+ return !testCase.throws() || config.allowThrows();
+ }
+
+ bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {
+ return testSpec.matches( testCase ) && isThrowSafe( testCase, config );
+ }
+
+ void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {
+ std::set<TestCase> seenFunctions;
+ for( auto const& function : functions ) {
+ auto prev = seenFunctions.insert( function );
+ CATCH_ENFORCE( prev.second,
+ "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n"
+ << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n"
+ << "\tRedefined at " << function.getTestCaseInfo().lineInfo );
+ }
+ }
+
+ std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {
+ std::vector<TestCase> filtered;
+ filtered.reserve( testCases.size() );
+ for (auto const& testCase : testCases) {
+ if ((!testSpec.hasFilters() && !testCase.isHidden()) ||
+ (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) {
+ filtered.push_back(testCase);
+ }
+ }
+ return filtered;
+ }
+ std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {
+ return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );
+ }
+
+ void TestRegistry::registerTest( TestCase const& testCase ) {
+ std::string name = testCase.getTestCaseInfo().name;
+ if( name.empty() ) {
+ ReusableStringStream rss;
+ rss << "Anonymous test case " << ++m_unnamedCount;
+ return registerTest( testCase.withName( rss.str() ) );
+ }
+ m_functions.push_back( testCase );
+ }
+
+ std::vector<TestCase> const& TestRegistry::getAllTests() const {
+ return m_functions;
+ }
+ std::vector<TestCase> const& TestRegistry::getAllTestsSorted( IConfig const& config ) const {
+ if( m_sortedFunctions.empty() )
+ enforceNoDuplicateTestCases( m_functions );
+
+ if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {
+ m_sortedFunctions = sortTests( config, m_functions );
+ m_currentSortOrder = config.runOrder();
+ }
+ return m_sortedFunctions;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {}
+
+ void TestInvokerAsFunction::invoke() const {
+ m_testAsFunction();
+ }
+
+ std::string extractClassName( StringRef const& classOrQualifiedMethodName ) {
+ std::string className(classOrQualifiedMethodName);
+ if( startsWith( className, '&' ) )
+ {
+ std::size_t lastColons = className.rfind( "::" );
+ std::size_t penultimateColons = className.rfind( "::", lastColons-1 );
+ if( penultimateColons == std::string::npos )
+ penultimateColons = 1;
+ className = className.substr( penultimateColons, lastColons-penultimateColons );
+ }
+ return className;
+ }
+
+} // end namespace Catch
+// end catch_test_case_registry_impl.cpp
+// start catch_test_case_tracker.cpp
+
+#include <algorithm>
+#include <cassert>
+#include <stdexcept>
+#include <memory>
+#include <sstream>
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wexit-time-destructors"
+#endif
+
+namespace Catch {
+namespace TestCaseTracking {
+
+ NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location )
+ : name( _name ),
+ location( _location )
+ {}
+
+ ITracker::~ITracker() = default;
+
+ ITracker& TrackerContext::startRun() {
+ m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr );
+ m_currentTracker = nullptr;
+ m_runState = Executing;
+ return *m_rootTracker;
+ }
+
+ void TrackerContext::endRun() {
+ m_rootTracker.reset();
+ m_currentTracker = nullptr;
+ m_runState = NotStarted;
+ }
+
+ void TrackerContext::startCycle() {
+ m_currentTracker = m_rootTracker.get();
+ m_runState = Executing;
+ }
+ void TrackerContext::completeCycle() {
+ m_runState = CompletedCycle;
+ }
+
+ bool TrackerContext::completedCycle() const {
+ return m_runState == CompletedCycle;
+ }
+ ITracker& TrackerContext::currentTracker() {
+ return *m_currentTracker;
+ }
+ void TrackerContext::setCurrentTracker( ITracker* tracker ) {
+ m_currentTracker = tracker;
+ }
+
+ TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ):
+ ITracker(nameAndLocation),
+ m_ctx( ctx ),
+ m_parent( parent )
+ {}
+
+ bool TrackerBase::isComplete() const {
+ return m_runState == CompletedSuccessfully || m_runState == Failed;
+ }
+ bool TrackerBase::isSuccessfullyCompleted() const {
+ return m_runState == CompletedSuccessfully;
+ }
+ bool TrackerBase::isOpen() const {
+ return m_runState != NotStarted && !isComplete();
+ }
+ bool TrackerBase::hasChildren() const {
+ return !m_children.empty();
+ }
+
+ void TrackerBase::addChild( ITrackerPtr const& child ) {
+ m_children.push_back( child );
+ }
+
+ ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) {
+ auto it = std::find_if( m_children.begin(), m_children.end(),
+ [&nameAndLocation]( ITrackerPtr const& tracker ){
+ return
+ tracker->nameAndLocation().location == nameAndLocation.location &&
+ tracker->nameAndLocation().name == nameAndLocation.name;
+ } );
+ return( it != m_children.end() )
+ ? *it
+ : nullptr;
+ }
+ ITracker& TrackerBase::parent() {
+ assert( m_parent ); // Should always be non-null except for root
+ return *m_parent;
+ }
+
+ void TrackerBase::openChild() {
+ if( m_runState != ExecutingChildren ) {
+ m_runState = ExecutingChildren;
+ if( m_parent )
+ m_parent->openChild();
+ }
+ }
+
+ bool TrackerBase::isSectionTracker() const { return false; }
+ bool TrackerBase::isGeneratorTracker() const { return false; }
+
+ void TrackerBase::open() {
+ m_runState = Executing;
+ moveToThis();
+ if( m_parent )
+ m_parent->openChild();
+ }
+
+ void TrackerBase::close() {
+
+ // Close any still open children (e.g. generators)
+ while( &m_ctx.currentTracker() != this )
+ m_ctx.currentTracker().close();
+
+ switch( m_runState ) {
+ case NeedsAnotherRun:
+ break;
+
+ case Executing:
+ m_runState = CompletedSuccessfully;
+ break;
+ case ExecutingChildren:
+ if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) )
+ m_runState = CompletedSuccessfully;
+ break;
+
+ case NotStarted:
+ case CompletedSuccessfully:
+ case Failed:
+ CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState );
+
+ default:
+ CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState );
+ }
+ moveToParent();
+ m_ctx.completeCycle();
+ }
+ void TrackerBase::fail() {
+ m_runState = Failed;
+ if( m_parent )
+ m_parent->markAsNeedingAnotherRun();
+ moveToParent();
+ m_ctx.completeCycle();
+ }
+ void TrackerBase::markAsNeedingAnotherRun() {
+ m_runState = NeedsAnotherRun;
+ }
+
+ void TrackerBase::moveToParent() {
+ assert( m_parent );
+ m_ctx.setCurrentTracker( m_parent );
+ }
+ void TrackerBase::moveToThis() {
+ m_ctx.setCurrentTracker( this );
+ }
+
+ SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
+ : TrackerBase( nameAndLocation, ctx, parent ),
+ m_trimmed_name(trim(nameAndLocation.name))
+ {
+ if( parent ) {
+ while( !parent->isSectionTracker() )
+ parent = &parent->parent();
+
+ SectionTracker& parentSection = static_cast<SectionTracker&>( *parent );
+ addNextFilters( parentSection.m_filters );
+ }
+ }
+
+ bool SectionTracker::isComplete() const {
+ bool complete = true;
+
+ if (m_filters.empty()
+ || m_filters[0] == ""
+ || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) {
+ complete = TrackerBase::isComplete();
+ }
+ return complete;
+ }
+
+ bool SectionTracker::isSectionTracker() const { return true; }
+
+ SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) {
+ std::shared_ptr<SectionTracker> section;
+
+ ITracker& currentTracker = ctx.currentTracker();
+ if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {
+ assert( childTracker );
+ assert( childTracker->isSectionTracker() );
+ section = std::static_pointer_cast<SectionTracker>( childTracker );
+ }
+ else {
+ section = std::make_shared<SectionTracker>( nameAndLocation, ctx, &currentTracker );
+ currentTracker.addChild( section );
+ }
+ if( !ctx.completedCycle() )
+ section->tryOpen();
+ return *section;
+ }
+
+ void SectionTracker::tryOpen() {
+ if( !isComplete() )
+ open();
+ }
+
+ void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) {
+ if( !filters.empty() ) {
+ m_filters.reserve( m_filters.size() + filters.size() + 2 );
+ m_filters.emplace_back(""); // Root - should never be consulted
+ m_filters.emplace_back(""); // Test Case - not a section filter
+ m_filters.insert( m_filters.end(), filters.begin(), filters.end() );
+ }
+ }
+ void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) {
+ if( filters.size() > 1 )
+ m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() );
+ }
+
+ std::vector<std::string> const& SectionTracker::getFilters() const {
+ return m_filters;
+ }
+
+ std::string const& SectionTracker::trimmedName() const {
+ return m_trimmed_name;
+ }
+
+} // namespace TestCaseTracking
+
+using TestCaseTracking::ITracker;
+using TestCaseTracking::TrackerContext;
+using TestCaseTracking::SectionTracker;
+
+} // namespace Catch
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#endif
+// end catch_test_case_tracker.cpp
+// start catch_test_registry.cpp
+
+namespace Catch {
+
+ auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* {
+ return new(std::nothrow) TestInvokerAsFunction( testAsFunction );
+ }
+
+ NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {}
+
+ AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept {
+ CATCH_TRY {
+ getMutableRegistryHub()
+ .registerTest(
+ makeTestCase(
+ invoker,
+ extractClassName( classOrMethod ),
+ nameAndTags,
+ lineInfo));
+ } CATCH_CATCH_ALL {
+ // Do not throw when constructing global objects, instead register the exception to be processed later
+ getMutableRegistryHub().registerStartupException();
+ }
+ }
+
+ AutoReg::~AutoReg() = default;
+}
+// end catch_test_registry.cpp
+// start catch_test_spec.cpp
+
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <memory>
+
+namespace Catch {
+
+ TestSpec::Pattern::Pattern( std::string const& name )
+ : m_name( name )
+ {}
+
+ TestSpec::Pattern::~Pattern() = default;
+
+ std::string const& TestSpec::Pattern::name() const {
+ return m_name;
+ }
+
+ TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString )
+ : Pattern( filterString )
+ , m_wildcardPattern( toLower( name ), CaseSensitive::No )
+ {}
+
+ bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const {
+ return m_wildcardPattern.matches( testCase.name );
+ }
+
+ TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString )
+ : Pattern( filterString )
+ , m_tag( toLower( tag ) )
+ {}
+
+ bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const {
+ return std::find(begin(testCase.lcaseTags),
+ end(testCase.lcaseTags),
+ m_tag) != end(testCase.lcaseTags);
+ }
+
+ TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern )
+ : Pattern( underlyingPattern->name() )
+ , m_underlyingPattern( underlyingPattern )
+ {}
+
+ bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const {
+ return !m_underlyingPattern->matches( testCase );
+ }
+
+ bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const {
+ return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } );
+ }
+
+ std::string TestSpec::Filter::name() const {
+ std::string name;
+ for( auto const& p : m_patterns )
+ name += p->name();
+ return name;
+ }
+
+ bool TestSpec::hasFilters() const {
+ return !m_filters.empty();
+ }
+
+ bool TestSpec::matches( TestCaseInfo const& testCase ) const {
+ return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } );
+ }
+
+ TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const
+ {
+ Matches matches( m_filters.size() );
+ std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){
+ std::vector<TestCase const*> currentMatches;
+ for( auto const& test : testCases )
+ if( isThrowSafe( test, config ) && filter.matches( test ) )
+ currentMatches.emplace_back( &test );
+ return FilterMatch{ filter.name(), currentMatches };
+ } );
+ return matches;
+ }
+
+ const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{
+ return (m_invalidArgs);
+ }
+
+}
+// end catch_test_spec.cpp
+// start catch_test_spec_parser.cpp
+
+namespace Catch {
+
+ TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
+
+ TestSpecParser& TestSpecParser::parse( std::string const& arg ) {
+ m_mode = None;
+ m_exclusion = false;
+ m_arg = m_tagAliases->expandAliases( arg );
+ m_escapeChars.clear();
+ m_substring.reserve(m_arg.size());
+ m_patternName.reserve(m_arg.size());
+ m_realPatternPos = 0;
+
+ for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )
+ //if visitChar fails
+ if( !visitChar( m_arg[m_pos] ) ){
+ m_testSpec.m_invalidArgs.push_back(arg);
+ break;
+ }
+ endMode();
+ return *this;
+ }
+ TestSpec TestSpecParser::testSpec() {
+ addFilter();
+ return m_testSpec;
+ }
+ bool TestSpecParser::visitChar( char c ) {
+ if( (m_mode != EscapedName) && (c == '\\') ) {
+ escape();
+ addCharToPattern(c);
+ return true;
+ }else if((m_mode != EscapedName) && (c == ',') ) {
+ return separate();
+ }
+
+ switch( m_mode ) {
+ case None:
+ if( processNoneChar( c ) )
+ return true;
+ break;
+ case Name:
+ processNameChar( c );
+ break;
+ case EscapedName:
+ endMode();
+ addCharToPattern(c);
+ return true;
+ default:
+ case Tag:
+ case QuotedName:
+ if( processOtherChar( c ) )
+ return true;
+ break;
+ }
+
+ m_substring += c;
+ if( !isControlChar( c ) ) {
+ m_patternName += c;
+ m_realPatternPos++;
+ }
+ return true;
+ }
+ // Two of the processing methods return true to signal the caller to return
+ // without adding the given character to the current pattern strings
+ bool TestSpecParser::processNoneChar( char c ) {
+ switch( c ) {
+ case ' ':
+ return true;
+ case '~':
+ m_exclusion = true;
+ return false;
+ case '[':
+ startNewMode( Tag );
+ return false;
+ case '"':
+ startNewMode( QuotedName );
+ return false;
+ default:
+ startNewMode( Name );
+ return false;
+ }
+ }
+ void TestSpecParser::processNameChar( char c ) {
+ if( c == '[' ) {
+ if( m_substring == "exclude:" )
+ m_exclusion = true;
+ else
+ endMode();
+ startNewMode( Tag );
+ }
+ }
+ bool TestSpecParser::processOtherChar( char c ) {
+ if( !isControlChar( c ) )
+ return false;
+ m_substring += c;
+ endMode();
+ return true;
+ }
+ void TestSpecParser::startNewMode( Mode mode ) {
+ m_mode = mode;
+ }
+ void TestSpecParser::endMode() {
+ switch( m_mode ) {
+ case Name:
+ case QuotedName:
+ return addNamePattern();
+ case Tag:
+ return addTagPattern();
+ case EscapedName:
+ revertBackToLastMode();
+ return;
+ case None:
+ default:
+ return startNewMode( None );
+ }
+ }
+ void TestSpecParser::escape() {
+ saveLastMode();
+ m_mode = EscapedName;
+ m_escapeChars.push_back(m_realPatternPos);
+ }
+ bool TestSpecParser::isControlChar( char c ) const {
+ switch( m_mode ) {
+ default:
+ return false;
+ case None:
+ return c == '~';
+ case Name:
+ return c == '[';
+ case EscapedName:
+ return true;
+ case QuotedName:
+ return c == '"';
+ case Tag:
+ return c == '[' || c == ']';
+ }
+ }
+
+ void TestSpecParser::addFilter() {
+ if( !m_currentFilter.m_patterns.empty() ) {
+ m_testSpec.m_filters.push_back( m_currentFilter );
+ m_currentFilter = TestSpec::Filter();
+ }
+ }
+
+ void TestSpecParser::saveLastMode() {
+ lastMode = m_mode;
+ }
+
+ void TestSpecParser::revertBackToLastMode() {
+ m_mode = lastMode;
+ }
+
+ bool TestSpecParser::separate() {
+ if( (m_mode==QuotedName) || (m_mode==Tag) ){
+ //invalid argument, signal failure to previous scope.
+ m_mode = None;
+ m_pos = m_arg.size();
+ m_substring.clear();
+ m_patternName.clear();
+ m_realPatternPos = 0;
+ return false;
+ }
+ endMode();
+ addFilter();
+ return true; //success
+ }
+
+ std::string TestSpecParser::preprocessPattern() {
+ std::string token = m_patternName;
+ for (std::size_t i = 0; i < m_escapeChars.size(); ++i)
+ token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1);
+ m_escapeChars.clear();
+ if (startsWith(token, "exclude:")) {
+ m_exclusion = true;
+ token = token.substr(8);
+ }
+
+ m_patternName.clear();
+ m_realPatternPos = 0;
+
+ return token;
+ }
+
+ void TestSpecParser::addNamePattern() {
+ auto token = preprocessPattern();
+
+ if (!token.empty()) {
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring);
+ if (m_exclusion)
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+ m_substring.clear();
+ m_exclusion = false;
+ m_mode = None;
+ }
+
+ void TestSpecParser::addTagPattern() {
+ auto token = preprocessPattern();
+
+ if (!token.empty()) {
+ // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo])
+ // we have to create a separate hide tag and shorten the real one
+ if (token.size() > 1 && token[0] == '.') {
+ token.erase(token.begin());
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(".", m_substring);
+ if (m_exclusion) {
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ }
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring);
+
+ if (m_exclusion) {
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ }
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+ m_substring.clear();
+ m_exclusion = false;
+ m_mode = None;
+ }
+
+ TestSpec parseTestSpec( std::string const& arg ) {
+ return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();
+ }
+
+} // namespace Catch
+// end catch_test_spec_parser.cpp
+// start catch_timer.cpp
+
+#include <chrono>
+
+static const uint64_t nanosecondsInSecond = 1000000000;
+
+namespace Catch {
+
+ auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
+ return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count();
+ }
+
+ namespace {
+ auto estimateClockResolution() -> uint64_t {
+ uint64_t sum = 0;
+ static const uint64_t iterations = 1000000;
+
+ auto startTime = getCurrentNanosecondsSinceEpoch();
+
+ for( std::size_t i = 0; i < iterations; ++i ) {
+
+ uint64_t ticks;
+ uint64_t baseTicks = getCurrentNanosecondsSinceEpoch();
+ do {
+ ticks = getCurrentNanosecondsSinceEpoch();
+ } while( ticks == baseTicks );
+
+ auto delta = ticks - baseTicks;
+ sum += delta;
+
+ // If we have been calibrating for over 3 seconds -- the clock
+ // is terrible and we should move on.
+ // TBD: How to signal that the measured resolution is probably wrong?
+ if (ticks > startTime + 3 * nanosecondsInSecond) {
+ return sum / ( i + 1u );
+ }
+ }
+
+ // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers
+ // - and potentially do more iterations if there's a high variance.
+ return sum/iterations;
+ }
+ }
+ auto getEstimatedClockResolution() -> uint64_t {
+ static auto s_resolution = estimateClockResolution();
+ return s_resolution;
+ }
+
+ void Timer::start() {
+ m_nanoseconds = getCurrentNanosecondsSinceEpoch();
+ }
+ auto Timer::getElapsedNanoseconds() const -> uint64_t {
+ return getCurrentNanosecondsSinceEpoch() - m_nanoseconds;
+ }
+ auto Timer::getElapsedMicroseconds() const -> uint64_t {
+ return getElapsedNanoseconds()/1000;
+ }
+ auto Timer::getElapsedMilliseconds() const -> unsigned int {
+ return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
+ }
+ auto Timer::getElapsedSeconds() const -> double {
+ return getElapsedMicroseconds()/1000000.0;
+ }
+
+} // namespace Catch
+// end catch_timer.cpp
+// start catch_tostring.cpp
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wexit-time-destructors"
+# pragma clang diagnostic ignored "-Wglobal-constructors"
+#endif
+
+// Enable specific decls locally
+#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
+#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
+#endif
+
+#include <cmath>
+#include <iomanip>
+
+namespace Catch {
+
+namespace Detail {
+
+ const std::string unprintableString = "{?}";
+
+ namespace {
+ const int hexThreshold = 255;
+
+ struct Endianness {
+ enum Arch { Big, Little };
+
+ static Arch which() {
+ int one = 1;
+ // If the lowest byte we read is non-zero, we can assume
+ // that little endian format is used.
+ auto value = *reinterpret_cast<char*>(&one);
+ return value ? Little : Big;
+ }
+ };
+ }
+
+ std::string rawMemoryToString( const void *object, std::size_t size ) {
+ // Reverse order for little endian architectures
+ int i = 0, end = static_cast<int>( size ), inc = 1;
+ if( Endianness::which() == Endianness::Little ) {
+ i = end-1;
+ end = inc = -1;
+ }
+
+ unsigned char const *bytes = static_cast<unsigned char const *>(object);
+ ReusableStringStream rss;
+ rss << "0x" << std::setfill('0') << std::hex;
+ for( ; i != end; i += inc )
+ rss << std::setw(2) << static_cast<unsigned>(bytes[i]);
+ return rss.str();
+ }
+}
+
+template<typename T>
+std::string fpToString( T value, int precision ) {
+ if (Catch::isnan(value)) {
+ return "nan";
+ }
+
+ ReusableStringStream rss;
+ rss << std::setprecision( precision )
+ << std::fixed
+ << value;
+ std::string d = rss.str();
+ std::size_t i = d.find_last_not_of( '0' );
+ if( i != std::string::npos && i != d.size()-1 ) {
+ if( d[i] == '.' )
+ i++;
+ d = d.substr( 0, i+1 );
+ }
+ return d;
+}
+
+//// ======================================================= ////
+//
+// Out-of-line defs for full specialization of StringMaker
+//
+//// ======================================================= ////
+
+std::string StringMaker<std::string>::convert(const std::string& str) {
+ if (!getCurrentContext().getConfig()->showInvisibles()) {
+ return '"' + str + '"';
+ }
+
+ std::string s("\"");
+ for (char c : str) {
+ switch (c) {
+ case '\n':
+ s.append("\\n");
+ break;
+ case '\t':
+ s.append("\\t");
+ break;
+ default:
+ s.push_back(c);
+ break;
+ }
+ }
+ s.append("\"");
+ return s;
+}
+
+#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
+std::string StringMaker<std::string_view>::convert(std::string_view str) {
+ return ::Catch::Detail::stringify(std::string{ str });
+}
+#endif
+
+std::string StringMaker<char const*>::convert(char const* str) {
+ if (str) {
+ return ::Catch::Detail::stringify(std::string{ str });
+ } else {
+ return{ "{null string}" };
+ }
+}
+std::string StringMaker<char*>::convert(char* str) {
+ if (str) {
+ return ::Catch::Detail::stringify(std::string{ str });
+ } else {
+ return{ "{null string}" };
+ }
+}
+
+#ifdef CATCH_CONFIG_WCHAR
+std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {
+ std::string s;
+ s.reserve(wstr.size());
+ for (auto c : wstr) {
+ s += (c <= 0xff) ? static_cast<char>(c) : '?';
+ }
+ return ::Catch::Detail::stringify(s);
+}
+
+# ifdef CATCH_CONFIG_CPP17_STRING_VIEW
+std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {
+ return StringMaker<std::wstring>::convert(std::wstring(str));
+}
+# endif
+
+std::string StringMaker<wchar_t const*>::convert(wchar_t const * str) {
+ if (str) {
+ return ::Catch::Detail::stringify(std::wstring{ str });
+ } else {
+ return{ "{null string}" };
+ }
+}
+std::string StringMaker<wchar_t *>::convert(wchar_t * str) {
+ if (str) {
+ return ::Catch::Detail::stringify(std::wstring{ str });
+ } else {
+ return{ "{null string}" };
+ }
+}
+#endif
+
+#if defined(CATCH_CONFIG_CPP17_BYTE)
+#include <cstddef>
+std::string StringMaker<std::byte>::convert(std::byte value) {
+ return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value));
+}
+#endif // defined(CATCH_CONFIG_CPP17_BYTE)
+
+std::string StringMaker<int>::convert(int value) {
+ return ::Catch::Detail::stringify(static_cast<long long>(value));
+}
+std::string StringMaker<long>::convert(long value) {
+ return ::Catch::Detail::stringify(static_cast<long long>(value));
+}
+std::string StringMaker<long long>::convert(long long value) {
+ ReusableStringStream rss;
+ rss << value;
+ if (value > Detail::hexThreshold) {
+ rss << " (0x" << std::hex << value << ')';
+ }
+ return rss.str();
+}
+
+std::string StringMaker<unsigned int>::convert(unsigned int value) {
+ return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
+}
+std::string StringMaker<unsigned long>::convert(unsigned long value) {
+ return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
+}
+std::string StringMaker<unsigned long long>::convert(unsigned long long value) {
+ ReusableStringStream rss;
+ rss << value;
+ if (value > Detail::hexThreshold) {
+ rss << " (0x" << std::hex << value << ')';
+ }
+ return rss.str();
+}
+
+std::string StringMaker<bool>::convert(bool b) {
+ return b ? "true" : "false";
+}
+
+std::string StringMaker<signed char>::convert(signed char value) {
+ if (value == '\r') {
+ return "'\\r'";
+ } else if (value == '\f') {
+ return "'\\f'";
+ } else if (value == '\n') {
+ return "'\\n'";
+ } else if (value == '\t') {
+ return "'\\t'";
+ } else if ('\0' <= value && value < ' ') {
+ return ::Catch::Detail::stringify(static_cast<unsigned int>(value));
+ } else {
+ char chstr[] = "' '";
+ chstr[1] = value;
+ return chstr;
+ }
+}
+std::string StringMaker<char>::convert(char c) {
+ return ::Catch::Detail::stringify(static_cast<signed char>(c));
+}
+std::string StringMaker<unsigned char>::convert(unsigned char c) {
+ return ::Catch::Detail::stringify(static_cast<char>(c));
+}
+
+std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) {
+ return "nullptr";
+}
+
+int StringMaker<float>::precision = 5;
+
+std::string StringMaker<float>::convert(float value) {
+ return fpToString(value, precision) + 'f';
+}
+
+int StringMaker<double>::precision = 10;
+
+std::string StringMaker<double>::convert(double value) {
+ return fpToString(value, precision);
+}
+
+std::string ratio_string<std::atto>::symbol() { return "a"; }
+std::string ratio_string<std::femto>::symbol() { return "f"; }
+std::string ratio_string<std::pico>::symbol() { return "p"; }
+std::string ratio_string<std::nano>::symbol() { return "n"; }
+std::string ratio_string<std::micro>::symbol() { return "u"; }
+std::string ratio_string<std::milli>::symbol() { return "m"; }
+
+} // end namespace Catch
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#endif
+
+// end catch_tostring.cpp
+// start catch_totals.cpp
+
+namespace Catch {
+
+ Counts Counts::operator - ( Counts const& other ) const {
+ Counts diff;
+ diff.passed = passed - other.passed;
+ diff.failed = failed - other.failed;
+ diff.failedButOk = failedButOk - other.failedButOk;
+ return diff;
+ }
+
+ Counts& Counts::operator += ( Counts const& other ) {
+ passed += other.passed;
+ failed += other.failed;
+ failedButOk += other.failedButOk;
+ return *this;
+ }
+
+ std::size_t Counts::total() const {
+ return passed + failed + failedButOk;
+ }
+ bool Counts::allPassed() const {
+ return failed == 0 && failedButOk == 0;
+ }
+ bool Counts::allOk() const {
+ return failed == 0;
+ }
+
+ Totals Totals::operator - ( Totals const& other ) const {
+ Totals diff;
+ diff.assertions = assertions - other.assertions;
+ diff.testCases = testCases - other.testCases;
+ return diff;
+ }
+
+ Totals& Totals::operator += ( Totals const& other ) {
+ assertions += other.assertions;
+ testCases += other.testCases;
+ return *this;
+ }
+
+ Totals Totals::delta( Totals const& prevTotals ) const {
+ Totals diff = *this - prevTotals;
+ if( diff.assertions.failed > 0 )
+ ++diff.testCases.failed;
+ else if( diff.assertions.failedButOk > 0 )
+ ++diff.testCases.failedButOk;
+ else
+ ++diff.testCases.passed;
+ return diff;
+ }
+
+}
+// end catch_totals.cpp
+// start catch_uncaught_exceptions.cpp
+
+// start catch_config_uncaught_exceptions.hpp
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+
+#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+
+#if defined(_MSC_VER)
+# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+# endif
+#endif
+
+#include <exception>
+
+#if defined(__cpp_lib_uncaught_exceptions) \
+ && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+#endif // __cpp_lib_uncaught_exceptions
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \
+ && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \
+ && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+
+# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+#endif
+
+#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+// end catch_config_uncaught_exceptions.hpp
+#include <exception>
+
+namespace Catch {
+ bool uncaught_exceptions() {
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ return false;
+#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+ return std::uncaught_exceptions() > 0;
+#else
+ return std::uncaught_exception();
+#endif
+ }
+} // end namespace Catch
+// end catch_uncaught_exceptions.cpp
+// start catch_version.cpp
+
+#include <ostream>
+
+namespace Catch {
+
+ Version::Version
+ ( unsigned int _majorVersion,
+ unsigned int _minorVersion,
+ unsigned int _patchNumber,
+ char const * const _branchName,
+ unsigned int _buildNumber )
+ : majorVersion( _majorVersion ),
+ minorVersion( _minorVersion ),
+ patchNumber( _patchNumber ),
+ branchName( _branchName ),
+ buildNumber( _buildNumber )
+ {}
+
+ std::ostream& operator << ( std::ostream& os, Version const& version ) {
+ os << version.majorVersion << '.'
+ << version.minorVersion << '.'
+ << version.patchNumber;
+ // branchName is never null -> 0th char is \0 if it is empty
+ if (version.branchName[0]) {
+ os << '-' << version.branchName
+ << '.' << version.buildNumber;
+ }
+ return os;
+ }
+
+ Version const& libraryVersion() {
+ static Version version( 2, 13, 9, "", 0 );
+ return version;
+ }
+
+}
+// end catch_version.cpp
+// start catch_wildcard_pattern.cpp
+
+namespace Catch {
+
+ WildcardPattern::WildcardPattern( std::string const& pattern,
+ CaseSensitive::Choice caseSensitivity )
+ : m_caseSensitivity( caseSensitivity ),
+ m_pattern( normaliseString( pattern ) )
+ {
+ if( startsWith( m_pattern, '*' ) ) {
+ m_pattern = m_pattern.substr( 1 );
+ m_wildcard = WildcardAtStart;
+ }
+ if( endsWith( m_pattern, '*' ) ) {
+ m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );
+ m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );
+ }
+ }
+
+ bool WildcardPattern::matches( std::string const& str ) const {
+ switch( m_wildcard ) {
+ case NoWildcard:
+ return m_pattern == normaliseString( str );
+ case WildcardAtStart:
+ return endsWith( normaliseString( str ), m_pattern );
+ case WildcardAtEnd:
+ return startsWith( normaliseString( str ), m_pattern );
+ case WildcardAtBothEnds:
+ return contains( normaliseString( str ), m_pattern );
+ default:
+ CATCH_INTERNAL_ERROR( "Unknown enum" );
+ }
+ }
+
+ std::string WildcardPattern::normaliseString( std::string const& str ) const {
+ return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str );
+ }
+}
+// end catch_wildcard_pattern.cpp
+// start catch_xmlwriter.cpp
+
+#include <iomanip>
+#include <type_traits>
+
+namespace Catch {
+
+namespace {
+
+ size_t trailingBytes(unsigned char c) {
+ if ((c & 0xE0) == 0xC0) {
+ return 2;
+ }
+ if ((c & 0xF0) == 0xE0) {
+ return 3;
+ }
+ if ((c & 0xF8) == 0xF0) {
+ return 4;
+ }
+ CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+ }
+
+ uint32_t headerValue(unsigned char c) {
+ if ((c & 0xE0) == 0xC0) {
+ return c & 0x1F;
+ }
+ if ((c & 0xF0) == 0xE0) {
+ return c & 0x0F;
+ }
+ if ((c & 0xF8) == 0xF0) {
+ return c & 0x07;
+ }
+ CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+ }
+
+ void hexEscapeChar(std::ostream& os, unsigned char c) {
+ std::ios_base::fmtflags f(os.flags());
+ os << "\\x"
+ << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
+ << static_cast<int>(c);
+ os.flags(f);
+ }
+
+ bool shouldNewline(XmlFormatting fmt) {
+ return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline));
+ }
+
+ bool shouldIndent(XmlFormatting fmt) {
+ return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent));
+ }
+
+} // anonymous namespace
+
+ XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {
+ return static_cast<XmlFormatting>(
+ static_cast<std::underlying_type<XmlFormatting>::type>(lhs) |
+ static_cast<std::underlying_type<XmlFormatting>::type>(rhs)
+ );
+ }
+
+ XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {
+ return static_cast<XmlFormatting>(
+ static_cast<std::underlying_type<XmlFormatting>::type>(lhs) &
+ static_cast<std::underlying_type<XmlFormatting>::type>(rhs)
+ );
+ }
+
+ XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )
+ : m_str( str ),
+ m_forWhat( forWhat )
+ {}
+
+ void XmlEncode::encodeTo( std::ostream& os ) const {
+ // Apostrophe escaping not necessary if we always use " to write attributes
+ // (see: http://www.w3.org/TR/xml/#syntax)
+
+ for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
+ unsigned char c = m_str[idx];
+ switch (c) {
+ case '<': os << "&lt;"; break;
+ case '&': os << "&amp;"; break;
+
+ case '>':
+ // See: http://www.w3.org/TR/xml/#syntax
+ if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')
+ os << "&gt;";
+ else
+ os << c;
+ break;
+
+ case '\"':
+ if (m_forWhat == ForAttributes)
+ os << "&quot;";
+ else
+ os << c;
+ break;
+
+ default:
+ // Check for control characters and invalid utf-8
+
+ // Escape control characters in standard ascii
+ // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
+ if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
+ hexEscapeChar(os, c);
+ break;
+ }
+
+ // Plain ASCII: Write it to stream
+ if (c < 0x7F) {
+ os << c;
+ break;
+ }
+
+ // UTF-8 territory
+ // Check if the encoding is valid and if it is not, hex escape bytes.
+ // Important: We do not check the exact decoded values for validity, only the encoding format
+ // First check that this bytes is a valid lead byte:
+ // This means that it is not encoded as 1111 1XXX
+ // Or as 10XX XXXX
+ if (c < 0xC0 ||
+ c >= 0xF8) {
+ hexEscapeChar(os, c);
+ break;
+ }
+
+ auto encBytes = trailingBytes(c);
+ // Are there enough bytes left to avoid accessing out-of-bounds memory?
+ if (idx + encBytes - 1 >= m_str.size()) {
+ hexEscapeChar(os, c);
+ break;
+ }
+ // The header is valid, check data
+ // The next encBytes bytes must together be a valid utf-8
+ // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)
+ bool valid = true;
+ uint32_t value = headerValue(c);
+ for (std::size_t n = 1; n < encBytes; ++n) {
+ unsigned char nc = m_str[idx + n];
+ valid &= ((nc & 0xC0) == 0x80);
+ value = (value << 6) | (nc & 0x3F);
+ }
+
+ if (
+ // Wrong bit pattern of following bytes
+ (!valid) ||
+ // Overlong encodings
+ (value < 0x80) ||
+ (0x80 <= value && value < 0x800 && encBytes > 2) ||
+ (0x800 < value && value < 0x10000 && encBytes > 3) ||
+ // Encoded value out of range
+ (value >= 0x110000)
+ ) {
+ hexEscapeChar(os, c);
+ break;
+ }
+
+ // If we got here, this is in fact a valid(ish) utf-8 sequence
+ for (std::size_t n = 0; n < encBytes; ++n) {
+ os << m_str[idx + n];
+ }
+ idx += encBytes - 1;
+ break;
+ }
+ }
+ }
+
+ std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {
+ xmlEncode.encodeTo( os );
+ return os;
+ }
+
+ XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt )
+ : m_writer( writer ),
+ m_fmt(fmt)
+ {}
+
+ XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept
+ : m_writer( other.m_writer ),
+ m_fmt(other.m_fmt)
+ {
+ other.m_writer = nullptr;
+ other.m_fmt = XmlFormatting::None;
+ }
+ XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept {
+ if ( m_writer ) {
+ m_writer->endElement();
+ }
+ m_writer = other.m_writer;
+ other.m_writer = nullptr;
+ m_fmt = other.m_fmt;
+ other.m_fmt = XmlFormatting::None;
+ return *this;
+ }
+
+ XmlWriter::ScopedElement::~ScopedElement() {
+ if (m_writer) {
+ m_writer->endElement(m_fmt);
+ }
+ }
+
+ XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) {
+ m_writer->writeText( text, fmt );
+ return *this;
+ }
+
+ XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )
+ {
+ writeDeclaration();
+ }
+
+ XmlWriter::~XmlWriter() {
+ while (!m_tags.empty()) {
+ endElement();
+ }
+ newlineIfNecessary();
+ }
+
+ XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) {
+ ensureTagClosed();
+ newlineIfNecessary();
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ m_indent += " ";
+ }
+ m_os << '<' << name;
+ m_tags.push_back( name );
+ m_tagIsOpen = true;
+ applyFormatting(fmt);
+ return *this;
+ }
+
+ XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) {
+ ScopedElement scoped( this, fmt );
+ startElement( name, fmt );
+ return scoped;
+ }
+
+ XmlWriter& XmlWriter::endElement(XmlFormatting fmt) {
+ m_indent = m_indent.substr(0, m_indent.size() - 2);
+
+ if( m_tagIsOpen ) {
+ m_os << "/>";
+ m_tagIsOpen = false;
+ } else {
+ newlineIfNecessary();
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ }
+ m_os << "</" << m_tags.back() << ">";
+ }
+ m_os << std::flush;
+ applyFormatting(fmt);
+ m_tags.pop_back();
+ return *this;
+ }
+
+ XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {
+ if( !name.empty() && !attribute.empty() )
+ m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+ return *this;
+ }
+
+ XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {
+ m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
+ return *this;
+ }
+
+ XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) {
+ if( !text.empty() ){
+ bool tagWasOpen = m_tagIsOpen;
+ ensureTagClosed();
+ if (tagWasOpen && shouldIndent(fmt)) {
+ m_os << m_indent;
+ }
+ m_os << XmlEncode( text );
+ applyFormatting(fmt);
+ }
+ return *this;
+ }
+
+ XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) {
+ ensureTagClosed();
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ }
+ m_os << "<!--" << text << "-->";
+ applyFormatting(fmt);
+ return *this;
+ }
+
+ void XmlWriter::writeStylesheetRef( std::string const& url ) {
+ m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
+ }
+
+ XmlWriter& XmlWriter::writeBlankLine() {
+ ensureTagClosed();
+ m_os << '\n';
+ return *this;
+ }
+
+ void XmlWriter::ensureTagClosed() {
+ if( m_tagIsOpen ) {
+ m_os << '>' << std::flush;
+ newlineIfNecessary();
+ m_tagIsOpen = false;
+ }
+ }
+
+ void XmlWriter::applyFormatting(XmlFormatting fmt) {
+ m_needsNewline = shouldNewline(fmt);
+ }
+
+ void XmlWriter::writeDeclaration() {
+ m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ }
+
+ void XmlWriter::newlineIfNecessary() {
+ if( m_needsNewline ) {
+ m_os << std::endl;
+ m_needsNewline = false;
+ }
+ }
+}
+// end catch_xmlwriter.cpp
+// start catch_reporter_bases.cpp
+
+#include <cstring>
+#include <cfloat>
+#include <cstdio>
+#include <cassert>
+#include <memory>
+
+namespace Catch {
+ void prepareExpandedExpression(AssertionResult& result) {
+ result.getExpandedExpression();
+ }
+
+ // Because formatting using c++ streams is stateful, drop down to C is required
+ // Alternatively we could use stringstream, but its performance is... not good.
+ std::string getFormattedDuration( double duration ) {
+ // Max exponent + 1 is required to represent the whole part
+ // + 1 for decimal point
+ // + 3 for the 3 decimal places
+ // + 1 for null terminator
+ const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;
+ char buffer[maxDoubleSize];
+
+ // Save previous errno, to prevent sprintf from overwriting it
+ ErrnoGuard guard;
+#ifdef _MSC_VER
+ sprintf_s(buffer, "%.3f", duration);
+#else
+ std::sprintf(buffer, "%.3f", duration);
+#endif
+ return std::string(buffer);
+ }
+
+ bool shouldShowDuration( IConfig const& config, double duration ) {
+ if ( config.showDurations() == ShowDurations::Always ) {
+ return true;
+ }
+ if ( config.showDurations() == ShowDurations::Never ) {
+ return false;
+ }
+ const double min = config.minDuration();
+ return min >= 0 && duration >= min;
+ }
+
+ std::string serializeFilters( std::vector<std::string> const& container ) {
+ ReusableStringStream oss;
+ bool first = true;
+ for (auto&& filter : container)
+ {
+ if (!first)
+ oss << ' ';
+ else
+ first = false;
+
+ oss << filter;
+ }
+ return oss.str();
+ }
+
+ TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config)
+ :StreamingReporterBase(_config) {}
+
+ std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() {
+ return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High };
+ }
+
+ void TestEventListenerBase::assertionStarting(AssertionInfo const &) {}
+
+ bool TestEventListenerBase::assertionEnded(AssertionStats const &) {
+ return false;
+ }
+
+} // end namespace Catch
+// end catch_reporter_bases.cpp
+// start catch_reporter_compact.cpp
+
+namespace {
+
+#ifdef CATCH_PLATFORM_MAC
+ const char* failedString() { return "FAILED"; }
+ const char* passedString() { return "PASSED"; }
+#else
+ const char* failedString() { return "failed"; }
+ const char* passedString() { return "passed"; }
+#endif
+
+ // Colour::LightGrey
+ Catch::Colour::Code dimColour() { return Catch::Colour::FileName; }
+
+ std::string bothOrAll( std::size_t count ) {
+ return count == 1 ? std::string() :
+ count == 2 ? "both " : "all " ;
+ }
+
+} // anon namespace
+
+namespace Catch {
+namespace {
+// Colour, message variants:
+// - white: No tests ran.
+// - red: Failed [both/all] N test cases, failed [both/all] M assertions.
+// - white: Passed [both/all] N test cases (no assertions).
+// - red: Failed N tests cases, failed M assertions.
+// - green: Passed [both/all] N tests cases with M assertions.
+void printTotals(std::ostream& out, const Totals& totals) {
+ if (totals.testCases.total() == 0) {
+ out << "No tests ran.";
+ } else if (totals.testCases.failed == totals.testCases.total()) {
+ Colour colour(Colour::ResultError);
+ const std::string qualify_assertions_failed =
+ totals.assertions.failed == totals.assertions.total() ?
+ bothOrAll(totals.assertions.failed) : std::string();
+ out <<
+ "Failed " << bothOrAll(totals.testCases.failed)
+ << pluralise(totals.testCases.failed, "test case") << ", "
+ "failed " << qualify_assertions_failed <<
+ pluralise(totals.assertions.failed, "assertion") << '.';
+ } else if (totals.assertions.total() == 0) {
+ out <<
+ "Passed " << bothOrAll(totals.testCases.total())
+ << pluralise(totals.testCases.total(), "test case")
+ << " (no assertions).";
+ } else if (totals.assertions.failed) {
+ Colour colour(Colour::ResultError);
+ out <<
+ "Failed " << pluralise(totals.testCases.failed, "test case") << ", "
+ "failed " << pluralise(totals.assertions.failed, "assertion") << '.';
+ } else {
+ Colour colour(Colour::ResultSuccess);
+ out <<
+ "Passed " << bothOrAll(totals.testCases.passed)
+ << pluralise(totals.testCases.passed, "test case") <<
+ " with " << pluralise(totals.assertions.passed, "assertion") << '.';
+ }
+}
+
+// Implementation of CompactReporter formatting
+class AssertionPrinter {
+public:
+ AssertionPrinter& operator= (AssertionPrinter const&) = delete;
+ AssertionPrinter(AssertionPrinter const&) = delete;
+ AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)
+ : stream(_stream)
+ , result(_stats.assertionResult)
+ , messages(_stats.infoMessages)
+ , itMessage(_stats.infoMessages.begin())
+ , printInfoMessages(_printInfoMessages) {}
+
+ void print() {
+ printSourceInfo();
+
+ itMessage = messages.begin();
+
+ switch (result.getResultType()) {
+ case ResultWas::Ok:
+ printResultType(Colour::ResultSuccess, passedString());
+ printOriginalExpression();
+ printReconstructedExpression();
+ if (!result.hasExpression())
+ printRemainingMessages(Colour::None);
+ else
+ printRemainingMessages();
+ break;
+ case ResultWas::ExpressionFailed:
+ if (result.isOk())
+ printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok"));
+ else
+ printResultType(Colour::Error, failedString());
+ printOriginalExpression();
+ printReconstructedExpression();
+ printRemainingMessages();
+ break;
+ case ResultWas::ThrewException:
+ printResultType(Colour::Error, failedString());
+ printIssue("unexpected exception with message:");
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::FatalErrorCondition:
+ printResultType(Colour::Error, failedString());
+ printIssue("fatal error condition with message:");
+ printMessage();
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::DidntThrowException:
+ printResultType(Colour::Error, failedString());
+ printIssue("expected exception, got none");
+ printExpressionWas();
+ printRemainingMessages();
+ break;
+ case ResultWas::Info:
+ printResultType(Colour::None, "info");
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::Warning:
+ printResultType(Colour::None, "warning");
+ printMessage();
+ printRemainingMessages();
+ break;
+ case ResultWas::ExplicitFailure:
+ printResultType(Colour::Error, failedString());
+ printIssue("explicitly");
+ printRemainingMessages(Colour::None);
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ printResultType(Colour::Error, "** internal error **");
+ break;
+ }
+ }
+
+private:
+ void printSourceInfo() const {
+ Colour colourGuard(Colour::FileName);
+ stream << result.getSourceInfo() << ':';
+ }
+
+ void printResultType(Colour::Code colour, std::string const& passOrFail) const {
+ if (!passOrFail.empty()) {
+ {
+ Colour colourGuard(colour);
+ stream << ' ' << passOrFail;
+ }
+ stream << ':';
+ }
+ }
+
+ void printIssue(std::string const& issue) const {
+ stream << ' ' << issue;
+ }
+
+ void printExpressionWas() {
+ if (result.hasExpression()) {
+ stream << ';';
+ {
+ Colour colour(dimColour());
+ stream << " expression was:";
+ }
+ printOriginalExpression();
+ }
+ }
+
+ void printOriginalExpression() const {
+ if (result.hasExpression()) {
+ stream << ' ' << result.getExpression();
+ }
+ }
+
+ void printReconstructedExpression() const {
+ if (result.hasExpandedExpression()) {
+ {
+ Colour colour(dimColour());
+ stream << " for: ";
+ }
+ stream << result.getExpandedExpression();
+ }
+ }
+
+ void printMessage() {
+ if (itMessage != messages.end()) {
+ stream << " '" << itMessage->message << '\'';
+ ++itMessage;
+ }
+ }
+
+ void printRemainingMessages(Colour::Code colour = dimColour()) {
+ if (itMessage == messages.end())
+ return;
+
+ const auto itEnd = messages.cend();
+ const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd));
+
+ {
+ Colour colourGuard(colour);
+ stream << " with " << pluralise(N, "message") << ':';
+ }
+
+ while (itMessage != itEnd) {
+ // If this assertion is a warning ignore any INFO messages
+ if (printInfoMessages || itMessage->type != ResultWas::Info) {
+ printMessage();
+ if (itMessage != itEnd) {
+ Colour colourGuard(dimColour());
+ stream << " and";
+ }
+ continue;
+ }
+ ++itMessage;
+ }
+ }
+
+private:
+ std::ostream& stream;
+ AssertionResult const& result;
+ std::vector<MessageInfo> messages;
+ std::vector<MessageInfo>::const_iterator itMessage;
+ bool printInfoMessages;
+};
+
+} // anon namespace
+
+ std::string CompactReporter::getDescription() {
+ return "Reports test results on a single line, suitable for IDEs";
+ }
+
+ void CompactReporter::noMatchingTestCases( std::string const& spec ) {
+ stream << "No test cases matched '" << spec << '\'' << std::endl;
+ }
+
+ void CompactReporter::assertionStarting( AssertionInfo const& ) {}
+
+ bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool printInfoMessages = true;
+
+ // Drop out if result was successful and we're not printing those
+ if( !m_config->includeSuccessfulResults() && result.isOk() ) {
+ if( result.getResultType() != ResultWas::Warning )
+ return false;
+ printInfoMessages = false;
+ }
+
+ AssertionPrinter printer( stream, _assertionStats, printInfoMessages );
+ printer.print();
+
+ stream << std::endl;
+ return true;
+ }
+
+ void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {
+ double dur = _sectionStats.durationInSeconds;
+ if ( shouldShowDuration( *m_config, dur ) ) {
+ stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ }
+ }
+
+ void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) {
+ printTotals( stream, _testRunStats.totals );
+ stream << '\n' << std::endl;
+ StreamingReporterBase::testRunEnded( _testRunStats );
+ }
+
+ CompactReporter::~CompactReporter() {}
+
+ CATCH_REGISTER_REPORTER( "compact", CompactReporter )
+
+} // end namespace Catch
+// end catch_reporter_compact.cpp
+// start catch_reporter_console.cpp
+
+#include <cfloat>
+#include <cstdio>
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch
+ // Note that 4062 (not all labels are handled and default is missing) is enabled
+#endif
+
+#if defined(__clang__)
+# pragma clang diagnostic push
+// For simplicity, benchmarking-only helpers are always enabled
+# pragma clang diagnostic ignored "-Wunused-function"
+#endif
+
+namespace Catch {
+
+namespace {
+
+// Formatter impl for ConsoleReporter
+class ConsoleAssertionPrinter {
+public:
+ ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete;
+ ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete;
+ ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)
+ : stream(_stream),
+ stats(_stats),
+ result(_stats.assertionResult),
+ colour(Colour::None),
+ message(result.getMessage()),
+ messages(_stats.infoMessages),
+ printInfoMessages(_printInfoMessages) {
+ switch (result.getResultType()) {
+ case ResultWas::Ok:
+ colour = Colour::Success;
+ passOrFail = "PASSED";
+ //if( result.hasMessage() )
+ if (_stats.infoMessages.size() == 1)
+ messageLabel = "with message";
+ if (_stats.infoMessages.size() > 1)
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ExpressionFailed:
+ if (result.isOk()) {
+ colour = Colour::Success;
+ passOrFail = "FAILED - but was ok";
+ } else {
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ }
+ if (_stats.infoMessages.size() == 1)
+ messageLabel = "with message";
+ if (_stats.infoMessages.size() > 1)
+ messageLabel = "with messages";
+ break;
+ case ResultWas::ThrewException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to unexpected exception with ";
+ if (_stats.infoMessages.size() == 1)
+ messageLabel += "message";
+ if (_stats.infoMessages.size() > 1)
+ messageLabel += "messages";
+ break;
+ case ResultWas::FatalErrorCondition:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "due to a fatal error condition";
+ break;
+ case ResultWas::DidntThrowException:
+ colour = Colour::Error;
+ passOrFail = "FAILED";
+ messageLabel = "because no exception was thrown where one was expected";
+ break;
+ case ResultWas::Info:
+ messageLabel = "info";
+ break;
+ case ResultWas::Warning:
+ messageLabel = "warning";
+ break;
+ case ResultWas::ExplicitFailure:
+ passOrFail = "FAILED";
+ colour = Colour::Error;
+ if (_stats.infoMessages.size() == 1)
+ messageLabel = "explicitly with message";
+ if (_stats.infoMessages.size() > 1)
+ messageLabel = "explicitly with messages";
+ break;
+ // These cases are here to prevent compiler warnings
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ passOrFail = "** internal error **";
+ colour = Colour::Error;
+ break;
+ }
+ }
+
+ void print() const {
+ printSourceInfo();
+ if (stats.totals.assertions.total() > 0) {
+ printResultType();
+ printOriginalExpression();
+ printReconstructedExpression();
+ } else {
+ stream << '\n';
+ }
+ printMessage();
+ }
+
+private:
+ void printResultType() const {
+ if (!passOrFail.empty()) {
+ Colour colourGuard(colour);
+ stream << passOrFail << ":\n";
+ }
+ }
+ void printOriginalExpression() const {
+ if (result.hasExpression()) {
+ Colour colourGuard(Colour::OriginalExpression);
+ stream << " ";
+ stream << result.getExpressionInMacro();
+ stream << '\n';
+ }
+ }
+ void printReconstructedExpression() const {
+ if (result.hasExpandedExpression()) {
+ stream << "with expansion:\n";
+ Colour colourGuard(Colour::ReconstructedExpression);
+ stream << Column(result.getExpandedExpression()).indent(2) << '\n';
+ }
+ }
+ void printMessage() const {
+ if (!messageLabel.empty())
+ stream << messageLabel << ':' << '\n';
+ for (auto const& msg : messages) {
+ // If this assertion is a warning ignore any INFO messages
+ if (printInfoMessages || msg.type != ResultWas::Info)
+ stream << Column(msg.message).indent(2) << '\n';
+ }
+ }
+ void printSourceInfo() const {
+ Colour colourGuard(Colour::FileName);
+ stream << result.getSourceInfo() << ": ";
+ }
+
+ std::ostream& stream;
+ AssertionStats const& stats;
+ AssertionResult const& result;
+ Colour::Code colour;
+ std::string passOrFail;
+ std::string messageLabel;
+ std::string message;
+ std::vector<MessageInfo> messages;
+ bool printInfoMessages;
+};
+
+std::size_t makeRatio(std::size_t number, std::size_t total) {
+ std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;
+ return (ratio == 0 && number > 0) ? 1 : ratio;
+}
+
+std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) {
+ if (i > j && i > k)
+ return i;
+ else if (j > k)
+ return j;
+ else
+ return k;
+}
+
+struct ColumnInfo {
+ enum Justification { Left, Right };
+ std::string name;
+ int width;
+ Justification justification;
+};
+struct ColumnBreak {};
+struct RowBreak {};
+
+class Duration {
+ enum class Unit {
+ Auto,
+ Nanoseconds,
+ Microseconds,
+ Milliseconds,
+ Seconds,
+ Minutes
+ };
+ static const uint64_t s_nanosecondsInAMicrosecond = 1000;
+ static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond;
+ static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;
+ static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;
+
+ double m_inNanoseconds;
+ Unit m_units;
+
+public:
+ explicit Duration(double inNanoseconds, Unit units = Unit::Microseconds)
+ : m_inNanoseconds(inNanoseconds),
+ m_units(units) {
+ if (m_units == Unit::Auto) {
+ if (m_inNanoseconds < s_nanosecondsInAMicrosecond)
+ m_units = Unit::Nanoseconds;
+ else if (m_inNanoseconds < s_nanosecondsInAMillisecond)
+ m_units = Unit::Microseconds;
+ else if (m_inNanoseconds < s_nanosecondsInASecond)
+ m_units = Unit::Milliseconds;
+ else if (m_inNanoseconds < s_nanosecondsInAMinute)
+ m_units = Unit::Seconds;
+ else
+ m_units = Unit::Minutes;
+ }
+
+ }
+
+ auto value() const -> double {
+ switch (m_units) {
+ case Unit::Microseconds:
+ return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond);
+ case Unit::Milliseconds:
+ return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond);
+ case Unit::Seconds:
+ return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond);
+ case Unit::Minutes:
+ return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);
+ default:
+ return m_inNanoseconds;
+ }
+ }
+ auto unitsAsString() const -> std::string {
+ switch (m_units) {
+ case Unit::Nanoseconds:
+ return "ns";
+ case Unit::Microseconds:
+ return "us";
+ case Unit::Milliseconds:
+ return "ms";
+ case Unit::Seconds:
+ return "s";
+ case Unit::Minutes:
+ return "m";
+ default:
+ return "** internal error **";
+ }
+
+ }
+ friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& {
+ return os << std::fixed << duration.value() << ' ' << duration.unitsAsString();
+ }
+};
+} // end anon namespace
+
+class TablePrinter {
+ std::ostream& m_os;
+ std::vector<ColumnInfo> m_columnInfos;
+ std::ostringstream m_oss;
+ int m_currentColumn = -1;
+ bool m_isOpen = false;
+
+public:
+ TablePrinter( std::ostream& os, std::vector<ColumnInfo> columnInfos )
+ : m_os( os ),
+ m_columnInfos( std::move( columnInfos ) ) {}
+
+ auto columnInfos() const -> std::vector<ColumnInfo> const& {
+ return m_columnInfos;
+ }
+
+ void open() {
+ if (!m_isOpen) {
+ m_isOpen = true;
+ *this << RowBreak();
+
+ Columns headerCols;
+ Spacer spacer(2);
+ for (auto const& info : m_columnInfos) {
+ headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));
+ headerCols += spacer;
+ }
+ m_os << headerCols << '\n';
+
+ m_os << Catch::getLineOfChars<'-'>() << '\n';
+ }
+ }
+ void close() {
+ if (m_isOpen) {
+ *this << RowBreak();
+ m_os << std::endl;
+ m_isOpen = false;
+ }
+ }
+
+ template<typename T>
+ friend TablePrinter& operator << (TablePrinter& tp, T const& value) {
+ tp.m_oss << value;
+ return tp;
+ }
+
+ friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) {
+ auto colStr = tp.m_oss.str();
+ const auto strSize = colStr.size();
+ tp.m_oss.str("");
+ tp.open();
+ if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {
+ tp.m_currentColumn = -1;
+ tp.m_os << '\n';
+ }
+ tp.m_currentColumn++;
+
+ auto colInfo = tp.m_columnInfos[tp.m_currentColumn];
+ auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width))
+ ? std::string(colInfo.width - (strSize + 1), ' ')
+ : std::string();
+ if (colInfo.justification == ColumnInfo::Left)
+ tp.m_os << colStr << padding << ' ';
+ else
+ tp.m_os << padding << colStr << ' ';
+ return tp;
+ }
+
+ friend TablePrinter& operator << (TablePrinter& tp, RowBreak) {
+ if (tp.m_currentColumn > 0) {
+ tp.m_os << '\n';
+ tp.m_currentColumn = -1;
+ }
+ return tp;
+ }
+};
+
+ConsoleReporter::ConsoleReporter(ReporterConfig const& config)
+ : StreamingReporterBase(config),
+ m_tablePrinter(new TablePrinter(config.stream(),
+ [&config]() -> std::vector<ColumnInfo> {
+ if (config.fullConfig()->benchmarkNoAnalysis())
+ {
+ return{
+ { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },
+ { " samples", 14, ColumnInfo::Right },
+ { " iterations", 14, ColumnInfo::Right },
+ { " mean", 14, ColumnInfo::Right }
+ };
+ }
+ else
+ {
+ return{
+ { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },
+ { "samples mean std dev", 14, ColumnInfo::Right },
+ { "iterations low mean low std dev", 14, ColumnInfo::Right },
+ { "estimated high mean high std dev", 14, ColumnInfo::Right }
+ };
+ }
+ }())) {}
+ConsoleReporter::~ConsoleReporter() = default;
+
+std::string ConsoleReporter::getDescription() {
+ return "Reports test results as plain lines of text";
+}
+
+void ConsoleReporter::noMatchingTestCases(std::string const& spec) {
+ stream << "No test cases matched '" << spec << '\'' << std::endl;
+}
+
+void ConsoleReporter::reportInvalidArguments(std::string const&arg){
+ stream << "Invalid Filter: " << arg << std::endl;
+}
+
+void ConsoleReporter::assertionStarting(AssertionInfo const&) {}
+
+bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {
+ AssertionResult const& result = _assertionStats.assertionResult;
+
+ bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();
+
+ // Drop out if result was successful but we're not printing them.
+ if (!includeResults && result.getResultType() != ResultWas::Warning)
+ return false;
+
+ lazyPrint();
+
+ ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults);
+ printer.print();
+ stream << std::endl;
+ return true;
+}
+
+void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) {
+ m_tablePrinter->close();
+ m_headerPrinted = false;
+ StreamingReporterBase::sectionStarting(_sectionInfo);
+}
+void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {
+ m_tablePrinter->close();
+ if (_sectionStats.missingAssertions) {
+ lazyPrint();
+ Colour colour(Colour::ResultError);
+ if (m_sectionStack.size() > 1)
+ stream << "\nNo assertions in section";
+ else
+ stream << "\nNo assertions in test case";
+ stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
+ }
+ double dur = _sectionStats.durationInSeconds;
+ if (shouldShowDuration(*m_config, dur)) {
+ stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ }
+ if (m_headerPrinted) {
+ m_headerPrinted = false;
+ }
+ StreamingReporterBase::sectionEnded(_sectionStats);
+}
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+void ConsoleReporter::benchmarkPreparing(std::string const& name) {
+ lazyPrintWithoutClosingBenchmarkTable();
+
+ auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));
+
+ bool firstLine = true;
+ for (auto line : nameCol) {
+ if (!firstLine)
+ (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();
+ else
+ firstLine = false;
+
+ (*m_tablePrinter) << line << ColumnBreak();
+ }
+}
+
+void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {
+ (*m_tablePrinter) << info.samples << ColumnBreak()
+ << info.iterations << ColumnBreak();
+ if (!m_config->benchmarkNoAnalysis())
+ (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak();
+}
+void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {
+ if (m_config->benchmarkNoAnalysis())
+ {
+ (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak();
+ }
+ else
+ {
+ (*m_tablePrinter) << ColumnBreak()
+ << Duration(stats.mean.point.count()) << ColumnBreak()
+ << Duration(stats.mean.lower_bound.count()) << ColumnBreak()
+ << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak()
+ << Duration(stats.standardDeviation.point.count()) << ColumnBreak()
+ << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak()
+ << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak();
+ }
+}
+
+void ConsoleReporter::benchmarkFailed(std::string const& error) {
+ Colour colour(Colour::Red);
+ (*m_tablePrinter)
+ << "Benchmark failed (" << error << ')'
+ << ColumnBreak() << RowBreak();
+}
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) {
+ m_tablePrinter->close();
+ StreamingReporterBase::testCaseEnded(_testCaseStats);
+ m_headerPrinted = false;
+}
+void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) {
+ if (currentGroupInfo.used) {
+ printSummaryDivider();
+ stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
+ printTotals(_testGroupStats.totals);
+ stream << '\n' << std::endl;
+ }
+ StreamingReporterBase::testGroupEnded(_testGroupStats);
+}
+void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {
+ printTotalsDivider(_testRunStats.totals);
+ printTotals(_testRunStats.totals);
+ stream << std::endl;
+ StreamingReporterBase::testRunEnded(_testRunStats);
+}
+void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {
+ StreamingReporterBase::testRunStarting(_testInfo);
+ printTestFilters();
+}
+
+void ConsoleReporter::lazyPrint() {
+
+ m_tablePrinter->close();
+ lazyPrintWithoutClosingBenchmarkTable();
+}
+
+void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() {
+
+ if (!currentTestRunInfo.used)
+ lazyPrintRunInfo();
+ if (!currentGroupInfo.used)
+ lazyPrintGroupInfo();
+
+ if (!m_headerPrinted) {
+ printTestCaseAndSectionHeader();
+ m_headerPrinted = true;
+ }
+}
+void ConsoleReporter::lazyPrintRunInfo() {
+ stream << '\n' << getLineOfChars<'~'>() << '\n';
+ Colour colour(Colour::SecondaryText);
+ stream << currentTestRunInfo->name
+ << " is a Catch v" << libraryVersion() << " host application.\n"
+ << "Run with -? for options\n\n";
+
+ if (m_config->rngSeed() != 0)
+ stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";
+
+ currentTestRunInfo.used = true;
+}
+void ConsoleReporter::lazyPrintGroupInfo() {
+ if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) {
+ printClosedHeader("Group: " + currentGroupInfo->name);
+ currentGroupInfo.used = true;
+ }
+}
+void ConsoleReporter::printTestCaseAndSectionHeader() {
+ assert(!m_sectionStack.empty());
+ printOpenHeader(currentTestCaseInfo->name);
+
+ if (m_sectionStack.size() > 1) {
+ Colour colourGuard(Colour::Headers);
+
+ auto
+ it = m_sectionStack.begin() + 1, // Skip first section (test case)
+ itEnd = m_sectionStack.end();
+ for (; it != itEnd; ++it)
+ printHeaderString(it->name, 2);
+ }
+
+ SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;
+
+ stream << getLineOfChars<'-'>() << '\n';
+ Colour colourGuard(Colour::FileName);
+ stream << lineInfo << '\n';
+ stream << getLineOfChars<'.'>() << '\n' << std::endl;
+}
+
+void ConsoleReporter::printClosedHeader(std::string const& _name) {
+ printOpenHeader(_name);
+ stream << getLineOfChars<'.'>() << '\n';
+}
+void ConsoleReporter::printOpenHeader(std::string const& _name) {
+ stream << getLineOfChars<'-'>() << '\n';
+ {
+ Colour colourGuard(Colour::Headers);
+ printHeaderString(_name);
+ }
+}
+
+// if string has a : in first line will set indent to follow it on
+// subsequent lines
+void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) {
+ std::size_t i = _string.find(": ");
+ if (i != std::string::npos)
+ i += 2;
+ else
+ i = 0;
+ stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n';
+}
+
+struct SummaryColumn {
+
+ SummaryColumn( std::string _label, Colour::Code _colour )
+ : label( std::move( _label ) ),
+ colour( _colour ) {}
+ SummaryColumn addRow( std::size_t count ) {
+ ReusableStringStream rss;
+ rss << count;
+ std::string row = rss.str();
+ for (auto& oldRow : rows) {
+ while (oldRow.size() < row.size())
+ oldRow = ' ' + oldRow;
+ while (oldRow.size() > row.size())
+ row = ' ' + row;
+ }
+ rows.push_back(row);
+ return *this;
+ }
+
+ std::string label;
+ Colour::Code colour;
+ std::vector<std::string> rows;
+
+};
+
+void ConsoleReporter::printTotals( Totals const& totals ) {
+ if (totals.testCases.total() == 0) {
+ stream << Colour(Colour::Warning) << "No tests ran\n";
+ } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) {
+ stream << Colour(Colour::ResultSuccess) << "All tests passed";
+ stream << " ("
+ << pluralise(totals.assertions.passed, "assertion") << " in "
+ << pluralise(totals.testCases.passed, "test case") << ')'
+ << '\n';
+ } else {
+
+ std::vector<SummaryColumn> columns;
+ columns.push_back(SummaryColumn("", Colour::None)
+ .addRow(totals.testCases.total())
+ .addRow(totals.assertions.total()));
+ columns.push_back(SummaryColumn("passed", Colour::Success)
+ .addRow(totals.testCases.passed)
+ .addRow(totals.assertions.passed));
+ columns.push_back(SummaryColumn("failed", Colour::ResultError)
+ .addRow(totals.testCases.failed)
+ .addRow(totals.assertions.failed));
+ columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure)
+ .addRow(totals.testCases.failedButOk)
+ .addRow(totals.assertions.failedButOk));
+
+ printSummaryRow("test cases", columns, 0);
+ printSummaryRow("assertions", columns, 1);
+ }
+}
+void ConsoleReporter::printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row) {
+ for (auto col : cols) {
+ std::string value = col.rows[row];
+ if (col.label.empty()) {
+ stream << label << ": ";
+ if (value != "0")
+ stream << value;
+ else
+ stream << Colour(Colour::Warning) << "- none -";
+ } else if (value != "0") {
+ stream << Colour(Colour::LightGrey) << " | ";
+ stream << Colour(col.colour)
+ << value << ' ' << col.label;
+ }
+ }
+ stream << '\n';
+}
+
+void ConsoleReporter::printTotalsDivider(Totals const& totals) {
+ if (totals.testCases.total() > 0) {
+ std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());
+ std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total());
+ std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());
+ while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)
+ findMax(failedRatio, failedButOkRatio, passedRatio)++;
+ while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)
+ findMax(failedRatio, failedButOkRatio, passedRatio)--;
+
+ stream << Colour(Colour::Error) << std::string(failedRatio, '=');
+ stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');
+ if (totals.testCases.allPassed())
+ stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');
+ else
+ stream << Colour(Colour::Success) << std::string(passedRatio, '=');
+ } else {
+ stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');
+ }
+ stream << '\n';
+}
+void ConsoleReporter::printSummaryDivider() {
+ stream << getLineOfChars<'-'>() << '\n';
+}
+
+void ConsoleReporter::printTestFilters() {
+ if (m_config->testSpec().hasFilters()) {
+ Colour guard(Colour::BrightYellow);
+ stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n';
+ }
+}
+
+CATCH_REGISTER_REPORTER("console", ConsoleReporter)
+
+} // end namespace Catch
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+#if defined(__clang__)
+# pragma clang diagnostic pop
+#endif
+// end catch_reporter_console.cpp
+// start catch_reporter_junit.cpp
+
+#include <cassert>
+#include <sstream>
+#include <ctime>
+#include <algorithm>
+#include <iomanip>
+
+namespace Catch {
+
+ namespace {
+ std::string getCurrentTimestamp() {
+ // Beware, this is not reentrant because of backward compatibility issues
+ // Also, UTC only, again because of backward compatibility (%z is C++11)
+ time_t rawtime;
+ std::time(&rawtime);
+ auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
+
+#ifdef _MSC_VER
+ std::tm timeInfo = {};
+ gmtime_s(&timeInfo, &rawtime);
+#else
+ std::tm* timeInfo;
+ timeInfo = std::gmtime(&rawtime);
+#endif
+
+ char timeStamp[timeStampSize];
+ const char * const fmt = "%Y-%m-%dT%H:%M:%SZ";
+
+#ifdef _MSC_VER
+ std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
+#else
+ std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
+#endif
+ return std::string(timeStamp, timeStampSize-1);
+ }
+
+ std::string fileNameTag(const std::vector<std::string> &tags) {
+ auto it = std::find_if(begin(tags),
+ end(tags),
+ [] (std::string const& tag) {return tag.front() == '#'; });
+ if (it != tags.end())
+ return it->substr(1);
+ return std::string();
+ }
+
+ // Formats the duration in seconds to 3 decimal places.
+ // This is done because some genius defined Maven Surefire schema
+ // in a way that only accepts 3 decimal places, and tools like
+ // Jenkins use that schema for validation JUnit reporter output.
+ std::string formatDuration( double seconds ) {
+ ReusableStringStream rss;
+ rss << std::fixed << std::setprecision( 3 ) << seconds;
+ return rss.str();
+ }
+
+ } // anonymous namespace
+
+ JunitReporter::JunitReporter( ReporterConfig const& _config )
+ : CumulativeReporterBase( _config ),
+ xml( _config.stream() )
+ {
+ m_reporterPrefs.shouldRedirectStdOut = true;
+ m_reporterPrefs.shouldReportAllAssertions = true;
+ }
+
+ JunitReporter::~JunitReporter() {}
+
+ std::string JunitReporter::getDescription() {
+ return "Reports test results in an XML format that looks like Ant's junitreport target";
+ }
+
+ void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {}
+
+ void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) {
+ CumulativeReporterBase::testRunStarting( runInfo );
+ xml.startElement( "testsuites" );
+ }
+
+ void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) {
+ suiteTimer.start();
+ stdOutForSuite.clear();
+ stdErrForSuite.clear();
+ unexpectedExceptions = 0;
+ CumulativeReporterBase::testGroupStarting( groupInfo );
+ }
+
+ void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) {
+ m_okToFail = testCaseInfo.okToFail();
+ }
+
+ bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) {
+ if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail )
+ unexpectedExceptions++;
+ return CumulativeReporterBase::assertionEnded( assertionStats );
+ }
+
+ void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {
+ stdOutForSuite += testCaseStats.stdOut;
+ stdErrForSuite += testCaseStats.stdErr;
+ CumulativeReporterBase::testCaseEnded( testCaseStats );
+ }
+
+ void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {
+ double suiteTime = suiteTimer.getElapsedSeconds();
+ CumulativeReporterBase::testGroupEnded( testGroupStats );
+ writeGroup( *m_testGroups.back(), suiteTime );
+ }
+
+ void JunitReporter::testRunEndedCumulative() {
+ xml.endElement();
+ }
+
+ void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
+
+ TestGroupStats const& stats = groupNode.value;
+ xml.writeAttribute( "name", stats.groupInfo.name );
+ xml.writeAttribute( "errors", unexpectedExceptions );
+ xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions );
+ xml.writeAttribute( "tests", stats.totals.assertions.total() );
+ xml.writeAttribute( "hostname", "tbd" ); // !TBD
+ if( m_config->showDurations() == ShowDurations::Never )
+ xml.writeAttribute( "time", "" );
+ else
+ xml.writeAttribute( "time", formatDuration( suiteTime ) );
+ xml.writeAttribute( "timestamp", getCurrentTimestamp() );
+
+ // Write properties if there are any
+ if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {
+ auto properties = xml.scopedElement("properties");
+ if (m_config->hasTestFilters()) {
+ xml.scopedElement("property")
+ .writeAttribute("name", "filters")
+ .writeAttribute("value", serializeFilters(m_config->getTestsOrTags()));
+ }
+ if (m_config->rngSeed() != 0) {
+ xml.scopedElement("property")
+ .writeAttribute("name", "random-seed")
+ .writeAttribute("value", m_config->rngSeed());
+ }
+ }
+
+ // Write test cases
+ for( auto const& child : groupNode.children )
+ writeTestCase( *child );
+
+ xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline );
+ xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline );
+ }
+
+ void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) {
+ TestCaseStats const& stats = testCaseNode.value;
+
+ // All test cases have exactly one section - which represents the
+ // test case itself. That section may have 0-n nested sections
+ assert( testCaseNode.children.size() == 1 );
+ SectionNode const& rootSection = *testCaseNode.children.front();
+
+ std::string className = stats.testInfo.className;
+
+ if( className.empty() ) {
+ className = fileNameTag(stats.testInfo.tags);
+ if ( className.empty() )
+ className = "global";
+ }
+
+ if ( !m_config->name().empty() )
+ className = m_config->name() + "." + className;
+
+ writeSection( className, "", rootSection, stats.testInfo.okToFail() );
+ }
+
+ void JunitReporter::writeSection( std::string const& className,
+ std::string const& rootName,
+ SectionNode const& sectionNode,
+ bool testOkToFail) {
+ std::string name = trim( sectionNode.stats.sectionInfo.name );
+ if( !rootName.empty() )
+ name = rootName + '/' + name;
+
+ if( !sectionNode.assertions.empty() ||
+ !sectionNode.stdOut.empty() ||
+ !sectionNode.stdErr.empty() ) {
+ XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
+ if( className.empty() ) {
+ xml.writeAttribute( "classname", name );
+ xml.writeAttribute( "name", "root" );
+ }
+ else {
+ xml.writeAttribute( "classname", className );
+ xml.writeAttribute( "name", name );
+ }
+ xml.writeAttribute( "time", formatDuration( sectionNode.stats.durationInSeconds ) );
+ // This is not ideal, but it should be enough to mimic gtest's
+ // junit output.
+ // Ideally the JUnit reporter would also handle `skipTest`
+ // events and write those out appropriately.
+ xml.writeAttribute( "status", "run" );
+
+ if (sectionNode.stats.assertions.failedButOk) {
+ xml.scopedElement("skipped")
+ .writeAttribute("message", "TEST_CASE tagged with !mayfail");
+ }
+
+ writeAssertions( sectionNode );
+
+ if( !sectionNode.stdOut.empty() )
+ xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline );
+ if( !sectionNode.stdErr.empty() )
+ xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline );
+ }
+ for( auto const& childNode : sectionNode.childSections )
+ if( className.empty() )
+ writeSection( name, "", *childNode, testOkToFail );
+ else
+ writeSection( className, name, *childNode, testOkToFail );
+ }
+
+ void JunitReporter::writeAssertions( SectionNode const& sectionNode ) {
+ for( auto const& assertion : sectionNode.assertions )
+ writeAssertion( assertion );
+ }
+
+ void JunitReporter::writeAssertion( AssertionStats const& stats ) {
+ AssertionResult const& result = stats.assertionResult;
+ if( !result.isOk() ) {
+ std::string elementName;
+ switch( result.getResultType() ) {
+ case ResultWas::ThrewException:
+ case ResultWas::FatalErrorCondition:
+ elementName = "error";
+ break;
+ case ResultWas::ExplicitFailure:
+ case ResultWas::ExpressionFailed:
+ case ResultWas::DidntThrowException:
+ elementName = "failure";
+ break;
+
+ // We should never see these here:
+ case ResultWas::Info:
+ case ResultWas::Warning:
+ case ResultWas::Ok:
+ case ResultWas::Unknown:
+ case ResultWas::FailureBit:
+ case ResultWas::Exception:
+ elementName = "internalError";
+ break;
+ }
+
+ XmlWriter::ScopedElement e = xml.scopedElement( elementName );
+
+ xml.writeAttribute( "message", result.getExpression() );
+ xml.writeAttribute( "type", result.getTestMacroName() );
+
+ ReusableStringStream rss;
+ if (stats.totals.assertions.total() > 0) {
+ rss << "FAILED" << ":\n";
+ if (result.hasExpression()) {
+ rss << " ";
+ rss << result.getExpressionInMacro();
+ rss << '\n';
+ }
+ if (result.hasExpandedExpression()) {
+ rss << "with expansion:\n";
+ rss << Column(result.getExpandedExpression()).indent(2) << '\n';
+ }
+ } else {
+ rss << '\n';
+ }
+
+ if( !result.getMessage().empty() )
+ rss << result.getMessage() << '\n';
+ for( auto const& msg : stats.infoMessages )
+ if( msg.type == ResultWas::Info )
+ rss << msg.message << '\n';
+
+ rss << "at " << result.getSourceInfo();
+ xml.writeText( rss.str(), XmlFormatting::Newline );
+ }
+ }
+
+ CATCH_REGISTER_REPORTER( "junit", JunitReporter )
+
+} // end namespace Catch
+// end catch_reporter_junit.cpp
+// start catch_reporter_listening.cpp
+
+#include <cassert>
+
+namespace Catch {
+
+ ListeningReporter::ListeningReporter() {
+ // We will assume that listeners will always want all assertions
+ m_preferences.shouldReportAllAssertions = true;
+ }
+
+ void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) {
+ m_listeners.push_back( std::move( listener ) );
+ }
+
+ void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) {
+ assert(!m_reporter && "Listening reporter can wrap only 1 real reporter");
+ m_reporter = std::move( reporter );
+ m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut;
+ }
+
+ ReporterPreferences ListeningReporter::getPreferences() const {
+ return m_preferences;
+ }
+
+ std::set<Verbosity> ListeningReporter::getSupportedVerbosities() {
+ return std::set<Verbosity>{ };
+ }
+
+ void ListeningReporter::noMatchingTestCases( std::string const& spec ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->noMatchingTestCases( spec );
+ }
+ m_reporter->noMatchingTestCases( spec );
+ }
+
+ void ListeningReporter::reportInvalidArguments(std::string const&arg){
+ for ( auto const& listener : m_listeners ) {
+ listener->reportInvalidArguments( arg );
+ }
+ m_reporter->reportInvalidArguments( arg );
+ }
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void ListeningReporter::benchmarkPreparing( std::string const& name ) {
+ for (auto const& listener : m_listeners) {
+ listener->benchmarkPreparing(name);
+ }
+ m_reporter->benchmarkPreparing(name);
+ }
+ void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->benchmarkStarting( benchmarkInfo );
+ }
+ m_reporter->benchmarkStarting( benchmarkInfo );
+ }
+ void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->benchmarkEnded( benchmarkStats );
+ }
+ m_reporter->benchmarkEnded( benchmarkStats );
+ }
+
+ void ListeningReporter::benchmarkFailed( std::string const& error ) {
+ for (auto const& listener : m_listeners) {
+ listener->benchmarkFailed(error);
+ }
+ m_reporter->benchmarkFailed(error);
+ }
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testRunStarting( testRunInfo );
+ }
+ m_reporter->testRunStarting( testRunInfo );
+ }
+
+ void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testGroupStarting( groupInfo );
+ }
+ m_reporter->testGroupStarting( groupInfo );
+ }
+
+ void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testCaseStarting( testInfo );
+ }
+ m_reporter->testCaseStarting( testInfo );
+ }
+
+ void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->sectionStarting( sectionInfo );
+ }
+ m_reporter->sectionStarting( sectionInfo );
+ }
+
+ void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->assertionStarting( assertionInfo );
+ }
+ m_reporter->assertionStarting( assertionInfo );
+ }
+
+ // The return value indicates if the messages buffer should be cleared:
+ bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) {
+ for( auto const& listener : m_listeners ) {
+ static_cast<void>( listener->assertionEnded( assertionStats ) );
+ }
+ return m_reporter->assertionEnded( assertionStats );
+ }
+
+ void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->sectionEnded( sectionStats );
+ }
+ m_reporter->sectionEnded( sectionStats );
+ }
+
+ void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testCaseEnded( testCaseStats );
+ }
+ m_reporter->testCaseEnded( testCaseStats );
+ }
+
+ void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testGroupEnded( testGroupStats );
+ }
+ m_reporter->testGroupEnded( testGroupStats );
+ }
+
+ void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->testRunEnded( testRunStats );
+ }
+ m_reporter->testRunEnded( testRunStats );
+ }
+
+ void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) {
+ for ( auto const& listener : m_listeners ) {
+ listener->skipTest( testInfo );
+ }
+ m_reporter->skipTest( testInfo );
+ }
+
+ bool ListeningReporter::isMulti() const {
+ return true;
+ }
+
+} // end namespace Catch
+// end catch_reporter_listening.cpp
+// start catch_reporter_xml.cpp
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch
+ // Note that 4062 (not all labels are handled
+ // and default is missing) is enabled
+#endif
+
+namespace Catch {
+ XmlReporter::XmlReporter( ReporterConfig const& _config )
+ : StreamingReporterBase( _config ),
+ m_xml(_config.stream())
+ {
+ m_reporterPrefs.shouldRedirectStdOut = true;
+ m_reporterPrefs.shouldReportAllAssertions = true;
+ }
+
+ XmlReporter::~XmlReporter() = default;
+
+ std::string XmlReporter::getDescription() {
+ return "Reports test results as an XML document";
+ }
+
+ std::string XmlReporter::getStylesheetRef() const {
+ return std::string();
+ }
+
+ void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) {
+ m_xml
+ .writeAttribute( "filename", sourceInfo.file )
+ .writeAttribute( "line", sourceInfo.line );
+ }
+
+ void XmlReporter::noMatchingTestCases( std::string const& s ) {
+ StreamingReporterBase::noMatchingTestCases( s );
+ }
+
+ void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) {
+ StreamingReporterBase::testRunStarting( testInfo );
+ std::string stylesheetRef = getStylesheetRef();
+ if( !stylesheetRef.empty() )
+ m_xml.writeStylesheetRef( stylesheetRef );
+ m_xml.startElement( "Catch" );
+ if( !m_config->name().empty() )
+ m_xml.writeAttribute( "name", m_config->name() );
+ if (m_config->testSpec().hasFilters())
+ m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) );
+ if( m_config->rngSeed() != 0 )
+ m_xml.scopedElement( "Randomness" )
+ .writeAttribute( "seed", m_config->rngSeed() );
+ }
+
+ void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) {
+ StreamingReporterBase::testGroupStarting( groupInfo );
+ m_xml.startElement( "Group" )
+ .writeAttribute( "name", groupInfo.name );
+ }
+
+ void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) {
+ StreamingReporterBase::testCaseStarting(testInfo);
+ m_xml.startElement( "TestCase" )
+ .writeAttribute( "name", trim( testInfo.name ) )
+ .writeAttribute( "description", testInfo.description )
+ .writeAttribute( "tags", testInfo.tagsAsString() );
+
+ writeSourceInfo( testInfo.lineInfo );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ m_testCaseTimer.start();
+ m_xml.ensureTagClosed();
+ }
+
+ void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) {
+ StreamingReporterBase::sectionStarting( sectionInfo );
+ if( m_sectionDepth++ > 0 ) {
+ m_xml.startElement( "Section" )
+ .writeAttribute( "name", trim( sectionInfo.name ) );
+ writeSourceInfo( sectionInfo.lineInfo );
+ m_xml.ensureTagClosed();
+ }
+ }
+
+ void XmlReporter::assertionStarting( AssertionInfo const& ) { }
+
+ bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) {
+
+ AssertionResult const& result = assertionStats.assertionResult;
+
+ bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();
+
+ if( includeResults || result.getResultType() == ResultWas::Warning ) {
+ // Print any info messages in <Info> tags.
+ for( auto const& msg : assertionStats.infoMessages ) {
+ if( msg.type == ResultWas::Info && includeResults ) {
+ m_xml.scopedElement( "Info" )
+ .writeText( msg.message );
+ } else if ( msg.type == ResultWas::Warning ) {
+ m_xml.scopedElement( "Warning" )
+ .writeText( msg.message );
+ }
+ }
+ }
+
+ // Drop out if result was successful but we're not printing them.
+ if( !includeResults && result.getResultType() != ResultWas::Warning )
+ return true;
+
+ // Print the expression if there is one.
+ if( result.hasExpression() ) {
+ m_xml.startElement( "Expression" )
+ .writeAttribute( "success", result.succeeded() )
+ .writeAttribute( "type", result.getTestMacroName() );
+
+ writeSourceInfo( result.getSourceInfo() );
+
+ m_xml.scopedElement( "Original" )
+ .writeText( result.getExpression() );
+ m_xml.scopedElement( "Expanded" )
+ .writeText( result.getExpandedExpression() );
+ }
+
+ // And... Print a result applicable to each result type.
+ switch( result.getResultType() ) {
+ case ResultWas::ThrewException:
+ m_xml.startElement( "Exception" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ case ResultWas::FatalErrorCondition:
+ m_xml.startElement( "FatalErrorCondition" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ case ResultWas::Info:
+ m_xml.scopedElement( "Info" )
+ .writeText( result.getMessage() );
+ break;
+ case ResultWas::Warning:
+ // Warning will already have been written
+ break;
+ case ResultWas::ExplicitFailure:
+ m_xml.startElement( "Failure" );
+ writeSourceInfo( result.getSourceInfo() );
+ m_xml.writeText( result.getMessage() );
+ m_xml.endElement();
+ break;
+ default:
+ break;
+ }
+
+ if( result.hasExpression() )
+ m_xml.endElement();
+
+ return true;
+ }
+
+ void XmlReporter::sectionEnded( SectionStats const& sectionStats ) {
+ StreamingReporterBase::sectionEnded( sectionStats );
+ if( --m_sectionDepth > 0 ) {
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" );
+ e.writeAttribute( "successes", sectionStats.assertions.passed );
+ e.writeAttribute( "failures", sectionStats.assertions.failed );
+ e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds );
+
+ m_xml.endElement();
+ }
+ }
+
+ void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {
+ StreamingReporterBase::testCaseEnded( testCaseStats );
+ XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" );
+ e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() );
+
+ if ( m_config->showDurations() == ShowDurations::Always )
+ e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() );
+
+ if( !testCaseStats.stdOut.empty() )
+ m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline );
+ if( !testCaseStats.stdErr.empty() )
+ m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline );
+
+ m_xml.endElement();
+ }
+
+ void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {
+ StreamingReporterBase::testGroupEnded( testGroupStats );
+ // TODO: Check testGroupStats.aborting and act accordingly.
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testGroupStats.totals.assertions.passed )
+ .writeAttribute( "failures", testGroupStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk );
+ m_xml.scopedElement( "OverallResultsCases")
+ .writeAttribute( "successes", testGroupStats.totals.testCases.passed )
+ .writeAttribute( "failures", testGroupStats.totals.testCases.failed )
+ .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk );
+ m_xml.endElement();
+ }
+
+ void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) {
+ StreamingReporterBase::testRunEnded( testRunStats );
+ m_xml.scopedElement( "OverallResults" )
+ .writeAttribute( "successes", testRunStats.totals.assertions.passed )
+ .writeAttribute( "failures", testRunStats.totals.assertions.failed )
+ .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk );
+ m_xml.scopedElement( "OverallResultsCases")
+ .writeAttribute( "successes", testRunStats.totals.testCases.passed )
+ .writeAttribute( "failures", testRunStats.totals.testCases.failed )
+ .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk );
+ m_xml.endElement();
+ }
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+ void XmlReporter::benchmarkPreparing(std::string const& name) {
+ m_xml.startElement("BenchmarkResults")
+ .writeAttribute("name", name);
+ }
+
+ void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) {
+ m_xml.writeAttribute("samples", info.samples)
+ .writeAttribute("resamples", info.resamples)
+ .writeAttribute("iterations", info.iterations)
+ .writeAttribute("clockResolution", info.clockResolution)
+ .writeAttribute("estimatedDuration", info.estimatedDuration)
+ .writeComment("All values in nano seconds");
+ }
+
+ void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
+ m_xml.startElement("mean")
+ .writeAttribute("value", benchmarkStats.mean.point.count())
+ .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count())
+ .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count())
+ .writeAttribute("ci", benchmarkStats.mean.confidence_interval);
+ m_xml.endElement();
+ m_xml.startElement("standardDeviation")
+ .writeAttribute("value", benchmarkStats.standardDeviation.point.count())
+ .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count())
+ .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count())
+ .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval);
+ m_xml.endElement();
+ m_xml.startElement("outliers")
+ .writeAttribute("variance", benchmarkStats.outlierVariance)
+ .writeAttribute("lowMild", benchmarkStats.outliers.low_mild)
+ .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe)
+ .writeAttribute("highMild", benchmarkStats.outliers.high_mild)
+ .writeAttribute("highSevere", benchmarkStats.outliers.high_severe);
+ m_xml.endElement();
+ m_xml.endElement();
+ }
+
+ void XmlReporter::benchmarkFailed(std::string const &error) {
+ m_xml.scopedElement("failed").
+ writeAttribute("message", error);
+ m_xml.endElement();
+ }
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+ CATCH_REGISTER_REPORTER( "xml", XmlReporter )
+
+} // end namespace Catch
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+// end catch_reporter_xml.cpp
+
+namespace Catch {
+ LeakDetector leakDetector;
+}
+
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+
+// end catch_impl.hpp
+#endif
+
+#ifdef CATCH_CONFIG_MAIN
+// start catch_default_main.hpp
+
+#ifndef __OBJC__
+
+#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)
+// Standard C/C++ Win32 Unicode wmain entry point
+extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) {
+#else
+// Standard C/C++ main entry point
+int main (int argc, char * argv[]) {
+#endif
+
+ return Catch::Session().run( argc, argv );
+}
+
+#else // __OBJC__
+
+// Objective-C entry point
+int main (int argc, char * const argv[]) {
+#if !CATCH_ARC_ENABLED
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+#endif
+
+ Catch::registerTestMethods();
+ int result = Catch::Session().run( argc, (char**)argv );
+
+#if !CATCH_ARC_ENABLED
+ [pool drain];
+#endif
+
+ return result;
+}
+
+#endif // __OBJC__
+
+// end catch_default_main.hpp
+#endif
+
+#if !defined(CATCH_CONFIG_IMPL_ONLY)
+
+#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
+# undef CLARA_CONFIG_MAIN
+#endif
+
+#if !defined(CATCH_CONFIG_DISABLE)
+//////
+// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
+#ifdef CATCH_CONFIG_PREFIX_ALL
+
+#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
+
+#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
+#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )
+#endif// CATCH_CONFIG_DISABLE_MATCHERS
+#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+
+#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
+#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )
+
+#define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
+
+#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+
+#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
+#define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "CATCH_UNSCOPED_INFO", msg )
+#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
+#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE",__VA_ARGS__ )
+
+#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
+#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )
+#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+
+#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )
+#else
+#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )
+#endif
+
+#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
+#define CATCH_STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__ , #__VA_ARGS__ ); CATCH_SUCCEED( #__VA_ARGS__ )
+#define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); CATCH_SUCCEED( #__VA_ARGS__ )
+#else
+#define CATCH_STATIC_REQUIRE( ... ) CATCH_REQUIRE( __VA_ARGS__ )
+#define CATCH_STATIC_REQUIRE_FALSE( ... ) CATCH_REQUIRE_FALSE( __VA_ARGS__ )
+#endif
+
+// "BDD-style" convenience wrappers
+#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+#define CATCH_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc )
+#define CATCH_AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc )
+#define CATCH_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc )
+#define CATCH_AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc )
+#define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc )
+#define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc )
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+#define CATCH_BENCHMARK(...) \
+ INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))
+#define CATCH_BENCHMARK_ADVANCED(name) \
+ INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), name)
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
+#else
+
+#define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
+
+#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr )
+#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ )
+
+#define CHECK( ... ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )
+#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )
+
+#define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )
+#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )
+
+#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg )
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+
+#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
+#define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "UNSCOPED_INFO", msg )
+#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
+#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE",__VA_ARGS__ )
+
+#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
+#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
+#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )
+#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
+#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )
+#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )
+#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )
+#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )
+#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )
+#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)
+#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#else
+#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )
+#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )
+#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
+#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )
+#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )
+#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )
+#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) )
+#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
+#endif
+
+#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
+#define STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ )
+#define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); SUCCEED( "!(" #__VA_ARGS__ ")" )
+#else
+#define STATIC_REQUIRE( ... ) REQUIRE( __VA_ARGS__ )
+#define STATIC_REQUIRE_FALSE( ... ) REQUIRE_FALSE( __VA_ARGS__ )
+#endif
+
+#endif
+
+#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
+
+// "BDD-style" convenience wrappers
+#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
+#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ )
+
+#define GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc )
+#define AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc )
+#define WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc )
+#define AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc )
+#define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc )
+#define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc )
+
+#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+#define BENCHMARK(...) \
+ INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))
+#define BENCHMARK_ADVANCED(name) \
+ INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(C_A_T_C_H_B_E_N_C_H_), name)
+#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
+
+using Catch::Detail::Approx;
+
+#else // CATCH_CONFIG_DISABLE
+
+//////
+// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
+#ifdef CATCH_CONFIG_PREFIX_ALL
+
+#define CATCH_REQUIRE( ... ) (void)(0)
+#define CATCH_REQUIRE_FALSE( ... ) (void)(0)
+
+#define CATCH_REQUIRE_THROWS( ... ) (void)(0)
+#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)
+#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) (void)(0)
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
+#endif// CATCH_CONFIG_DISABLE_MATCHERS
+#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0)
+
+#define CATCH_CHECK( ... ) (void)(0)
+#define CATCH_CHECK_FALSE( ... ) (void)(0)
+#define CATCH_CHECKED_IF( ... ) if (__VA_ARGS__)
+#define CATCH_CHECKED_ELSE( ... ) if (!(__VA_ARGS__))
+#define CATCH_CHECK_NOFAIL( ... ) (void)(0)
+
+#define CATCH_CHECK_THROWS( ... ) (void)(0)
+#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0)
+#define CATCH_CHECK_THROWS_WITH( expr, matcher ) (void)(0)
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define CATCH_CHECK_NOTHROW( ... ) (void)(0)
+
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CATCH_CHECK_THAT( arg, matcher ) (void)(0)
+
+#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0)
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+
+#define CATCH_INFO( msg ) (void)(0)
+#define CATCH_UNSCOPED_INFO( msg ) (void)(0)
+#define CATCH_WARN( msg ) (void)(0)
+#define CATCH_CAPTURE( msg ) (void)(0)
+
+#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+#define CATCH_METHOD_AS_TEST_CASE( method, ... )
+#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0)
+#define CATCH_SECTION( ... )
+#define CATCH_DYNAMIC_SECTION( ... )
+#define CATCH_FAIL( ... ) (void)(0)
+#define CATCH_FAIL_CHECK( ... ) (void)(0)
+#define CATCH_SUCCEED( ... ) (void)(0)
+
+#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
+#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
+#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
+#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#else
+#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )
+#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#endif
+
+// "BDD-style" convenience wrappers
+#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), className )
+#define CATCH_GIVEN( desc )
+#define CATCH_AND_GIVEN( desc )
+#define CATCH_WHEN( desc )
+#define CATCH_AND_WHEN( desc )
+#define CATCH_THEN( desc )
+#define CATCH_AND_THEN( desc )
+
+#define CATCH_STATIC_REQUIRE( ... ) (void)(0)
+#define CATCH_STATIC_REQUIRE_FALSE( ... ) (void)(0)
+
+// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
+#else
+
+#define REQUIRE( ... ) (void)(0)
+#define REQUIRE_FALSE( ... ) (void)(0)
+
+#define REQUIRE_THROWS( ... ) (void)(0)
+#define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)
+#define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0)
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define REQUIRE_NOTHROW( ... ) (void)(0)
+
+#define CHECK( ... ) (void)(0)
+#define CHECK_FALSE( ... ) (void)(0)
+#define CHECKED_IF( ... ) if (__VA_ARGS__)
+#define CHECKED_ELSE( ... ) if (!(__VA_ARGS__))
+#define CHECK_NOFAIL( ... ) (void)(0)
+
+#define CHECK_THROWS( ... ) (void)(0)
+#define CHECK_THROWS_AS( expr, exceptionType ) (void)(0)
+#define CHECK_THROWS_WITH( expr, matcher ) (void)(0)
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+#define CHECK_NOTHROW( ... ) (void)(0)
+
+#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
+#define CHECK_THAT( arg, matcher ) (void)(0)
+
+#define REQUIRE_THAT( arg, matcher ) (void)(0)
+#endif // CATCH_CONFIG_DISABLE_MATCHERS
+
+#define INFO( msg ) (void)(0)
+#define UNSCOPED_INFO( msg ) (void)(0)
+#define WARN( msg ) (void)(0)
+#define CAPTURE( ... ) (void)(0)
+
+#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+#define METHOD_AS_TEST_CASE( method, ... )
+#define REGISTER_TEST_CASE( Function, ... ) (void)(0)
+#define SECTION( ... )
+#define DYNAMIC_SECTION( ... )
+#define FAIL( ... ) (void)(0)
+#define FAIL_CHECK( ... ) (void)(0)
+#define SUCCEED( ... ) (void)(0)
+#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
+
+#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
+#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
+#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
+#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#else
+#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )
+#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )
+#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )
+#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )
+#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )
+#endif
+
+#define STATIC_REQUIRE( ... ) (void)(0)
+#define STATIC_REQUIRE_FALSE( ... ) (void)(0)
+
+#endif
+
+#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
+
+// "BDD-style" convenience wrappers
+#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ) )
+#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), className )
+
+#define GIVEN( desc )
+#define AND_GIVEN( desc )
+#define WHEN( desc )
+#define AND_WHEN( desc )
+#define THEN( desc )
+#define AND_THEN( desc )
+
+using Catch::Detail::Approx;
+
+#endif
+
+#endif // ! CATCH_CONFIG_IMPL_ONLY
+
+// start catch_reenable_warnings.h
+
+
+#ifdef __clang__
+# ifdef __ICC // icpc defines the __clang__ macro
+# pragma warning(pop)
+# else
+# pragma clang diagnostic pop
+# endif
+#elif defined __GNUC__
+# pragma GCC diagnostic pop
+#endif
+
+// end catch_reenable_warnings.h
+// end catch.hpp
+#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
+
diff --git a/lib/lua/CMakeLists.txt b/lib/lua/CMakeLists.txt
index 5d0dc0f70..2de4840cb 100644
--- a/lib/lua/CMakeLists.txt
+++ b/lib/lua/CMakeLists.txt
@@ -1,12 +1,10 @@
-project(lua C)
+project(lua CXX)
set(LUA_VERSION_MAJOR 5)
set(LUA_VERSION_MINOR 1)
set(LUA_VERSION_PATCH 4)
set(LUA_VERSION "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}.${LUA_VERSION_PATCH}")
-set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
-
set(COMMON_CFLAGS)
set(COMMON_LDFLAGS)
set(LIBS)
@@ -50,19 +48,12 @@ if(LUA_ANSI)
set(COMMON_CFLAGS "${COMMON_CFLAGS} -DLUA_ANSI")
endif(LUA_ANSI)
-# COMMON_CFLAGS has no effect without this line
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_CFLAGS}")
-
-
-# Standard flags to use for each build type.
-if(CMAKE_COMPILER_IS_GNUCC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -Wall -Wextra -Wshadow -W -pedantic -std=gnu99")
- set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
- set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g")
- set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_PROFILE} -O1 -g")
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_WITHDEBINFO} -O2 -g")
-endif(CMAKE_COMPILER_IS_GNUCC)
-
+# Standard flags to use
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|(Apple)?Clang")
+ set(COMMON_CFLAGS "${COMMON_CFLAGS} -pipe -Wall -Wextra -Wshadow -W -pedantic")
+endif()
-add_subdirectory(src build)
+# COMMON_CFLAGS has no effect without this line
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_CFLAGS}")
+add_subdirectory(src)
diff --git a/lib/lua/src/CMakeLists.txt b/lib/lua/src/CMakeLists.txt
index 8f6cc1213..2ca4f4168 100644
--- a/lib/lua/src/CMakeLists.txt
+++ b/lib/lua/src/CMakeLists.txt
@@ -31,24 +31,14 @@ set(LUA_CORE_SRC
lvm.c
lzio.c
)
-set(LUA_LIB_HEADERS
- lua.h
- lualib.h
- lauxlib.h
- luaconf.h
-)
-
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_BINARY_DIR})
-# Lua library.
+# Lua library
add_library(lua STATIC ${LUA_CORE_SRC})
target_link_libraries(lua ${LIBS})
-set(LUA_STATIC_LIB lua)
-set(LUA_LIBS lua)
-
-set_target_properties(${LUA_LIBS} PROPERTIES
+set_target_properties(lua PROPERTIES
VERSION ${LUA_VERSION}
CLEAN_DIRECT_OUTPUT 1
)
+# Compile code as C++
+set_source_files_properties(${LUA_CORE_SRC} PROPERTIES LANGUAGE CXX)
diff --git a/lib/lua/src/lgc.c b/lib/lua/src/lgc.c
index e909c79a9..9141a1c60 100644
--- a/lib/lua/src/lgc.c
+++ b/lib/lua/src/lgc.c
@@ -164,8 +164,13 @@ static int traversetable (global_State *g, Table *h) {
markobject(g, h->metatable);
mode = gfasttm(g, h->metatable, TM_MODE);
if (mode && ttisstring(mode)) { /* is there a weak mode? */
- weakkey = (strchr(svalue(mode), 'k') != NULL);
- weakvalue = (strchr(svalue(mode), 'v') != NULL);
+ // Android's 'FORTIFY libc' calls __builtin_object_size on the argument of strchr.
+ // This produces an incorrect size for the expression `svalue(mode)`, causing
+ // an assertion. By placing it in a temporary, __builtin_object_size returns
+ // -1 (for unknown size) which functions correctly.
+ const char *tmp = svalue(mode);
+ weakkey = (strchr(tmp, 'k') != NULL);
+ weakvalue = (strchr(tmp, 'v') != NULL);
if (weakkey || weakvalue) { /* is really weak? */
h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */
h->marked |= cast_byte((weakkey << KEYWEAKBIT) |
diff --git a/lib/lua/src/luaconf.h b/lib/lua/src/luaconf.h
index e2cb26163..1521f0cbc 100644
--- a/lib/lua/src/luaconf.h
+++ b/lib/lua/src/luaconf.h
@@ -143,6 +143,14 @@
#define LUA_INTEGER ptrdiff_t
+/* MINETEST-SPECIFIC CHANGE: make sure API functions conform to the C ABI. */
+#if defined(__cplusplus)
+#define LUAI_API_EXTERN extern "C"
+#else
+#define LUAI_API_EXTERN extern
+#endif
+
+
/*
@@ LUA_API is a mark for all core API functions.
@@ LUALIB_API is a mark for all standard library functions.
@@ -154,14 +162,14 @@
#if defined(LUA_BUILD_AS_DLL)
#if defined(LUA_CORE) || defined(LUA_LIB)
-#define LUA_API __declspec(dllexport)
+#define LUA_API LUAI_API_EXTERN __declspec(dllexport)
#else
-#define LUA_API __declspec(dllimport)
+#define LUA_API LUAI_API_EXTERN __declspec(dllimport)
#endif
#else
-#define LUA_API extern
+#define LUA_API LUAI_API_EXTERN
#endif
diff --git a/minetest.conf.example b/minetest.conf.example
index 7f4b5d946..2f153413a 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -16,30 +16,13 @@
# Controls
#
+## General
+
# If enabled, you can place blocks at the position (feet + eye level) where you stand.
# This is helpful when working with nodeboxes in small areas.
# type: bool
# enable_build_where_you_stand = false
-# Player is able to fly without being affected by gravity.
-# This requires the "fly" privilege on the server.
-# type: bool
-# free_move = false
-
-# If enabled, makes move directions relative to the player's pitch when flying or swimming.
-# type: bool
-# pitch_move = false
-
-# Fast movement (via the "Aux1" key).
-# This requires the "fast" privilege on the server.
-# type: bool
-# fast_move = false
-
-# If enabled together with fly mode, player is able to fly through solid nodes.
-# This requires the "noclip" privilege on the server.
-# type: bool
-# noclip = false
-
# Smooths camera when looking around. Also called look or mouse smoothing.
# Useful for recording videos.
# type: bool
@@ -53,14 +36,6 @@
# type: float min: 0 max: 0.99
# cinematic_camera_smoothing = 0.7
-# Invert vertical mouse movement.
-# type: bool
-# invert_mouse = false
-
-# Mouse sensitivity multiplier.
-# type: float
-# mouse_sensitivity = 0.2
-
# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and
# descending.
# type: bool
@@ -77,7 +52,7 @@
# The time in seconds it takes between repeated node placements when holding
# the place button.
-# type: float min: 0.001
+# type: float min: 0.25 max: 2
# repeat_place_time = 0.25
# Automatically jump up single-node obstacles.
@@ -89,14 +64,17 @@
# type: bool
# safe_dig_and_place = false
-# Enable random user input (only used for testing).
-# type: bool
-# random_input = false
+## Keyboard and Mouse
-# Continuous forward movement, toggled by autoforward key.
-# Press the autoforward key again or the backwards movement to disable.
+# Invert vertical mouse movement.
# type: bool
-# continuous_forward = false
+# invert_mouse = false
+
+# Mouse sensitivity multiplier.
+# type: float min: 0.001 max: 10
+# mouse_sensitivity = 0.2
+
+## Touchscreen
# The length in pixels it takes for touch screen interaction to start.
# type: int min: 0 max: 100
@@ -112,431 +90,217 @@
# type: bool
# virtual_joystick_triggers_aux1 = false
-# Enable joysticks
-# type: bool
-# enable_joysticks = false
-
-# The identifier of the joystick to use
-# type: int
-# joystick_id = 0
-
-# The type of joystick
-# type: enum values: auto, generic, xbox, dragonrise_gamecube
-# joystick_type = auto
-
-# The time in seconds it takes between repeated events
-# when holding down a joystick button combination.
-# type: float min: 0.001
-# repeat_joystick_button_time = 0.17
-
-# The dead zone of the joystick
-# type: int
-# joystick_deadzone = 2048
-
-# The sensitivity of the joystick axes for moving the
-# in-game view frustum around.
-# type: float
-# joystick_frustum_sensitivity = 170
-
-# Key for moving the player forward.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_forward = KEY_KEY_W
-
-# Key for moving the player backward.
-# Will also disable autoforward, when active.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_backward = KEY_KEY_S
-
-# Key for moving the player left.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_left = KEY_KEY_A
-
-# Key for moving the player right.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_right = KEY_KEY_D
-
-# Key for jumping.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_jump = KEY_SPACE
-
-# Key for sneaking.
-# Also used for climbing down and descending in water if aux1_descends is disabled.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_sneak = KEY_LSHIFT
-
-# Key for digging.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_dig = KEY_LBUTTON
-
-# Key for placing.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_place = KEY_RBUTTON
-
-# Key for opening the inventory.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_inventory = KEY_KEY_I
-
-# Key for moving fast in fast mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_aux1 = KEY_KEY_E
-
-# Key for opening the chat window.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_chat = KEY_KEY_T
-
-# Key for opening the chat window to type commands.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_cmd = /
-
-# Key for opening the chat window to type local commands.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_cmd_local = .
-
-# Key for toggling unlimited view range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_rangeselect = KEY_KEY_R
-
-# Key for toggling flying.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_freemove = KEY_KEY_K
-
-# Key for toggling pitch move mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_pitchmove = KEY_KEY_P
-
-# Key for toggling fast mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_fastmove = KEY_KEY_J
-
-# Key for toggling noclip mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_noclip = KEY_KEY_H
-
-# Key for selecting the next item in the hotbar.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_hotbar_next = KEY_KEY_N
-
-# Key for selecting the previous item in the hotbar.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_hotbar_previous = KEY_KEY_B
-
-# Key for muting the game.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_mute = KEY_KEY_M
-
-# Key for increasing the volume.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_increase_volume =
-
-# Key for decreasing the volume.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_decrease_volume =
-
-# Key for toggling autoforward.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_autoforward =
-
-# Key for toggling cinematic mode.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_cinematic =
-
-# Key for toggling display of minimap.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_minimap = KEY_KEY_V
-
-# Key for taking screenshots.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_screenshot = KEY_F12
-
-# Key for dropping the currently selected item.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_drop = KEY_KEY_Q
-
-# Key to use view zoom when possible.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_zoom = KEY_KEY_Z
-
-# Key for selecting the first hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot1 = KEY_KEY_1
+#
+# Graphics and Audio
+#
-# Key for selecting the second hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot2 = KEY_KEY_2
+## Graphics
-# Key for selecting the third hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot3 = KEY_KEY_3
+### Screen
-# Key for selecting the fourth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot4 = KEY_KEY_4
-
-# Key for selecting the fifth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot5 = KEY_KEY_5
-
-# Key for selecting the sixth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot6 = KEY_KEY_6
+# Width component of the initial window size. Ignored in fullscreen mode.
+# type: int min: 1 max: 65535
+# screen_w = 1024
-# Key for selecting the seventh hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot7 = KEY_KEY_7
+# Height component of the initial window size. Ignored in fullscreen mode.
+# type: int min: 1 max: 65535
+# screen_h = 600
-# Key for selecting the eighth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot8 = KEY_KEY_8
+# Save window size automatically when modified.
+# type: bool
+# autosave_screensize = true
-# Key for selecting the ninth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot9 = KEY_KEY_9
+# Fullscreen mode.
+# type: bool
+# fullscreen = false
-# Key for selecting the tenth hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot10 = KEY_KEY_0
+# Open the pause menu when the window's focus is lost. Does not pause if a formspec is
+# open.
+# type: bool
+# pause_on_lost_focus = false
-# Key for selecting the 11th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot11 =
+### FPS
-# Key for selecting the 12th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot12 =
+# If FPS would go higher than this, limit it by sleeping
+# to not waste CPU power for no benefit.
+# type: int min: 1 max: 4294967295
+# fps_max = 60
-# Key for selecting the 13th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot13 =
+# Vertical screen synchronization.
+# type: bool
+# vsync = false
-# Key for selecting the 14th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot14 =
+# Maximum FPS when the window is not focused, or when the game is paused.
+# type: int min: 1 max: 4294967295
+# fps_max_unfocused = 20
-# Key for selecting the 15th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot15 =
+# View distance in nodes.
+# type: int min: 20 max: 4000
+# viewing_range = 190
-# Key for selecting the 16th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot16 =
+# Undersampling is similar to using a lower screen resolution, but it applies
+# to the game world only, keeping the GUI intact.
+# It should give a significant performance boost at the cost of less detailed image.
+# Higher values result in a less detailed image.
+# type: int min: 1 max: 8
+# undersampling = 1
-# Key for selecting the 17th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot17 =
+### Graphics Effects
-# Key for selecting the 18th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot18 =
+# Makes all liquids opaque
+# type: bool
+# opaque_water = false
-# Key for selecting the 19th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot19 =
+# Leaves style:
+# - Fancy: all faces visible
+# - Simple: only outer faces, if defined special_tiles are used
+# - Opaque: disable transparency
+# type: enum values: fancy, simple, opaque
+# leaves_style = fancy
-# Key for selecting the 20th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot20 =
+# Connects glass if supported by node.
+# type: bool
+# connected_glass = false
-# Key for selecting the 21st hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot21 =
+# Enable smooth lighting with simple ambient occlusion.
+# Disable for speed or for different looks.
+# type: bool
+# smooth_lighting = true
-# Key for selecting the 22nd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot22 =
+# Enables tradeoffs that reduce CPU load or increase rendering performance
+# at the expense of minor visual glitches that do not impact game playability.
+# type: bool
+# performance_tradeoffs = false
-# Key for selecting the 23rd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot23 =
+# Adds particles when digging a node.
+# type: bool
+# enable_particles = true
-# Key for selecting the 24th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot24 =
+### 3d
-# Key for selecting the 25th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot25 =
+# 3D support.
+# Currently supported:
+# - none: no 3d output.
+# - anaglyph: cyan/magenta color 3d.
+# - interlaced: odd/even line based polarisation screen support.
+# - topbottom: split screen top/bottom.
+# - sidebyside: split screen side by side.
+# - crossview: Cross-eyed 3d
+# - pageflip: quadbuffer based 3d.
+# Note that the interlaced mode requires shaders to be enabled.
+# type: enum values: none, anaglyph, interlaced, topbottom, sidebyside, crossview, pageflip
+# 3d_mode = none
-# Key for selecting the 26th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot26 =
+# Strength of 3D mode parallax.
+# type: float min: -0.087 max: 0.087
+# 3d_paralax_strength = 0.025
-# Key for selecting the 27th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot27 =
+### Bobbing
-# Key for selecting the 28th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot28 =
+# Arm inertia, gives a more realistic movement of
+# the arm when the camera moves.
+# type: bool
+# arm_inertia = true
-# Key for selecting the 29th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot29 =
+# Enable view bobbing and amount of view bobbing.
+# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
+# type: float min: 0 max: 7.9
+# view_bobbing_amount = 1.0
-# Key for selecting the 30th hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot30 =
+# Multiplier for fall bobbing.
+# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
+# type: float min: 0 max: 100
+# fall_bobbing_amount = 0.03
-# Key for selecting the 31st hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot31 =
+### Camera
-# Key for selecting the 32nd hotbar slot.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_slot32 =
+# Camera 'near clipping plane' distance in nodes, between 0 and 0.25
+# Only works on GLES platforms. Most users will not need to change this.
+# Increasing can reduce artifacting on weaker GPUs.
+# 0.1 = Default, 0.25 = Good value for weaker tablets.
+# type: float min: 0 max: 0.25
+# near_plane = 0.1
-# Key for toggling the display of the HUD.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_hud = KEY_F1
+# Field of view in degrees.
+# type: int min: 45 max: 160
+# fov = 72
-# Key for toggling the display of chat.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_chat = KEY_F2
+# Alters the light curve by applying 'gamma correction' to it.
+# Higher values make middle and lower light levels brighter.
+# Value '1.0' leaves the light curve unaltered.
+# This only has significant effect on daylight and artificial
+# light, it has very little effect on natural night light.
+# type: float min: 0.33 max: 3
+# display_gamma = 1.0
-# Key for toggling the display of the large chat console.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_console = KEY_F10
+# The strength (darkness) of node ambient-occlusion shading.
+# Lower is darker, Higher is lighter. The valid range of values for this
+# setting is 0.25 to 4.0 inclusive. If the value is out of range it will be
+# set to the nearest valid value.
+# type: float min: 0.25 max: 4
+# ambient_occlusion_gamma = 2.2
-# Key for toggling the display of fog.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_force_fog_off = KEY_F3
+### Screenshots
-# Key for toggling the camera update. Only used for development
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_update_camera =
+# Path to save screenshots at. Can be an absolute or relative path.
+# The folder will be created if it doesn't already exist.
+# type: path
+# screenshot_path = screenshots
-# Key for toggling the display of debug info.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_debug = KEY_F5
+# Format of screenshots.
+# type: enum values: png, jpg
+# screenshot_format = png
-# Key for toggling the display of the profiler. Used for development.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_toggle_profiler = KEY_F6
+# Screenshot quality. Only used for JPEG format.
+# 1 means worst quality; 100 means best quality.
+# Use 0 for default quality.
+# type: int min: 0 max: 100
+# screenshot_quality = 0
-# Key for switching between first- and third-person camera.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_camera_mode = KEY_KEY_C
+### Node and Entity Highlighting
-# Key for increasing the viewing range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_increase_viewing_range_min = +
+# Method used to highlight selected object.
+# type: enum values: box, halo, none
+# node_highlighting = box
-# Key for decreasing the viewing range.
-# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-# type: key
-# keymap_decrease_viewing_range_min = -
+# Show entity selection boxes
+# A restart is required after changing this.
+# type: bool
+# show_entity_selectionbox = false
-#
-# Graphics
-#
+# Selection box border color (R,G,B).
+# type: string
+# selectionbox_color = (0,0,0)
-## In-Game
+# Width of the selection box lines around nodes.
+# type: int min: 1 max: 5
+# selectionbox_width = 2
-### Basic
+# Crosshair color (R,G,B).
+# Also controls the object crosshair color
+# type: string
+# crosshair_color = (255,255,255)
-# Whether name tag backgrounds should be shown by default.
-# Mods may still set a background.
-# type: bool
-# show_nametag_backgrounds = true
+# Crosshair alpha (opaqueness, between 0 and 255).
+# This also applies to the object crosshair.
+# type: int min: 0 max: 255
+# crosshair_alpha = 255
-# Enable vertex buffer objects.
-# This should greatly improve graphics performance.
-# type: bool
-# enable_vbo = true
+### Fog
# Whether to fog out the end of the visible area.
# type: bool
# enable_fog = true
-# Leaves style:
-# - Fancy: all faces visible
-# - Simple: only outer faces, if defined special_tiles are used
-# - Opaque: disable transparency
-# type: enum values: fancy, simple, opaque
-# leaves_style = fancy
-
-# Connects glass if supported by node.
+# Make fog and sky colors depend on daytime (dawn/sunset) and view direction.
# type: bool
-# connected_glass = false
+# directional_colored_fog = true
-# Enable smooth lighting with simple ambient occlusion.
-# Disable for speed or for different looks.
-# type: bool
-# smooth_lighting = true
+# Fraction of the visible distance at which fog starts to be rendered
+# type: float min: 0 max: 0.99
+# fog_start = 0.4
-# Enables tradeoffs that reduce CPU load or increase rendering performance
-# at the expense of minor visual glitches that do not impact game playability.
-# type: bool
-# performance_tradeoffs = false
+### Clouds
# Clouds are a client side effect.
# type: bool
@@ -546,15 +310,7 @@
# type: bool
# enable_3d_clouds = true
-# Method used to highlight selected object.
-# type: enum values: box, halo, none
-# node_highlighting = box
-
-# Adds particles when digging a node.
-# type: bool
-# enable_particles = true
-
-### Filtering
+### Filtering and Antialiasing
# Use mipmapping to scale textures. May slightly increase performance,
# especially when using a high resolution texture pack.
@@ -589,7 +345,7 @@
# bilinear/trilinear/anisotropic filtering is enabled.
# This is also used as the base node texture size for world-aligned
# texture autoscaling.
-# type: int
+# type: int min: 1 max: 32768
# texture_min_size = 64
# Use multi-sample antialiasing (MSAA) to smooth out block edges.
@@ -602,14 +358,7 @@
# type: enum values: 0, 1, 2, 4, 8, 16
# fsaa = 0
-# Undersampling is similar to using a lower screen resolution, but it applies
-# to the game world only, keeping the GUI intact.
-# It should give a significant performance boost at the cost of less detailed image.
-# Higher values result in a less detailed image.
-# type: int min: 1 max: 8
-# undersampling = 1
-
-### Shaders
+## Shaders
# Shaders allow advanced visual effects and may increase performance on some video
# cards.
@@ -617,11 +366,7 @@
# type: bool
# enable_shaders = true
-# Path to shader directory. If no path is defined, default location will be used.
-# type: path
-# shader_path =
-
-#### Tone Mapping
+### Tone Mapping
# Enables Hable's 'Uncharted 2' filmic tone mapping.
# Simulates the tone curve of photographic film and how this approximates the
@@ -630,7 +375,17 @@
# type: bool
# tone_mapping = false
-#### Waving Nodes
+### Waving Nodes
+
+# Set to true to enable waving leaves.
+# Requires shaders to be enabled.
+# type: bool
+# enable_waving_leaves = false
+
+# Set to true to enable waving plants.
+# Requires shaders to be enabled.
+# type: bool
+# enable_waving_plants = false
# Set to true to enable waving liquids (like water).
# Requires shaders to be enabled.
@@ -656,162 +411,104 @@
# type: float
# water_wave_speed = 5.0
-# Set to true to enable waving leaves.
-# Requires shaders to be enabled.
-# type: bool
-# enable_waving_leaves = false
+### Dynamic shadows
-# Set to true to enable waving plants.
+# Set to true to enable Shadow Mapping.
# Requires shaders to be enabled.
# type: bool
-# enable_waving_plants = false
+# enable_dynamic_shadows = false
-### Advanced
+# Set the shadow strength gamma.
+# Adjusts the intensity of in-game dynamic shadows.
+# Lower value means lighter shadows, higher value means darker shadows.
+# type: float min: 0.1 max: 10
+# shadow_strength_gamma = 1.0
-# Arm inertia, gives a more realistic movement of
-# the arm when the camera moves.
-# type: bool
-# arm_inertia = true
+# Maximum distance to render shadows.
+# type: float min: 10 max: 1000
+# shadow_map_max_distance = 120.0
-# If FPS would go higher than this, limit it by sleeping
-# to not waste CPU power for no benefit.
-# type: int min: 1
-# fps_max = 60
-
-# Maximum FPS when the window is not focused, or when the game is paused.
-# type: int min: 1
-# fps_max_unfocused = 20
+# Texture size to render the shadow map on.
+# This must be a power of two.
+# Bigger numbers create better shadows but it is also more expensive.
+# type: int min: 128 max: 8192
+# shadow_map_texture_size = 1024
-# Open the pause menu when the window's focus is lost. Does not pause if a formspec is
-# open.
+# Sets shadow texture quality to 32 bits.
+# On false, 16 bits texture will be used.
+# This can cause much more artifacts in the shadow.
# type: bool
-# pause_on_lost_focus = false
-
-# View distance in nodes.
-# type: int min: 20 max: 4000
-# viewing_range = 190
-
-# Camera 'near clipping plane' distance in nodes, between 0 and 0.25
-# Only works on GLES platforms. Most users will not need to change this.
-# Increasing can reduce artifacting on weaker GPUs.
-# 0.1 = Default, 0.25 = Good value for weaker tablets.
-# type: float min: 0 max: 0.25
-# near_plane = 0.1
-
-# Width component of the initial window size. Ignored in fullscreen mode.
-# type: int min: 1
-# screen_w = 1024
+# shadow_map_texture_32bit = true
-# Height component of the initial window size. Ignored in fullscreen mode.
-# type: int min: 1
-# screen_h = 600
-
-# Save window size automatically when modified.
+# Enable Poisson disk filtering.
+# On true uses Poisson disk to make "soft shadows". Otherwise uses PCF filtering.
# type: bool
-# autosave_screensize = true
+# shadow_poisson_filter = true
-# Fullscreen mode.
-# type: bool
-# fullscreen = false
+# Define shadow filtering quality.
+# This simulates the soft shadows effect by applying a PCF or Poisson disk
+# but also uses more resources.
+# type: enum values: 0, 1, 2
+# shadow_filters = 1
-# Vertical screen synchronization.
+# Enable colored shadows.
+# On true translucent nodes cast colored shadows. This is expensive.
# type: bool
-# vsync = false
+# shadow_map_color = false
-# Field of view in degrees.
-# type: int min: 45 max: 160
-# fov = 72
+# Spread a complete update of shadow map over given amount of frames.
+# Higher values might make shadows laggy, lower values
+# will consume more resources.
+# Minimum value: 1; maximum value: 16
+# type: int min: 1 max: 16
+# shadow_update_frames = 8
-# Alters the light curve by applying 'gamma correction' to it.
-# Higher values make middle and lower light levels brighter.
-# Value '1.0' leaves the light curve unaltered.
-# This only has significant effect on daylight and artificial
-# light, it has very little effect on natural night light.
-# type: float min: 0.33 max: 3
-# display_gamma = 1.0
+# Set the soft shadow radius size.
+# Lower values mean sharper shadows, bigger values mean softer shadows.
+# Minimum value: 1.0; maximum value: 15.0
+# type: float min: 1 max: 15
+# shadow_soft_radius = 5.0
-# Gradient of light curve at minimum light level.
-# Controls the contrast of the lowest light levels.
-# type: float min: 0 max: 3
-# lighting_alpha = 0.0
+# Set the tilt of Sun/Moon orbit in degrees.
+# Value of 0 means no tilt / vertical orbit.
+# Minimum value: 0.0; maximum value: 60.0
+# type: float min: 0 max: 60
+# shadow_sky_body_orbit_tilt = 0.0
-# Gradient of light curve at maximum light level.
-# Controls the contrast of the highest light levels.
-# type: float min: 0 max: 3
-# lighting_beta = 1.5
+## Audio
-# Strength of light curve boost.
-# The 3 'boost' parameters define a range of the light
-# curve that is boosted in brightness.
-# type: float min: 0 max: 0.4
-# lighting_boost = 0.2
-
-# Center of light curve boost range.
-# Where 0.0 is minimum light level, 1.0 is maximum light level.
+# Volume of all sounds.
+# Requires the sound system to be enabled.
# type: float min: 0 max: 1
-# lighting_boost_center = 0.5
+# sound_volume = 0.7
-# Spread of light curve boost range.
-# Controls the width of the range to be boosted.
-# Standard deviation of the light curve boost Gaussian.
-# type: float min: 0 max: 0.4
-# lighting_boost_spread = 0.2
+# Whether to mute sounds. You can unmute sounds at any time, unless the
+# sound system is disabled (enable_sound=false).
+# In-game, you can toggle the mute state with the mute key or by using the
+# pause menu.
+# type: bool
+# mute_sound = false
-# Path to texture directory. All textures are first searched from here.
-# type: path
-# texture_path =
+## User Interfaces
-# The rendering back-end.
+# Set the language. Leave empty to use the system language.
# A restart is required after changing this.
-# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
-# On other platforms, OpenGL is recommended.
-# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
-# type: enum values: opengl, ogles1, ogles2
-# video_driver = opengl
-
-# Radius of cloud area stated in number of 64 node cloud squares.
-# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
-# type: int
-# cloud_radius = 12
-
-# Enable view bobbing and amount of view bobbing.
-# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
-# type: float
-# view_bobbing_amount = 1.0
-
-# Multiplier for fall bobbing.
-# For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double.
-# type: float
-# fall_bobbing_amount = 0.03
-
-# 3D support.
-# Currently supported:
-# - none: no 3d output.
-# - anaglyph: cyan/magenta color 3d.
-# - interlaced: odd/even line based polarisation screen support.
-# - topbottom: split screen top/bottom.
-# - sidebyside: split screen side by side.
-# - crossview: Cross-eyed 3d
-# - pageflip: quadbuffer based 3d.
-# Note that the interlaced mode requires shaders to be enabled.
-# type: enum values: none, anaglyph, interlaced, topbottom, sidebyside, crossview, pageflip
-# 3d_mode = none
+# type: enum values: , be, bg, ca, cs, da, de, el, en, eo, es, et, eu, fi, fr, gd, gl, hu, id, it, ja, jbo, kk, ko, lt, lv, ms, nb, nl, nn, pl, pt, pt_BR, ro, ru, sk, sl, sr_Cyrl, sr_Latn, sv, sw, tr, uk, vi, zh_CN, zh_TW
+# language =
-# Strength of 3D mode parallax.
-# type: float
-# 3d_paralax_strength = 0.025
+### GUIs
-# In-game chat console height, between 0.1 (10%) and 1.0 (100%).
-# type: float min: 0.1 max: 1
-# console_height = 0.6
-
-# In-game chat console background color (R,G,B).
-# type: string
-# console_color = (0,0,0)
+# Scale GUI by a user specified value.
+# Use a nearest-neighbor-anti-alias filter to scale the GUI.
+# This will smooth over some of the rough edges, and blend
+# pixels when scaling down, at the cost of blurring some
+# edge pixels when images are scaled by non-integer sizes.
+# type: float min: 0.5 max: 20
+# gui_scaling = 1.0
-# In-game chat console background alpha (opaqueness, between 0 and 255).
-# type: int min: 0 max: 255
-# console_alpha = 200
+# Enables animation of inventory items.
+# type: bool
+# inventory_items_animations = false
# Formspec full-screen background opacity (between 0 and 255).
# type: int min: 0 max: 255
@@ -821,138 +518,6 @@
# type: string
# formspec_fullscreen_bg_color = (0,0,0)
-# Formspec default background opacity (between 0 and 255).
-# type: int min: 0 max: 255
-# formspec_default_bg_opacity = 140
-
-# Formspec default background color (R,G,B).
-# type: string
-# formspec_default_bg_color = (0,0,0)
-
-# Selection box border color (R,G,B).
-# type: string
-# selectionbox_color = (0,0,0)
-
-# Width of the selection box lines around nodes.
-# type: int min: 1 max: 5
-# selectionbox_width = 2
-
-# Crosshair color (R,G,B).
-# Also controls the object crosshair color
-# type: string
-# crosshair_color = (255,255,255)
-
-# Crosshair alpha (opaqueness, between 0 and 255).
-# This also applies to the object crosshair.
-# type: int min: 0 max: 255
-# crosshair_alpha = 255
-
-# Maximum number of recent chat messages to show
-# type: int min: 2 max: 20
-# recent_chat_messages = 6
-
-# Whether node texture animations should be desynchronized per mapblock.
-# type: bool
-# desynchronize_mapblock_texture_animation = true
-
-# Maximum proportion of current window to be used for hotbar.
-# Useful if there's something to be displayed right or left of hotbar.
-# type: float
-# hud_hotbar_max_width = 1.0
-
-# Modifies the size of the HUD elements.
-# type: float
-# hud_scaling = 1.0
-
-# Enables caching of facedir rotated meshes.
-# type: bool
-# enable_mesh_cache = false
-
-# Delay between mesh updates on the client in ms. Increasing this will slow
-# down the rate of mesh updates, thus reducing jitter on slower clients.
-# type: int min: 0 max: 50
-# mesh_generation_interval = 0
-
-# Size of the MapBlock cache of the mesh generator. Increasing this will
-# increase the cache hit %, reducing the data being copied from the main
-# thread, thus reducing jitter.
-# type: int min: 0 max: 1000
-# meshgen_block_cache_size = 20
-
-# Enables minimap.
-# type: bool
-# enable_minimap = true
-
-# Shape of the minimap. Enabled = round, disabled = square.
-# type: bool
-# minimap_shape_round = true
-
-# True = 256
-# False = 128
-# Usable to make minimap smoother on slower machines.
-# type: bool
-# minimap_double_scan_height = true
-
-# Make fog and sky colors depend on daytime (dawn/sunset) and view direction.
-# type: bool
-# directional_colored_fog = true
-
-# The strength (darkness) of node ambient-occlusion shading.
-# Lower is darker, Higher is lighter. The valid range of values for this
-# setting is 0.25 to 4.0 inclusive. If the value is out of range it will be
-# set to the nearest valid value.
-# type: float min: 0.25 max: 4
-# ambient_occlusion_gamma = 2.2
-
-# Enables animation of inventory items.
-# type: bool
-# inventory_items_animations = false
-
-# Fraction of the visible distance at which fog starts to be rendered
-# type: float min: 0 max: 0.99
-# fog_start = 0.4
-
-# Makes all liquids opaque
-# type: bool
-# opaque_water = false
-
-# Textures on a node may be aligned either to the node or to the world.
-# The former mode suits better things like machines, furniture, etc., while
-# the latter makes stairs and microblocks fit surroundings better.
-# However, as this possibility is new, thus may not be used by older servers,
-# this option allows enforcing it for certain node types. Note though that
-# that is considered EXPERIMENTAL and may not work properly.
-# type: enum values: disable, enable, force_solid, force_nodebox
-# world_aligned_mode = enable
-
-# World-aligned textures may be scaled to span several nodes. However,
-# the server may not send the scale you want, especially if you use
-# a specially-designed texture pack; with this option, the client tries
-# to determine the scale automatically basing on the texture size.
-# See also texture_min_size.
-# Warning: This option is EXPERIMENTAL!
-# type: enum values: disable, enable, force
-# autoscale_mode = disable
-
-# Show entity selection boxes
-# A restart is required after changing this.
-# type: bool
-# show_entity_selectionbox = false
-
-## Menus
-
-# Use a cloud animation for the main menu background.
-# type: bool
-# menu_clouds = true
-
-# Scale GUI by a user specified value.
-# Use a nearest-neighbor-anti-alias filter to scale the GUI.
-# This will smooth over some of the rough edges, and blend
-# pixels when scaling down, at the cost of blurring some
-# edge pixels when images are scaled by non-integer sizes.
-# type: float min: 0.001
-# gui_scaling = 1.0
-
# When gui_scaling_filter is true, all GUI images need to be
# filtered in software, but some images are generated directly
# to hardware (e.g. render-to-texture for nodes in inventory).
@@ -967,224 +532,112 @@
# gui_scaling_filter_txr2img = true
# Delay showing tooltips, stated in milliseconds.
-# type: int
+# type: int min: 0 max: 1.844674407371e+19
# tooltip_show_delay = 400
# Append item name to tooltip.
# type: bool
# tooltip_append_itemname = false
+# Use a cloud animation for the main menu background.
# type: bool
-# font_bold = false
-
-# type: bool
-# font_italic = false
-
-# Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn.
-# type: int
-# font_shadow = 1
-
-# Opaqueness (alpha) of the shadow behind the default font, between 0 and 255.
-# type: int min: 0 max: 255
-# font_shadow_alpha = 127
-
-# Font size of the default font where 1 unit = 1 pixel at 96 DPI
-# type: int min: 1
-# font_size = 16
-
-# For pixel-style fonts that do not scale well, this ensures that font sizes used
-# with this font will always be divisible by this value, in pixels. For instance,
-# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
-# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
-# type: int min: 1
-# font_size_divisible_by = 1
+# menu_clouds = true
-# Path to the default font. Must be a TrueType font.
-# The fallback font will be used if the font cannot be loaded.
-# type: filepath
-# font_path = fonts/Arimo-Regular.ttf
+### HUD
-# type: filepath
-# font_path_bold = fonts/Arimo-Bold.ttf
+# Modifies the size of the HUD elements.
+# type: float min: 0.5 max: 20
+# hud_scaling = 1.0
-# type: filepath
-# font_path_italic = fonts/Arimo-Italic.ttf
+# Whether name tag backgrounds should be shown by default.
+# Mods may still set a background.
+# type: bool
+# show_nametag_backgrounds = true
-# type: filepath
-# font_path_bold_italic = fonts/Arimo-BoldItalic.ttf
+### Chat
-# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
-# type: int min: 1
-# mono_font_size = 16
+# Maximum number of recent chat messages to show
+# type: int min: 2 max: 20
+# recent_chat_messages = 6
-# For pixel-style fonts that do not scale well, this ensures that font sizes used
-# with this font will always be divisible by this value, in pixels. For instance,
-# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
-# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
-# type: int min: 1
-# mono_font_size_divisible_by = 1
+# In-game chat console height, between 0.1 (10%) and 1.0 (100%).
+# type: float min: 0.1 max: 1
+# console_height = 0.6
-# Path to the monospace font. Must be a TrueType font.
-# This font is used for e.g. the console and profiler screen.
-# type: filepath
-# mono_font_path = fonts/Cousine-Regular.ttf
+# In-game chat console background color (R,G,B).
+# type: string
+# console_color = (0,0,0)
-# type: filepath
-# mono_font_path_bold = fonts/Cousine-Bold.ttf
+# In-game chat console background alpha (opaqueness, between 0 and 255).
+# type: int min: 0 max: 255
+# console_alpha = 200
-# type: filepath
-# mono_font_path_italic = fonts/Cousine-Italic.ttf
+# Maximum proportion of current window to be used for hotbar.
+# Useful if there's something to be displayed right or left of hotbar.
+# type: float min: 0.001 max: 1
+# hud_hotbar_max_width = 1.0
-# type: filepath
-# mono_font_path_bold_italic = fonts/Cousine-BoldItalic.ttf
+# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
+# type: bool
+# clickable_chat_weblinks = true
-# Path of the fallback font. Must be a TrueType font.
-# This font will be used for certain languages or if the default font is unavailable.
-# type: filepath
-# fallback_font_path = fonts/DroidSansFallbackFull.ttf
+# Optional override for chat weblink color.
+# type: string
+# chat_weblink_color =
# Font size of the recent chat text and chat prompt in point (pt).
# Value 0 will use the default font size.
-# type: int
+# type: int min: 0 max: 72
# chat_font_size = 0
-# Path to save screenshots at. Can be an absolute or relative path.
-# The folder will be created if it doesn't already exist.
-# type: path
-# screenshot_path = screenshots
-
-# Format of screenshots.
-# type: enum values: png, jpg
-# screenshot_format = png
+### Content Repository
-# Screenshot quality. Only used for JPEG format.
-# 1 means worst quality; 100 means best quality.
-# Use 0 for default quality.
-# type: int min: 0 max: 100
-# screenshot_quality = 0
+# The URL for the content repository
+# type: string
+# contentdb_url = https://content.minetest.net
-## Advanced
+# 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.
+# You can also specify content ratings.
+# These flags are independent from Minetest versions,
+# so see a full list at https://content.minetest.net/help/content_flags/
+# type: string
+# contentdb_flag_blacklist = nonfree, desktop_default
-# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens.
+# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.
+# This should be lower than curl_parallel_limit.
# type: int min: 1
-# screen_dpi = 72
-
-# Adjust the detected display density, used for scaling UI elements.
-# type: float
-# display_density_factor = 1
-
-# Windows systems only: Start Minetest with the command line window in the background.
-# Contains the same information as the file debug.txt (default name).
-# type: bool
-# enable_console = false
-
-#
-# Sound
-#
-
-# Enables the sound system.
-# If disabled, this completely disables all sounds everywhere and the in-game
-# sound controls will be non-functional.
-# Changing this setting requires a restart.
-# type: bool
-# enable_sound = true
-
-# Volume of all sounds.
-# Requires the sound system to be enabled.
-# type: float min: 0 max: 1
-# sound_volume = 0.7
-
-# Whether to mute sounds. You can unmute sounds at any time, unless the
-# sound system is disabled (enable_sound=false).
-# In-game, you can toggle the mute state with the mute key or by using the
-# pause menu.
-# type: bool
-# mute_sound = false
+# contentdb_max_concurrent_downloads = 3
#
-# Client
+# Client and Server
#
-# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output.
-# type: bool
-# clickable_chat_weblinks = false
-
-# Optional override for chat weblink color.
-# type: string
-# chat_weblink_color =
-
-## Network
-
-# Address to connect to.
-# Leave this blank to start a local server.
-# Note that the address field in the main menu overrides this setting.
-# type: string
-# address =
-
-# Port to connect to (UDP).
-# Note that the port field in the main menu overrides this setting.
-# type: int min: 1 max: 65535
-# remote_port = 30000
-
-# Prometheus listener address.
-# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
-# enable metrics listener for Prometheus on that address.
-# Metrics can be fetched on http://127.0.0.1:30000/metrics
-# type: string
-# prometheus_listener_address = 127.0.0.1:30000
+## Client
# Save the map received by the client on disk.
# type: bool
# enable_local_map_saving = false
-# Enable usage of remote media server (if provided by server).
-# Remote servers offer a significantly faster way to download media (e.g. textures)
-# when connecting to the server.
-# type: bool
-# enable_remote_media_server = true
-
-# Enable Lua modding support on client.
-# This support is experimental and API can change.
-# type: bool
-# enable_client_modding = false
-
# URL to the server list displayed in the Multiplayer Tab.
# type: string
# serverlist_url = servers.minetest.net
-# File in client/serverlist/ that contains your favorite servers displayed in the
-# Multiplayer Tab.
-# type: string
-# serverlist_file = favoriteservers.json
-
-# Maximum size of the out chat queue.
-# 0 to disable queueing and -1 to make the queue size unlimited.
-# type: int
-# max_out_chat_queue_size = 20
-
-# Enable register confirmation when connecting to server.
-# If disabled, new account will be registered automatically.
+# If enabled, account registration is separate from login in the UI.
+# If disabled, new accounts will be registered automatically when logging in.
# type: bool
-# enable_register_confirmation = true
+# enable_split_login_register = true
-## Advanced
+## Server
-# Timeout for client to remove unused map data from memory.
-# type: int
-# client_unload_unused_data_timeout = 600
-
-# Maximum number of mapblocks for client to be kept in memory.
-# Set to -1 for unlimited amount.
-# type: int
-# client_mapblock_limit = 7500
-
-# Whether to show the client debug info (has the same effect as hitting F5).
-# type: bool
-# show_debug = false
+# Name of the player.
+# When running a server, clients connecting with this name are admins.
+# When starting from the main menu, this is overridden.
+# type: string
+# name =
-#
-# Server / Singleplayer
-#
+### Serverlist and MOTD
# Name of the server, to be displayed when players join and in the serverlist.
# type: string
@@ -1210,16 +663,23 @@
# type: string
# serverlist_url = servers.minetest.net
-# Remove color codes from incoming chat messages
-# Use this to stop players from being able to use color in their messages
-# type: bool
-# strip_color_codes = false
+# Message of the day displayed to players connecting.
+# type: string
+# motd =
-## Network
+# Maximum number of players that can be connected simultaneously.
+# type: int min: 0 max: 65535
+# max_users = 15
+
+# If this is set, players will always (re)spawn at the given position.
+# type: string
+# static_spawnpoint =
+
+### Networking
# Network port to listen (UDP).
# This value will be overridden when starting from the main menu.
-# type: int
+# type: int min: 1 max: 65535
# port = 30000
# The network interface that the server listens on.
@@ -1245,79 +705,16 @@
# type: bool
# ipv6_server = false
-### Advanced
-
-# Maximum number of blocks that are simultaneously sent per client.
-# The maximum total count is calculated dynamically:
-# max_total = ceil((#clients + max_users) * per_client / 4)
-# type: int
-# max_simultaneous_block_sends_per_client = 40
-
-# To reduce lag, block transfers are slowed down when a player is building something.
-# This determines how long they are slowed down after placing or removing a node.
-# type: float
-# full_block_send_enable_min_time_from_building = 2.0
-
-# Maximum number of packets sent per send step, if you have a slow connection
-# try reducing it, but don't reduce it to a number below double of targeted
-# client number.
-# type: int
-# max_packets_per_iteration = 1024
-
-# Compression level to use when sending mapblocks to the client.
-# -1 - use default compression level
-# 0 - least compression, fastest
-# 9 - best compression, slowest
-# type: int min: -1 max: 9
-# map_compression_level_net = -1
-
-## Game
-
-# Default game when creating a new world.
-# This will be overridden when creating a world from the main menu.
-# type: string
-# default_game = minetest
-
-# Message of the day displayed to players connecting.
-# type: string
-# motd =
-
-# Maximum number of players that can be connected simultaneously.
-# type: int
-# max_users = 15
-
-# World directory (everything in the world is stored here).
-# Not needed if starting from the main menu.
-# type: path
-# map-dir =
-
-# Time in seconds for item entity (dropped items) to live.
-# Setting it to -1 disables the feature.
-# type: int
-# item_entity_ttl = 900
-
-# Specifies the default stack size of nodes, items and tools.
-# Note that mods or games may explicitly set a stack for certain (or all) items.
-# type: int
-# default_stack_max = 99
-
-# Enable players getting damage and dying.
-# type: bool
-# enable_damage = false
-
-# Enable creative mode for all players
-# type: bool
-# creative_mode = false
-
-# A chosen map seed for a new map, leave empty for random.
-# Will be overridden when creating a new world in the main menu.
-# type: string
-# fixed_map_seed =
+## Server Security
# New users need to input this password.
# type: string
# default_password =
+# If enabled, players cannot join without a password or change theirs to an empty password.
+# type: bool
+# disallow_empty_password = false
+
# The privileges that new users automatically get.
# See /privs in game for a full list on your server and mod configuration.
# type: string
@@ -1327,31 +724,6 @@
# type: string
# basic_privs = interact, shout
-# Whether players are shown to clients without any range limit.
-# Deprecated, use the setting player_transfer_distance instead.
-# type: bool
-# unlimited_player_transfer_distance = true
-
-# Defines the maximal player transfer distance in blocks (0 = unlimited).
-# type: int
-# player_transfer_distance = 0
-
-# Whether to allow players to damage and kill each other.
-# type: bool
-# enable_pvp = true
-
-# Enable mod channels support.
-# type: bool
-# enable_mod_channels = false
-
-# If this is set, players will always (re)spawn at the given position.
-# type: string
-# static_spawnpoint =
-
-# If enabled, new players cannot join with an empty password.
-# type: bool
-# disallow_empty_password = false
-
# If enabled, disable cheat prevention in multiplayer.
# type: bool
# disable_anticheat = false
@@ -1361,393 +733,131 @@
# type: bool
# enable_rollback_recording = false
-# Format of player chat messages. The following strings are valid placeholders:
-# @name, @message, @timestamp (optional)
-# type: string
-# chat_message_format = <@name> @message
+### Client-side Modding
-# If the execution of a chat command takes longer than this specified time in
-# seconds, add the time information to the chat command message
-# type: float
-# chatcommand_msg_time_threshold = 0.1
+# Restricts the access of certain client-side functions on servers.
+# Combine the byteflags below to restrict client-side features, or set to 0
+# for no restrictions:
+# LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)
+# CHAT_MESSAGES: 2 (disable send_chat_message call client-side)
+# READ_ITEMDEFS: 4 (disable get_item_def call client-side)
+# READ_NODEDEFS: 8 (disable get_node_def call client-side)
+# LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to
+# csm_restriction_noderange)
+# READ_PLAYERINFO: 32 (disable get_player_names call client-side)
+# type: int min: 0 max: 63
+# csm_restriction_flags = 62
-# A message to be displayed to all clients when the server shuts down.
-# type: string
-# kick_msg_shutdown = Server shutting down.
+# If the CSM restriction for node range is enabled, get_node calls are limited
+# to this distance from the player to the node.
+# type: int min: 0 max: 4294967295
+# csm_restriction_noderange = 0
-# A message to be displayed to all clients when the server crashes.
-# type: string
-# kick_msg_crash = This server has experienced an internal error. You will now be disconnected.
+### Chat
-# Whether to ask clients to reconnect after a (Lua) crash.
-# Set this to true if your server is set up to restart automatically.
+# Remove color codes from incoming chat messages
+# Use this to stop players from being able to use color in their messages
# type: bool
-# ask_reconnect_on_crash = false
-
-# From how far clients know about objects, stated in mapblocks (16 nodes).
-#
-# Setting this larger than active_block_range will also cause the server
-# to maintain active objects up to this distance in the direction the
-# player is looking. (This can avoid mobs suddenly disappearing from view)
-# type: int
-# active_object_send_range_blocks = 8
+# strip_color_codes = false
-# The radius of the volume of blocks around every player that is subject to the
-# active block stuff, stated in mapblocks (16 nodes).
-# In active blocks objects are loaded and ABMs run.
-# This is also the minimum range in which active objects (mobs) are maintained.
-# This should be configured together with active_object_send_range_blocks.
-# type: int
-# active_block_range = 4
+# Set the maximum length of a chat message (in characters) sent by clients.
+# type: int min: 10 max: 65535
+# chat_message_max_size = 500
-# From how far blocks are sent to clients, stated in mapblocks (16 nodes).
-# type: int
-# max_block_send_distance = 12
+# Amount of messages a player may send per 10 seconds.
+# type: float min: 1
+# chat_message_limit_per_10sec = 10.0
-# Maximum number of forceloaded mapblocks.
-# type: int
-# max_forceloaded_blocks = 16
+# Kick players who sent more than X messages per 10 seconds.
+# type: int min: 1 max: 65535
+# chat_message_limit_trigger_kick = 50
-# Interval of sending time of day to clients.
-# type: int
-# time_send_interval = 5
+## Server Gameplay
# Controls length of day/night cycle.
# Examples:
# 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged.
-# type: int
+# type: int min: 0
# time_speed = 72
# Time of day when a new world is started, in millihours (0-23999).
# type: int min: 0 max: 23999
# world_start_time = 6125
-# Interval of saving important changes in the world, stated in seconds.
-# type: float
-# server_map_save_interval = 5.3
-
-# Set the maximum character length of a chat message sent by clients.
-# type: int
-# chat_message_max_size = 500
-
-# Amount of messages a player may send per 10 seconds.
-# type: float
-# chat_message_limit_per_10sec = 10.0
+# Time in seconds for item entity (dropped items) to live.
+# Setting it to -1 disables the feature.
+# type: int min: -1
+# item_entity_ttl = 900
-# Kick players who sent more than X messages per 10 seconds.
-# type: int
-# chat_message_limit_trigger_kick = 50
+# Specifies the default stack size of nodes, items and tools.
+# Note that mods or games may explicitly set a stack for certain (or all) items.
+# type: int min: 1 max: 65535
+# default_stack_max = 99
### Physics
# Horizontal and vertical acceleration on ground or when climbing,
# in nodes per second per second.
-# type: float
-# movement_acceleration_default = 3
+# type: float min: 0
+# movement_acceleration_default = 3.0
# Horizontal acceleration in air when jumping or falling,
# in nodes per second per second.
-# type: float
-# movement_acceleration_air = 2
+# type: float min: 0
+# movement_acceleration_air = 2.0
# Horizontal and vertical acceleration in fast mode,
# in nodes per second per second.
-# type: float
-# movement_acceleration_fast = 10
+# type: float min: 0
+# movement_acceleration_fast = 10.0
# Walking and flying speed, in nodes per second.
-# type: float
-# movement_speed_walk = 4
+# type: float min: 0
+# movement_speed_walk = 4.0
# Sneaking speed, in nodes per second.
-# type: float
+# type: float min: 0
# movement_speed_crouch = 1.35
# Walking, flying and climbing speed in fast mode, in nodes per second.
-# type: float
-# movement_speed_fast = 20
+# type: float min: 0
+# movement_speed_fast = 20.0
# Vertical climbing speed, in nodes per second.
-# type: float
-# movement_speed_climb = 3
+# type: float min: 0
+# movement_speed_climb = 3.0
# Initial vertical speed when jumping, in nodes per second.
-# type: float
+# type: float min: 0
# movement_speed_jump = 6.5
+# How much you are slowed down when moving inside a liquid.
# Decrease this to increase liquid resistance to movement.
-# type: float
-# movement_liquid_fluidity = 1
+# type: float min: 0.001
+# movement_liquid_fluidity = 1.0
# Maximum liquid resistance. Controls deceleration when entering liquid at
# high speed.
# type: float
# movement_liquid_fluidity_smooth = 0.5
-# Controls sinking speed in liquid.
+# Controls sinking speed in liquid when idling. Negative values will cause
+# you to rise instead.
# type: float
-# movement_liquid_sink = 10
+# movement_liquid_sink = 10.0
# Acceleration of gravity, in nodes per second per second.
# type: float
# movement_gravity = 9.81
-### Advanced
-
-# Handling for deprecated Lua API calls:
-# - none: Do not log deprecated calls
-# - log: mimic and log backtrace of deprecated call (default).
-# - error: abort on usage of deprecated call (suggested for mod developers).
-# type: enum values: none, log, error
-# deprecated_lua_api_handling = log
-
-# Number of extra blocks that can be loaded by /clearobjects at once.
-# This is a trade-off between SQLite transaction overhead and
-# memory consumption (4096=100MB, as a rule of thumb).
-# type: int
-# max_clearobjects_extra_loaded_blocks = 4096
-
-# How much the server will wait before unloading unused mapblocks.
-# Higher value is smoother, but will use more RAM.
-# type: int
-# server_unload_unused_data_timeout = 29
-
-# Maximum number of statically stored objects in a block.
-# type: int
-# max_objects_per_block = 64
-
-# See https://www.sqlite.org/pragma.html#pragma_synchronous
-# type: enum values: 0, 1, 2
-# sqlite_synchronous = 2
-
-# Compression level to use when saving mapblocks to disk.
-# -1 - use default compression level
-# 0 - least compression, fastest
-# 9 - best compression, slowest
-# type: int min: -1 max: 9
-# map_compression_level_disk = -1
-
-# Length of a server tick and the interval at which objects are generally updated over
-# network.
-# type: float
-# dedicated_server_step = 0.09
-
-# Length of time between active block management cycles
-# type: float
-# active_block_mgmt_interval = 2.0
-
-# Length of time between Active Block Modifier (ABM) execution cycles
-# type: float
-# abm_interval = 1.0
-
-# The time budget allowed for ABMs to execute on each step
-# (as a fraction of the ABM Interval)
-# type: float min: 0.1 max: 0.9
-# abm_time_budget = 0.2
-
-# Length of time between NodeTimer execution cycles
-# type: float
-# nodetimer_interval = 0.2
-
-# If enabled, invalid world data won't cause the server to shut down.
-# Only enable this if you know what you are doing.
-# type: bool
-# ignore_world_load_errors = false
-
-# Max liquids processed per step.
-# type: int
-# liquid_loop_max = 100000
-
-# The time (in seconds) that the liquids queue may grow beyond processing
-# capacity until an attempt is made to decrease its size by dumping old queue
-# items. A value of 0 disables the functionality.
-# type: int
-# liquid_queue_purge_time = 0
-
-# Liquid update interval in seconds.
-# type: float
-# liquid_update = 1.0
-
-# At this distance the server will aggressively optimize which blocks are sent to
-# clients.
-# Small values potentially improve performance a lot, at the expense of visible
-# rendering glitches (some blocks will not be rendered under water and in caves,
-# as well as sometimes on land).
-# Setting this to a value greater than max_block_send_distance disables this
-# optimization.
-# Stated in mapblocks (16 nodes).
-# type: int min: 2
-# block_send_optimize_distance = 4
-
-# If enabled the server will perform map block occlusion culling based on
-# on the eye position of the player. This can reduce the number of blocks
-# sent to the client 50-80%. The client will not longer receive most invisible
-# so that the utility of noclip mode is reduced.
-# type: bool
-# server_side_occlusion_culling = true
-
-# Restricts the access of certain client-side functions on servers.
-# Combine the byteflags below to restrict client-side features, or set to 0
-# for no restrictions:
-# LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)
-# CHAT_MESSAGES: 2 (disable send_chat_message call client-side)
-# READ_ITEMDEFS: 4 (disable get_item_def call client-side)
-# READ_NODEDEFS: 8 (disable get_node_def call client-side)
-# LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to
-# csm_restriction_noderange)
-# READ_PLAYERINFO: 32 (disable get_player_names call client-side)
-# type: int
-# csm_restriction_flags = 62
-
-# If the CSM restriction for node range is enabled, get_node calls are limited
-# to this distance from the player to the node.
-# type: int
-# csm_restriction_noderange = 0
-
-## Security
-
-# Prevent mods from doing insecure things like running shell commands.
-# type: bool
-# secure.enable_security = true
-
-# Comma-separated list of trusted mods that are allowed to access insecure
-# functions even when mod security is on (via request_insecure_environment()).
-# type: string
-# secure.trusted_mods =
-
-# Comma-separated list of mods that are allowed to access HTTP APIs, which
-# allow them to upload and download data to/from the internet.
-# type: string
-# secure.http_mods =
-
-## Advanced
-
-### Profiling
-
-# Load the game profiler to collect game profiling data.
-# Provides a /profiler command to access the compiled profile.
-# Useful for mod developers and server operators.
-# type: bool
-# profiler.load = false
-
-# The default format in which profiles are being saved,
-# when calling `/profiler save [format]` without format.
-# type: enum values: txt, csv, lua, json, json_pretty
-# profiler.default_report_format = txt
-
-# The file path relative to your worldpath in which profiles will be saved to.
-# type: string
-# profiler.report_path = ""
-
-#### Instrumentation
-
-# Instrument the methods of entities on registration.
-# type: bool
-# instrument.entity = true
-
-# Instrument the action function of Active Block Modifiers on registration.
-# type: bool
-# instrument.abm = true
-
-# Instrument the action function of Loading Block Modifiers on registration.
-# type: bool
-# instrument.lbm = true
-
-# Instrument chat commands on registration.
-# type: bool
-# instrument.chatcommand = true
-
-# Instrument global callback functions on registration.
-# (anything you pass to a minetest.register_*() function)
-# type: bool
-# instrument.global_callback = true
-
-##### Advanced
-
-# Instrument builtin.
-# This is usually only needed by core/builtin contributors
-# type: bool
-# instrument.builtin = false
-
-# Have the profiler instrument itself:
-# * Instrument an empty function.
-# This estimates the overhead, that instrumentation is adding (+1 function call).
-# * Instrument the sampler being used to update the statistics.
-# type: bool
-# instrument.profiler = false
-
#
-# Client and Server
+# Mapgen
#
-# Name of the player.
-# When running a server, clients connecting with this name are admins.
-# When starting from the main menu, this is overridden.
-# type: string
-# name =
-
-# Set the language. Leave empty to use the system language.
-# A restart is required after changing this.
-# type: enum values: , be, bg, ca, cs, da, de, el, en, eo, es, et, eu, fi, fr, gd, gl, hu, id, it, ja, jbo, kk, ko, lt, lv, ms, nb, nl, nn, pl, pt, pt_BR, ro, ru, sk, sl, sr_Cyrl, sr_Latn, sv, sw, tr, uk, vi, zh_CN, zh_TW
-# language =
-
-# Level of logging to be written to debug.txt:
-# - <nothing> (no logging)
-# - none (messages with no level)
-# - error
-# - warning
-# - action
-# - info
-# - verbose
-# type: enum values: , none, error, warning, action, info, verbose
-# debug_log_level = action
-
-# If the file size of debug.txt exceeds the number of megabytes specified in
-# this setting when it is opened, the file is moved to debug.txt.1,
-# deleting an older debug.txt.1 if it exists.
-# debug.txt is only moved if this setting is positive.
-# type: int
-# debug_log_size_max = 50
-
-# Minimal level of logging to be written to chat.
-# type: enum values: , none, error, warning, action, info, verbose
-# chat_log_level = error
-
-# Enable IPv6 support (for both client and server).
-# Required for IPv6 connections to work at all.
-# type: bool
-# enable_ipv6 = true
-
-## Advanced
-
-# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
-# type: int
-# curl_timeout = 20000
-
-# Limits number of parallel HTTP requests. Affects:
-# - Media fetch if server uses remote_media setting.
-# - Serverlist download and server announcement.
-# - Downloads performed by main menu (e.g. mod manager).
-# Only has an effect if compiled with cURL.
-# type: int
-# curl_parallel_limit = 8
-
-# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
-# type: int
-# curl_file_download_timeout = 300000
-
-# Replaces the default main menu with a custom one.
+# A chosen map seed for a new map, leave empty for random.
+# Will be overridden when creating a new world in the main menu.
# type: string
-# main_menu_script =
-
-# Print the engine's profiling data in regular intervals (in seconds).
-# 0 = disable. Useful for developers.
-# type: int
-# profiler_print_interval = 0
-
-#
-# Mapgen
-#
+# fixed_map_seed =
# Name of map generator to be used when creating a new world.
# Creating a world in the main menu will override this.
@@ -1757,11 +867,11 @@
# mg_name = v7
# Water surface level of the world.
-# type: int
+# type: int min: -31000 max: 31000
# water_level = 1
# From how far blocks are generated for clients, stated in mapblocks (16 nodes).
-# type: int
+# type: int min: 1 max: 32767
# max_block_generate_distance = 10
# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).
@@ -1776,7 +886,7 @@
# type: flags possible values: caves, dungeons, light, decorations, biomes, ores, nocaves, nodungeons, nolight, nodecorations, nobiomes, noores
# mg_flags = caves,dungeons,light,decorations,biomes,ores
-## Biome API temperature and humidity noise parameters
+## Biome API noise parameters
# Temperature variation for biomes.
# type: noise_params_2d
@@ -1843,7 +953,7 @@
# mgv5_cave_width = 0.09
# Y of upper limit of large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgv5_large_cave_depth = -256
# Minimum limit of random number of small caves per mapchunk.
@@ -1867,11 +977,11 @@
# mgv5_large_cave_flooded = 0.5
# Y-level of cavern upper limit.
-# type: int
+# type: int min: -31000 max: 31000
# mgv5_cavern_limit = -256
# Y-distance over which caverns expand to full size.
-# type: int
+# type: int min: 0 max: 32767
# mgv5_cavern_taper = 256
# Defines full size of caverns, smaller values create larger caverns.
@@ -1879,11 +989,11 @@
# mgv5_cavern_threshold = 0.7
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv5_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv5_dungeon_ymax = 31000
### Noises
@@ -1938,7 +1048,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -1951,7 +1061,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining giant caverns.
@@ -1964,7 +1074,7 @@
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining terrain.
@@ -1990,7 +1100,7 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
## Mapgen V6
@@ -2012,11 +1122,11 @@
# mgv6_freq_beach = 0.15
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv6_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv6_dungeon_ymax = 31000
### Noises
@@ -2174,22 +1284,22 @@
# mgv7_spflags = mountains,ridges,nofloatlands,caverns
# Y of mountain density gradient zero level. Used to shift mountains vertically.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_mount_zero_level = 0
# Lower Y limit of floatlands.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_floatland_ymin = 1024
# Upper Y limit of floatlands.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_floatland_ymax = 4096
# Y-distance over which floatlands taper from full density to nothing.
# Tapering starts at this distance from the Y limit.
# For a solid floatland layer, this controls the height of hills/mountains.
# Must be less than or equal to half the distance between the Y limits.
-# type: int
+# type: int min: 0 max: 32767
# mgv7_floatland_taper = 256
# Exponent of the floatland tapering. Alters the tapering behaviour.
@@ -2219,7 +1329,7 @@
# required value depending on 'mgv7_np_floatland'), to avoid
# server-intensive extreme water flow and to avoid vast flooding of the
# world surface below.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_floatland_ywater = -31000
# Controls width of tunnels, a smaller value creates wider tunnels.
@@ -2229,7 +1339,7 @@
# mgv7_cave_width = 0.09
# Y of upper limit of large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_large_cave_depth = -33
# Minimum limit of random number of small caves per mapchunk.
@@ -2253,11 +1363,11 @@
# mgv7_large_cave_flooded = 0.5
# Y-level of cavern upper limit.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_cavern_limit = -256
# Y-distance over which caverns expand to full size.
-# type: int
+# type: int min: 0 max: 32767
# mgv7_cavern_taper = 256
# Defines full size of caverns, smaller values create larger caverns.
@@ -2265,11 +1375,11 @@
# mgv7_cavern_threshold = 0.7
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgv7_dungeon_ymax = 31000
### Noises
@@ -2377,7 +1487,7 @@
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining structure of river canyon walls.
@@ -2390,7 +1500,7 @@
# octaves = 4,
# persistence = 0.75,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining structure of floatlands.
@@ -2406,7 +1516,7 @@
# octaves = 4,
# persistence = 0.75,
# lacunarity = 1.618,
-# flags =
+# flags =
# }
# 3D noise defining giant caverns.
@@ -2419,7 +1529,7 @@
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# First of two 3D noises that together define tunnels.
@@ -2432,7 +1542,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -2445,7 +1555,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise that determines number of dungeons per mapchunk.
@@ -2458,7 +1568,7 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
## Mapgen Carpathian
@@ -2490,7 +1600,7 @@
# mgcarpathian_cave_width = 0.09
# Y of upper limit of large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgcarpathian_large_cave_depth = -33
# Minimum limit of random number of small caves per mapchunk.
@@ -2514,11 +1624,11 @@
# mgcarpathian_large_cave_flooded = 0.5
# Y-level of cavern upper limit.
-# type: int
+# type: int min: -31000 max: 31000
# mgcarpathian_cavern_limit = -256
# Y-distance over which caverns expand to full size.
-# type: int
+# type: int min: 0 max: 32767
# mgcarpathian_cavern_taper = 256
# Defines full size of caverns, smaller values create larger caverns.
@@ -2526,11 +1636,11 @@
# mgcarpathian_cavern_threshold = 0.7
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgcarpathian_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgcarpathian_dungeon_ymax = 31000
### Noises
@@ -2701,7 +1811,7 @@
# octaves = 5,
# persistence = 0.55,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# First of two 3D noises that together define tunnels.
@@ -2714,7 +1824,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -2727,7 +1837,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining giant caverns.
@@ -2740,7 +1850,7 @@
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise that determines number of dungeons per mapchunk.
@@ -2753,7 +1863,7 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
## Mapgen Flat
@@ -2764,11 +1874,11 @@
# mgflat_spflags = nolakes,nohills,nocaverns
# Y of flat ground.
-# type: int
+# type: int min: -31000 max: 31000
# mgflat_ground_level = 8
# Y of upper limit of large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgflat_large_cave_depth = -33
# Minimum limit of random number of small caves per mapchunk.
@@ -2818,11 +1928,11 @@
# mgflat_hill_steepness = 64.0
# Y-level of cavern upper limit.
-# type: int
+# type: int min: -31000 max: 31000
# mgflat_cavern_limit = -256
# Y-distance over which caverns expand to full size.
-# type: int
+# type: int min: 0 max: 32767
# mgflat_cavern_taper = 256
# Defines full size of caverns, smaller values create larger caverns.
@@ -2830,11 +1940,11 @@
# mgflat_cavern_threshold = 0.7
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgflat_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgflat_dungeon_ymax = 31000
### Noises
@@ -2875,7 +1985,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -2888,7 +1998,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise defining giant caverns.
@@ -2901,7 +2011,7 @@
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise that determines number of dungeons per mapchunk.
@@ -2914,7 +2024,7 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
## Mapgen Fractal
@@ -2932,7 +2042,7 @@
# mgfractal_cave_width = 0.09
# Y of upper limit of large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgfractal_large_cave_depth = -33
# Minimum limit of random number of small caves per mapchunk.
@@ -2956,11 +2066,11 @@
# mgfractal_large_cave_flooded = 0.5
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgfractal_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgfractal_dungeon_ymax = 31000
# Selects one of 18 fractal types.
@@ -2989,7 +2099,7 @@
# Increasing this increases the amount of fine detail, but also
# increases processing load.
# At iterations = 20 this mapgen has a similar load to mapgen V7.
-# type: int
+# type: int min: 1 max: 65535
# mgfractal_iterations = 11
# (X,Y,Z) scale of fractal in nodes.
@@ -3088,7 +2198,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -3101,7 +2211,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# 3D noise that determines number of dungeons per mapchunk.
@@ -3114,7 +2224,7 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
## Mapgen Valleys
@@ -3131,11 +2241,11 @@
# The vertical distance over which heat drops by 20 if 'altitude_chill' is
# enabled. Also the vertical distance over which humidity drops by 10 if
# 'altitude_dry' is enabled.
-# type: int
+# type: int min: 0 max: 65535
# mgvalleys_altitude_chill = 90
# Depth below which you'll find large caves.
-# type: int
+# type: int min: -31000 max: 31000
# mgvalleys_large_cave_depth = -33
# Minimum limit of random number of small caves per mapchunk.
@@ -3159,11 +2269,11 @@
# mgvalleys_large_cave_flooded = 0.5
# Depth below which you'll find giant caverns.
-# type: int
+# type: int min: -31000 max: 31000
# mgvalleys_cavern_limit = -256
# Y-distance over which caverns expand to full size.
-# type: int
+# type: int min: 0 max: 32767
# mgvalleys_cavern_taper = 192
# Defines full size of caverns, smaller values create larger caverns.
@@ -3171,11 +2281,11 @@
# mgvalleys_cavern_threshold = 0.6
# How deep to make rivers.
-# type: int
+# type: int min: 0 max: 65535
# mgvalleys_river_depth = 4
# How wide to make rivers.
-# type: int
+# type: int min: 0 max: 65535
# mgvalleys_river_size = 5
# Controls width of tunnels, a smaller value creates wider tunnels.
@@ -3185,11 +2295,11 @@
# mgvalleys_cave_width = 0.09
# Lower Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgvalleys_dungeon_ymin = -31000
# Upper Y limit of dungeons.
-# type: int
+# type: int min: -31000 max: 31000
# mgvalleys_dungeon_ymax = 63
### Noises
@@ -3204,7 +2314,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Second of two 3D noises that together define tunnels.
@@ -3217,7 +2327,7 @@
# octaves = 3,
# persistence = 0.5,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# The depth of dirt or other biome filler node.
@@ -3243,7 +2353,7 @@
# octaves = 6,
# persistence = 0.63,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Defines large-scale river channel structure.
@@ -3295,7 +2405,7 @@
# octaves = 6,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
# Amplifies the valleys.
@@ -3334,18 +2444,512 @@
# octaves = 2,
# persistence = 0.8,
# lacunarity = 2.0,
-# flags =
+# flags =
# }
+#
+# Advanced
+#
+
+## Developer Options
+
+# Enable Lua modding support on client.
+# This support is experimental and API can change.
+# type: bool
+# enable_client_modding = false
+
+# Replaces the default main menu with a custom one.
+# type: string
+# main_menu_script =
+
+### Mod Security
+
+# Prevent mods from doing insecure things like running shell commands.
+# type: bool
+# secure.enable_security = true
+
+# Comma-separated list of trusted mods that are allowed to access insecure
+# functions even when mod security is on (via request_insecure_environment()).
+# type: string
+# secure.trusted_mods =
+
+# Comma-separated list of mods that are allowed to access HTTP APIs, which
+# allow them to upload and download data to/from the internet.
+# type: string
+# secure.http_mods =
+
+### Debugging
+
+# Level of logging to be written to debug.txt:
+# - <nothing> (no logging)
+# - none (messages with no level)
+# - error
+# - warning
+# - action
+# - info
+# - verbose
+# - trace
+# type: enum values: , none, error, warning, action, info, verbose, trace
+# debug_log_level = action
+
+# If the file size of debug.txt exceeds the number of megabytes specified in
+# this setting when it is opened, the file is moved to debug.txt.1,
+# deleting an older debug.txt.1 if it exists.
+# debug.txt is only moved if this setting is positive.
+# type: int min: 1
+# debug_log_size_max = 50
+
+# Minimal level of logging to be written to chat.
+# type: enum values: , none, error, warning, action, info, verbose, trace
+# chat_log_level = error
+
+# Handling for deprecated Lua API calls:
+# - none: Do not log deprecated calls
+# - log: mimic and log backtrace of deprecated call (default).
+# - error: abort on usage of deprecated call (suggested for mod developers).
+# type: enum values: none, log, error
+# deprecated_lua_api_handling = log
+
+# Enable random user input (only used for testing).
+# type: bool
+# random_input = false
+
+# Enable mod channels support.
+# type: bool
+# enable_mod_channels = false
+
+### Mod Profiler
+
+# Load the game profiler to collect game profiling data.
+# Provides a /profiler command to access the compiled profile.
+# Useful for mod developers and server operators.
+# type: bool
+# profiler.load = false
+
+# The default format in which profiles are being saved,
+# when calling `/profiler save [format]` without format.
+# type: enum values: txt, csv, lua, json, json_pretty
+# profiler.default_report_format = txt
+
+# The file path relative to your worldpath in which profiles will be saved to.
+# type: string
+# profiler.report_path = ""
+
+# Instrument the methods of entities on registration.
+# type: bool
+# instrument.entity = true
+
+# Instrument the action function of Active Block Modifiers on registration.
+# type: bool
+# instrument.abm = true
+
+# Instrument the action function of Loading Block Modifiers on registration.
+# type: bool
+# instrument.lbm = true
+
+# Instrument chat commands on registration.
+# type: bool
+# instrument.chatcommand = true
+
+# Instrument global callback functions on registration.
+# (anything you pass to a minetest.register_*() function)
+# type: bool
+# instrument.global_callback = true
+
+# Instrument builtin.
+# This is usually only needed by core/builtin contributors
+# type: bool
+# instrument.builtin = false
+
+# Have the profiler instrument itself:
+# * Instrument an empty function.
+# This estimates the overhead, that instrumentation is adding (+1 function call).
+# * Instrument the sampler being used to update the statistics.
+# type: bool
+# instrument.profiler = false
+
+### Engine profiler
+
+# Print the engine's profiling data in regular intervals (in seconds).
+# 0 = disable. Useful for developers.
+# type: int min: 0
+# profiler_print_interval = 0
+
## Advanced
+# Enable IPv6 support (for both client and server).
+# Required for IPv6 connections to work at all.
+# type: bool
+# enable_ipv6 = true
+
+# If enabled, invalid world data won't cause the server to shut down.
+# Only enable this if you know what you are doing.
+# type: bool
+# ignore_world_load_errors = false
+
+### Graphics
+
+# Path to shader directory. If no path is defined, default location will be used.
+# type: path
+# shader_path =
+
+# The rendering back-end.
+# A restart is required after changing this.
+# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
+# On other platforms, OpenGL is recommended.
+# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
+# type: enum values: opengl, ogles1, ogles2
+# video_driver = opengl
+
+# Distance in nodes at which transparency depth sorting is enabled
+# Use this to limit the performance impact of transparency depth sorting
+# type: int min: 0 max: 128
+# transparency_sorting_distance = 16
+
+# Enable vertex buffer objects.
+# This should greatly improve graphics performance.
+# type: bool
+# enable_vbo = true
+
+# Radius of cloud area stated in number of 64 node cloud squares.
+# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
+# type: int min: 1 max: 62
+# cloud_radius = 12
+
+# Whether node texture animations should be desynchronized per mapblock.
+# type: bool
+# desynchronize_mapblock_texture_animation = true
+
+# Enables caching of facedir rotated meshes.
+# type: bool
+# enable_mesh_cache = false
+
+# Delay between mesh updates on the client in ms. Increasing this will slow
+# down the rate of mesh updates, thus reducing jitter on slower clients.
+# type: int min: 0 max: 50
+# mesh_generation_interval = 0
+
+# Size of the MapBlock cache of the mesh generator. Increasing this will
+# increase the cache hit %, reducing the data being copied from the main
+# thread, thus reducing jitter.
+# type: int min: 0 max: 1000
+# meshgen_block_cache_size = 20
+
+# True = 256
+# False = 128
+# Usable to make minimap smoother on slower machines.
+# type: bool
+# minimap_double_scan_height = true
+
+# Textures on a node may be aligned either to the node or to the world.
+# The former mode suits better things like machines, furniture, etc., while
+# the latter makes stairs and microblocks fit surroundings better.
+# However, as this possibility is new, thus may not be used by older servers,
+# this option allows enforcing it for certain node types. Note though that
+# that is considered EXPERIMENTAL and may not work properly.
+# type: enum values: disable, enable, force_solid, force_nodebox
+# world_aligned_mode = enable
+
+# World-aligned textures may be scaled to span several nodes. However,
+# the server may not send the scale you want, especially if you use
+# a specially-designed texture pack; with this option, the client tries
+# to determine the scale automatically basing on the texture size.
+# See also texture_min_size.
+# Warning: This option is EXPERIMENTAL!
+# type: enum values: disable, enable, force
+# autoscale_mode = disable
+
+### Font
+
+# type: bool
+# font_bold = false
+
+# type: bool
+# font_italic = false
+
+# Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn.
+# type: int min: 0 max: 65535
+# font_shadow = 1
+
+# Opaqueness (alpha) of the shadow behind the default font, between 0 and 255.
+# type: int min: 0 max: 255
+# font_shadow_alpha = 127
+
+# Font size of the default font where 1 unit = 1 pixel at 96 DPI
+# type: int min: 5 max: 72
+# font_size = 16
+
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+# type: int min: 1
+# font_size_divisible_by = 1
+
+# Path to the default font. Must be a TrueType font.
+# The fallback font will be used if the font cannot be loaded.
+# type: filepath
+# font_path = fonts/Arimo-Regular.ttf
+
+# type: filepath
+# font_path_bold = fonts/Arimo-Bold.ttf
+
+# type: filepath
+# font_path_italic = fonts/Arimo-Italic.ttf
+
+# type: filepath
+# font_path_bold_italic = fonts/Arimo-BoldItalic.ttf
+
+# Font size of the monospace font where 1 unit = 1 pixel at 96 DPI
+# type: int min: 5 max: 72
+# mono_font_size = 16
+
+# For pixel-style fonts that do not scale well, this ensures that font sizes used
+# with this font will always be divisible by this value, in pixels. For instance,
+# a pixel font 16 pixels tall should have this set to 16, so it will only ever be
+# sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32.
+# type: int min: 1
+# mono_font_size_divisible_by = 1
+
+# Path to the monospace font. Must be a TrueType font.
+# This font is used for e.g. the console and profiler screen.
+# type: filepath
+# mono_font_path = fonts/Cousine-Regular.ttf
+
+# type: filepath
+# mono_font_path_bold = fonts/Cousine-Bold.ttf
+
+# type: filepath
+# mono_font_path_italic = fonts/Cousine-Italic.ttf
+
+# type: filepath
+# mono_font_path_bold_italic = fonts/Cousine-BoldItalic.ttf
+
+# Path of the fallback font. Must be a TrueType font.
+# This font will be used for certain languages or if the default font is unavailable.
+# type: filepath
+# fallback_font_path = fonts/DroidSansFallbackFull.ttf
+
+### Lighting
+
+# Gradient of light curve at minimum light level.
+# Controls the contrast of the lowest light levels.
+# type: float min: 0 max: 3
+# lighting_alpha = 0.0
+
+# Gradient of light curve at maximum light level.
+# Controls the contrast of the highest light levels.
+# type: float min: 0 max: 3
+# lighting_beta = 1.5
+
+# Strength of light curve boost.
+# The 3 'boost' parameters define a range of the light
+# curve that is boosted in brightness.
+# type: float min: 0 max: 0.4
+# lighting_boost = 0.2
+
+# Center of light curve boost range.
+# Where 0.0 is minimum light level, 1.0 is maximum light level.
+# type: float min: 0 max: 1
+# lighting_boost_center = 0.5
+
+# Spread of light curve boost range.
+# Controls the width of the range to be boosted.
+# Standard deviation of the light curve boost Gaussian.
+# type: float min: 0 max: 0.4
+# lighting_boost_spread = 0.2
+
+### Networking
+
+# Prometheus listener address.
+# If Minetest is compiled with ENABLE_PROMETHEUS option enabled,
+# enable metrics listener for Prometheus on that address.
+# Metrics can be fetched on http://127.0.0.1:30000/metrics
+# type: string
+# prometheus_listener_address = 127.0.0.1:30000
+
+# Maximum size of the out chat queue.
+# 0 to disable queueing and -1 to make the queue size unlimited.
+# type: int min: -1 max: 32767
+# max_out_chat_queue_size = 20
+
+# Timeout for client to remove unused map data from memory, in seconds.
+# type: float min: 0
+# client_unload_unused_data_timeout = 600.0
+
+# Maximum number of mapblocks for client to be kept in memory.
+# Set to -1 for unlimited amount.
+# type: int min: -1 max: 2147483647
+# client_mapblock_limit = 7500
+
+# Whether to show the client debug info (has the same effect as hitting F5).
+# type: bool
+# show_debug = false
+
+# Maximum number of blocks that are simultaneously sent per client.
+# The maximum total count is calculated dynamically:
+# max_total = ceil((#clients + max_users) * per_client / 4)
+# type: int min: 1 max: 4294967295
+# max_simultaneous_block_sends_per_client = 40
+
+# To reduce lag, block transfers are slowed down when a player is building something.
+# This determines how long they are slowed down after placing or removing a node.
+# type: float min: 0
+# full_block_send_enable_min_time_from_building = 2.0
+
+# Maximum number of packets sent per send step, if you have a slow connection
+# try reducing it, but don't reduce it to a number below double of targeted
+# client number.
+# type: int min: 1 max: 65535
+# max_packets_per_iteration = 1024
+
+# Compression level to use when sending mapblocks to the client.
+# -1 - use default compression level
+# 0 - least compression, fastest
+# 9 - best compression, slowest
+# type: int min: -1 max: 9
+# map_compression_level_net = -1
+
+### Server
+
+# Format of player chat messages. The following strings are valid placeholders:
+# @name, @message, @timestamp (optional)
+# type: string
+# chat_message_format = <@name> @message
+
+# If the execution of a chat command takes longer than this specified time in
+# seconds, add the time information to the chat command message
+# type: float min: 0
+# chatcommand_msg_time_threshold = 0.1
+
+# A message to be displayed to all clients when the server shuts down.
+# type: string
+# kick_msg_shutdown = Server shutting down.
+
+# A message to be displayed to all clients when the server crashes.
+# type: string
+# kick_msg_crash = This server has experienced an internal error. You will now be disconnected.
+
+# Whether to ask clients to reconnect after a (Lua) crash.
+# Set this to true if your server is set up to restart automatically.
+# type: bool
+# ask_reconnect_on_crash = false
+
+### Server/Env Performance
+
+# Length of a server tick and the interval at which objects are generally updated over
+# network, stated in seconds.
+# type: float min: 0
+# dedicated_server_step = 0.09
+
+# Whether players are shown to clients without any range limit.
+# Deprecated, use the setting player_transfer_distance instead.
+# type: bool
+# unlimited_player_transfer_distance = true
+
+# Defines the maximal player transfer distance in blocks (0 = unlimited).
+# type: int min: 0 max: 65535
+# player_transfer_distance = 0
+
+# From how far clients know about objects, stated in mapblocks (16 nodes).
+#
+# Setting this larger than active_block_range will also cause the server
+# to maintain active objects up to this distance in the direction the
+# player is looking. (This can avoid mobs suddenly disappearing from view)
+# type: int min: 1 max: 65535
+# active_object_send_range_blocks = 8
+
+# The radius of the volume of blocks around every player that is subject to the
+# active block stuff, stated in mapblocks (16 nodes).
+# In active blocks objects are loaded and ABMs run.
+# This is also the minimum range in which active objects (mobs) are maintained.
+# This should be configured together with active_object_send_range_blocks.
+# type: int min: 1 max: 65535
+# active_block_range = 4
+
+# From how far blocks are sent to clients, stated in mapblocks (16 nodes).
+# type: int min: 1 max: 65535
+# max_block_send_distance = 12
+
+# Maximum number of forceloaded mapblocks.
+# type: int min: 0
+# max_forceloaded_blocks = 16
+
+# Interval of sending time of day to clients, stated in seconds.
+# type: float min: 0.001
+# time_send_interval = 5.0
+
+# Interval of saving important changes in the world, stated in seconds.
+# type: float min: 0.001
+# server_map_save_interval = 5.3
+
+# How long the server will wait before unloading unused mapblocks, stated in seconds.
+# Higher value is smoother, but will use more RAM.
+# type: int min: 0 max: 4294967295
+# server_unload_unused_data_timeout = 29
+
+# Maximum number of statically stored objects in a block.
+# type: int min: 1 max: 65535
+# max_objects_per_block = 256
+
+# Length of time between active block management cycles, stated in seconds.
+# type: float min: 0
+# active_block_mgmt_interval = 2.0
+
+# Length of time between Active Block Modifier (ABM) execution cycles, stated in seconds.
+# type: float min: 0
+# abm_interval = 1.0
+
+# The time budget allowed for ABMs to execute on each step
+# (as a fraction of the ABM Interval)
+# type: float min: 0.1 max: 0.9
+# abm_time_budget = 0.2
+
+# Length of time between NodeTimer execution cycles, stated in seconds.
+# type: float min: 0
+# nodetimer_interval = 0.2
+
+# Max liquids processed per step.
+# type: int min: 1 max: 4294967295
+# liquid_loop_max = 100000
+
+# The time (in seconds) that the liquids queue may grow beyond processing
+# capacity until an attempt is made to decrease its size by dumping old queue
+# items. A value of 0 disables the functionality.
+# type: int min: 0 max: 65535
+# liquid_queue_purge_time = 0
+
+# Liquid update interval in seconds.
+# type: float min: 0.001
+# liquid_update = 1.0
+
+# At this distance the server will aggressively optimize which blocks are sent to
+# clients.
+# Small values potentially improve performance a lot, at the expense of visible
+# rendering glitches (some blocks will not be rendered under water and in caves,
+# as well as sometimes on land).
+# Setting this to a value greater than max_block_send_distance disables this
+# optimization.
+# Stated in mapblocks (16 nodes).
+# type: int min: 2 max: 32767
+# block_send_optimize_distance = 4
+
+# If enabled the server will perform map block occlusion culling based on
+# on the eye position of the player. This can reduce the number of blocks
+# sent to the client 50-80%. The client will not longer receive most invisible
+# so that the utility of noclip mode is reduced.
+# type: bool
+# server_side_occlusion_culling = true
+
+### Mapgen
+
# Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).
# WARNING!: There is no benefit, and there are several dangers, in
# increasing this value above 5.
# Reducing this value increases cave and dungeon density.
# Altering this value is for special usage, leaving it unchanged is
# recommended.
-# type: int
+# type: int min: 1 max: 10
# chunksize = 5
# Dump the mapgen debug information.
@@ -3376,28 +2980,545 @@
# speed, but this may harm game performance by interfering with other
# processes, especially in singleplayer and/or when running Lua code in
# 'on_generated'. For many users the optimum setting may be '1'.
-# type: int
+# type: int min: 0 max: 32767
# num_emerge_threads = 1
-#
-# Online Content Repository
-#
+### cURL
-# The URL for the content repository
+# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds.
+# type: int min: 100 max: 2147483647
+# curl_timeout = 20000
+
+# Limits number of parallel HTTP requests. Affects:
+# - Media fetch if server uses remote_media setting.
+# - Serverlist download and server announcement.
+# - Downloads performed by main menu (e.g. mod manager).
+# Only has an effect if compiled with cURL.
+# type: int min: 1 max: 2147483647
+# curl_parallel_limit = 8
+
+# Maximum time a file download (e.g. a mod download) may take, stated in milliseconds.
+# type: int min: 100 max: 2147483647
+# curl_file_download_timeout = 300000
+
+### Misc
+
+# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens.
+# type: int min: 1
+# screen_dpi = 72
+
+# Adjust the detected display density, used for scaling UI elements.
+# type: float min: 0.5 max: 5
+# display_density_factor = 1
+
+# Windows systems only: Start Minetest with the command line window in the background.
+# Contains the same information as the file debug.txt (default name).
+# type: bool
+# enable_console = false
+
+# Number of extra blocks that can be loaded by /clearobjects at once.
+# This is a trade-off between SQLite transaction overhead and
+# memory consumption (4096=100MB, as a rule of thumb).
+# type: int min: 0 max: 4294967295
+# max_clearobjects_extra_loaded_blocks = 4096
+
+# World directory (everything in the world is stored here).
+# Not needed if starting from the main menu.
+# type: path
+# map-dir =
+
+# See https://www.sqlite.org/pragma.html#pragma_synchronous
+# type: enum values: 0, 1, 2
+# sqlite_synchronous = 2
+
+# Compression level to use when saving mapblocks to disk.
+# -1 - use default compression level
+# 0 - least compression, fastest
+# 9 - best compression, slowest
+# type: int min: -1 max: 9
+# map_compression_level_disk = -1
+
+# Enable usage of remote media server (if provided by server).
+# Remote servers offer a significantly faster way to download media (e.g. textures)
+# when connecting to the server.
+# type: bool
+# enable_remote_media_server = true
+
+# File in client/serverlist/ that contains your favorite servers displayed in the
+# Multiplayer Tab.
# type: string
-# contentdb_url = https://content.minetest.net
+# serverlist_file = favoriteservers.json
-# 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.
-# You can also specify content ratings.
-# These flags are independent from Minetest versions,
-# so see a full list at https://content.minetest.net/help/content_flags/
+## Gamepads
+
+# Enable joysticks. Requires a restart to take effect
+# type: bool
+# enable_joysticks = false
+
+# The identifier of the joystick to use
+# type: int min: 0 max: 255
+# joystick_id = 0
+
+# The type of joystick
+# type: enum values: auto, generic, xbox, dragonrise_gamecube
+# joystick_type = auto
+
+# The time in seconds it takes between repeated events
+# when holding down a joystick button combination.
+# type: float min: 0.001
+# repeat_joystick_button_time = 0.17
+
+# The dead zone of the joystick
+# type: int min: 0 max: 65535
+# joystick_deadzone = 2048
+
+# The sensitivity of the joystick axes for moving the
+# in-game view frustum around.
+# type: float min: 0.001
+# joystick_frustum_sensitivity = 170.0
+
+## Temporary Settings
+
+# Path to texture directory. All textures are first searched from here.
+# type: path
+# texture_path =
+
+# Enables minimap.
+# type: bool
+# enable_minimap = true
+
+# Shape of the minimap. Enabled = round, disabled = square.
+# type: bool
+# minimap_shape_round = true
+
+# Address to connect to.
+# Leave this blank to start a local server.
+# Note that the address field in the main menu overrides this setting.
# type: string
-# contentdb_flag_blacklist = nonfree, desktop_default
+# address =
-# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.
-# This should be lower than curl_parallel_limit.
-# type: int
-# contentdb_max_concurrent_downloads = 3
+# Port to connect to (UDP).
+# Note that the port field in the main menu overrides this setting.
+# type: int min: 1 max: 65535
+# remote_port = 30000
+
+# Default game when creating a new world.
+# This will be overridden when creating a world from the main menu.
+# type: string
+# default_game = minetest
+
+# Enable players getting damage and dying.
+# type: bool
+# enable_damage = false
+
+# Enable creative mode for all players
+# type: bool
+# creative_mode = false
+
+# Whether to allow players to damage and kill each other.
+# type: bool
+# enable_pvp = true
+
+# Player is able to fly without being affected by gravity.
+# This requires the "fly" privilege on the server.
+# type: bool
+# free_move = false
+
+# If enabled, makes move directions relative to the player's pitch when flying or swimming.
+# type: bool
+# pitch_move = false
+
+# Fast movement (via the "Aux1" key).
+# This requires the "fast" privilege on the server.
+# type: bool
+# fast_move = false
+
+# If enabled together with fly mode, player is able to fly through solid nodes.
+# This requires the "noclip" privilege on the server.
+# type: bool
+# noclip = false
+
+# Continuous forward movement, toggled by autoforward key.
+# Press the autoforward key again or the backwards movement to disable.
+# type: bool
+# continuous_forward = false
+
+# Formspec default background opacity (between 0 and 255).
+# type: int min: 0 max: 255
+# formspec_default_bg_opacity = 140
+
+# Formspec default background color (R,G,B).
+# type: string
+# formspec_default_bg_color = (0,0,0)
+
+# Whether to show technical names.
+# Affects mods and texture packs in the Content and Select Mods menus, as well as
+# setting names in All Settings.
+# Controlled by the checkbox in the "All settings" menu.
+# type: bool
+# show_technical_names = false
+
+# Enables the sound system.
+# If disabled, this completely disables all sounds everywhere and the in-game
+# sound controls will be non-functional.
+# Changing this setting requires a restart.
+# type: bool
+# enable_sound = true
+
+# Key for moving the player forward.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_forward = KEY_KEY_W
+
+# Key for moving the player backward.
+# Will also disable autoforward, when active.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_backward = KEY_KEY_S
+
+# Key for moving the player left.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_left = KEY_KEY_A
+
+# Key for moving the player right.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_right = KEY_KEY_D
+
+# Key for jumping.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_jump = KEY_SPACE
+
+# Key for sneaking.
+# Also used for climbing down and descending in water if aux1_descends is disabled.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_sneak = KEY_LSHIFT
+
+# Key for digging.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_dig = KEY_LBUTTON
+
+# Key for placing.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_place = KEY_RBUTTON
+
+# Key for opening the inventory.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_inventory = KEY_KEY_I
+
+# Key for moving fast in fast mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_aux1 = KEY_KEY_E
+
+# Key for opening the chat window.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_chat = KEY_KEY_T
+
+# Key for opening the chat window to type commands.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_cmd = /
+
+# Key for opening the chat window to type local commands.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_cmd_local = .
+
+# Key for toggling unlimited view range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_rangeselect = KEY_KEY_R
+
+# Key for toggling flying.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_freemove = KEY_KEY_K
+
+# Key for toggling pitch move mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_pitchmove = KEY_KEY_P
+
+# Key for toggling fast mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_fastmove = KEY_KEY_J
+
+# Key for toggling noclip mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_noclip = KEY_KEY_H
+
+# Key for selecting the next item in the hotbar.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_hotbar_next = KEY_KEY_N
+
+# Key for selecting the previous item in the hotbar.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_hotbar_previous = KEY_KEY_B
+
+# Key for muting the game.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_mute = KEY_KEY_M
+
+# Key for increasing the volume.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_increase_volume =
+
+# Key for decreasing the volume.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_decrease_volume =
+
+# Key for toggling autoforward.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_autoforward =
+
+# Key for toggling cinematic mode.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_cinematic =
+
+# Key for toggling display of minimap.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_minimap = KEY_KEY_V
+
+# Key for taking screenshots.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_screenshot = KEY_F12
+
+# Key for dropping the currently selected item.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_drop = KEY_KEY_Q
+
+# Key to use view zoom when possible.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_zoom = KEY_KEY_Z
+
+# Key for selecting the first hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot1 = KEY_KEY_1
+
+# Key for selecting the second hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot2 = KEY_KEY_2
+
+# Key for selecting the third hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot3 = KEY_KEY_3
+
+# Key for selecting the fourth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot4 = KEY_KEY_4
+
+# Key for selecting the fifth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot5 = KEY_KEY_5
+
+# Key for selecting the sixth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot6 = KEY_KEY_6
+
+# Key for selecting the seventh hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot7 = KEY_KEY_7
+
+# Key for selecting the eighth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot8 = KEY_KEY_8
+
+# Key for selecting the ninth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot9 = KEY_KEY_9
+
+# Key for selecting the tenth hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot10 = KEY_KEY_0
+
+# Key for selecting the 11th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot11 =
+
+# Key for selecting the 12th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot12 =
+
+# Key for selecting the 13th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot13 =
+
+# Key for selecting the 14th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot14 =
+
+# Key for selecting the 15th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot15 =
+
+# Key for selecting the 16th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot16 =
+
+# Key for selecting the 17th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot17 =
+
+# Key for selecting the 18th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot18 =
+
+# Key for selecting the 19th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot19 =
+
+# Key for selecting the 20th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot20 =
+
+# Key for selecting the 21st hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot21 =
+
+# Key for selecting the 22nd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot22 =
+
+# Key for selecting the 23rd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot23 =
+
+# Key for selecting the 24th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot24 =
+
+# Key for selecting the 25th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot25 =
+
+# Key for selecting the 26th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot26 =
+
+# Key for selecting the 27th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot27 =
+
+# Key for selecting the 28th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot28 =
+
+# Key for selecting the 29th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot29 =
+
+# Key for selecting the 30th hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot30 =
+
+# Key for selecting the 31st hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot31 =
+
+# Key for selecting the 32nd hotbar slot.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_slot32 =
+
+# Key for toggling the display of the HUD.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_hud = KEY_F1
+
+# Key for toggling the display of chat.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_chat = KEY_F2
+
+# Key for toggling the display of the large chat console.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_console = KEY_F10
+
+# Key for toggling the display of fog.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_force_fog_off = KEY_F3
+
+# Key for toggling the camera update. Only used for development
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_update_camera =
+
+# Key for toggling the display of debug info.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_debug = KEY_F5
+
+# Key for toggling the display of the profiler. Used for development.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_toggle_profiler = KEY_F6
+
+# Key for switching between first- and third-person camera.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_camera_mode = KEY_KEY_C
+
+# Key for increasing the viewing range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_increase_viewing_range_min = +
+
+# Key for decreasing the viewing range.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_decrease_viewing_range_min = -
diff --git a/misc/irrlichtmt_tag.txt b/misc/irrlichtmt_tag.txt
new file mode 100644
index 000000000..2684ddfde
--- /dev/null
+++ b/misc/irrlichtmt_tag.txt
@@ -0,0 +1 @@
+1.9.0mt7
diff --git a/misc/net.minetest.minetest.appdata.xml b/misc/net.minetest.minetest.appdata.xml
index f9bc91dc9..339f3d006 100644
--- a/misc/net.minetest.minetest.appdata.xml
+++ b/misc/net.minetest.minetest.appdata.xml
@@ -11,26 +11,44 @@
</content_rating>
<name>Minetest</name>
<summary>Multiplayer infinite-world block sandbox game</summary>
+ <summary xml:lang="de">Mehrspieler-Sandkastenspiel mit unendlichen Blockwelten</summary>
<description>
<p>
Minetest is an infinite-world block sandbox game and game engine.
+ </p><p xml:lang="de">
+ Minetest ist ein Sandkastenspiel und eine Spielengine mit unendlichen Welten.
</p><p>
Players can create and destroy various types of blocks in a
three-dimensional open world. This allows forming structures in
every possible creation, on multiplayer servers or in singleplayer.
+ </p><p xml:lang="de">
+ Spieler können in einer offenen 3D-Welt viele verschiedene Arten von
+ Blöcken platzieren und abbauen. Dies erlaubt das Bauen von vielfältigen
+ Strukturen im Einzelspieler oder auf Mehrspielerservern.
</p><p>
Minetest is designed to be simple, stable, and portable.
It is lightweight enough to run on fairly old hardware.
+ </p><p xml:lang="de">
+ Minetest wurde entworfen, um einfach, stabil und portabel zu sein.
+ Es ist leichtgewichtig genug, um auf relativ alter Hardware zu laufen.
</p><p>
Minetest has many features, including:
+ </p><p xml:lang="de">
+ Minetest besitzt viele Features, unter anderem:
</p>
<ul>
<li>Ability to walk around, dig, and build in a near-infinite voxel world</li>
+ <li xml:lang="de">Die Möglichkeit, in einer nahezu unendlichen Voxel-Welt herumzulaufen, zu graben und zu bauen</li>
<li>Crafting of items from raw materials</li>
+ <li xml:lang="de">Fertigen von Items aus Rohmaterialien</li>
<li>Fast and able to run on old and slow hardware</li>
+ <li xml:lang="de">Gute Performance selbst auf älterer und langsamer Hardware</li>
<li>A simple modding API that supports many additions and modifications to the game</li>
+ <li xml:lang="de">Eine einfache Modding-API, die viele Ergänzungen und Änderungen am Spiel unterstützt</li>
<li>Multiplayer support via servers hosted by users</li>
+ <li xml:lang="de">Mehrspieler auf selber gehosteten Servern</li>
<li>Beautiful lightning-fast map generator</li>
+ <li xml:lang="de">Wunderschöner, blitzschneller Kartengenerator</li>
</ul>
</description>
<screenshots>
@@ -50,18 +68,20 @@
<keyword>mining</keyword>
<keyword>multiplayer</keyword>
</keywords>
- <url type="homepage">http://minetest.net</url>
- <url type="bugtracker">http://www.minetest.net/development/#reporting-issues</url>
- <url type="translate">http://dev.minetest.net/Translation</url>
- <url type="donation">http://www.minetest.net/development/#donate</url>
- <url type="faq">http://wiki.minetest.net/FAQ</url>
- <url type="help">http://wiki.minetest.net</url>
+ <url type="homepage">https://www.minetest.net</url>
+ <url type="bugtracker">https://www.minetest.net/development/#reporting-issues</url>
+ <url type="translate">https://dev.minetest.net/Translation</url>
+ <url type="donation">https://www.minetest.net/development/#donate</url>
+ <url type="faq">https://wiki.minetest.net/FAQ</url>
+ <url type="help">https://wiki.minetest.net</url>
+ <url type="vcs-browser">https://github.com/minetest/minetest</url>
+ <url type="contribute">https://www.minetest.net/get-involved/</url>
<provides>
<binary>minetest</binary>
</provides>
<translation type="gettext">minetest</translation>
<update_contact>sfan5@live.de</update_contact>
<releases>
- <release date="2022-05-15" version="5.5.1"/>
+ <release date="2022-08-04" version="5.6.0"/>
</releases>
</component>
diff --git a/mods/mods_here.txt b/mods/mods_here.txt
index e105fbd1a..e14b7539e 100644
--- a/mods/mods_here.txt
+++ b/mods/mods_here.txt
@@ -1,4 +1,10 @@
+You can use the content tab in the main menu
+
+ OR
+
You can install Minetest mods by copying (and extracting) them into this folder.
To enable them, go to the configure world window in the main menu or write
+
load_mod_<modname> = true
-in world.mt in the world directory.
+
+in world.mt in the world directory.
diff --git a/po/ar/minetest.po b/po/ar/minetest.po
index fc4891024..55ba0af16 100644
--- a/po/ar/minetest.po
+++ b/po/ar/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-12-05 13:51+0000\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-03-18 02:57+0000\n"
"Last-Translator: abidin toumi <abidin24@disroot.org>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/minetest/minetest/"
"ar/>\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 4.10-dev\n"
+"X-Generator: Weblate 4.12-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -119,6 +119,31 @@ msgid "The server has requested a reconnect:"
msgstr "يطلب الخادم إعادة الإتصال:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "اختر التعديلات"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "لا تتطابق نسخ الميفاق. "
@@ -131,6 +156,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "الخادم يدعم نسخ الميفاق ما بين $1 و $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "نحن ندعم نسخة الميفاق $1فقط."
@@ -138,14 +167,21 @@ msgstr "نحن ندعم نسخة الميفاق $1فقط."
msgid "We support protocol versions between version $1 and $2."
msgstr "نحن ندعم نسخ الميفاق ما بين $1 و $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "ألغِ"
@@ -284,7 +320,6 @@ msgid "Failed to download $1"
msgstr "فشل تحميل $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "الألعاب"
@@ -301,12 +336,10 @@ msgid "Install missing dependencies"
msgstr "ثبت الإعتماديات المفقودة"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install: Unsupported file type or broken archive"
-msgstr "يثبت: نوع الملف \"$1\" غير مدعوم أو هو أرشيف تالف"
+msgstr "التثبيت: نوع الملف غير مدعوم أو هو أرشيف تالف"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "التعديلات"
@@ -399,12 +432,9 @@ msgid "Decorations"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "نزِّل لعبة,مثل لعبة Minetest, من minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "نزِّل لعبة من minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "تحذير: إختبار التطور موجه للمطورين."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -422,10 +452,6 @@ msgstr "أرض عائمة في السماء"
msgid "Floatlands (experimental)"
msgstr "أراضيٌ عائمة (تجريبية)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "اللعبة"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "ولد تضاريس غير كسورية: محيطات وباطن الأرض"
@@ -443,6 +469,15 @@ msgid "Increases humidity around rivers"
msgstr "زِد الرطوبة قرب الأنهار"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "ثبت $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "بحيرات"
@@ -542,10 +577,6 @@ msgid "Very large caverns deep in the underground"
msgstr "كهوف كبيرة في أعماق الأرض"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "تحذير: إختبار التطور موجه للمطورين."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "إسم العالم"
@@ -575,6 +606,38 @@ msgstr "مدير الحزم: المسار \"$1\" غير صالح"
msgid "Delete World \"$1\"?"
msgstr "حذف العالم \"$1\"؟"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "أكد كلمة المرور"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "الاسم"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "كلمة المرور"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "كلمتا المرور غير متطابقتين!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "سجل وادخل"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "أقبل"
@@ -606,6 +669,16 @@ msgstr "< عد لصفحة الإعدادات"
msgid "Browse"
msgstr "استعرض"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "المحتوى"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "المحتوى"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "عطِّل"
@@ -663,7 +736,7 @@ msgstr "إختر الدليل"
msgid "Select file"
msgstr "إختر ملف"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "إعرض الأسماء التقنية"
@@ -811,6 +884,10 @@ msgstr "المساهمون السابقون"
msgid "Previous Core Developers"
msgstr "المطورون الرئيسيون السابقون"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "تصفح المحتوى عبر الانترنت"
@@ -880,10 +957,6 @@ msgstr "استضف خدوم"
msgid "Install games from ContentDB"
msgstr "ثبت العابا من ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "الاسم"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "جديد"
@@ -892,10 +965,6 @@ msgstr "جديد"
msgid "No world created or selected!"
msgstr "لم تنشئ او تحدد عالما!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "كلمة المرور"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "إلعب"
@@ -929,10 +998,6 @@ msgid "Clear"
msgstr "امسح"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "اتصل"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "النمط الإبداعي"
@@ -942,10 +1007,6 @@ msgid "Damage / PvP"
msgstr "الضرر / قتال اللاعبين"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "حذف المفضلة"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "المفضلة"
@@ -958,6 +1019,10 @@ msgid "Join Game"
msgstr "انضم للعبة"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
@@ -970,10 +1035,19 @@ msgid "Refresh"
msgstr "حدِّث"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "حذف المفضلة"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "وصف الخادم"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1018,7 +1092,8 @@ msgid "Dynamic shadows"
msgstr "ظلال ديناميكية"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "ظلال ديناميكية: "
#: builtin/mainmenu/tab_settings.lua
@@ -1114,7 +1189,8 @@ msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "حساسية اللمس: (بكسل)"
#: builtin/mainmenu/tab_settings.lua
@@ -1122,7 +1198,8 @@ msgid "Trilinear Filter"
msgstr "مرشح خطي ثلاثي"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "عالية جدا"
#: builtin/mainmenu/tab_settings.lua
@@ -1141,6 +1218,11 @@ msgstr "سوائل متموجة"
msgid "Waving Plants"
msgstr "نباتات متموجة"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "خطأ في الاتصال (انتهاء المهلة؟)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "انتهت مهلة الاتصال."
@@ -1277,7 +1359,8 @@ msgid "Camera update enabled"
msgstr "تحديث الكاميرا مفعل"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr "تعذر إظهار حدود الكتل ( تحتاج امتياز 'basic_debug')"
#: src/client/game.cpp
@@ -1407,6 +1490,11 @@ msgid "Enabled unlimited viewing range"
msgstr "مدى الرؤية غير المحدود مفعل"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "ينشىء عميلا…"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "اخرج للقائمة"
@@ -1958,27 +2046,6 @@ msgstr "فشل فتح صفحة الويب"
msgid "Opening webpage"
msgstr "يفتح صفحة الويب"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "كلمتا المرور غير متطابقتين!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "سجل وادخل"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"أنت على وشك دخول هذا الخادوم للمرة الأولى باسم \"%s\".\n"
-"اذا رغبت بالاستمرار سيتم إنشاء حساب جديد باستخدام بياناتك الاعتمادية.\n"
-"لتأكيد التسجيل ادخل كلمة مرورك وانقر 'سجل وادخل'، أو 'ألغ' للإلغاء."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "تابع"
@@ -2011,7 +2078,7 @@ msgstr "حدود الكتلة"
msgid "Change camera"
msgstr "غير الكاميرا"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "دردشة"
@@ -2064,7 +2131,7 @@ msgid "Key already in use"
msgstr "المفتاح مستخدم مسبقا"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -2136,10 +2203,6 @@ msgid "Change"
msgstr "غيِّر"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "أكد كلمة المرور"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "كلمة مرور جديدة"
@@ -2147,6 +2210,10 @@ msgstr "كلمة مرور جديدة"
msgid "Old Password"
msgstr "كلمة المرور القديمة"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "كلمتا المرور غير متطابقتين!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "أخرج"
@@ -2160,12 +2227,6 @@ msgstr "مكتوم"
msgid "Sound Volume: %d%%"
msgstr "حجم الصوت: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "أدخل "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2173,6 +2234,16 @@ msgstr "أدخل "
msgid "LANG_CODE"
msgstr "ar"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "يرجى اختيار اسم!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2300,6 +2371,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2385,6 +2460,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "ضمّن اسم العنصر"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "متقدم"
@@ -2404,7 +2484,7 @@ msgstr ""
"على ضوء الليل الطبيعي."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2473,6 +2553,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "زر المشي التلقائي"
@@ -2513,10 +2597,6 @@ msgid "Base terrain height."
msgstr "إرتفاع التضاريس الأساسي."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "أساسي"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "الإمتيازات الأساسية"
@@ -2537,7 +2617,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2549,6 +2629,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "مسار الخطين العريض والمائل"
@@ -2573,6 +2657,11 @@ msgid "Builtin"
msgstr "مدمج"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "غير الكاميرا"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2732,6 +2821,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "سرعة التسلق"
@@ -2835,6 +2928,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2871,7 +2968,9 @@ msgstr ""
"72 = 20 دقيقة ، 360 = 4 دقائق ، 1 = 24 ساعة ، 0 = نهار / ليل أبدي."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2938,12 +3037,12 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "مفتاح تقليل الحجم"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "قلل منه لزيادة مقاومة الحركة في السوائل."
+msgid "Dec. volume key"
+msgstr "مفتاح تقليل الحجم"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3088,6 +3187,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "المطورون الرئيسيون"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -3108,6 +3212,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3177,6 +3287,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3193,19 +3307,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3279,6 +3387,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3297,6 +3409,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3374,8 +3490,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "الترشيح"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "التنعييم:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3442,6 +3559,11 @@ msgid "Fog toggle key"
msgstr "مفتاح تبديل ظهور الضباب"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "حجم الخط"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "الخط عريض افتراضيًا"
@@ -3590,6 +3712,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "الألعاب"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3617,6 +3752,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3633,10 +3776,15 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "الواجهة ظاهرة"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3882,11 +4030,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "قلل منه لزيادة مقاومة الحركة في السوائل."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3955,6 +4111,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3976,7 +4138,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4016,10 +4180,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -4070,15 +4230,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4699,6 +4855,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr "اطرد اللاعبين الذين أرسلوا أكثر من X رسالة في 10 ثوانٍ."
@@ -4758,7 +4918,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4768,15 +4928,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4788,7 +4951,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4816,6 +4980,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "إضاءة سلسة"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5200,10 +5369,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5252,6 +5417,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5338,16 +5515,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5360,6 +5537,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "إبراز العقد"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5397,10 +5579,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5494,10 +5672,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5544,10 +5718,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5716,6 +5886,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "الشاشة:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5743,6 +5918,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "صوّر الشاشة"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5755,10 +5935,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5798,8 +5974,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "استضف خدوم"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "- اسم الخادم: "
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "وصف الخادم"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5826,10 +6013,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "منفذ الخدوم"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5840,12 +6036,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5853,7 +6051,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5929,7 +6127,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6130,6 +6328,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "إعدادات"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6332,7 +6535,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6356,10 +6559,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6450,6 +6661,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6683,6 +6898,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6772,6 +6996,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6798,6 +7026,9 @@ msgstr ""
#~ msgid "Back"
#~ msgstr "عُد"
+#~ msgid "Basic"
+#~ msgstr "أساسي"
+
#~ msgid "Bump Mapping"
#~ msgstr "خريطة النتوءات"
@@ -6807,15 +7038,33 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "اضبط"
+#~ msgid "Connect"
+#~ msgstr "اتصل"
+
#~ msgid "Credits"
#~ msgstr "إشادات"
#~ msgid "Damage enabled"
#~ msgstr "الضرر ممكن"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "نزِّل لعبة,مثل لعبة Minetest, من minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "نزِّل لعبة من minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "تنزيل وتثبيت $1, يرجى الإنتظار..."
+#~ msgid "Enter "
+#~ msgstr "أدخل "
+
+#~ msgid "Filtering"
+#~ msgstr "الترشيح"
+
+#~ msgid "Game"
+#~ msgstr "اللعبة"
+
#~ msgid "Generate Normal Maps"
#~ msgstr "ولِد خرائط عادية"
@@ -6870,6 +7119,19 @@ msgstr ""
#~ msgid "Yes"
#~ msgstr "نعم"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "أنت على وشك دخول هذا الخادوم للمرة الأولى باسم \"%s\".\n"
+#~ "اذا رغبت بالاستمرار سيتم إنشاء حساب جديد باستخدام بياناتك الاعتمادية.\n"
+#~ "لتأكيد التسجيل ادخل كلمة مرورك وانقر 'سجل وادخل'، أو 'ألغ' للإلغاء."
+
#~ msgid "You died."
#~ msgstr "مِت"
diff --git a/po/be/minetest.po b/po/be/minetest.po
index d625a7c75..8fa81a04d 100644
--- a/po/be/minetest.po
+++ b/po/be/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Belarusian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2019-11-19 23:04+0000\n"
"Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n"
"Language-Team: Belarusian <https://hosted.weblate.org/projects/minetest/"
@@ -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 3.10-dev\n"
#: builtin/client/chatcommands.lua
@@ -121,6 +121,31 @@ msgid "The server has requested a reconnect:"
msgstr "Сервер патрабуе перазлучыцца:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Абраць свет:"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Версіі пратакола адрозніваюцца. "
@@ -133,6 +158,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Сервер падтрымлівае версіі пратакола паміж $1 і $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Мы падтрымліваем толькі $1 версію пратакола."
@@ -140,14 +169,21 @@ msgstr "Мы падтрымліваем толькі $1 версію прата
msgid "We support protocol versions between version $1 and $2."
msgstr "Мы падтрымліваем версіі пратакола паміж $1 і $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Скасаваць"
@@ -288,7 +324,6 @@ msgid "Failed to download $1"
msgstr "Не атрымалася спампаваць $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Гульні"
@@ -312,7 +347,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Усталёўка: непадтрымліваемы файл тыпу \"$1\" або сапсаваны архіў"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Мадыфікацыі"
@@ -413,12 +447,10 @@ msgid "Decorations"
msgstr "Ітэрацыі"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Спампоўвайце гульні кшталту «Minetest Game», з minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Спампаваць з minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr ""
+"Увага: \"The minimal development test\" прызначаны толькі распрацоўшчыкам."
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
@@ -439,10 +471,6 @@ msgstr "Шчыльнасць гор лятучых астравоў"
msgid "Floatlands (experimental)"
msgstr "Узровень лятучых астравоў"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Гульня"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -461,6 +489,15 @@ msgid "Increases humidity around rivers"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Усталяваць"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr ""
@@ -565,12 +602,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-"Увага: \"The minimal development test\" прызначаны толькі распрацоўшчыкам."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Назва свету"
@@ -600,6 +631,40 @@ msgstr "pkgmgr: хібны шлях да \"$1\""
msgid "Delete World \"$1\"?"
msgstr "Выдаліць свет \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Пацвердзіць пароль"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Назва генератара мапы"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Password"
+msgstr "Новы пароль"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Паролі не супадаюць!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Зарэгістравацца і далучыцца"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Ухваліць"
@@ -632,6 +697,16 @@ msgstr "< Назад на старонку налад"
msgid "Browse"
msgstr "Праглядзець"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Змесціва"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Змесціва"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Адключаны"
@@ -689,7 +764,7 @@ msgstr "Абраць каталог"
msgid "Select file"
msgstr "Абраць файл"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Паказваць тэхнічныя назвы"
@@ -842,6 +917,11 @@ msgstr "Былыя ўдзельнікі"
msgid "Previous Core Developers"
msgstr "Былыя асноўныя распрацоўшчыкі"
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Паказваць адладачную інфармацыю"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Пошук у сеціве"
@@ -910,10 +990,6 @@ msgstr "Сервер"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Новы"
@@ -922,11 +998,6 @@ msgstr "Новы"
msgid "No world created or selected!"
msgstr "Няма створанага альбо абранага свету!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-#, fuzzy
-msgid "Password"
-msgstr "Новы пароль"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Гуляць"
@@ -962,10 +1033,6 @@ msgid "Clear"
msgstr "Ачысціць"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Злучыцца"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Творчы рэжым"
@@ -976,10 +1043,6 @@ msgid "Damage / PvP"
msgstr "Пашкоджанні"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Прыбраць з упадабанага"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "Упадабанае"
@@ -993,6 +1056,10 @@ msgid "Join Game"
msgstr "Далучыцца да гульні"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Пінг"
@@ -1007,10 +1074,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "Адлеглы порт"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "Апісанне сервера"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1056,8 +1132,9 @@ msgid "Dynamic shadows"
msgstr "Цень шрыфту"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Цень шрыфту"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -1153,7 +1230,8 @@ msgid "Tone Mapping"
msgstr "Танальнае адлюстраванне"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Сэнсарны парог: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1161,7 +1239,7 @@ msgid "Trilinear Filter"
msgstr "Трылінейны фільтр"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1180,6 +1258,11 @@ msgstr "Калыханне вадкасцяў"
msgid "Waving Plants"
msgstr "Дрыготкія расліны"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Памылка злучэння (таймаут?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Таймаут злучэння."
@@ -1317,7 +1400,7 @@ msgid "Camera update enabled"
msgstr "Абнаўленне камеры ўключана"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1448,6 +1531,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Абмежаванне бачнасці ўключана"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Стварэнне кліента…"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Выхад у меню"
@@ -1955,29 +2043,6 @@ msgstr "Не атрымалася спампаваць $1"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Паролі не супадаюць!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Зарэгістравацца і далучыцца"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Вы хочаце першы раз увайсці на сервер з назвай «%s».\n"
-"Калі вы працягнеце, то на серверы будзе створаны новы конт з вашамі данымі.\n"
-"Калі ласка, ўвядзіце пароль яшчэ раз і націсніце «Зарэгістравацца і "
-"далучыцца», каб пацвердзіць стварэнне конта альбо \"Скасаваць\", каб "
-"адмовіцца."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Працягнуць"
@@ -2011,7 +2076,7 @@ msgstr ""
msgid "Change camera"
msgstr "Змяніць камеру"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Размова"
@@ -2064,9 +2129,8 @@ msgid "Key already in use"
msgstr "Клавіша ўжо выкарыстоўваецца"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Прывязкі клавіш. (Калі меню сапсавана, выдаліце налады з minetest.conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2137,10 +2201,6 @@ msgid "Change"
msgstr "Змяніць"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Пацвердзіць пароль"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Новы пароль"
@@ -2148,6 +2208,10 @@ msgstr "Новы пароль"
msgid "Old Password"
msgstr "Стары пароль"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Паролі не супадаюць!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Выхад"
@@ -2161,12 +2225,6 @@ msgstr "Сцішаны"
msgid "Sound Volume: %d%%"
msgstr "Гучнасць: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Увод "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2174,6 +2232,16 @@ msgstr "Увод "
msgid "LANG_CODE"
msgstr "be"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Калі ласка, абярыце імя!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2334,6 +2402,10 @@ msgstr ""
"- pageflip: чатырохразовая буферызацыя (квадра-буфер)."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2424,6 +2496,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Дадаваць назвы прадметаў"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Пашыраныя"
@@ -2437,7 +2514,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Заўсёды ў палёце і шпарка"
#: src/settings_translation_file.cpp
@@ -2518,6 +2596,10 @@ msgstr ""
"Прызначаецца ў блоках мапы (16 вузлоў)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Клавіша аўта-ўперад"
@@ -2560,10 +2642,6 @@ msgid "Base terrain height."
msgstr "Вышыня асноўнай мясцовасці."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Базавыя"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Базавыя прывілеі"
@@ -2584,7 +2662,8 @@ msgid "Bind address"
msgstr "Адрас прывязкі"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Параметры шуму тэмпературы і вільготнасці для API-біёму"
#: src/settings_translation_file.cpp
@@ -2596,6 +2675,10 @@ msgid "Block send optimize distance"
msgstr "Аптымізаваная адлегласць адпраўлення блокаў"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bold and italic font path"
msgstr "Шлях да монашырыннага шрыфту"
@@ -2625,6 +2708,11 @@ msgstr "Убудаваны"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Camera"
+msgstr "Змяніць камеру"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2791,6 +2879,11 @@ msgid "Client side node lookup range restriction"
msgstr "Абмежаванне дыяпазону пошуку ад кліента"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Модынг кліента"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Хуткасць караскання"
@@ -2899,6 +2992,11 @@ msgid "Console height"
msgstr "Вышыня кансолі"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Сеціўны рэпазіторый"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Чорны спіс сцяжкоў ContentDB"
@@ -2936,8 +3034,10 @@ msgstr ""
"Прыклады: 72 = 20 мін, 360 = 4 мін, 1 = 24 г, 0 — дзень і ноч не змяняюцца."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Кантралюе хуткасць сцякання вадкасці."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -3004,13 +3104,12 @@ msgid "Debug log level"
msgstr "Узровень журнала адладкі"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Кнопка памяншэння гучнасці"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Паменшыце гэта, каб павялічыць інерцыю вадкасці."
+msgid "Dec. volume key"
+msgstr "Кнопка памяншэння гучнасці"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3166,6 +3265,11 @@ msgstr "Дэсінхранізаваць анімацыю блока"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Developer Options"
+msgstr "Ітэрацыі"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Dig key"
msgstr "Клавіша ўправа"
@@ -3186,6 +3290,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Даменная назва сервера, што будзе паказвацца ў спісе сервераў."
@@ -3258,6 +3368,10 @@ msgid "Enable joysticks"
msgstr "Уключыць джойсцікі"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Уключыць абарону мадыфікацый."
@@ -3274,18 +3388,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Уключыць выпадковы карыстальніцкі ўвод (толькі для тэставання)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Уключыць пацвярджэнне рэгістрацыі"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Уключае пацвярджэнне рэгістрацыі пры злучэнні з серверам.\n"
-"Калі выключана, новы акаўнт будзе рэгістравацца аўтаматычна."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3294,6 +3396,10 @@ msgstr ""
"Адключыць для хуткасці ці другога выгляду."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3377,6 +3483,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Профіль даліны"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Інтэрвал друкавання даных прафілявання рухавіка"
@@ -3395,6 +3506,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "FPS when unfocused or paused"
msgstr "Максімальны FPS, калі гульня прыпыненая."
@@ -3485,8 +3600,9 @@ msgstr ""
"Выкарыстайце гэты фільтр, каб выправіць тэкстуры падчас загрузкі."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Фільтрацыя"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Згладжванне:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3561,6 +3677,11 @@ msgid "Fog toggle key"
msgstr "Клавіша пераключэння туману"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Памер шрыфту"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3722,6 +3843,19 @@ msgid "GUI scaling filter txr2img"
msgstr "txr2img-фільтр маштабавання графічнага інтэрфейсу"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Гульні"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Глабальныя зваротныя выклікі"
@@ -3756,6 +3890,16 @@ msgid "Graphics"
msgstr "Графіка"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Графіка"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Графіка"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Гравітацыя"
@@ -3772,8 +3916,13 @@ msgid "HTTP mods"
msgstr "HTTP-мадыфікацыі"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Каэфіцыент маштабавання HUD"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Маштабаванне графічнага інтэрфейсу"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4030,8 +4179,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Як доўга сервер будзе чакаць перад выгрузкай блокаў мапы,\n"
@@ -4039,6 +4190,13 @@ msgstr ""
"На больш высокіх значэннях адбываецца плаўней, але патрабуецца больш памяці."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Паменшыце гэта, каб павялічыць інерцыю вадкасці."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Наколькі шырокімі рабіць рэкі."
@@ -4113,6 +4271,15 @@ msgstr ""
"\"special\" замест \"sneak\"."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Уключае пацвярджэнне рэгістрацыі пры злучэнні з серверам.\n"
+"Калі выключана, новы акаўнт будзе рэгістравацца аўтаматычна."
+
+#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
@@ -4142,7 +4309,10 @@ msgstr ""
"або плавання."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr "Калі ўключана, то гульцы не змогуць далучыцца з пустым паролем."
#: src/settings_translation_file.cpp
@@ -4191,10 +4361,6 @@ msgid "Ignore world errors"
msgstr "Не зважаць на памылкі свету"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "У гульні"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr "Празрыстасць фону гульнявой кансолі (непразрыстасць, паміж 0 і 255)."
@@ -4252,15 +4418,12 @@ msgid "Instrument the methods of entities on registration."
msgstr "Інструмент метадаў сутнасці пры рэгістрацыі."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Інструменты"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "Інтэрвал захавання важных змен свету, вызначаны ў секундах."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Інтэрвал адпраўлення кліентам часу."
#: src/settings_translation_file.cpp
@@ -5123,6 +5286,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Адлучаць гульцоў, што ўвялі гэтую колькасць паведамленняў цягам 10 секунд."
@@ -5181,10 +5348,11 @@ msgid "Left key"
msgstr "Клавіша ўлева"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Працягласць цыкла сервера і інтэрвал, па якім аб'екты, як правіла, "
"абнаўляюцца па сетцы."
@@ -5199,18 +5367,25 @@ msgstr ""
"Патрабуюцца ўключаныя шэйдэры."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Інтэрвал часу паміж цыкламі выканання мадыфікатараў актыўных блокаў"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Інтэрвал часу паміж цыкламі выканання таймераў блокаў"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Інтэрвал часу паміж цыкламі кіравання актыўнымі блокамі (ABM)"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5219,7 +5394,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Узровень дэталізацыі журнала debug.txt:\n"
"- <nothing> (не вядзецца)\n"
@@ -5261,6 +5437,11 @@ msgid "Light curve low gradient"
msgstr "Цэнтр сярэдняга ўздыму крывой святла"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Мяккае асвятленне"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5708,10 +5889,6 @@ msgid "Maximum users"
msgstr "Максімальная колькасць карыстальнікаў"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Меню"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Кэш сетак"
@@ -5761,6 +5938,20 @@ msgid "Mipmapping"
msgstr "MIP-тэкстураванне"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Прафіліроўшчык"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Бяспека"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Каналы мадыфікацый"
@@ -5861,10 +6052,6 @@ msgid "Near plane"
msgstr "Блізкая плоскасць адсячэння"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Сетка"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5873,6 +6060,11 @@ msgstr ""
"Гэтае значэнне можна перавызначыць у галоўным меню падчас запуску."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Сетка"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Новыя карыстальнікі мусяц ўвесці гэты пароль."
@@ -5885,6 +6077,11 @@ msgid "Noclip key"
msgstr "Клавіша руху скрозь сцены"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Падсвятленне вузла"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Падсвятленне блокаў"
@@ -5944,10 +6141,6 @@ msgstr ""
"і спажываннем памяці (4096 = 100 МБ, як правіла)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Сеціўны рэпазіторый"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Непразрыстыя вадкасці"
@@ -6050,10 +6243,6 @@ msgstr ""
"Неабходны прывілей «noclip» на серверы."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Імя гульца"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Дыстанцыя перадачы даных гульца"
@@ -6111,10 +6300,6 @@ msgid "Profiler toggle key"
msgstr "Клавіша пераключэння прафіліроўшчыка"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Прафіляванне"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -6303,6 +6488,11 @@ msgstr ""
"калі выява маштабуецца не да цэлых памераў."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Экран:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Вышыня экрана"
@@ -6332,6 +6522,11 @@ msgstr ""
"1 азначае найгоршую якасць, а 100 — найлепшую. 0 - прадвызначаная якасць."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Здымак экрана"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Шум марскога дна"
@@ -6345,10 +6540,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Другі з двух 3D-шумоў, што разам вызначаюць тунэлі."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Бяспека"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Глядзіце https://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6408,8 +6599,19 @@ msgstr ""
"18 = 4D-мноства Жулія «Мандэльбульб»."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Сервер / Адзіночная гульня"
+#, fuzzy
+msgid "Server"
+msgstr "URL сервера"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Назва сервера"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Апісанне сервера"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6436,10 +6638,20 @@ msgid "Server side occlusion culling"
msgstr "Адсячэнне аклюзіі на баку сервера"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Порт сервера"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "URL спіса сервераў"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "URL спіса сервераў"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Файл спіса сервераў"
@@ -6452,14 +6664,17 @@ msgstr ""
"Пасля змены мовы патрэбна перазапусціць гульню."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
"Вызначае максімальную колькасць сімвалаў у паведамленнях, што адпраўляюцца "
"кліентамі ў размову."
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -6467,7 +6682,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6562,7 +6777,7 @@ msgid ""
msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6791,6 +7006,11 @@ msgid "Temperature variation for biomes."
msgstr "Варыяцыя тэмпературы ў біёмах."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Налады"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Альтэрнатыўны шум рэльефу"
@@ -7047,7 +7267,8 @@ msgid "Time speed"
msgstr "Хуткасць часу"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, fuzzy
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr "Таймаут выдалення невыкарыстоўваемых даных з памяці кліента."
#: src/settings_translation_file.cpp
@@ -7075,10 +7296,19 @@ msgid "Touch screen threshold"
msgstr "Парог сэнсарнага экрана"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Парог сэнсарнага экрана"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Шум дрэў"
@@ -7186,6 +7416,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Выкарыстоўваць трылінейную фільтрацыю пры маштабаванні тэкстур."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7461,6 +7695,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr "Паказваць адладачную інфармацыю (тое ж, што і F5)."
@@ -7565,6 +7808,10 @@ msgid "Y-level of seabed."
msgstr "Y-узровень марскога дна."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Таймаўт спампоўвання файла па cURL"
@@ -7611,6 +7858,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Back"
#~ msgstr "Назад"
+#~ msgid "Basic"
+#~ msgstr "Базавыя"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Біты на піксель (глыбіня колеру) у поўнаэкранным рэжыме."
@@ -7644,9 +7894,15 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Configure"
#~ msgstr "Наладзіць"
+#~ msgid "Connect"
+#~ msgstr "Злучыцца"
+
#~ msgid "Content Store"
#~ msgstr "Крама дадаткаў"
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Кантралюе хуткасць сцякання вадкасці."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7691,6 +7947,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ "Вызначае крок дыскрэтызацыі тэкстуры.\n"
#~ "Больш высокае значэнне прыводзіць да больш гладкіх мапаў нармаляў."
+#~ msgid "Del. Favorite"
+#~ msgstr "Прыбраць з упадабанага"
+
#~ msgid ""
#~ "Deprecated, define and locate cave liquids using biome definitions "
#~ "instead.\n"
@@ -7700,12 +7959,21 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ "азначэнняў біёму.\n"
#~ "Y верхняй мяжы лавы ў вялікіх пячорах."
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Спампоўвайце гульні кшталту «Minetest Game», з minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Спампаваць з minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Спампоўванне і ўсталёўка $1. Калі ласка, пачакайце…"
#~ msgid "Enable VBO"
#~ msgstr "Уключыць VBO"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Уключыць пацвярджэнне рэгістрацыі"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7733,6 +8001,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ "Уключае паралакснае аклюзіўнае тэкстураванне.\n"
#~ "Патрабуюцца ўключаныя шэйдэры."
+#~ msgid "Enter "
+#~ msgstr "Увод "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7752,6 +8023,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Fallback font size"
#~ msgstr "Памер рэзервовага шрыфту"
+#~ msgid "Filtering"
+#~ msgstr "Фільтрацыя"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Шум базавай вышыні лятучых астравоў"
@@ -7767,6 +8041,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Full screen BPP"
#~ msgstr "Глыбіня колеру ў поўнаэкранным рэжыме (бітаў на піксель)"
+#~ msgid "Game"
+#~ msgstr "Гульня"
+
#~ msgid "Gamma"
#~ msgstr "Гама"
@@ -7776,6 +8053,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Generate normalmaps"
#~ msgstr "Генерацыя мапы нармаляў"
+#~ msgid "HUD scale factor"
+#~ msgstr "Каэфіцыент маштабавання HUD"
+
#~ msgid "High-precision FPU"
#~ msgstr "Высокадакладны FPU"
@@ -7789,9 +8069,20 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ "Калі ўключана адначасова з рэжымам палёту, то вызначае напрамак руху "
#~ "адносна кроку гульца."
+#~ msgid "In-Game"
+#~ msgstr "У гульні"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Усталёўка: файл: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Інструменты"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Прывязкі клавіш. (Калі меню сапсавана, выдаліце налады з minetest.conf)"
+
#~ msgid "Lava depth"
#~ msgstr "Глыбіня лавы"
@@ -7841,6 +8132,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ "Нявызначаныя параметры прадвызначана не змяняюцца.\n"
#~ "Параметры, што пачынаюцца з \"no\", выкарыстоўваюцца для выключэння."
+#~ msgid "Menus"
+#~ msgstr "Меню"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Мінімапа ў рэжыме радару, павелічэнне х2"
@@ -7907,6 +8201,12 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Path to save screenshots at."
#~ msgstr "Каталог для захоўвання здымкаў экрана."
+#~ msgid "Player name"
+#~ msgstr "Імя гульца"
+
+#~ msgid "Profiling"
+#~ msgstr "Прафіляванне"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Праектаванне падзямелляў"
@@ -7919,6 +8219,9 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Select Package File:"
#~ msgstr "Абраць файл пакунка:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Сервер / Адзіночная гульня"
+
#~ msgid "Shadow limit"
#~ msgstr "Ліміт ценяў"
@@ -7993,6 +8296,22 @@ msgstr "Ліміт адначасовых злучэнняў cURL"
#~ msgid "Yes"
#~ msgstr "Так"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Вы хочаце першы раз увайсці на сервер з назвай «%s».\n"
+#~ "Калі вы працягнеце, то на серверы будзе створаны новы конт з вашамі "
+#~ "данымі.\n"
+#~ "Калі ласка, ўвядзіце пароль яшчэ раз і націсніце «Зарэгістравацца і "
+#~ "далучыцца», каб пацвердзіць стварэнне конта альбо \"Скасаваць\", каб "
+#~ "адмовіцца."
+
#, fuzzy
#~ msgid "You died."
#~ msgstr "Вы загінулі"
diff --git a/po/bg/minetest.po b/po/bg/minetest.po
index fb3a096dc..ce95a8879 100644
--- a/po/bg/minetest.po
+++ b/po/bg/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-10 23:53+0000\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-04-11 15:08+0000\n"
"Last-Translator: 109247019824 <stoyan@gmx.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/minetest/"
"minetest/bg/>\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 4.10.1\n"
+"X-Generator: Weblate 4.12-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -119,6 +119,31 @@ msgid "The server has requested a reconnect:"
msgstr "Сървърът поиска повторно свързване:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Модификации"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Изданието на протокола не съвпада. "
@@ -131,6 +156,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Сървърът поддържа изданията на протокола между $1 и $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Поддържаме само издание $1 на протокола."
@@ -138,14 +167,21 @@ msgstr "Поддържаме само издание $1 на протокола.
msgid "We support protocol versions between version $1 and $2."
msgstr "Поддържаме само изданията на протокола между $1 и $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Отказ"
@@ -160,7 +196,7 @@ msgstr "Изключване всички"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr "Изключване на пакет с модификации"
+msgstr "Изкл. на пакета"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -168,7 +204,7 @@ msgstr "Включване всички"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr "Включване на пакет с модификации"
+msgstr "Вкл. на пакета"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
@@ -285,7 +321,6 @@ msgid "Failed to download $1"
msgstr "Грешка при изтеглянето на $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Игри"
@@ -306,7 +341,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Инсталиране: Неподдържан вид на файл или повреден архив"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Модификации"
@@ -399,12 +433,9 @@ msgid "Decorations"
msgstr "Декорации"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Изтегляне на игра, например Minetest Game, от minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Изтеглете от minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Внимание: Тестът за разработка е предназначен за разработчици."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -422,10 +453,6 @@ msgstr "Плаващи земни маси в небето"
msgid "Floatlands (experimental)"
msgstr "Небесни острови (експериментално)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Игра"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Създаване на нефрактален терен: Морета и подземен свят"
@@ -443,6 +470,15 @@ msgid "Increases humidity around rivers"
msgstr "Увеличава влажността около реките"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Инсталиране $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Езера"
@@ -544,10 +580,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Много големи пещери дълбоко под земята"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Внимание: Тестът за разработка е предназначен за разработчици."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Име на света"
@@ -577,6 +609,38 @@ msgstr "pkgmgr: недействителен път „$1“"
msgid "Delete World \"$1\"?"
msgstr "Премахване на света „$1“?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Потвърж. на парола"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Име"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Парола"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Паролите не съвпадат!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Регистриране и вход"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Приемане"
@@ -609,6 +673,16 @@ msgstr "Главно меню"
msgid "Browse"
msgstr "Разглеждане"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Съдържание"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Съдържание"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Изключено"
@@ -666,7 +740,7 @@ msgstr "Избор на папка"
msgid "Select file"
msgstr "Избор на файл"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Технически наименования"
@@ -708,7 +782,7 @@ msgstr "Разпределение по Z"
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "absvalue"
-msgstr ""
+msgstr "абсолютна стойност"
#. ~ "defaults" is a noise parameter flag.
#. It describes the default processing options
@@ -814,6 +888,10 @@ msgstr "Предишни сътрудници"
msgid "Previous Core Developers"
msgstr "Предишни основни разработчици"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Преглед на съдържание онлайн"
@@ -840,7 +918,7 @@ msgstr "Няма зависимости."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr "Пакетът няма описание"
+msgstr "Пакетът е без описание"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
@@ -882,10 +960,6 @@ msgstr "Създаване на сървър"
msgid "Install games from ContentDB"
msgstr "Инсталиране на игри от ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Име"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Създаване"
@@ -894,10 +968,6 @@ msgstr "Създаване"
msgid "No world created or selected!"
msgstr "Не е създаден или избран свят!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Парола"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Започване на игра"
@@ -931,10 +1001,6 @@ msgid "Clear"
msgstr "Изчистване"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Свързване"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Творчески режим"
@@ -944,10 +1010,6 @@ msgid "Damage / PvP"
msgstr "Щети / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Премах. любим"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Любими"
@@ -960,8 +1022,12 @@ msgid "Join Game"
msgstr "Включване към игра"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
-msgstr "Ping"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Public Servers"
@@ -972,12 +1038,21 @@ msgid "Refresh"
msgstr "Презареждане"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Отдалечен порт"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Описание на сървър"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr "2x"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
@@ -985,11 +1060,11 @@ msgstr "Тримерни облаци"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr "4x"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr "8x"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "All Settings"
@@ -1020,7 +1095,8 @@ msgid "Dynamic shadows"
msgstr "Динамични сенки"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Динамични сенки: "
#: builtin/mainmenu/tab_settings.lua
@@ -1080,7 +1156,7 @@ msgstr "Непрозрачна вода"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr "Частици"
+msgstr "Отломки"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
@@ -1120,7 +1196,8 @@ msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Праг на докосване: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1128,7 +1205,8 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Много силни"
#: builtin/mainmenu/tab_settings.lua
@@ -1147,6 +1225,11 @@ msgstr "Поклащащи се течности"
msgid "Waving Plants"
msgstr "Поклащащи се растения"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Грешка при свързване (изтекло време?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Времето за свързване изтече."
@@ -1177,7 +1260,7 @@ msgstr "Грешка при свързване (изтекло време?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr "Не може да бъде намерена или заредена игра: "
+msgstr "Играта не може да бъде намерена или заредена: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1233,9 +1316,8 @@ msgstr "- Обществен: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
-#, fuzzy
msgid "- PvP: "
-msgstr "- PvP: "
+msgstr ""
#: src/client/game.cpp
msgid "- Server Name: "
@@ -1260,21 +1342,20 @@ msgid "Automatic forward enabled"
msgstr "Автоматичното движение напред е включено"
#: src/client/game.cpp
-#, fuzzy
msgid "Block bounds hidden"
-msgstr "Граници на блокове"
+msgstr "Контурите на блоковете са скрити"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
-msgstr ""
+msgstr "Контурите на всички блокове са видими"
#: src/client/game.cpp
msgid "Block bounds shown for current block"
-msgstr ""
+msgstr "Контурите на текущия блок са видими"
#: src/client/game.cpp
msgid "Block bounds shown for nearby blocks"
-msgstr ""
+msgstr "Контурите на близките блокове са видими"
#: src/client/game.cpp
msgid "Camera update disabled"
@@ -1285,8 +1366,11 @@ msgid "Camera update enabled"
msgstr "Опресняването на екрана при движение е включено"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
+"Контурите на блоковете не могат да бъдат показани (заб.: липсва правото "
+"„basic_debug“)"
#: src/client/game.cpp
msgid "Change Password"
@@ -1403,6 +1487,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Неограниченият обхват на видимост е включен"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Създаване на клиент…"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Изход към менюто"
@@ -1907,28 +1996,6 @@ msgstr "Грешка при отваряне на страница"
msgid "Opening webpage"
msgstr "Отваряне на страница"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Паролите не съвпадат!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Регистриране и вход"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"На път сте да влезете в сървъра с име „%s“ за първи път.\n"
-"Ако продължите нова сметка с тези данни ще бъде създадена на сървъра.\n"
-"Въведете паролата отново и натиснете „Регистриране и вход“, за да потвърдите "
-"или „Отказ“ за връщане обратно."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Напред"
@@ -1947,7 +2014,7 @@ msgstr "Автоматично скачане"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
-msgstr "Aux1"
+msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
@@ -1961,7 +2028,7 @@ msgstr "Граници на блокове"
msgid "Change camera"
msgstr "Промяна на камера"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Разговори"
@@ -2014,10 +2081,8 @@ msgid "Key already in use"
msgstr "Клавишът вече се ползва"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Клавишни комбинации (Ако екранът изглежда счупен махнете нещата от minetest."
-"conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2088,10 +2153,6 @@ msgid "Change"
msgstr "Променяне"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Потвърж. на парола"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Нова парола"
@@ -2099,6 +2160,10 @@ msgstr "Нова парола"
msgid "Old Password"
msgstr "Стара парола"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Паролите не съвпадат!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Изход"
@@ -2112,12 +2177,6 @@ msgstr "Без звук"
msgid "Sound Volume: %d%%"
msgstr "Сила на звука: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Въведете "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2125,6 +2184,16 @@ msgstr "Въведете "
msgid "LANG_CODE"
msgstr "bg"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Изберете име!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2250,6 +2319,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2308,7 +2381,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Adds particles when digging a node."
-msgstr ""
+msgstr "Добавят се отломки при копане на възел."
#: src/settings_translation_file.cpp
msgid ""
@@ -2331,6 +2404,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Име на света"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr ""
@@ -2344,7 +2422,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2413,6 +2491,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2453,12 +2535,8 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
-msgstr ""
+msgstr "Основни права"
#: src/settings_translation_file.cpp
msgid "Beach noise"
@@ -2477,7 +2555,7 @@ msgid "Bind address"
msgstr "Адрес за свързване"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2489,6 +2567,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2513,6 +2595,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Промяна на камера"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2671,6 +2758,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2766,6 +2857,10 @@ msgid "Console height"
msgstr "Височина на конзолата"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2803,8 +2898,10 @@ msgstr ""
"промяна."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Управлява скоростта на потъване в течности."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2827,7 +2924,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Creative"
-msgstr ""
+msgstr "Творчески"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
@@ -2870,11 +2967,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2901,7 +2998,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Default privileges"
-msgstr ""
+msgstr "Подразбирани права"
#: src/settings_translation_file.cpp
msgid "Default report format"
@@ -3017,12 +3114,17 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Декорации"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Digging particles"
-msgstr ""
+msgstr "Отломки при копане"
#: src/settings_translation_file.cpp
msgid "Disable anticheat"
@@ -3037,6 +3139,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3099,13 +3207,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Enable creative mode for all players"
-msgstr ""
+msgstr "Задаване на творчески режим на всички играчи"
#: src/settings_translation_file.cpp
msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3122,19 +3234,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3208,6 +3314,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3226,6 +3336,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3266,6 +3380,8 @@ msgid ""
"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
+"Бърздо движение чрез клавиш „Aux1“.\n"
+"Изисква правото „fast“ от сървъра."
#: src/settings_translation_file.cpp
msgid "Field of view"
@@ -3303,8 +3419,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Сгласяне:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3371,6 +3488,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3519,6 +3640,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Игри"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3546,6 +3680,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3562,10 +3704,15 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "HUD видим"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3802,11 +3949,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3857,6 +4011,9 @@ msgid ""
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
+"Ако е включено заедно с режима на летене, играчът може да лети през плътни "
+"възли.\n"
+"Изисква правото „noclip“ от сървъра."
#: src/settings_translation_file.cpp
msgid ""
@@ -3867,6 +4024,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3888,7 +4051,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3928,10 +4093,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3982,15 +4143,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4611,6 +4768,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4666,7 +4827,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4676,15 +4837,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4696,7 +4860,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4724,6 +4889,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Гладко осветление"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5108,10 +5278,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5160,6 +5326,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5246,16 +5424,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5268,6 +5446,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Осветяване на възел"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5305,10 +5488,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5400,10 +5579,8 @@ msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Име на играча"
+"Играчът може да лети без да се влияе от гравитацията.\n"
+"Изисква правото „fly“ от сървъра."
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@@ -5441,7 +5618,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "Правата, които играчите с „basic_privs“ могат да получат"
#: src/settings_translation_file.cpp
msgid "Profiler"
@@ -5452,10 +5629,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5469,7 +5642,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
-msgstr "Частта от големи пещери, които съдържат течност."
+msgstr "Съотношението на големи пещери, съдържащи течности."
#: src/settings_translation_file.cpp
msgid ""
@@ -5624,6 +5797,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Екран:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5651,6 +5829,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Снимка на екрана"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5663,10 +5846,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5706,8 +5885,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "Създаване на сървър"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "- Име на сървър: "
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Описание на сървър"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5734,10 +5924,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Порт на сървъра"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5748,12 +5947,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5761,7 +5962,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5837,7 +6038,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6037,6 +6238,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Настройки"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6144,6 +6350,8 @@ msgid ""
"The privileges that new users automatically get.\n"
"See /privs in game for a full list on your server and mod configuration."
msgstr ""
+"Правата, които получават новите играчи.\n"
+"В играта вижте „/privs“ за пълен списък от права за сървъра и модификациите."
#: src/settings_translation_file.cpp
msgid ""
@@ -6239,7 +6447,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6263,10 +6471,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6357,6 +6573,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6590,6 +6810,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6679,6 +6908,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6696,12 +6929,56 @@ msgstr ""
#~ msgid "- Damage: "
#~ msgstr "- Щети: "
+#~ msgid "Connect"
+#~ msgstr "Свързване"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Управлява скоростта на потъване в течности."
+
+#~ msgid "Del. Favorite"
+#~ msgstr "Премах. любим"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Изтегляне на игра, например Minetest Game, от minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Изтеглете от minetest.net"
+
+#~ msgid "Enter "
+#~ msgstr "Въведете "
+
+#~ msgid "Game"
+#~ msgstr "Игра"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Инсталиране: файл: „$1“"
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Клавишни комбинации (Ако екранът изглежда счупен махнете нещата от "
+#~ "minetest.conf)"
+
+#~ msgid "Player name"
+#~ msgstr "Име на играча"
+
#~ msgid "View"
#~ msgstr "Гледане"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "На път сте да влезете в сървъра с име „%s“ за първи път.\n"
+#~ "Ако продължите нова сметка с тези данни ще бъде създадена на сървъра.\n"
+#~ "Въведете паролата отново и натиснете „Регистриране и вход“, за да "
+#~ "потвърдите или „Отказ“ за връщане обратно."
+
#~ msgid "You died."
#~ msgstr "Умряхте."
diff --git a/po/ca/minetest.po b/po/ca/minetest.po
index b23999744..e58bc7fce 100644
--- a/po/ca/minetest.po
+++ b/po/ca/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Catalan (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/minetest/"
@@ -122,6 +122,31 @@ msgid "The server has requested a reconnect:"
msgstr "El servidor ha sol·licitat una reconnexió:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Seleccionar un món:"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Desajust de la versió del protocol. "
@@ -135,6 +160,10 @@ msgstr ""
"El servidor es compatible amb les versions de protocol entre $ 1 i $ 2 . "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Nosaltres sols suportem la versió $1 del protocol."
@@ -142,14 +171,21 @@ msgstr "Nosaltres sols suportem la versió $1 del protocol."
msgid "We support protocol versions between version $1 and $2."
msgstr "Nosaltres suportem versions del protocol entre la versió $1 i la $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Cancel·lar"
@@ -300,7 +336,6 @@ msgid "Failed to download $1"
msgstr "Error al instal·lar $1 en $2"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Jocs"
@@ -326,7 +361,6 @@ msgstr ""
"Instal·lar mod: Format de arxiu \"$1\" no suportat o arxiu corrupte"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -427,13 +461,10 @@ msgstr "Informació del mod:"
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
-msgid "Download a game, such as Minetest Game, from minetest.net"
+msgid "Development Test is meant for developers."
msgstr ""
-"Descarrega un subjoc, com per exemple minetest_game, des de minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Descarrega'n alguns des de minetest.net"
+"Advertència: El joc \"Minimal development test\" esta dissenyat per a "
+"desenvolupadors."
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
@@ -452,10 +483,6 @@ msgstr ""
msgid "Floatlands (experimental)"
msgstr ""
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Joc"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -473,6 +500,15 @@ msgid "Increases humidity around rivers"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Instal·lar"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr ""
@@ -575,13 +611,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-"Advertència: El joc \"Minimal development test\" esta dissenyat per a "
-"desenvolupadors."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nom del món"
@@ -614,6 +643,38 @@ msgstr "Modmgr: Ruta del mod \"$1\" invàlida"
msgid "Delete World \"$1\"?"
msgstr "Eliminar el món \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Confirma contrasenya"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Password"
+msgstr "Nova contrasenya"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Les contrasenyes no coincideixen!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr ""
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Acceptar"
@@ -645,6 +706,16 @@ msgstr "< Torna a la pàgina de configuració"
msgid "Browse"
msgstr "Navegar"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Continuar"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Continuar"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Desactivat"
@@ -703,7 +774,7 @@ msgstr "Selecciona el fitxer del mod:"
msgid "Select file"
msgstr "Selecciona el fitxer del mod:"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Mostrar els noms tècnics"
@@ -866,6 +937,10 @@ msgstr "Antics Col·laboradors"
msgid "Previous Core Developers"
msgstr "Antics Desenvolupadors del nucli"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr ""
@@ -943,10 +1018,6 @@ msgstr "Servidor"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nou"
@@ -955,11 +1026,6 @@ msgstr "Nou"
msgid "No world created or selected!"
msgstr "No s'ha creat ningun món o no s'ha seleccionat!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-#, fuzzy
-msgid "Password"
-msgstr "Nova contrasenya"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Jugar Joc"
@@ -996,10 +1062,6 @@ msgid "Clear"
msgstr "Netejar"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Connectar"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Mode creatiu"
@@ -1010,10 +1072,6 @@ msgid "Damage / PvP"
msgstr "Dany"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Esborra preferit"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "Preferit"
@@ -1028,6 +1086,10 @@ msgid "Join Game"
msgstr "Ocultar Joc"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -1042,10 +1104,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "Esborra preferit"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "Port del Servidor"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1092,7 +1163,7 @@ msgid "Dynamic shadows"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+msgid "Dynamic shadows:"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1189,7 +1260,7 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr "Llindar tàctil (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1197,7 +1268,7 @@ msgid "Trilinear Filter"
msgstr "Filtratge Trilineal"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1217,6 +1288,11 @@ msgstr "Moviment de les Fulles"
msgid "Waving Plants"
msgstr "Moviment de Plantes"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Error de connexió (¿temps esgotat?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Temps d'espera de la connexió esgotat."
@@ -1361,7 +1437,7 @@ msgid "Camera update enabled"
msgstr "Tecla alternativa per a l'actualització de la càmera"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1492,6 +1568,11 @@ msgid "Enabled unlimited viewing range"
msgstr ""
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Creant client ..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Eixir al menú"
@@ -2017,24 +2098,6 @@ msgstr "Error al instal·lar $1 en $2"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Les contrasenyes no coincideixen!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Continuar"
@@ -2070,7 +2133,7 @@ msgstr ""
msgid "Change camera"
msgstr "Configurar controls"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Xat"
@@ -2124,10 +2187,8 @@ msgid "Key already in use"
msgstr "La tecla s'està utilitzant"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Combinacions de tecles. (Si aquest menú espatlla, esborrar coses de minetest."
-"conf)"
#: src/gui/guiKeyChangeMenu.cpp
#, fuzzy
@@ -2205,10 +2266,6 @@ msgid "Change"
msgstr "Canviar"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Confirma contrasenya"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nova contrasenya"
@@ -2216,6 +2273,10 @@ msgstr "Nova contrasenya"
msgid "Old Password"
msgstr "Contrasenya vella"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Les contrasenyes no coincideixen!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Tancar"
@@ -2230,12 +2291,6 @@ msgstr "Utilitza la tecla"
msgid "Sound Volume: %d%%"
msgstr "Volum de so: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Introdueix "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2243,6 +2298,15 @@ msgstr "Introdueix "
msgid "LANG_CODE"
msgstr "ca"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+msgid "Name is taken. Please choose another name"
+msgstr ""
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2384,6 +2448,10 @@ msgstr ""
"- pageflip: quadbuffer based 3d."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2478,6 +2546,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Nom del món"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Avançat"
@@ -2491,7 +2564,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Sempre volar y ràpid"
#: src/settings_translation_file.cpp
@@ -2562,6 +2636,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Automatic forward key"
msgstr "Tecla Avançar"
@@ -2607,10 +2685,6 @@ msgid "Base terrain height."
msgstr "Alçada del terreny base"
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Bàsic"
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Basic privileges"
msgstr "Privilegis per defecte"
@@ -2632,7 +2706,7 @@ msgid "Bind address"
msgstr "Adreça BIND"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2644,6 +2718,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2668,6 +2746,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Configurar controls"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2836,6 +2919,11 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Client"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Velocitat d'escalada"
@@ -2941,6 +3029,10 @@ msgid "Console height"
msgstr "Tecla de la consola"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2979,7 +3071,9 @@ msgstr ""
"queda inalterat."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3048,11 +3142,11 @@ msgid "Debug log level"
msgstr "Nivell de registre de depuració"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3200,6 +3294,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Developer Options"
+msgstr "Informació del mod:"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Dig key"
msgstr "Tecla dreta"
@@ -3221,6 +3320,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3291,6 +3396,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3307,19 +3416,13 @@ msgid "Enable random user input (only used for testing)."
msgstr "Habilitar l'entrada aleatòria d'usuari (només utilitzat per testing)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3393,6 +3496,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3411,6 +3518,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3491,8 +3602,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Suavitzat (Antialiasing):"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3560,6 +3672,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3708,6 +3824,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Jocs"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3735,6 +3864,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3753,7 +3890,11 @@ msgid "HTTP mods"
msgstr "Mods HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3999,11 +4140,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -4064,6 +4212,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -4085,7 +4239,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4125,10 +4281,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -4180,15 +4332,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5028,6 +5176,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -5084,7 +5236,7 @@ msgstr "Tecla esquerra"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5094,15 +5246,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -5114,7 +5269,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5142,6 +5298,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Il·luminació suau"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5537,10 +5698,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5589,6 +5746,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5676,16 +5845,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5698,6 +5867,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Node ressaltat"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5735,10 +5909,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5835,10 +6005,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5886,10 +6052,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -6061,6 +6223,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Pantalla:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -6089,6 +6256,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Screenshots"
+msgstr "Pantalla:"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Seabed noise"
msgstr "Soroll de cova #1"
@@ -6101,10 +6273,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -6164,10 +6332,20 @@ msgstr ""
"18 = 4D \"Mandelbulb\" julia set."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
+#, fuzzy
+msgid "Server"
+msgstr "Servidor"
+
+#: src/settings_translation_file.cpp
+msgid "Server Gameplay"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Port del Servidor"
+
+#: src/settings_translation_file.cpp
msgid "Server URL"
msgstr ""
@@ -6192,10 +6370,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Port del Servidor"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -6206,12 +6393,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -6219,7 +6408,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6296,7 +6485,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6501,6 +6690,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Configuració"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6710,7 +6904,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6735,10 +6929,19 @@ msgid "Touch screen threshold"
msgstr "Llindar tàctil (px)"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Llindar tàctil (px)"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6830,6 +7033,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -7068,6 +7275,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -7161,6 +7377,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -7206,6 +7426,9 @@ msgstr ""
#~ msgid "Back"
#~ msgstr "Enrere"
+#~ msgid "Basic"
+#~ msgstr "Bàsic"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr ""
#~ "Bits per píxel (profunditat de color) en el mode de pantalla completa."
@@ -7222,6 +7445,9 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "Configurar"
+#~ msgid "Connect"
+#~ msgstr "Connectar"
+
#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels."
#~ msgstr ""
#~ "Controla l'amplada dels túnels, un valor més petit crea túnels més amples."
@@ -7243,12 +7469,26 @@ msgstr ""
#~ "Només té un efecte si és compilat amb cURL."
#, fuzzy
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr ""
+#~ "Descarrega un subjoc, com per exemple minetest_game, des de minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Descarrega'n alguns des de minetest.net"
+
+#, fuzzy
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Descarregant $1, si us plau esperi ..."
#~ msgid "Enable VBO"
#~ msgstr "Activar VBO"
+#~ msgid "Enter "
+#~ msgstr "Introdueix "
+
+#~ msgid "Game"
+#~ msgstr "Joc"
+
#, fuzzy
#~ msgid "Generate Normal Maps"
#~ msgstr "Generar Mapes Normals"
@@ -7257,6 +7497,12 @@ msgstr ""
#~ msgid "Install: file: \"$1\""
#~ msgstr "Instal·lar mod: Arxiu: \"$1\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Combinacions de tecles. (Si aquest menú espatlla, esborrar coses de "
+#~ "minetest.conf)"
+
#~ msgid "Main"
#~ msgstr "Principal"
diff --git a/po/cs/minetest.po b/po/cs/minetest.po
index 811c39f06..714fe7527 100644
--- a/po/cs/minetest.po
+++ b/po/cs/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Czech (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-11-22 18:50+0000\n"
-"Last-Translator: Ondřej Pfrogner <ondrej.andre.pfrogner@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-07-31 17:28+0000\n"
+"Last-Translator: Fjuro <fjuro@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/"
"cs/>\n"
"Language: cs\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.10-dev\n"
+"X-Generator: Weblate 4.14-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -115,6 +115,31 @@ msgid "The server has requested a reconnect:"
msgstr "Server vyžaduje opětovné připojení:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Vybrat mody"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Neshoda verze protokolu. "
@@ -127,6 +152,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Server podporuje verze protokolů mezi $1 a $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Podporujeme pouze protokol verze $1."
@@ -134,14 +163,21 @@ msgstr "Podporujeme pouze protokol verze $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Podporujeme verze protokolů mezi $1 a $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Zrušit"
@@ -281,7 +317,6 @@ msgid "Failed to download $1"
msgstr "Selhalo stažení $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Hry"
@@ -304,7 +339,6 @@ msgstr ""
"Instalace rozšíření: poškozený archiv nebo nepodporovaný typ souboru \"$1\""
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mody"
@@ -397,12 +431,9 @@ msgid "Decorations"
msgstr "Dekorace"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Stáhněte si z minetest.net hru, například Minetest Game"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Stáhněte si jednu z minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Varování: Development Test je určen pro vývojáře."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -420,10 +451,6 @@ msgstr "Krajina vznášející se na nebi"
msgid "Floatlands (experimental)"
msgstr "Létající ostrovy (experimentální)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Hra"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Generovat terén bez použití fraktálů: Oceány a podzemí"
@@ -441,6 +468,15 @@ msgid "Increases humidity around rivers"
msgstr "Zvyšuje vlhkost v okolí řek"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Instalovat $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Jezera"
@@ -542,10 +578,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Veliké jeskyně hluboko pod zemí"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Varování: Development Test je určen pro vývojáře."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Název světa"
@@ -575,6 +607,39 @@ msgstr "pkgmgr: neplatná cesta \"$1\""
msgid "Delete World \"$1\"?"
msgstr "Doopravdy chcete smazat svět \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Potvrdit heslo"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Jméno Generátoru mapy"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Jméno"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Heslo"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Hesla se neshodují!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Registrovat a Připojit se"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Přijmout"
@@ -607,6 +672,16 @@ msgstr "< Zpět do Nastavení"
msgid "Browse"
msgstr "Procházet"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Obsah"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Obsah"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Vypnuto"
@@ -664,7 +739,7 @@ msgstr "Vyberte adresář"
msgid "Select file"
msgstr "Vybrat soubor"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Zobrazit technické názvy"
@@ -815,6 +890,11 @@ msgstr "Bývalí přispěvatelé"
msgid "Previous Core Developers"
msgstr "Bývalí klíčoví vývojáři"
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Zobrazit ladící informace"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Procházet online obsah"
@@ -883,10 +963,6 @@ msgstr "Založit server"
msgid "Install games from ContentDB"
msgstr "Instalovat hry z ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Jméno"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nový"
@@ -895,10 +971,6 @@ msgstr "Nový"
msgid "No world created or selected!"
msgstr "Žádný svět nebyl vytvořen ani vybrán!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Heslo"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Spustit hru"
@@ -932,10 +1004,6 @@ msgid "Clear"
msgstr "Vyčistit"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Připojit"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Kreativní mód"
@@ -945,10 +1013,6 @@ msgid "Damage / PvP"
msgstr "Zranění / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Smazat oblíbené"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Oblíbené"
@@ -961,6 +1025,10 @@ msgid "Join Game"
msgstr "Připojit se ke hře"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -973,10 +1041,19 @@ msgid "Refresh"
msgstr "Obnovit"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Vzdálený port"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Popis serveru"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1021,7 +1098,8 @@ msgid "Dynamic shadows"
msgstr "Dynamické stíny"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Dynamické stíny: "
#: builtin/mainmenu/tab_settings.lua
@@ -1117,7 +1195,8 @@ msgid "Tone Mapping"
msgstr "Tone mapping"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Dosah dotyku: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1125,7 +1204,8 @@ msgid "Trilinear Filter"
msgstr "Trilineární filtr"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Velmi vysoké"
#: builtin/mainmenu/tab_settings.lua
@@ -1144,6 +1224,11 @@ msgstr "Vlnění Kapalin"
msgid "Waving Plants"
msgstr "Vlnění rostlin"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Chyba spojení (vypršel čas?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Vypršel časový limit připojení."
@@ -1283,7 +1368,7 @@ msgid "Camera update enabled"
msgstr "Aktualizace kamery (pohledu) povolena"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1414,6 +1499,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Neomezený pohled povolen"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Vytvářím klienta..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Odejít do nabídky"
@@ -1919,29 +2009,6 @@ msgstr "Selhalo stažení $1"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Hesla se neshodují!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registrovat a Připojit se"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Budete poprvé připojeni k serveru \"%s\".\n"
-"Pokud budete pokračovat, nový uživatelský účet s vašimi údaji bude vytvořen "
-"na tomto serveru.\n"
-"Prosím znovu napište svoje aktuální heslo a klikněte na 'Registrovat a "
-"Připojit se' pro potvrzení souhlasu, nebo vyberte 'Zrušit' pro návrat."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Pokračovat"
@@ -1974,7 +2041,7 @@ msgstr "Ohraničení bloku"
msgid "Change camera"
msgstr "Změnit nastavení kamery"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Chat"
@@ -2027,10 +2094,8 @@ msgid "Key already in use"
msgstr "Klávesa je již používána"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Nastavení kláves (pokud toto menu je špatně naformátované, upravte nastavení "
-"v minetest.conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2101,10 +2166,6 @@ msgid "Change"
msgstr "Změnit"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Potvrdit heslo"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nové heslo"
@@ -2112,6 +2173,10 @@ msgstr "Nové heslo"
msgid "Old Password"
msgstr "Staré heslo"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Hesla se neshodují!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Odejít"
@@ -2125,12 +2190,6 @@ msgstr "Ztlumeno"
msgid "Sound Volume: %d%%"
msgstr "Hlasitost: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Zadejte "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2138,6 +2197,16 @@ msgstr "Zadejte "
msgid "LANG_CODE"
msgstr "cs"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Zvolte prosím název!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2300,6 +2369,10 @@ msgstr ""
"Pozn.: Režim 'interlaced' vyžaduje podporu 'shaderů'."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2394,6 +2467,11 @@ msgstr ""
"nutno vždy otestovat) vytvoří souvislou vrstvu létajících ostrovů."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Dodatkový název položky"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Pokročilé"
@@ -2412,7 +2490,8 @@ msgstr ""
"a umělého osvětlení a má pouze malý dopad na noční osvětlení."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Vždy mít zapnuté létání a turbo"
#: src/settings_translation_file.cpp
@@ -2491,6 +2570,10 @@ msgstr ""
"Jednotkou je mapblok (16 bloků)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Automaticky vpřed klávesa"
@@ -2531,10 +2614,6 @@ msgid "Base terrain height."
msgstr "Základní výška terénu."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Základní"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Základní práva"
@@ -2555,7 +2634,8 @@ msgid "Bind address"
msgstr "Svázat adresu"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Parametry tepelného a vlhkostního šumu pro Biome API"
#: src/settings_translation_file.cpp
@@ -2567,6 +2647,10 @@ msgid "Block send optimize distance"
msgstr "Optimalizace vzdálenosti vysílání bloku"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Cesta k tučnému písmu s kurzívou"
@@ -2591,6 +2675,11 @@ msgid "Builtin"
msgstr "Zabudované"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Změnit nastavení kamery"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2751,6 +2840,11 @@ msgid "Client side node lookup range restriction"
msgstr "Omezení vyhledávání bloků z klientské aplikace"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Lokální mody"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Rychlost šplhání"
@@ -2858,6 +2952,10 @@ msgid "Console height"
msgstr "Šírka konzole"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "ContentDB: Černá listina"
@@ -2896,8 +2994,10 @@ msgstr ""
"72 = 20 minut, 360 = 4 minuty, 1 = 24 hodin, 0 = zůstává pouze noc nebo den."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Stanovuje rychlost potápění v kapalinách."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2971,12 +3071,12 @@ msgid "Debug log level"
msgstr "Úroveň minimální důležitosti ladících informací"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Klávesa snížení hlasitosti"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Snižte toto pro zvýšení odporu kapalin vůči pohybu."
+msgid "Dec. volume key"
+msgstr "Klávesa snížení hlasitosti"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3133,6 +3233,11 @@ msgid "Desynchronize block animation"
msgstr "Nesynchronizovat animace bloků"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Dekorace"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Klávesa těžení"
@@ -3153,6 +3258,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Doménové jméno serveru zobrazované na seznamu serverů."
@@ -3234,6 +3345,10 @@ msgid "Enable joysticks"
msgstr "Zapnout joysticky"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3250,18 +3365,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Povolit náhodný uživatelský vstup (pouze pro testování)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Zapnout potvrzení registrace"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Zapnout potvrzení registrace pro připojení na server.\n"
-"Pokud je toto vypnuto, je nový účet registrován automaticky."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3270,6 +3373,10 @@ msgstr ""
"Vypněte pro zrychlení či jiný vzhled."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3362,6 +3469,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Interval vypisování profilovacích dat enginu"
@@ -3386,6 +3497,10 @@ msgstr ""
"s rovinatějšími nížinami, vhodné pro souvislou vrstvu létajících ostrovů."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "Snímky za sekundu (FPS) při pauze či hře běžící na pozadí"
@@ -3471,8 +3586,9 @@ msgstr ""
"Toto nastavení je automaticky zapnuto, pokud je povoleno Mip-Mapování."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtrování"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Antialiasing:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3539,6 +3655,11 @@ msgid "Fog toggle key"
msgstr "Klávesa pro přepnutí mlhy"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Velikost písma"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Tučné písmo jako výchozí"
@@ -3704,6 +3825,19 @@ msgid "GUI scaling filter txr2img"
msgstr "Filtrovat při škálování GUI (txr2img)"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Hry"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Globální callback funkce"
@@ -3740,6 +3874,16 @@ msgid "Graphics"
msgstr "Grafika"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravitace"
@@ -3756,8 +3900,13 @@ msgid "HTTP mods"
msgstr "HTTP režimy"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Součinitel škálování HUD"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Měřítko GUI"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4015,14 +4164,23 @@ msgstr ""
"Vyžaduje zapnuté vlnění kapalin."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Jak dlouho bude server čekat před uvolněním nepotřebných mapbloků.\n"
"Vyšší hodnota zlepší rychlost programu, ale také způsobí větší spotřebu RAM."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Snižte toto pro zvýšení odporu kapalin vůči pohybu."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Jak široké dělat řeky."
@@ -4095,6 +4253,15 @@ msgstr ""
"namísto klávesy \"Plížení\"."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Zapnout potvrzení registrace pro připojení na server.\n"
+"Pokud je toto vypnuto, je nový účet registrován automaticky."
+
+#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
@@ -4123,7 +4290,10 @@ msgstr ""
"hráčova pohledu."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr "Když zapnuto, noví hráči se nemohou připojit s prázdným heslem."
#: src/settings_translation_file.cpp
@@ -4175,10 +4345,6 @@ msgid "Ignore world errors"
msgstr "Ignorovat chyby světa"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Ve hře"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr "Průhlednost pozadí herní chatovací konzole (neprůhlednost, 0 až 255)."
@@ -4236,15 +4402,12 @@ msgid "Instrument the methods of entities on registration."
msgstr "Instrumentovat metody entit při registraci."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentace"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "Časový interval ukládání důležitých změn ve světě, udaný v sekundách."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Časový interval, ve kterém se klientům posílá herní čas."
#: src/settings_translation_file.cpp
@@ -5078,6 +5241,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr "Vyhodit hráče, který poslal více jak X zpráv během 10 sekund."
@@ -5135,10 +5302,11 @@ msgid "Left key"
msgstr "Doleva"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Frekvence aktualizece objektů na serveru.\n"
"Určeno v délce jedné periody."
@@ -5152,18 +5320,25 @@ msgstr ""
"Vyžaduje zapnuté vlnění kapalin."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Frekvence vykonání cyklů Active Block Modifieru (ABM)"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Frekvence vykonání cyklů ČasovačeBloku"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Frekvence vykonání cyklů aktivní správy bloků"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5172,7 +5347,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Úroveň ladících informací zapsaných do debug.txt:\n"
"- <nothing> (žádné ladící informace)\n"
@@ -5208,6 +5384,11 @@ msgid "Light curve low gradient"
msgstr "Křivka světla Nízký gradient"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Plynulé osvětlení"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5625,10 +5806,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Nabídky"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5678,6 +5855,19 @@ msgid "Mipmapping"
msgstr "Mip-mapování"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Zabezpečení"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5766,16 +5956,17 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Síť"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Síť"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5788,6 +5979,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Osvícení bloku"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Dekorace označených bloků"
@@ -5825,10 +6021,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5924,10 +6116,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Jméno hráče"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5976,10 +6164,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -6155,6 +6339,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Obrazovka:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Výška obrazovky"
@@ -6185,6 +6374,10 @@ msgstr ""
"Použijte 0 pro výchozí kvalitu."
#: src/settings_translation_file.cpp
+msgid "Screenshots"
+msgstr "Obrázky"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -6199,10 +6392,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "První ze dvou 3D šumů, které dohromady definují tunely."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Zabezpečení"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -6262,8 +6451,19 @@ msgstr ""
"18 = 4D \"Mandelbulb\" – Juliova množina."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Server / Místní hra"
+#, fuzzy
+msgid "Server"
+msgstr "URL serveru"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Jméno serveru"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Popis serveru"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6290,10 +6490,20 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Port serveru"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "Adresa seznamu veřejných serverů"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "Adresa seznamu veřejných serverů"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Soubor se seznamem veřejných serverů"
@@ -6304,12 +6514,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -6317,7 +6529,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6408,7 +6620,7 @@ msgid ""
msgstr "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6618,6 +6830,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Nastavení"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6822,7 +7039,7 @@ msgid "Time speed"
msgstr "Rychlost času"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6847,10 +7064,19 @@ msgid "Touch screen threshold"
msgstr "Práh šumu pláže"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Práh šumu pláže"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6942,6 +7168,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -7185,6 +7415,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -7277,6 +7516,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -7320,6 +7563,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Back"
#~ msgstr "Zpět"
+#~ msgid "Basic"
+#~ msgstr "Základní"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bitová hloubka (bity na pixel) v celoobrazovkovém režimu."
@@ -7335,6 +7581,12 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Configure"
#~ msgstr "Nastavit"
+#~ msgid "Connect"
+#~ msgstr "Připojit"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Stanovuje rychlost potápění v kapalinách."
+
#, fuzzy
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
@@ -7376,12 +7628,24 @@ msgstr "cURL limit paralelních stahování"
#~ "Určuje vyhlazovací krok textur.\n"
#~ "Vyšší hodnota znamená vyhlazenější normálové mapy."
+#~ msgid "Del. Favorite"
+#~ msgstr "Smazat oblíbené"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Stáhněte si z minetest.net hru, například Minetest Game"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Stáhněte si jednu z minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Stahuji a instaluji $1, prosím čekejte..."
#~ msgid "Enable VBO"
#~ msgstr "Zapnout VBO"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Zapnout potvrzení registrace"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7409,6 +7673,9 @@ msgstr "cURL limit paralelních stahování"
#~ "Zapne parallax occlusion mapping.\n"
#~ "Nastavení vyžaduje zapnuté shadery."
+#~ msgid "Enter "
+#~ msgstr "Zadejte "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7428,6 +7695,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Fallback font size"
#~ msgstr "Velikost záložního písma"
+#~ msgid "Filtering"
+#~ msgstr "Filtrování"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Šum základní výšky létajících ostrovů"
@@ -7440,6 +7710,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Full screen BPP"
#~ msgstr "Bitová hloubka v celoobrazovkovém režimu"
+#~ msgid "Game"
+#~ msgstr "Hra"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7449,6 +7722,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Generate normalmaps"
#~ msgstr "Generovat normálové mapy"
+#~ msgid "HUD scale factor"
+#~ msgstr "Součinitel škálování HUD"
+
#~ msgid "High-precision FPU"
#~ msgstr "Výpočty ve FPU s vysokou přesností"
@@ -7458,9 +7734,21 @@ msgstr "cURL limit paralelních stahování"
#~ "Např.: 72 = 20 minut, 360 = 4 minuty, 1 = 24 hodin, 0 = čas zůstává stále "
#~ "stejný."
+#~ msgid "In-Game"
+#~ msgstr "Ve hře"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Instalace: soubor: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentace"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Nastavení kláves (pokud toto menu je špatně naformátované, upravte "
+#~ "nastavení v minetest.conf)"
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Hloubka velké jeskyně"
@@ -7472,6 +7760,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Main menu style"
#~ msgstr "Skript hlavní nabídky"
+#~ msgid "Menus"
+#~ msgstr "Nabídky"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Minimapa v režimu radar, Přiblížení x2"
@@ -7515,6 +7806,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Parallax occlusion scale"
#~ msgstr "Škála parallax occlusion"
+#~ msgid "Player name"
+#~ msgstr "Jméno hráče"
+
#~ msgid "PvP enabled"
#~ msgstr "PvP (hráč proti hráči) povoleno"
@@ -7525,6 +7819,9 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Select Package File:"
#~ msgstr "Vybrat soubor s modem:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Server / Místní hra"
+
#, fuzzy
#~ msgid ""
#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
@@ -7560,6 +7857,21 @@ msgstr "cURL limit paralelních stahování"
#~ msgid "Yes"
#~ msgstr "Ano"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Budete poprvé připojeni k serveru \"%s\".\n"
+#~ "Pokud budete pokračovat, nový uživatelský účet s vašimi údaji bude "
+#~ "vytvořen na tomto serveru.\n"
+#~ "Prosím znovu napište svoje aktuální heslo a klikněte na 'Registrovat a "
+#~ "Připojit se' pro potvrzení souhlasu, nebo vyberte 'Zrušit' pro návrat."
+
#~ msgid "You died."
#~ msgstr "Zemřel jsi."
diff --git a/po/da/minetest.po b/po/da/minetest.po
index 732d9f304..645c052c2 100644
--- a/po/da/minetest.po
+++ b/po/da/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Danish (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2022-01-26 12:17+0000\n"
"Last-Translator: Thomas Wagner Nielsen <thomas@viawords.com>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/minetest/minetest/"
@@ -116,6 +116,31 @@ msgid "The server has requested a reconnect:"
msgstr "Serveren har anmodet om at forbinde igen:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Vælg verden:"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokol versionerne matchede ikke. "
@@ -128,6 +153,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Serveren understøtter protokol versioner mellem $1 og $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Vi understøtter kun protokol version $1."
@@ -135,14 +164,21 @@ msgstr "Vi understøtter kun protokol version $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Vi understøtter protokol versioner mellem $1 og $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Anuller"
@@ -286,7 +322,6 @@ msgid "Failed to download $1"
msgstr "Kunne ikke hente $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Spil"
@@ -312,7 +347,6 @@ msgstr ""
"korrupt"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -413,12 +447,9 @@ msgid "Decorations"
msgstr "Gentagelser"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Hent et spil, såsom Minetest Game fra minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Hent en fra minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Advarsel: Den minimale udvikings test er kun lavet for udviklerne."
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
@@ -438,10 +469,6 @@ msgstr ""
msgid "Floatlands (experimental)"
msgstr "Svævelandsniveau"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Spil"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -460,6 +487,15 @@ msgid "Increases humidity around rivers"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Installer"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr ""
@@ -563,11 +599,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Advarsel: Den minimale udvikings test er kun lavet for udviklerne."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Verdens navn"
@@ -599,6 +630,39 @@ msgstr "Modmgr: ugyldig mod-sti \"$1\""
msgid "Delete World \"$1\"?"
msgstr "Slet verden \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Bekræft kodeord"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Mapgen-navn"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Password"
+msgstr "Nyt kodeord"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Kodeordene er ikke ens!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr ""
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Accepter"
@@ -631,6 +695,16 @@ msgstr "< Tilbage til siden Indstillinger"
msgid "Browse"
msgstr "Gennemse"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Indhold"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Indhold"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Deaktiveret"
@@ -689,7 +763,7 @@ msgstr "Vælg mappe"
msgid "Select file"
msgstr "Vælg fil"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Vis tekniske navne"
@@ -839,6 +913,10 @@ msgstr "Tidligere bidragere"
msgid "Previous Core Developers"
msgstr "Tidligere primære udviklere"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Gennemse online indhold"
@@ -907,10 +985,6 @@ msgstr "Host Server"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Ny"
@@ -919,11 +993,6 @@ msgstr "Ny"
msgid "No world created or selected!"
msgstr "Ingen verden oprettet eller valgt!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-#, fuzzy
-msgid "Password"
-msgstr "Nyt kodeord"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Start spil"
@@ -960,10 +1029,6 @@ msgid "Clear"
msgstr "Ryd"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Forbind"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Kreativ tilstand"
@@ -974,10 +1039,6 @@ msgid "Damage / PvP"
msgstr "Skade"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Slet favorit"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "Favorit"
@@ -992,6 +1053,10 @@ msgid "Join Game"
msgstr "Vær vært for spil"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -1006,10 +1071,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "Fjernport"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "Serverbeskrivelse"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1057,8 +1131,9 @@ msgid "Dynamic shadows"
msgstr "Fontskygge"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Fontskygge"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -1156,7 +1231,7 @@ msgstr "Toneoversættelse"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr "Føletærskel (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1164,7 +1239,7 @@ msgid "Trilinear Filter"
msgstr "Tri-lineær filtréring"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1184,6 +1259,11 @@ msgstr "Bølgende blade"
msgid "Waving Plants"
msgstr "Bølgende planter"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Forbindelses fejl (udløbelse af tidsfrist?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Forbindelses fejl (tidsfristen udløb)."
@@ -1325,7 +1405,7 @@ msgid "Camera update enabled"
msgstr "Tast til ændring af kameraopdatering"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1459,6 +1539,11 @@ msgid "Enabled unlimited viewing range"
msgstr ""
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Opretter klient ..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Afslut til menu"
@@ -1978,24 +2063,6 @@ msgstr "Kunne ikke hente $1"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Kodeordene er ikke ens!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Fortsæt"
@@ -2031,7 +2098,7 @@ msgstr ""
msgid "Change camera"
msgstr "Skift bindinger"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Snak"
@@ -2086,10 +2153,8 @@ msgid "Key already in use"
msgstr "Tast allerede i brug"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Tastebindinger. (Hvis denne menu fucker op, fjern elementer fra minetest."
-"conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2165,10 +2230,6 @@ msgid "Change"
msgstr "Skift"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Bekræft kodeord"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nyt kodeord"
@@ -2176,6 +2237,10 @@ msgstr "Nyt kodeord"
msgid "Old Password"
msgstr "Gammelt kodeord"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Kodeordene er ikke ens!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Afslut"
@@ -2190,12 +2255,6 @@ msgstr "Lydløs"
msgid "Sound Volume: %d%%"
msgstr "Lydstyrke: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr " "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2203,6 +2262,16 @@ msgstr " "
msgid "LANG_CODE"
msgstr "da"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Vælg venligst et navn!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2346,6 +2415,10 @@ msgstr ""
"- pageflip: quadbuffer baseret 3d."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2437,6 +2510,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Verdens navn"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Avanceret"
@@ -2450,7 +2528,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Flyv altid og hurtigt"
#: src/settings_translation_file.cpp
@@ -2521,6 +2600,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Automatic forward key"
msgstr "Fremadtast"
@@ -2567,10 +2650,6 @@ msgid "Base terrain height."
msgstr "Baseterrænhøjde"
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Grundlæggende"
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Basic privileges"
msgstr "Grundlæggende privilegier"
@@ -2593,7 +2672,7 @@ msgstr "Bind adresse"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr "Biom API temperatur og luftfugtighed støj parametre"
#: src/settings_translation_file.cpp
@@ -2606,6 +2685,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2631,6 +2714,11 @@ msgid "Builtin"
msgstr "Indbygget"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Skift bindinger"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2802,6 +2890,11 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Klient modding"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Klatringshastighed"
@@ -2905,6 +2998,10 @@ msgid "Console height"
msgstr "Konsolhøjde"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2943,7 +3040,9 @@ msgstr ""
"helst forbliver uændret."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3012,15 +3111,15 @@ msgid "Debug log level"
msgstr "Logniveau for fejlsøgning"
#: src/settings_translation_file.cpp
+msgid "Debugging"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Dec. volume key"
msgstr "Dec. lydstyrketasten"
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Dedicated server step"
msgstr "Dedikeret server-trin"
@@ -3171,6 +3270,11 @@ msgstr "Afsynkroniser blokanimation"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Developer Options"
+msgstr "Gentagelser"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Dig key"
msgstr "Højretast"
@@ -3191,6 +3295,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Domænenavn for server, til visning i serverlisten."
@@ -3265,6 +3375,10 @@ msgid "Enable joysticks"
msgstr "Aktivér joysticks"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable mod channels support."
msgstr "Aktiver mod-sikkerhed"
@@ -3282,16 +3396,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Aktiver vilkårlig brugerinddata (kun til test)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3300,6 +3404,10 @@ msgstr ""
"Deaktiver for hastighed eller for anderledes udseender."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3383,6 +3491,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Udskrivningsinterval for motorprofileringsdata"
@@ -3401,6 +3513,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3495,8 +3611,9 @@ msgstr ""
"op i dette på indlæsningstidspunktet for tekstur."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtrering"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Udjævning:"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3571,6 +3688,11 @@ msgid "Fog toggle key"
msgstr "Tast for tåge"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Skriftstørrelse"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3732,6 +3854,19 @@ msgid "GUI scaling filter txr2img"
msgstr "GUI-skaleringsfilter txr2img"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Spil"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Globale tilbagekald"
@@ -3767,6 +3902,16 @@ msgid "Graphics"
msgstr "Grafik"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafik"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafik"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Tyngdekraft"
@@ -3786,8 +3931,13 @@ msgid "HTTP mods"
msgstr "HTTP-Mod'er"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "HUD-skaleringsfaktor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Skalering af grafisk brugerflade"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4044,14 +4194,22 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Hvor lang tid serveren vil vente før ubrugt kortblokke fjernes.\n"
"Højere værdier er længere tid, men vil bruge mere RAM."
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "How wide to make rivers."
msgstr "Hvor brede floder skal være"
@@ -4124,6 +4282,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -4150,7 +4314,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
"Hvis aktiveret kan nye spillere ikke slutte sig til uden en tom adgangskode."
@@ -4195,10 +4362,6 @@ msgid "Ignore world errors"
msgstr "Ignorer verdensfejl"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "I-spil"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Baggrundsalfa for snakkekonsollen i spillet (uigennemsigtighed, mellem 0 og "
@@ -4259,16 +4422,13 @@ msgid "Instrument the methods of entities on registration."
msgstr "Udstyr metoderne for enheder ved registrering."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentering"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Interval for lagring af vigtige ændringer i verden, angivet i sekunder."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Interval for afsendelse af tidspunkt på dagen til klienter."
#: src/settings_translation_file.cpp
@@ -5171,6 +5331,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -5232,7 +5396,7 @@ msgstr "Venstretast"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Længde på serveraktivering og intervallet som objekter opdateres efter over "
"netværket."
@@ -5248,19 +5412,24 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Tidslængde mellem ABM-kørselscyklusser"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Tidslængde mellem NodeTimer-kørselscyklusser"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Tidslængde mellem ABM-kørselscyklusser"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5269,7 +5438,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Niveau for logning der skrives til debug.txt:\n"
"- <nothing> (ingen logning)\n"
@@ -5305,6 +5475,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Glat belysning"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5739,10 +5914,6 @@ msgid "Maximum users"
msgstr "Maksimum antal brugere"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menuer"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5793,6 +5964,19 @@ msgid "Mipmapping"
msgstr "Mipmapping"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Sikkerhed"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5881,16 +6065,17 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Netværk"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Netværk"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5903,6 +6088,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Knudepunktsfremhævelse"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5940,10 +6130,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -6041,10 +6227,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Spillerens navn"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -6092,10 +6274,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -6273,6 +6451,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Skærm:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Skærmhøjde"
@@ -6301,6 +6484,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Screenshots"
+msgstr "Skærmbillede"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Seabed noise"
msgstr "Havbunden støj"
@@ -6315,10 +6503,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Første af 2 3D-støj, der sammen definerer tunneler."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Sikkerhed"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -6378,8 +6562,19 @@ msgstr ""
"18 = 4D »Mandelbulb« julia-sæt."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Server/alene"
+#, fuzzy
+msgid "Server"
+msgstr "Server-URL"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Servernavn"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Serverbeskrivelse"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6406,10 +6601,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Server port"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -6420,12 +6624,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -6433,7 +6639,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6529,7 +6735,7 @@ msgstr ""
"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6733,6 +6939,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Temporary Settings"
+msgstr "Indstillinger"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Terrain alternative noise"
msgstr "Terræn base støj"
@@ -6940,7 +7151,7 @@ msgid "Time speed"
msgstr "Tidshastighed"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6965,10 +7176,19 @@ msgid "Touch screen threshold"
msgstr "Strandstøjtærskel"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Strandstøjtærskel"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -7060,6 +7280,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7303,6 +7527,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -7395,6 +7628,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -7437,6 +7674,9 @@ msgstr ""
#~ msgid "Back"
#~ msgstr "Tilbage"
+#~ msgid "Basic"
+#~ msgstr "Grundlæggende"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand."
@@ -7454,6 +7694,9 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "Konfigurér"
+#~ msgid "Connect"
+#~ msgstr "Forbind"
+
#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels."
#~ msgstr ""
#~ "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller."
@@ -7485,6 +7728,15 @@ msgstr ""
#~ "Definerer sampling-trin for tekstur.\n"
#~ "En højere værdi resulterer i en mere rullende normale kort."
+#~ msgid "Del. Favorite"
+#~ msgstr "Slet favorit"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Hent et spil, såsom Minetest Game fra minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Hent en fra minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Henter og installerer $1, vent venligst..."
@@ -7519,6 +7771,9 @@ msgstr ""
#~ "Aktiverer parallax-okklusionoversættelse.\n"
#~ "Kræver at dybdeskabere er aktiveret."
+#~ msgid "Enter "
+#~ msgstr " "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7538,6 +7793,9 @@ msgstr ""
#~ msgid "Fallback font size"
#~ msgstr "Størrelse for reserveskrifttypen"
+#~ msgid "Filtering"
+#~ msgstr "Filtrering"
+
#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)."
#~ msgstr "Alfa for skrifttypeskygge (uigennemsigtighed, mellem 0 og 255)."
@@ -7548,6 +7806,9 @@ msgstr ""
#~ msgid "Full screen BPP"
#~ msgstr "Fuldskærm BPP"
+#~ msgid "Game"
+#~ msgstr "Spil"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7558,15 +7819,30 @@ msgstr ""
#~ msgid "Generate normalmaps"
#~ msgstr "Opret normalkort"
+#~ msgid "HUD scale factor"
+#~ msgstr "HUD-skaleringsfaktor"
+
#~ msgid "High-precision FPU"
#~ msgstr "Højpræcisions FPU"
#~ msgid "IPv6 support."
#~ msgstr "Understøttelse af IPv6."
+#~ msgid "In-Game"
+#~ msgstr "I-spil"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Installer mod: Fil: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentering"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Tastebindinger. (Hvis denne menu fucker op, fjern elementer fra minetest."
+#~ "conf)"
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Dybde for stor hule"
@@ -7585,6 +7861,9 @@ msgstr ""
#~ msgstr ""
#~ "Får DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer."
+#~ msgid "Menus"
+#~ msgstr "Menuer"
+
#~ msgid "Name / Password"
#~ msgstr "Navn/adgangskode"
@@ -7604,6 +7883,9 @@ msgstr ""
#~ msgid "Parallax occlusion scale"
#~ msgstr "Parallax-okklusion"
+#~ msgid "Player name"
+#~ msgstr "Spillerens navn"
+
#~ msgid "PvP enabled"
#~ msgstr "Spiller mod spiller aktiveret"
@@ -7613,6 +7895,9 @@ msgstr ""
#~ msgid "Select Package File:"
#~ msgstr "Vælg pakke fil:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Server/alene"
+
#, fuzzy
#~ msgid "Shadow limit"
#~ msgstr "Skygge grænse"
diff --git a/po/de/minetest.po b/po/de/minetest.po
index 972359a32..36d47a74a 100644
--- a/po/de/minetest.po
+++ b/po/de/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: German (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-29 21:28+0000\n"
-"Last-Translator: Wuzzy <almikes@aol.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-07-24 09:24+0000\n"
+"Last-Translator: Wuzzy <Wuzzy@disroot.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/minetest/minetest/"
"de/>\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 4.11-dev\n"
+"X-Generator: Weblate 4.14-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -114,6 +114,34 @@ msgid "The server has requested a reconnect:"
msgstr "Der Server hat um eine Wiederverbindung gebeten:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr "Eine neue $1-Version ist verfügbar"
+
+#: builtin/mainmenu/common.lua
+msgid "Client Mods"
+msgstr "Client-Mods"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+"Installierte Version: $1\n"
+"Neue Version: $2\n"
+"Besuchen Sie $3, um herauszufinden, wie man die neueste Version erhält und auf "
+"dem neuesten Stand mit Features und Fehlerbehebungen bleibt."
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr "Später"
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr "Niemals"
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokollversion stimmt nicht überein. "
@@ -126,6 +154,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Der Server unterstützt die Protokollversionen von $1 bis $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr "Webseite besuchen"
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Wir unterstützen nur Protokollversion $1."
@@ -133,14 +165,21 @@ msgstr "Wir unterstützen nur Protokollversion $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Wir unterstützen Protokollversionen zwischen $1 und $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr "(Aktiviert, hat Fehler)"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr "(Nicht erfüllt)"
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Abbrechen"
@@ -280,7 +319,6 @@ msgid "Failed to download $1"
msgstr "Fehler beim Download von $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Spiele"
@@ -301,7 +339,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Installation: Nicht unterstützter Dateityp oder kaputtes Archiv"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -394,12 +431,8 @@ msgid "Decorations"
msgstr "Dekorationen"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Laden Sie sich ein Spiel (wie Minetest Game) von minetest.net herunter"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Spiele können von minetest.net heruntergeladen werden"
+msgid "Development Test is meant for developers."
+msgstr "Development Test ist für Entwickler gedacht."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -417,10 +450,6 @@ msgstr "Schwebende Landmassen im Himmel"
msgid "Floatlands (experimental)"
msgstr "Schwebeländer (experimentell)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Spiel"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Nicht-fraktales Gelände erzeugen: Ozeane und Untergrund"
@@ -438,6 +467,14 @@ msgid "Increases humidity around rivers"
msgstr "Erhöht die Luftfeuchte um Flüsse"
#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install a game"
+msgstr "Ein Spiel installieren"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr "Ein anderes Spiel installieren"
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Seen"
@@ -542,10 +579,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Sehr große Hohlräume tief im Untergrund"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Achtung: Der Development Test ist für Entwickler gedacht."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Weltname"
@@ -575,6 +608,36 @@ msgstr "pkgmgr: Ungültiger Pfad „$1“"
msgid "Delete World \"$1\"?"
msgstr "Die Welt „$1“ löschen?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Passw. bestätigen"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr "$1 beitreten"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr "Fehlender Name"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Name"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Passwort"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr "Passwörter stimmen nicht überein"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr "Registrieren"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Annehmen"
@@ -607,6 +670,14 @@ msgstr "< Einstellungsseite"
msgid "Browse"
msgstr "Durchsuchen"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Games"
+msgstr "Inhalt: Spiele"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Mods"
+msgstr "Inhalt: Mods"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Deaktiviert"
@@ -663,7 +734,7 @@ msgstr "Verzeichnis auswählen"
msgid "Select file"
msgstr "Datei auswählen"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Techn. Bezeichnung zeigen"
@@ -814,13 +885,17 @@ msgstr "Frühere Mitwirkende"
msgid "Previous Core Developers"
msgstr "Ehemalige Hauptentwickler"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr "Debug-Log teilen"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Onlineinhalte durchsuchen"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
-msgstr "Inhalte"
+msgstr "Inhalt"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
@@ -882,10 +957,6 @@ msgstr "Server hosten"
msgid "Install games from ContentDB"
msgstr "Spiele aus ContentDB installieren"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Name"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Neu"
@@ -894,10 +965,6 @@ msgstr "Neu"
msgid "No world created or selected!"
msgstr "Keine Welt angegeben oder ausgewählt!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Passwort"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Spiel starten"
@@ -931,10 +998,6 @@ msgid "Clear"
msgstr "Clear"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Verbinden"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Kreativmodus"
@@ -944,10 +1007,6 @@ msgid "Damage / PvP"
msgstr "Schaden / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Favorit löschen"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Favoriten"
@@ -960,6 +1019,10 @@ msgid "Join Game"
msgstr "Spiel beitreten"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr "Login"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Latenz"
@@ -972,10 +1035,18 @@ msgid "Refresh"
msgstr "Neu laden"
#: builtin/mainmenu/tab_online.lua
+msgid "Remove favorite"
+msgstr "Favorit entfernen"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Serverbeschreibung"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr "(Spielunterstützung benötigt)"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1020,8 +1091,8 @@ msgid "Dynamic shadows"
msgstr "Dynamische Schatten"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr "Dynamische Schatten: "
+msgid "Dynamic shadows:"
+msgstr "Dynamische Schatten:"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -1116,15 +1187,15 @@ msgid "Tone Mapping"
msgstr "Dynamikkompression"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr "Berührungsempfindlichkeit: (px)"
+msgid "Touch threshold (px):"
+msgstr "Berührungsempfindlichkeit (px):"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr "Trilinearer Filter"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr "Sehr hoch"
#: builtin/mainmenu/tab_settings.lua
@@ -1143,9 +1214,13 @@ msgstr "Flüssigkeitswellen"
msgid "Waving Plants"
msgstr "Wehende Pflanzen"
+#: src/client/client.cpp
+msgid "Connection aborted (protocol error?)."
+msgstr "Verbindung abgebrochen (Protokollfehler?)."
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr "Verbindungsfehler, Zeitüberschreitung."
+msgstr "Zeitüberschreitung."
#: src/client/client.cpp
msgid "Done!"
@@ -1165,7 +1240,7 @@ msgstr "Lade Texturen …"
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Shader erneuern…"
+msgstr "Shader erneuern …"
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -1278,9 +1353,9 @@ msgid "Camera update enabled"
msgstr "Kameraaktualisierung aktiviert"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
-"Blockgrenzen können nicht gezeigt werden („basic_debug“-Privileg benötigt)"
+"Blockgrenzen können nicht gezeigt werden (von Mod oder Spiel deaktiviert)"
#: src/client/game.cpp
msgid "Change Password"
@@ -1409,6 +1484,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Unbegrenzte Sichtweite aktiviert"
#: src/client/game.cpp
+#, c-format
+msgid "Error creating client: %s"
+msgstr "Fehler bei Erstellung des Clients: %s"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Hauptmenü"
@@ -1912,32 +1992,7 @@ msgstr "Fehler beim Öffnen der Webseite"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
-msgstr "Webseite öffnen"
-
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Passwörter stimmen nicht überein!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registrieren und beitreten"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Sie sind im Begriff, dem Server mit dem Namen „%s“ für das erste Mal "
-"beizutreten.\n"
-"Falls Sie fortfahren, wird ein neues Benutzerkonto mit Ihren Anmeldedaten "
-"auf diesem Server erstellt.\n"
-"Bitte geben Sie Ihr Passwort erneut ein und klicken Sie auf „Registrieren "
-"und beitreten“, um die Erstellung des Benutzerkontos zu bestätigen oder "
-"klicken Sie auf „Abbrechen“ zum Abbrechen."
+msgstr "Öffne Webseite"
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
@@ -1971,7 +2026,7 @@ msgstr "Blockgrenzen"
msgid "Change camera"
msgstr "Kamerawechsel"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Chat"
@@ -2024,10 +2079,8 @@ msgid "Key already in use"
msgstr "Taste bereits in Benutzung"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr ""
-"Steuerung (Falls dieses Menü defekt ist, entfernen Sie Zeugs aus minetest."
-"conf)"
+msgid "Keybindings."
+msgstr "Tastenbelegung."
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2098,10 +2151,6 @@ msgid "Change"
msgstr "Ändern"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Passw. bestätigen"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Neues Passwort"
@@ -2109,6 +2158,10 @@ msgstr "Neues Passwort"
msgid "Old Password"
msgstr "Altes Passwort"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Passwörter stimmen nicht überein!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Zurück"
@@ -2122,12 +2175,6 @@ msgstr "Stumm"
msgid "Sound Volume: %d%%"
msgstr "Tonlautstärke: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Eingabe "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2135,6 +2182,17 @@ msgstr "Eingabe "
msgid "LANG_CODE"
msgstr "de"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+"Name ist nicht registriert. Um ein Konto auf diesem Server zu erstellen, "
+"klicken Sie auf „Registrieren“"
+
+#: src/network/clientpackethandler.cpp
+msgid "Name is taken. Please choose another name"
+msgstr "Name ist belegt. Bitte einen anderen Namen wählen"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2311,6 +2369,10 @@ msgstr ""
"sind."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr "3-D"
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2411,6 +2473,10 @@ msgstr ""
"Schwebelandebene."
#: src/settings_translation_file.cpp
+msgid "Admin name"
+msgstr "Admin-Name"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Erweitert"
@@ -2431,7 +2497,7 @@ msgstr ""
"auf natürliches Licht bei Nacht."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr "Immer schnell fliegen"
#: src/settings_translation_file.cpp
@@ -2513,6 +2579,10 @@ msgstr ""
"In Kartenblöcken (16 Blöcke) angegeben."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr "Ton"
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Vorwärtsautomatiktaste"
@@ -2553,10 +2623,6 @@ msgid "Base terrain height."
msgstr "Basisgeländehöhe."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Grundlegend"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Grundprivilegien"
@@ -2577,8 +2643,8 @@ msgid "Bind address"
msgstr "Bind-Adresse"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
-msgstr "Biom-API-Temperatur- und Luftfeuchtigkeits-Rauschparameter"
+msgid "Biome API noise parameters"
+msgstr "Biom-API-Rauschparameter"
#: src/settings_translation_file.cpp
msgid "Biome noise"
@@ -2589,6 +2655,10 @@ msgid "Block send optimize distance"
msgstr "Distanz für Sendeoptimierungen von Kartenblöcken"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr "Wackeln"
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Pfad der Fett- und Kursivschrift"
@@ -2613,6 +2683,10 @@ msgid "Builtin"
msgstr "Builtin"
#: src/settings_translation_file.cpp
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2779,6 +2853,10 @@ msgid "Client side node lookup range restriction"
msgstr "Distanzlimit für clientseitige Block-Definitionsabfrage"
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr "Clientseitiges Modding"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Klettergeschwindigkeit"
@@ -2899,6 +2977,10 @@ msgid "Console height"
msgstr "Konsolenhöhe"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr "Inhaltespeicher"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "ContentDB: Schwarze Liste"
@@ -2939,8 +3021,13 @@ msgstr ""
"unverändert."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Regelt die Sinkgeschwindigkeit in Flüssigkeiten."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
+"Beeinflusst die Sinkgeschwindigkeit in der Flüssigkeit, wenn man sich nicht "
+"bewegt.\n"
+"Negative Werte werden Sie stattdessen aufsteigen lassen."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -3013,13 +3100,12 @@ msgid "Debug log level"
msgstr "Debugausgabelevel"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Leiser-Taste"
+msgid "Debugging"
+msgstr "Debugging"
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr ""
-"Dies verringern, um den Bewegungswiderstand in Flüssigkeiten zu erhöhen."
+msgid "Dec. volume key"
+msgstr "Leiser-Taste"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3181,6 +3267,10 @@ msgid "Desynchronize block animation"
msgstr "Blockanimationen desynchronisieren"
#: src/settings_translation_file.cpp
+msgid "Developer Options"
+msgstr "Entwickleroptionen"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Grabetaste"
@@ -3201,6 +3291,16 @@ msgid "Display Density Scaling Factor"
msgstr "Anzeigendichtenskalierungsfaktor"
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+"Entfernung in Nodes, bei welcher die Transparenztiefensortierung aktiviert "
+"ist.\n"
+"Dies benutzen, um die Performanzeinbußen der Transparenztiefensortierung zu "
+"begrenzen"
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Domainname des Servers. Wird in der Serverliste angezeigt."
@@ -3280,6 +3380,10 @@ msgid "Enable joysticks"
msgstr "Joysticks aktivieren"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr "Aktiviert Joysticks. Benötigt einen Neustart, um wirksam zu werden"
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Modkanäle-Unterstützung aktivieren."
@@ -3296,19 +3400,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Schaltet zufällige Steuerung ein (nur zum Testen verwendet)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Registrierungsbestätigung aktivieren"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Registrierungsbestätigung aktivieren, wenn zu einem\n"
-"Server verbunden wird. Falls deaktiviert, wird ein neues\n"
-"Benutzerkonto automatisch registriert."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3317,6 +3408,10 @@ msgstr ""
"Für bessere Performanz oder anderes Aussehen deaktivieren."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr "Login und Registrierung trennen"
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3358,8 +3453,7 @@ msgid ""
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
"Hiermit aktiviert man die Auf- und Abbewegung\n"
-"der Ansicht und legt außerdem die Stärke des\n"
-"Effekts fest.\n"
+"der Ansicht und legt außerdem die Stärke des Effekts fest.\n"
"Zum Beispiel: 0 für keine Auf- und Abbewegung,\n"
"1.0 für den Standardwert, 2.0 für doppelte Geschwindigkeit."
@@ -3422,6 +3516,10 @@ msgstr ""
"beeinträchtigen."
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr "Engine-Profiler"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Engine-Profiling-Datenausgabeintervall"
@@ -3447,6 +3545,10 @@ msgstr ""
"geeignet."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr "Bildwiederholrate"
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
"Maximale Bildwiederholrate, während das Spiel pausiert oder nicht fokussiert "
@@ -3462,7 +3564,7 @@ msgstr "Faktorrauschen"
#: src/settings_translation_file.cpp
msgid "Fall bobbing factor"
-msgstr "Kameraschütteln beim Sturz"
+msgstr "Kamerawackeln beim Sturz"
#: src/settings_translation_file.cpp
msgid "Fallback font path"
@@ -3536,8 +3638,8 @@ msgstr ""
"aktiviert ist."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filter"
+msgid "Filtering and Antialiasing"
+msgstr "Filter und Antialiasing"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3606,6 +3708,10 @@ msgid "Fog toggle key"
msgstr "Taste für Nebel umschalten"
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr "Schrift"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Schrift standardmäßig fett"
@@ -3791,6 +3897,18 @@ msgid "GUI scaling filter txr2img"
msgstr "GUI-Skalierungsfilter txr2img"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr "GUIs"
+
+#: src/settings_translation_file.cpp
+msgid "Gamepads"
+msgstr "Gamepads"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr "Allgemein"
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Globale Rückruffunktionen"
@@ -3826,6 +3944,14 @@ msgid "Graphics"
msgstr "Grafik"
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr "Grafikeffekte"
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr "Grafik und Ton"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravitation"
@@ -3842,8 +3968,12 @@ msgid "HTTP mods"
msgstr "HTTP-Mods"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "HUD-Skalierungsfaktor"
+msgid "HUD"
+msgstr "HUD"
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
+msgstr "HUD-Skalierung"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4105,12 +4235,22 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
-"Wie lange der Server warten wird, bevor nicht mehr verwendete Kartenblöcke\n"
-"entladen werden. Ein höher Wert führt zu besserer Performanz, aber auch\n"
-"zur Benutzung von mehr Arbeitsspeicher."
+"Wie lange der Server warten wird, bevor nicht mehr verwendete Kartenblöcke "
+"entladen werden, in Sekunden.\n"
+"Ein höher Wert wird das Programm flüssiger laufen lassen, aber auch mehr "
+"Arbeitsspeicher benutzen."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+"Wie stark man bei der Bewegung in einer Flüssigkeit verlangsamt wird.\n"
+"Dies verringern, um den Bewegungswiderstand in Flüssigkeiten zu erhöhen."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
@@ -4189,6 +4329,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Falls aktiviert, wird die Kontoregistrierung vom Einloggen in der "
+"Benutzeroberfläche getrennt behandelt.\n"
+"Falls deaktiviert, werden neue Konten beim Einloggen automatisch registriert."
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -4219,10 +4368,12 @@ msgstr ""
"beim Fliegen oder Schwimmen sein."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
-"Falls aktiviert, können neue Spieler nicht mit einem leeren Passwort "
-"beitreten."
+"Falls aktiviert, können neue Spieler nicht ohne ein Passwort beitreten oder "
+"ihr Passwort zu ein leeres Passwort ändern."
#: src/settings_translation_file.cpp
msgid ""
@@ -4277,10 +4428,6 @@ msgid "Ignore world errors"
msgstr "Weltfehler ignorieren"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Spiel"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Undurchsichtigkeit des Hintergrundes der Chat-Konsole im Spiel (Wert "
@@ -4344,17 +4491,15 @@ msgid "Instrument the methods of entities on registration."
msgstr "Die Methoden von Entitys bei ihrer Registrierung instrumentieren."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentierung"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Zeitintervall des Abspeicherns wichtiger Änderungen in der Welt, in Sekunden."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
-msgstr "Zeitintervall, in dem die Tageszeit an Clients gesendet wird."
+msgid "Interval of sending time of day to clients, stated in seconds."
+msgstr ""
+"Zeitintervall, in dem die Tageszeit an Clients gesendet wird, in Sekunden "
+"angegeben."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
@@ -5213,6 +5358,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr "Tastatur und Maus"
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Spieler, die mehr als X Nachrichten innerhalb von 10 Sekunden sendeten, "
@@ -5275,11 +5424,11 @@ msgstr "Linkstaste"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Länge eines Servertakts und dem Zeitintervall, in dem Objekte über das "
"Netzwerk\n"
-"üblicherweise aktualisiert werden."
+"üblicherweise aktualisiert werden; in Sekunden angegeben."
#: src/settings_translation_file.cpp
msgid ""
@@ -5290,16 +5439,20 @@ msgstr ""
"Dafür müssen Flüssigkeitswellen aktiviert sein."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
-msgstr "Dauer zwischen Active-Block-Modifier-(ABM)-Ausführungszyklen"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
+msgstr ""
+"Dauer zwischen Active-Block-Modifier-(ABM)-Ausführungszyklen, in Sekunden."
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
-msgstr "Dauer der Zeit zwischen NodeTimer-Ausführungszyklen"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
+msgstr "Dauer der Zeit zwischen NodeTimer-Ausführungszyklen, in Sekunden."
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
-msgstr "Zeit zwischen Active-Block-Management-Zyklen"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
+msgstr "Zeit zwischen Active-Block-Management-Zyklen, in Sekunden."
#: src/settings_translation_file.cpp
msgid ""
@@ -5310,17 +5463,19 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Bis zu welcher Stufe Protokollmeldungen in debug.txt geschrieben werden "
"sollen:\n"
"- <nichts> (keine Protokollierung)\n"
"- none (Meldungen ohne Einstufung)\n"
-"- error (Fehler)\n"
-"- warning (Warnungen)\n"
-"- action (Aktionen)\n"
-"- info (Informationen)\n"
-"- verbose (Ausführlich)"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose\n"
+"- trace"
#: src/settings_translation_file.cpp
msgid "Light curve boost"
@@ -5347,6 +5502,10 @@ msgid "Light curve low gradient"
msgstr "Lichtkurve: Niedriger Gradient"
#: src/settings_translation_file.cpp
+msgid "Lighting"
+msgstr "Licht"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5803,10 +5962,6 @@ msgid "Maximum users"
msgstr "Maximale Benutzerzahl"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menüs"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "3-D-Modell-Zwischenspeicher"
@@ -5858,6 +6013,18 @@ msgid "Mipmapping"
msgstr "Mip-Mapping"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr "Sonstiges"
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr "Mod-Profiler"
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr "Mod-Sicherheit"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Mod-Kanäle"
@@ -5910,9 +6077,9 @@ msgid ""
"Multiplier for fall bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
-"Faktor für Kameraschütteln beim Sturz.\n"
-"Zum Beispiel: 0 für kein Schütteln, 1.0 für den Standardwert, 2.0 für "
-"doppelte Geschwindigkeit."
+"Faktor für Kamerawackeln beim Sturz.\n"
+"Zum Beispiel: 0 für kein Wackeln, 1.0 für den Standardwert, 2.0 für doppelte "
+"Geschwindigkeit."
#: src/settings_translation_file.cpp
msgid "Mute key"
@@ -5957,10 +6124,6 @@ msgid "Near plane"
msgstr "Vordere Ebene"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Netzwerk"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5969,6 +6132,10 @@ msgstr ""
"Dieser Wert wird überschrieben, wenn vom Hauptmenü aus gestartet wird."
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr "Netzwerk"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Neue Benutzer müssen dieses Passwort eingeben."
@@ -5981,6 +6148,10 @@ msgid "Noclip key"
msgstr "Geistmodustaste"
#: src/settings_translation_file.cpp
+msgid "Node and Entity Highlighting"
+msgstr "Block- und Entityhervorhebung"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Blockhervorhebung"
@@ -6033,10 +6204,6 @@ msgstr ""
"Transaktions-Overhead und Speicherverbrauch (Faustregel: 4096=100MB)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Online-Inhaltespeicher"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Undurchsichtige Flüssigkeiten"
@@ -6150,10 +6317,6 @@ msgstr ""
"Dafür wird das „fly“-Privileg auf dem Server benötigt."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Spielername"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Spieler-Übertragungsdistanz"
@@ -6210,10 +6373,6 @@ msgid "Profiler toggle key"
msgstr "Profiler-Umschalten-Taste"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Profiling"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Prometheus-Lauschadresse"
@@ -6408,6 +6567,10 @@ msgstr ""
"ganzzahligen Größen skaliert werden."
#: src/settings_translation_file.cpp
+msgid "Screen"
+msgstr "Monitor"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Bildschirmhöhe"
@@ -6438,6 +6601,10 @@ msgstr ""
"Benutzen Sie 0 für die Standardqualität."
#: src/settings_translation_file.cpp
+msgid "Screenshots"
+msgstr "Bildschirmfotos"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Meeresgrundrauschen"
@@ -6452,10 +6619,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Das zweite von zwei 3-D-Rauschen, welche gemeinsam Tunnel definieren."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Sicherheit"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Siehe https://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6514,8 +6677,16 @@ msgstr ""
"18 = 4-D-Juliamenge, Typ „Mandelbulb“."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Server / Einzelspieler"
+msgid "Server"
+msgstr "Server"
+
+#: src/settings_translation_file.cpp
+msgid "Server Gameplay"
+msgstr "Server-Gameplay"
+
+#: src/settings_translation_file.cpp
+msgid "Server Security"
+msgstr "Serversicherheit"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6542,10 +6713,18 @@ msgid "Server side occlusion culling"
msgstr "Serverseitiges Occlusion Culling"
#: src/settings_translation_file.cpp
+msgid "Server/Env Performance"
+msgstr "Server-/Umgebungsperformanz"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "Serverlisten-URL"
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr "Serverliste und MOTD"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Serverlistendatei"
@@ -6558,17 +6737,20 @@ msgstr ""
"Nach Änderung ist ein Neustart erforderlich."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
-"Setzt die maximale Zeichenlänge einer Chatnachricht, die von einem Client "
-"gesendet wurde."
+"Setzt die maximale Zeichenlänge einer Chatnachricht (in Zeichen), die von "
+"Clients gesendet wird."
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
-"Setzt die Schattenstärke.\n"
+"Setzt den Schattenstärkegammawert.\n"
+"Passt die Intensität der dynamischen Schatten im Spiel an.\n"
"Ein niedrigerer Wert führt zu schwächeren Schatten, ein höherer Wert führt "
"zu dunkleren Schatten."
@@ -6576,12 +6758,12 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
"Setzt den Radius von weichen Schatten.\n"
"Niedrigere Werte führen zu schärferen Schatten, größere Werte führen zu "
"weicheren Schatten.\n"
-"Minimalwert: 1.0; Maximalwert: 10.0"
+"Minimalwert: 1.0; Maximalwert: 15.0"
#: src/settings_translation_file.cpp
msgid ""
@@ -6676,8 +6858,8 @@ msgstr ""
"der Schatten nicht gezeichnet."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
-msgstr "Schattenstärke"
+msgid "Shadow strength gamma"
+msgstr "Schattenstärkengammawert"
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6927,6 +7109,10 @@ msgid "Temperature variation for biomes."
msgstr "Temperaturvariierung für Biome."
#: src/settings_translation_file.cpp
+msgid "Temporary Settings"
+msgstr "Temporäre Einstellungen"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Geländealternativrauschen"
@@ -7204,9 +7390,10 @@ msgid "Time speed"
msgstr "Zeitgeschwindigkeit"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
-"Zeit, nach der der Client nicht benutzte Kartendaten aus dem Speicher löscht."
+"Zeit, nach dem Clients nicht benutzte Kartendaten aus dem Speicher löschen, "
+"in Sekunden."
#: src/settings_translation_file.cpp
msgid ""
@@ -7233,10 +7420,18 @@ msgid "Touch screen threshold"
msgstr "Touchscreenschwellwert"
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr "Touchscreen"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr "Kompromisse für Performanz"
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr "Transparenzsortierungsdistanz"
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Bäumerauschen"
@@ -7353,6 +7548,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Trilineare Filterung bei der Skalierung von Texturen benutzen."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr "Benutzeroberflächen"
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7636,6 +7835,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+"Ob technische Namen angezeigt werden sollen.\n"
+"Betrifft Mods und Texturenpakete in den Inhalte- und Modauswahlmenüs,\n"
+"als auch die Einstellungsnamen in Alle Einstellungen.\n"
+"Wird vom Kontrollkästchen im „Alle Einstellungen“-Menü beeinflusst."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
"Ob der Client Debug-Informationen zeigen soll (hat die selbe Wirkung wie das "
@@ -7749,6 +7961,10 @@ msgid "Y-level of seabed."
msgstr "Y-Höhe vom Meeresgrund."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr "cURL"
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "cURL-Dateidownload-Zeitüberschreitung"
@@ -7795,6 +8011,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Back"
#~ msgstr "Rücktaste"
+#~ msgid "Basic"
+#~ msgstr "Grundlegend"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bits pro Pixel (Farbtiefe) im Vollbildmodus."
@@ -7828,6 +8047,12 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Configure"
#~ msgstr "Konfigurieren"
+#~ msgid "Connect"
+#~ msgstr "Verbinden"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Regelt die Sinkgeschwindigkeit in Flüssigkeiten."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7875,6 +8100,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ "Definiert die Sampling-Schrittgröße der Textur.\n"
#~ "Ein höherer Wert resultiert in weichere Normal-Maps."
+#~ msgid "Del. Favorite"
+#~ msgstr "Favorit löschen"
+
#~ msgid ""
#~ "Deprecated, define and locate cave liquids using biome definitions "
#~ "instead.\n"
@@ -7884,12 +8112,22 @@ msgstr "cURL-Parallel-Begrenzung"
#~ "Höhlenflüssigkeiten in Biomdefinitionen.\n"
#~ "Y der Obergrenze von Lava in großen Höhlen."
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr ""
+#~ "Laden Sie sich ein Spiel (wie Minetest Game) von minetest.net herunter"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Spiele können von minetest.net heruntergeladen werden"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 wird heruntergeladen und installiert, bitte warten …"
#~ msgid "Enable VBO"
#~ msgstr "VBO aktivieren"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Registrierungsbestätigung aktivieren"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7919,6 +8157,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ "Aktiviert Parralax-Occlusion-Mapping.\n"
#~ "Hierfür müssen Shader aktiviert sein."
+#~ msgid "Enter "
+#~ msgstr "Eingabe "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7938,6 +8179,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Fallback font size"
#~ msgstr "Ersatzschriftgröße"
+#~ msgid "Filtering"
+#~ msgstr "Filter"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Schwebeland-Basishöhenrauschen"
@@ -7957,6 +8201,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Full screen BPP"
#~ msgstr "Vollbildfarbtiefe"
+#~ msgid "Game"
+#~ msgstr "Spiel"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7966,15 +8213,30 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Generate normalmaps"
#~ msgstr "Normalmaps generieren"
+#~ msgid "HUD scale factor"
+#~ msgstr "HUD-Skalierungsfaktor"
+
#~ msgid "High-precision FPU"
#~ msgstr "Hochpräzisions-FPU"
#~ msgid "IPv6 support."
#~ msgstr "IPv6-Unterstützung."
+#~ msgid "In-Game"
+#~ msgstr "Spiel"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Installation: Datei: „$1“"
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentierung"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Steuerung (Falls dieses Menü defekt ist, entfernen Sie Zeugs aus minetest."
+#~ "conf)"
+
#~ msgid "Lava depth"
#~ msgstr "Lavatiefe"
@@ -7995,6 +8257,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ "DirectX mit LuaJIT zusammenarbeiten lassen. Deaktivieren Sie dies, falls "
#~ "es Probleme verursacht."
+#~ msgid "Menus"
+#~ msgstr "Menüs"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Übersichtskarte im Radarmodus, Zoom ×2"
@@ -8070,6 +8335,12 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Path to save screenshots at."
#~ msgstr "Pfad, in dem Bildschirmfotos abgespeichert werden."
+#~ msgid "Player name"
+#~ msgstr "Spielername"
+
+#~ msgid "Profiling"
+#~ msgstr "Profiling"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Herausragende Verliese"
@@ -8082,6 +8353,9 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Select Package File:"
#~ msgstr "Paket-Datei auswählen:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Server / Einzelspieler"
+
#~ msgid ""
#~ "Set the shadow update time.\n"
#~ "Lower value means shadows and map updates faster, but it consume more "
@@ -8175,6 +8449,23 @@ msgstr "cURL-Parallel-Begrenzung"
#~ msgid "Yes"
#~ msgstr "Ja"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Sie sind im Begriff, dem Server mit dem Namen „%s“ für das erste Mal "
+#~ "beizutreten.\n"
+#~ "Falls Sie fortfahren, wird ein neues Benutzerkonto mit Ihren Anmeldedaten "
+#~ "auf diesem Server erstellt.\n"
+#~ "Bitte geben Sie Ihr Passwort erneut ein und klicken Sie auf „Registrieren "
+#~ "und beitreten“, um die Erstellung des Benutzerkontos zu bestätigen oder "
+#~ "klicken Sie auf „Abbrechen“ zum Abbrechen."
+
#~ msgid "You died."
#~ msgstr "Sie sind gestorben."
diff --git a/po/dv/minetest.po b/po/dv/minetest.po
index 2ae55d9e9..6626fd9f2 100644
--- a/po/dv/minetest.po
+++ b/po/dv/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Dhivehi (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2019-11-10 15:04+0000\n"
"Last-Translator: Krock <mk939@ymail.com>\n"
"Language-Team: Dhivehi <https://hosted.weblate.org/projects/minetest/"
@@ -115,6 +115,31 @@ msgid "The server has requested a reconnect:"
msgstr "ސަާވަރ އިން ރިކަނެކްޓަކަށް އެދެފި:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "ދުނިޔެ އިހްތިޔާރު ކުރޭ:"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "ޕްރޮޓޮކޯލް ވާޝަން ފުށުއެރުމެއް. "
@@ -127,6 +152,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "$1 އާއި 2$ ދެމެދުގެ ޕްރޮޓޮކޯލް ވާޝަންތައް ސާވަރ ސަިޕޯޓް ކުރޭ. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "އަޅުގަނޑުމެން ހަމައެކަނި ސަޕޯޓްކުރަނީ ޕްރޮޓޮކޯލް ވާޝަން 1$."
@@ -134,14 +163,21 @@ msgstr "އަޅުގަނޑުމެން ހަމައެކަނި ސަޕޯޓްކުރަނީ
msgid "We support protocol versions between version $1 and $2."
msgstr "އަޅުގަނޑުމެން 1$ އާއި 2$ އާއި ދެމެދުގެ ޕޮރޮޓޮކޯލް ވާޝަންތައް ސަޕޯޓް ކުރަން."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "ކެންސަލް"
@@ -283,7 +319,6 @@ msgid "Failed to download $1"
msgstr "$1 ނޭޅުނު"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "ގޭމްތައް"
@@ -306,7 +341,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "މޮޑްތައް"
@@ -401,12 +435,8 @@ msgstr "މޮޑްގެ މައުލޫލާތު:"
#: builtin/mainmenu/dlg_create_world.lua
#, fuzzy
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "މައިންޓެސްޓް_ގޭމް ފަދަ ސަބްގޭމެއް މައިންޓެސްޓް.ނެޓް އިން ޑައުންލޯޑްކުރައްވާ"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "މައިންޓެސްޓް.ނެޓް އިން އެކަތި ޑައުންލޯޑްކުރައްވާ"
+msgid "Development Test is meant for developers."
+msgstr "އިންޒާރު: މިނިމަލް ޑިވެލޮޕްމަންޓް ހާއްސަކުރެވިފައިވަނީ ޑިވެލޮޕަރުންނަށް."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -424,10 +454,6 @@ msgstr ""
msgid "Floatlands (experimental)"
msgstr ""
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "ގޭމް"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -445,6 +471,15 @@ msgid "Increases humidity around rivers"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "އަޅާ"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr ""
@@ -545,11 +580,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
-msgid "Warning: The Development Test is meant for developers."
-msgstr "އިންޒާރު: މިނިމަލް ޑިވެލޮޕްމަންޓް ހާއްސަކުރެވިފައިވަނީ ޑިވެލޮޕަރުންނަށް."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "ދުނިޔޭގެ ނަން"
@@ -579,6 +609,37 @@ msgstr "މޮޑްއެމް.ޖީ.އާރް: ޕާތު \"1$\" ބާތިލް"
msgid "Delete World \"$1\"?"
msgstr "ދުނިޔެ \"1$\" ޑިލީޓްކުރަންވީތޯ؟"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Password"
+msgstr "ޕާސްވޯޑް / ނަން"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr ""
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "ގަބޫލުކުރޭ"
@@ -609,6 +670,16 @@ msgstr "އަނބުރާ ސެޓިންގްސް ސަފުހާއަށް>"
msgid "Browse"
msgstr "ފުންކޮށް ހޯދާ"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "ގޭމް ހޮސްޓްކުރޭ"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "ސޮޓޯރ ކުލޯޒްކޮށްލާ"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "އޮފްކޮށްފަ"
@@ -667,7 +738,7 @@ msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:"
msgid "Select file"
msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "ޓެކްނިކަލް ނަންތައް ދައްކާ"
@@ -818,6 +889,10 @@ msgstr ""
msgid "Previous Core Developers"
msgstr ""
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr ""
@@ -890,10 +965,6 @@ msgstr "ސާވަރއެއް ހޮސްޓްކުރޭ"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "އައު"
@@ -902,11 +973,6 @@ msgstr "އައު"
msgid "No world created or selected!"
msgstr "އެއްވެސް ދުނިޔެއެއް އުފެދިފައެއް ނުވަތަ އިހްތިޔާރުވެފައެއް ނެޠް!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-#, fuzzy
-msgid "Password"
-msgstr "ޕާސްވޯޑް / ނަން"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "ގޭމް ކުޅޭ"
@@ -943,10 +1009,6 @@ msgid "Clear"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "ކަނެކްޓްކުރޭ"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "ކްރިއޭޓިވް މޯޑް"
@@ -956,10 +1018,6 @@ msgid "Damage / PvP"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "އެންމެ ގަޔާނުވޭ"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "އެންމެ ގަޔާވޭ"
@@ -974,6 +1032,10 @@ msgid "Join Game"
msgstr "ގޭމް ހޮސްޓްކުރޭ"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
@@ -988,10 +1050,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "އެންމެ ގަޔާނުވޭ"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "ސާވަރ ޕޯޓް"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr ""
@@ -1036,7 +1107,7 @@ msgid "Dynamic shadows"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+msgid "Dynamic shadows:"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1132,7 +1203,7 @@ msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1140,7 +1211,7 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1159,6 +1230,10 @@ msgstr ""
msgid "Waving Plants"
msgstr ""
+#: src/client/client.cpp
+msgid "Connection aborted (protocol error?)."
+msgstr ""
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr ""
@@ -1295,7 +1370,7 @@ msgid "Camera update enabled"
msgstr "އަނިޔާވުން ޖައްސާފައި"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1412,6 +1487,11 @@ msgid "Enabled unlimited viewing range"
msgstr ""
#: src/client/game.cpp
+#, c-format
+msgid "Error creating client: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "މެއިން މެނޫ"
@@ -1922,24 +2002,6 @@ msgstr "$1 ނޭޅުނު"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr ""
@@ -1973,7 +2035,7 @@ msgstr ""
msgid "Change camera"
msgstr "ފިތްތައް ބަދަލުކުރޭ"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr ""
@@ -2026,8 +2088,8 @@ msgid "Key already in use"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr "ފިތްތައް. (މި މެނޫ މައްސަލަ ޖެހިއްޖެނަމަ minetest.confއިން ތަކެތި ފުހެލައްވާ)"
+msgid "Keybindings."
+msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2098,15 +2160,15 @@ msgid "Change"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
+msgid "New Password"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "New Password"
+msgid "Old Password"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "Old Password"
+msgid "Passwords do not match!"
msgstr ""
#: src/gui/guiVolumeChange.cpp
@@ -2122,12 +2184,6 @@ msgstr ""
msgid "Sound Volume: %d%%"
msgstr ""
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2135,6 +2191,15 @@ msgstr ""
msgid "LANG_CODE"
msgstr "dv"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+msgid "Name is taken. Please choose another name"
+msgstr ""
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2260,6 +2325,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2344,6 +2413,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "ދުނިޔޭގެ ނަން"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr ""
@@ -2357,7 +2431,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2427,6 +2501,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2467,10 +2545,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2491,7 +2565,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2503,6 +2577,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2527,6 +2605,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "ފިތްތައް ބަދަލުކުރޭ"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2683,6 +2766,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2778,6 +2865,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2812,7 +2903,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2879,11 +2972,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3028,6 +3121,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "މޮޑްގެ މައުލޫލާތު:"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -3048,6 +3146,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3117,6 +3221,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3133,19 +3241,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3219,6 +3321,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3237,6 +3343,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3314,7 +3424,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
+msgid "Filtering and Antialiasing"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3382,6 +3492,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3530,6 +3644,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "ގޭމްތައް"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3557,6 +3684,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3573,7 +3708,11 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3813,11 +3952,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3878,6 +4024,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3899,7 +4051,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3939,10 +4093,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3993,15 +4143,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4622,6 +4768,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4677,7 +4827,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4687,15 +4837,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4707,7 +4860,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4735,6 +4889,10 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Lighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5125,10 +5283,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5177,6 +5331,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5266,16 +5432,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5288,6 +5454,10 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Node and Entity Highlighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5325,10 +5495,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5422,10 +5588,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5472,10 +5634,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5644,6 +5802,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "ސްކްރީން:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5671,6 +5834,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "ސްކްރީން:"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5683,10 +5851,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5726,10 +5890,20 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
+#, fuzzy
+msgid "Server"
+msgstr "ސާވަރއެއް ހޮސްޓްކުރޭ"
+
+#: src/settings_translation_file.cpp
+msgid "Server Gameplay"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "ސާވަރ ޕޯޓް"
+
+#: src/settings_translation_file.cpp
msgid "Server URL"
msgstr ""
@@ -5754,10 +5928,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "ސާވަރ ޕޯޓް"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5768,12 +5951,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5781,7 +5966,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5857,7 +6042,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6057,6 +6242,10 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Temporary Settings"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6259,7 +6448,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6283,10 +6472,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6377,6 +6574,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6610,6 +6811,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6700,6 +6910,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6714,19 +6928,36 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "ބަދަލުގެނޭ"
+#~ msgid "Connect"
+#~ msgstr "ކަނެކްޓްކުރޭ"
+
#~ msgid "Damage enabled"
#~ msgstr "އަނިޔާވުން ޖައްސާފައި"
+#, fuzzy
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "މައިންޓެސްޓް_ގޭމް ފަދަ ސަބްގޭމެއް މައިންޓެސްޓް.ނެޓް އިން ޑައުންލޯޑްކުރައްވާ"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "މައިންޓެސްޓް.ނެޓް އިން އެކަތި ޑައުންލޯޑްކުރައްވާ"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 ޑައުންލޯޑޮކޮށް އިންސްޓޯލްކުރަނީ، މަޑުކުރައްވާ..."
#~ msgid "FPS in pause menu"
#~ msgstr "ޕޯސް މެނޫގައި އެފް.ޕީ.އެސް"
+#~ msgid "Game"
+#~ msgstr "ގޭމް"
+
#, fuzzy
#~ msgid "Install: file: \"$1\""
#~ msgstr "މޮޑް އަޚާ: ފައިލް:\"1$\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr "ފިތްތައް. (މި މެނޫ މައްސަލަ ޖެހިއްޖެނަމަ minetest.confއިން ތަކެތި ފުހެލައްވާ)"
+
#, fuzzy
#~ msgid "Main menu style"
#~ msgstr "މެއިން މެނޫ ސްކްރިޕްޓް"
diff --git a/po/el/minetest.po b/po/el/minetest.po
index 2bf5854e6..154b81e2a 100644
--- a/po/el/minetest.po
+++ b/po/el/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Greek (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-06-07 14:33+0000\n"
-"Last-Translator: THANOS SIOURDAKIS <siourdakisthanos@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-03-24 18:55+0000\n"
+"Last-Translator: Elnaz javadi <elnazjavadii1369@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/minetest/minetest/"
"el/>\n"
"Language: el\n"
@@ -12,24 +12,23 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.7-dev\n"
+"X-Generator: Weblate 4.12-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
-msgstr ""
+msgstr "Διαγραφή της ουράς συνομιλίας"
#: builtin/client/chatcommands.lua
msgid "Empty command."
-msgstr ""
+msgstr "Κενή εντολή."
#: builtin/client/chatcommands.lua
-#, fuzzy
msgid "Exit to main menu"
-msgstr "Έξοδος στο Μενού"
+msgstr "Έξοδος στο κεντρικό μενού"
#: builtin/client/chatcommands.lua
msgid "Invalid command: "
-msgstr ""
+msgstr "Άκυρη εντολή: "
#: builtin/client/chatcommands.lua
msgid "Issued command: "
@@ -37,23 +36,24 @@ msgstr ""
#: builtin/client/chatcommands.lua
msgid "List online players"
-msgstr ""
+msgstr "Λίστα συνδεδεμένων παικτών"
#: builtin/client/chatcommands.lua
msgid "Online players: "
-msgstr ""
+msgstr "Συνδεδεμένοι παίκτες: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr ""
+msgstr "Η ουρά συνομιλίας είναι τώρα κενή."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
-msgstr ""
+msgstr "Αυτή η εντολή είναι απενεργοποιημένη από τον διακομιστή."
#: builtin/client/death_formspec.lua src/client/game.cpp
+#, fuzzy
msgid "Respawn"
-msgstr ""
+msgstr "Επανεμφάνηση"
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "You died"
@@ -61,28 +61,30 @@ msgstr "Πέθανες"
#: builtin/common/chatcommands.lua
msgid "Available commands:"
-msgstr ""
+msgstr "Διαθέσιμες εντολές:"
#: builtin/common/chatcommands.lua
msgid "Available commands: "
-msgstr ""
+msgstr "Διαθέσιμες εντολές: "
#: builtin/common/chatcommands.lua
msgid "Command not available: "
-msgstr ""
+msgstr "Η εντολή δεν είναι διαθέσιμη: "
#: builtin/common/chatcommands.lua
msgid "Get help for commands"
-msgstr ""
+msgstr "Βοήθεια για τις εντολές"
#: builtin/common/chatcommands.lua
msgid ""
"Use '.help <cmd>' to get more information, or '.help all' to list everything."
msgstr ""
+"Χρησιμοποιήστε το '.help <cmd>' για να λάβετε περισσότερες πληροφορίες ή το "
+"'.help all' για την λίστα των εντολών."
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[all | <εντολή>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
@@ -90,7 +92,7 @@ msgstr "Εντάξει"
#: builtin/fstk/ui.lua
msgid "<none available>"
-msgstr ""
+msgstr "<κανένα διαθέσιμο>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
@@ -113,6 +115,31 @@ msgid "The server has requested a reconnect:"
msgstr "Ο διακομιστής ζήτησε επανασύνδεση:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Επιλογή Τροποποιήσεων"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Ασυμφωνία έκδοσης πρωτοκόλλου. "
@@ -125,6 +152,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Ο διακομιστής υποστηρίζει εκδόσεις πρωτοκόλλων μεταξύ $1 και $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Υποστηρίζουμε μόνο το πρωτόκολλο έκδοσης $1."
@@ -132,14 +163,21 @@ msgstr "Υποστηρίζουμε μόνο το πρωτόκολλο έκδοσ
msgid "We support protocol versions between version $1 and $2."
msgstr "Υποστηρίζουμε τις εκδόσεις πρωτοκόλλων μεταξύ της έκδοσης $1 και $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Άκυρο"
@@ -154,7 +192,7 @@ msgstr "Απενεργοποίηση όλων"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr ""
+msgstr "Απενεργοποίηση πακέτου τροποποιήσεων"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -162,21 +200,23 @@ msgstr "Ενεργοποίηση όλων"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr ""
+msgstr "Ενεργοποίηση πακέτου τροποποιήσεων"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"characters [a-z0-9_] are allowed."
msgstr ""
+"Η ενεργοποίηση του mod \"$1\" απέτυχε καθώς περιέχει μη επιτρεπόμενους "
+"χαρακτήρες. Επιτρέπονται μόνο χαρακτήρες [a-z0-9_]."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Find More Mods"
-msgstr ""
+msgstr "Εύρεση Περισσότερων Τροποποιήσεων"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr ""
+msgstr "Τροποποίηση:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No (optional) dependencies"
@@ -188,19 +228,19 @@ msgstr "Δεν παρέχεται περιγραφή παιχνιδιού."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No hard dependencies"
-msgstr ""
+msgstr "Δεν υπάρχουν απαραίτητες εξαρτήσεις"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No modpack description provided."
-msgstr ""
+msgstr "Δεν παρέχεται περιγραφή για το πακέτο τροποποιήσεων."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No optional dependencies"
-msgstr ""
+msgstr "Δεν υπάρχουν προαιρετικές εξαρτήσεις"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua
msgid "Optional dependencies:"
-msgstr ""
+msgstr "Προαιρετικές εξαρτήσεις:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp
@@ -221,17 +261,19 @@ msgstr "Το \"$1\" ήδη υπάρχει. Θέλετε να το αντικατ
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "Οι εξαρτήσεις $1 και $2 θα εγκατασταθούν."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 με $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
+"$1 σε λήψη,\n"
+"$2 σε αναμονή"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 downloading..."
@@ -239,11 +281,11 @@ msgstr "Λήψη ..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "Δεν ήταν δυνατή η εύρεση των απαιτούμενων εξαρτήσεων $1."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "Θα εγκατασταθεί το $1 και οι εξαρτήσεις $2 θα παραβλεφθούν."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
@@ -259,11 +301,12 @@ msgstr "Πίσω στο Κύριο Μενού"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr ""
+msgstr "Βασικό παιχνίδι:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
msgstr ""
+"Το ContentDB δεν είναι διαθέσιμο όταν το Minetest μεταγλωττίστηκε χωρίς cURL"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Downloading..."
@@ -271,10 +314,9 @@ msgstr "Λήψη ..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Failed to download $1"
-msgstr ""
+msgstr "Η λήψη του $1 απέτυχε"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Παιχνίδια"
@@ -288,20 +330,19 @@ msgstr "Εγκατάσταση $1"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install missing dependencies"
-msgstr ""
+msgstr "Εγκατάσταση των εξαρτήσεων που λείπουν"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install: Unsupported file type or broken archive"
-msgstr ""
+msgstr "Εγκατάσταση: Μη υποστηριζόμενος τύπος αρχείου ή κατεστραμμένο αρχείο"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
-msgstr ""
+msgstr "Τροποποιήσεις"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr ""
+msgstr "Δεν ήταν δυνατή η ανάκτηση πακέτων"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
@@ -309,7 +350,7 @@ msgstr "Χωρίς αποτελέσματα"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No updates"
-msgstr ""
+msgstr "Δεν υπάρχουν ενημερώσεις"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
@@ -317,19 +358,19 @@ msgstr "Δε βρέθηκε"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr ""
+msgstr "Αντικατάσταση"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr ""
+msgstr "Ελέγξτε ότι το βασικό παιχνίδι είναι σωστό."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
-msgstr ""
+msgstr "Σε αναμονή"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
-msgstr ""
+msgstr "Πακέτα υφής"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Uninstall"
@@ -337,7 +378,7 @@ msgstr "Απεγκατάσταση"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update"
-msgstr "Ενημέρωση"
+msgstr "Αναβάθμιση"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
@@ -345,23 +386,23 @@ msgstr "Ενημέρωση Όλων [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "Δείτε περισσότερες πληροφορίες σε ένα πρόγραμμα περιήγησης ιστού"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "Υπάρχει ήδη ένας κόσμος με το όνομα \"$1\""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Additional terrain"
-msgstr ""
+msgstr "Πρόσθετο έδαφος"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Altitude chill"
-msgstr ""
+msgstr "Κρύο υψομέτρου"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Altitude dry"
-msgstr ""
+msgstr "Ξηρασία υψομέτρου"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biome blending"
@@ -373,11 +414,11 @@ msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr ""
+msgstr "Σπήλαια"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
-msgstr ""
+msgstr "Σπηλιές"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@@ -385,39 +426,32 @@ msgstr "Δημιουργία"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Decorations"
-msgstr ""
+msgstr "Διακοσμήσεις"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr ""
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Προειδοποίηση: Τα Development Test προορίζονται για προγραμματιστές."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
-msgstr ""
+msgstr "Μπουντρούμια"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Flat terrain"
-msgstr ""
+msgstr "Επίπεδο έδαφος"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr ""
+msgstr "Αιωρούμενες μάζες γης στον ουρανό"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Παιχνίδι"
+msgstr "Αιωρούμενες μάζες γης (πειραματικό)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr ""
+msgstr "Δημιουργία non-fractal εδάφους: ωκεανοί και υπόγεια"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
@@ -425,10 +459,19 @@ msgstr "Λόφοι"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Humid rivers"
-msgstr ""
+msgstr "Υγρά ποτάμια"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
+msgstr "Αύξηση της υγρασίας γύρω από τα ποτάμια"
+
+#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Εγκατάσταση $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
@@ -437,19 +480,19 @@ msgstr "Λίμνες"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
-msgstr ""
+msgstr "Η χαμηλή υγρασία και η υψηλή ζέστη προκαλούν ρηχά ή ξηρά ποτάμια"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr ""
+msgstr "Δημιουργία χάρτη"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr ""
+msgstr "Ρυθμίσεις δημιουργίας χάρτη"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr ""
+msgstr "Ειδικές ρυθμίσεις δημιουργίας χάρτη"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
@@ -457,11 +500,11 @@ msgstr "Βουνά"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr ""
+msgstr "Ροή λάσπης"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr ""
+msgstr "Δίκτυο σηράγγων και σπηλαίων"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
@@ -469,11 +512,11 @@ msgstr "Κανένα παιχνίδι επιλεγμένο"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr ""
+msgstr "Μείωση της θερμότητας με το υψόμετρο"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr ""
+msgstr "Μείωση της υγρασίας με το υψόμετρο"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Rivers"
@@ -481,7 +524,7 @@ msgstr "Ποτάμια"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Sea level rivers"
-msgstr ""
+msgstr "Ποτάμια στο επίπεδο της θάλασσας"
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -497,42 +540,40 @@ msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
+"Κατασκευές που εμφανίζονται στο έδαφος (καμία επίδραση στα δέντρα και το "
+"γρασίδι της ζούγκλας που δημιουργήθηκε από v6)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
-msgstr ""
+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"
-msgstr ""
+msgstr "Διάβρωση επιφάνειας εδάφους"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
-msgstr ""
+msgstr "Δέντρα και γρασίδι ζούγκλας"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Vary river depth"
-msgstr ""
+msgstr "Μεταβολή βάθους ποταμού"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
+msgstr "Πολύ μεγάλα σπήλαια βαθιά στο υπέδαφος"
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -540,11 +581,11 @@ msgstr "Όνομα κόσμου"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no games installed."
-msgstr ""
+msgstr "Δεν έχετε εγκαταστήσει παιχνίδια."
#: builtin/mainmenu/dlg_delete_content.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "Είστε βέβαιοι ότι θέλετε να διαγράψετε το \\\"$1\\\";"
#: builtin/mainmenu/dlg_delete_content.lua
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
@@ -554,14 +595,44 @@ msgstr "Διαγραφή"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "pkgmgr: απέτυχε η διαγραφή του \\\"$1\\\""
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: invalid path \"$1\""
-msgstr ""
+msgstr "pkgmgr: μη έγκυρη διαδρομή \\\"$1\\\""
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
+msgstr "Διαγραφή Κόσμου \\\"$1\\\";"
+
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Επιβεβαίωση Κωδικού"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Όνομα"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Κωδικός"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
msgstr ""
#: builtin/mainmenu/dlg_rename_modpack.lua
@@ -570,30 +641,42 @@ msgstr "Αποδοχή"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr ""
+msgstr "Μετονομασία Modpack:"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid ""
"This modpack has an explicit name given in its modpack.conf which will "
"override any renaming here."
msgstr ""
+"Αυτό το modpack έχει ένα ρητό όνομα που δίνεται στο modpack.conf το οποίο θα "
+"παρακάμψει οποιαδήποτε μετονομασία εδώ."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr ""
+msgstr "(Δεν δόθηκε περιγραφή της ρύθμισης)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "2D Noise"
-msgstr ""
+msgstr "2D θόρυβος"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "< Επιστροφή στη σελίδα Ρυθμίσεις"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
msgstr "Περιήγηση"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Περιεχόμενο"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Περιεχόμενο"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Απενεργοποιημένο"
@@ -604,7 +687,7 @@ msgstr "Επεξεργασία"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Enabled"
-msgstr ""
+msgstr "Ενεργοποιημένο"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Lacunarity"
@@ -612,11 +695,11 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Octaves"
-msgstr ""
+msgstr "Οκτάβες"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Offset"
-msgstr ""
+msgstr "Αντιστάθμιση"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Persistence"
@@ -624,19 +707,19 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr ""
+msgstr "Εισαγάγετε έναν έγκυρο ακέραιο αριθμό."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
-msgstr ""
+msgstr "Εισαγάγετε έναν έγκυρο αριθμό."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr ""
+msgstr "Επαναφορά προεπιλογής"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Scale"
-msgstr ""
+msgstr "Κλίμακα"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
@@ -650,17 +733,17 @@ msgstr "Επιλογή φακέλου"
msgid "Select file"
msgstr "Επιλογή αρχείου"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
-msgstr ""
+msgstr "Εμφάνιση τεχνικών ονομάτων"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be at least $1."
-msgstr ""
+msgstr "Η τιμή πρέπει να είναι τουλάχιστον $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must not be larger than $1."
-msgstr ""
+msgstr "Η τιμή δεν πρέπει να είναι μεγαλύτερη από $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
@@ -668,7 +751,7 @@ msgstr "X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X spread"
-msgstr ""
+msgstr "Χ εξάπλωση"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y"
@@ -676,7 +759,7 @@ msgstr "Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y spread"
-msgstr ""
+msgstr "Υ εξάπλωση"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z"
@@ -684,7 +767,7 @@ msgstr "Z"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z spread"
-msgstr ""
+msgstr "Ζ εξάπλωση"
#. ~ "absvalue" is a noise parameter flag.
#. It is short for "absolute value".
@@ -692,14 +775,14 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "absvalue"
-msgstr ""
+msgstr "απόλυτη τιμή"
#. ~ "defaults" is a noise parameter flag.
#. It describes the default processing options
#. for noise settings in main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "defaults"
-msgstr ""
+msgstr "προεπιλογή"
#. ~ "eased" is a noise parameter flag.
#. It is used to make the map smoother and
@@ -707,47 +790,51 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "eased"
-msgstr ""
+msgstr "Ομαλός Χάρτης"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 (Enabled)"
-msgstr ""
+msgstr "$1 (Ενεργοποιημένο)"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 mods"
-msgstr ""
+msgstr "$1 Τροποποιήσεις"
#: builtin/mainmenu/pkgmgr.lua
msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "Αποτυχία εγκατάστασης $1 έως $2"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find real mod name for: $1"
msgstr ""
+"Εγκατάσταση Τροποποίησης: Δεν είναι δυνατή η εύρεση του πραγματικού ονόματος "
+"τροποποίησης για: $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
+"Εγκατάσταση Τροποποίησης: Δεν είναι δυνατή η εύρεση του κατάλληλου ονόματος "
+"φακέλου για την τροποποίηση $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
-msgstr ""
+msgstr "Δεν είναι δυνατή η εύρεση έγκυρης τροποποίησης ή πακέτου τροποποίησης"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a $1 as a texture pack"
-msgstr ""
+msgstr "Δεν είναι δυνατή η εγκατάσταση $1 ως πακέτου υφής"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a game as a $1"
-msgstr ""
+msgstr "Δεν είναι δυνατή η εγκατάσταση ενός παιχνιδιού ως $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a mod as a $1"
-msgstr ""
+msgstr "Δεν είναι δυνατή η εγκατάσταση τροποποίησης ως $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a modpack as a $1"
-msgstr ""
+msgstr "Δεν είναι δυνατή η εγκατάσταση πακέτου τροποποίησης ως $1"
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
@@ -755,7 +842,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."
@@ -765,11 +852,11 @@ msgstr ""
#: builtin/mainmenu/tab_about.lua
msgid "About"
-msgstr ""
+msgstr "Σχετικά"
#: builtin/mainmenu/tab_about.lua
msgid "Active Contributors"
-msgstr ""
+msgstr "Ενεργοί Συντελεστές"
#: builtin/mainmenu/tab_about.lua
msgid "Active renderer:"
@@ -777,24 +864,31 @@ msgstr ""
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
-msgstr ""
+msgstr "Βασικοί Προγραμματιστές"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
-msgstr ""
+msgstr "Άνοιγμα Καταλόγου Δεδομένων Χρήστη"
#: builtin/mainmenu/tab_about.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
+"Ανοίγει τον κατάλογο που περιέχει κόσμους, παιχνίδια, τροποποιήσεις που "
+"παρέχονται από τον χρήστη,\n"
+"και πακέτα υφής σε έναν διαχειριστή αρχείων / εξερευνητή."
#: builtin/mainmenu/tab_about.lua
msgid "Previous Contributors"
-msgstr ""
+msgstr "Προηγούμενοι Συντελεστές"
#: builtin/mainmenu/tab_about.lua
msgid "Previous Core Developers"
+msgstr "Προηγούμενοι Βασικοί Προγραμματιστές"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
msgstr ""
#: builtin/mainmenu/tab_content.lua
@@ -807,7 +901,7 @@ msgstr "Περιεχόμενο"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
-msgstr ""
+msgstr "Απενεργοποίηση πακέτου υφής"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
@@ -819,11 +913,11 @@ msgstr "Εγκαταστημένα Πακέτα:"
#: builtin/mainmenu/tab_content.lua
msgid "No dependencies."
-msgstr ""
+msgstr "Χωρίς εξαρτήσεις."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr ""
+msgstr "Δεν υπάρχει διαθέσιμη περιγραφή πακέτου"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
@@ -835,55 +929,47 @@ msgstr "Απεγκατάσταση πακέτου"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
-msgstr ""
+msgstr "Χρήση Πακέτου Υφής"
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
-msgstr ""
+msgstr "Ανακοίνωση Διακομιστή"
#: builtin/mainmenu/tab_local.lua
msgid "Bind Address"
-msgstr ""
+msgstr "Δεσμευμένη διεύθυνση"
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
-msgstr ""
+msgstr "Λειτουργία Δημιουργίας"
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
-msgstr ""
+msgstr "Ενεργοποίηση Ζημίας"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr ""
+msgstr "Φιλοξενία Παιχνιδιού"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
-msgstr ""
+msgstr "Διακομιστής Φιλοξενίας"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
msgstr "Εγκατάσταση παιχνιδιών από το ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Όνομα"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Νέο"
#: builtin/mainmenu/tab_local.lua
msgid "No world created or selected!"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Κωδικός"
+msgstr "Κανένας κόσμος δεν δημιουργήθηκε ούτε επιλέχθηκε!"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
-msgstr ""
+msgstr "Εκκίνηση Παιχνιδιού"
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
@@ -891,7 +977,7 @@ msgstr "Θήρα"
#: builtin/mainmenu/tab_local.lua
msgid "Select Mods"
-msgstr ""
+msgstr "Επιλογή Τροποποιήσεων"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
@@ -906,41 +992,36 @@ msgid "Start Game"
msgstr "Εκκίνηση Παιχνιδιού"
#: builtin/mainmenu/tab_online.lua
-#, fuzzy
msgid "Address"
-msgstr "- Διεύθυνση: "
+msgstr "Διεύθυνση"
#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
msgid "Clear"
msgstr "Εκκαθάριση"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Σύνδεση"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
-msgstr ""
+msgstr "Λειτουργία Δημιουργίας"
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
msgid "Damage / PvP"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
+msgstr "Μάχες μεταξύ παιχτών"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
-msgstr ""
+msgstr "Αγαπημένα"
#: builtin/mainmenu/tab_online.lua
msgid "Incompatible Servers"
-msgstr ""
+msgstr "Μη συμβατοί διακομιστές"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
+msgstr "Συμμετοχή στο Παιχνίδι"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Login"
msgstr ""
#: builtin/mainmenu/tab_online.lua
@@ -949,16 +1030,23 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Public Servers"
-msgstr ""
+msgstr "Δημόσιοι Διακομιστές"
#: builtin/mainmenu/tab_online.lua
msgid "Refresh"
+msgstr "Ανανέωση"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Remove favorite"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-#, fuzzy
msgid "Server Description"
-msgstr "Περιγραφή διακομιστή"
+msgstr "Περιγραφή Διακομιστή"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -986,11 +1074,11 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr ""
+msgstr "Αυτόματη αποθήκευση Μεγέθους Οθόνης"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr ""
+msgstr "Διγραμμικό Φίλτρο"
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
@@ -1002,27 +1090,28 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
-msgstr ""
+msgstr "Δυναμικές σκιές"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Δυναμικές σκιές: "
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr ""
+msgstr "Φανταχτερά Φύλλα"
#: builtin/mainmenu/tab_settings.lua
msgid "High"
-msgstr ""
+msgstr "Υψηλό"
#: builtin/mainmenu/tab_settings.lua
msgid "Low"
-msgstr ""
+msgstr "Χαμηλό"
#: builtin/mainmenu/tab_settings.lua
msgid "Medium"
-msgstr ""
+msgstr "Μεσαίο"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
@@ -1034,7 +1123,7 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "Χωρίς Φίλτρο"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
@@ -1042,11 +1131,11 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr ""
+msgstr "Επισήμανση Στοιχείων"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr ""
+msgstr "Περίγραμμα Στοιχείων"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
@@ -1054,15 +1143,15 @@ msgstr "Κανένα"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
-msgstr ""
+msgstr "Αδιαφανή Φύλλα"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Water"
-msgstr ""
+msgstr "Αδιαφανές Νερό"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr ""
+msgstr "Σωματίδια"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
@@ -1086,51 +1175,58 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr ""
+msgstr "Απλά Φύλλα"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr ""
+msgstr "Απαλός Φωτισμός"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "Υφή:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr ""
+msgstr "Χαρτογράφηση Τόνου"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr ""
+#, fuzzy
+msgid "Touch threshold (px):"
+msgstr "Όριο αφής: (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr ""
+msgstr "Τριγραμμικό Φίλτρο"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
-msgstr ""
+#, fuzzy
+msgid "Very High"
+msgstr "Εξαιρετικά Υψηλό"
#: builtin/mainmenu/tab_settings.lua
msgid "Very Low"
-msgstr ""
+msgstr "Πολύ Χαμηλό"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "Κινούμενα Φύλλα"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr ""
+msgstr "Κυματιζόμενα Υγρά"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "Κυματιζόμενα Φυτά"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Σφάλμα σύνδεσης (λήξη χρόνου;)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "Λήξη χρονικού ορίου σύνδεσης."
#: src/client/client.cpp
msgid "Done!"
@@ -1138,31 +1234,31 @@ msgstr "Έτοιμο!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "Εκκίνηση στοιχείων"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "Εκκίνηση στοιχείων..."
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Φόρτωση υφών..."
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Ανακατασκευή σκίαστρων..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "Σφάλμα σύνδεσης (λήξη χρόνου;)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr ""
+msgstr "Δεν ήταν δυνατή η εύρεση ή η φόρτωση του παιχνιδιού: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr ""
+msgstr "Μη έγκυρη προδιαγραφή παιχνιδιού."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
@@ -1170,11 +1266,11 @@ msgstr "Κύριο μενού"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "Δεν έχει επιλεγεί κόσμος και δεν παρέχεται διεύθυνση."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr ""
+msgstr "Το όνομα παίκτη είναι πολύ μεγάλο."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
@@ -1182,17 +1278,19 @@ msgstr "Παρακαλώ επιλέξτε ένα όνομα!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr ""
+msgstr "Απέτυχε το άνοιγμα του παρεχόμενου αρχείου κωδικού πρόσβασης: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "Το αρχείο του Κόσμου δεν υπάρχει: "
#: src/client/game.cpp
msgid ""
"\n"
"Check debug.txt for details."
msgstr ""
+"\n"
+"Ελέγξτε το debug.txt για λεπτομέρειες."
#: src/client/game.cpp
msgid "- Address: "
@@ -1200,7 +1298,7 @@ msgstr "- Διεύθυνση: "
#: src/client/game.cpp
msgid "- Mode: "
-msgstr ""
+msgstr "- Λειτουργία: "
#: src/client/game.cpp
msgid "- Port: "
@@ -1227,71 +1325,74 @@ msgstr "Παρουσιάστηκε σφάλμα:"
#: src/client/game.cpp
#, c-format
msgid "Access denied. Reason: %s"
-msgstr ""
+msgstr "Δεν επιτρέπεται η πρόσβαση. Αιτία: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
-msgstr ""
+msgstr "Η αυτόματη προώθηση είναι απενεργοποιημένη"
#: src/client/game.cpp
msgid "Automatic forward enabled"
-msgstr ""
+msgstr "Η αυτόματη προώθηση είναι ενεργοποιημένη"
#: src/client/game.cpp
msgid "Block bounds hidden"
-msgstr ""
+msgstr "Αποκλεισμός ορίων κρυφά"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
-msgstr ""
+msgstr "Τα όρια μπλοκ εμφανίζονται για όλα τα μπλοκ"
#: src/client/game.cpp
msgid "Block bounds shown for current block"
-msgstr ""
+msgstr "Εμφανίζονται όρια αποκλεισμού για το τρέχον μπλοκ"
#: src/client/game.cpp
msgid "Block bounds shown for nearby blocks"
-msgstr ""
+msgstr "Εμφανίζονται όρια αποκλεισμού για κοντινά μπλοκ"
#: src/client/game.cpp
msgid "Camera update disabled"
-msgstr ""
+msgstr "Η ενημέρωση κάμερας απενεργοποιήθηκε"
#: src/client/game.cpp
msgid "Camera update enabled"
-msgstr ""
+msgstr "Η ενημέρωση κάμερας ενεργοποιήθηκε"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
+"Δεν είναι δυνατή η εμφάνιση ορίων μπλοκ (χρειάζεται το δικαίωμα "
+"\"basic_debug\")"
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+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"
-msgstr ""
+msgstr "Ο πελάτης αποσυνδέθηκε"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
-msgstr ""
+msgstr "Η δέσμη ενεργειών από την πλευρά του πελάτη είναι απενεργοποιημένη"
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "Σύνδεση με διακομιστή..."
#: src/client/game.cpp
msgid "Connection failed for unknown reason"
-msgstr ""
+msgstr "Η σύνδεση απέτυχε για άγνωστο λόγο"
#: src/client/game.cpp
msgid "Continue"
@@ -1315,31 +1416,47 @@ msgid ""
"- Mouse wheel: select item\n"
"- %s: chat\n"
msgstr ""
+"Στοιχεία ελέγχου:\n"
+"- %s: κίνηση προς τα εμπρός\n"
+"- %s: κίνηση προς τα πίσω\n"
+"- %s: κίνηση αριστερά\n"
+"- %s: κίνηση δεξιά\n"
+"- %s: άλμα/σκαρφάλωμα\n"
+"- %s: σκάψιμο/διάτρηση\n"
+"- %s: τοποθέτηση/χρήση\n"
+"- %s: ολίσθηση/κατέβασμα\n"
+"- %s: απόθεση αντικειμένου\n"
+"- %s: αποθέματα\n"
+"- Ποντίκι: στροφή/παρακολούθηση\n"
+"- Τροχός ποντικιού: επιλογή στοιχείου\n"
+"- %s: συνομιλία\n"
#: src/client/game.cpp
#, c-format
msgid "Couldn't resolve address: %s"
-msgstr ""
+msgstr "Δεν ήταν δυνατή η επίλυση της διεύθυνσης: %s"
#: src/client/game.cpp
msgid "Creating client..."
-msgstr ""
+msgstr "Δημιουργία πελάτη..."
#: src/client/game.cpp
msgid "Creating server..."
-msgstr ""
+msgstr "Δημιουργία διακομιστή..."
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
-msgstr ""
+msgstr "Κρυφές πληροφορίες εντοπισμού σφαλμάτων και γράφημα προφίλ"
#: src/client/game.cpp
msgid "Debug info shown"
-msgstr ""
+msgstr "Εμφάνιση πληροφοριών εντοπισμού σφαλμάτων"
#: src/client/game.cpp
+#, fuzzy
msgid "Debug info, profiler graph, and wireframe hidden"
msgstr ""
+"Απόκρυψη πληροφοριών εντοπισμού σφαλμάτων, γραφήματος προφίλ και wireframe"
#: src/client/game.cpp
msgid ""
@@ -1356,14 +1473,31 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
+"Προεπιλεγμένα στοιχεία ελέγχου:\n"
+"Δεν εμφανίζεται μενού:\n"
+"- ένα πάτημα: κουμπί ενεργοποίησης\n"
+"- διπλό πάτημα: θέση/χρήση\n"
+"- σύρσιμο δαχτύλου: παρακολούθηση γύρω\n"
+"Ορατό μενού/απόθεμα:\n"
+"- διπλό πάτημα (εξωτερικό):\n"
+" -->κλείσιμο\n"
+"- στοίβα αφής, υποδοχή αφής:\n"
+" --> μετακίνηση στοίβας\n"
+"- άγγιγμα & σύρσιμο, πάτημα του 2ου δαχτύλου\n"
+" --> τοποθέτηση μεμονωμένου αντικειμένου στην υποδοχή\n"
#: src/client/game.cpp
msgid "Disabled unlimited viewing range"
-msgstr ""
+msgstr "Απενεργοποιημένο το απεριόριστο εύρος προβολής"
#: src/client/game.cpp
msgid "Enabled unlimited viewing range"
-msgstr ""
+msgstr "Ενεργοποιημένο το απεριόριστο εύρος προβολής"
+
+#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Δημιουργία πελάτη..."
#: src/client/game.cpp
msgid "Exit to Menu"
@@ -1375,35 +1509,37 @@ msgstr "Έξοδος στο ΛΣ"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr ""
+msgstr "Γρήγορη λειτουργία απενεργοποιημένη"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr ""
+msgstr "Γρήγορη λειτουργία ενεργοποιημένη"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
msgstr ""
+"Γρήγορη λειτουργία ενεργοποιημένη (σημείωση: δεν υπάρχει προνόμιο \"fast\")"
#: src/client/game.cpp
msgid "Fly mode disabled"
-msgstr ""
+msgstr "Λειτουργία πτήσης απενεργοποιημένη"
#: src/client/game.cpp
msgid "Fly mode enabled"
-msgstr ""
+msgstr "Λειτουργία πτήσης ενεργοποιημένη"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
msgstr ""
+"Λειτουργία πτήσης ενεργοποιημένη (σημείωση: δεν υπάρχει προνόμιο \"fly\")"
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr ""
+msgstr "Η ομίχλη απενεργοποιήθηκε"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr ""
+msgstr "Η ομίχλη ενεργοποιήθηκε"
#: src/client/game.cpp
msgid "Game info:"
@@ -1411,15 +1547,15 @@ msgstr "Πληροφορίες Παιχνιδιού:"
#: src/client/game.cpp
msgid "Game paused"
-msgstr ""
+msgstr "Το παιχνίδι διακόπηκε"
#: src/client/game.cpp
msgid "Hosting server"
-msgstr ""
+msgstr "Διακομιστής Φιλοξενίας"
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Ορισμοί στοιχείων..."
#: src/client/game.cpp
msgid "KiB/s"
@@ -1439,7 +1575,7 @@ msgstr ""
#: src/client/game.cpp
msgid "Multiplayer"
-msgstr ""
+msgstr "Πολλοί παίκτες"
#: src/client/game.cpp
msgid "Noclip mode disabled"
@@ -1479,15 +1615,15 @@ msgstr ""
#: src/client/game.cpp
msgid "Remote server"
-msgstr ""
+msgstr "Απομακρυσμένος διακομιστής"
#: src/client/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "Επίλυση διεύθυνσης..."
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "Τερματισμός Λειτουργίας..."
#: src/client/game.cpp
msgid "Singleplayer"
@@ -1503,11 +1639,11 @@ msgstr "Σίγαση Ήχου"
#: src/client/game.cpp
msgid "Sound system is disabled"
-msgstr ""
+msgstr "Το Σύστημα Ήχου είναι απενεργοποιημένο"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr ""
+msgstr "Το Σύστημα Ήχου δεν υποστηρίζεται σε αυτή την έκδοση"
#: src/client/game.cpp
msgid "Sound unmuted"
@@ -1516,37 +1652,39 @@ msgstr ""
#: src/client/game.cpp
#, c-format
msgid "The server is probably running a different version of %s."
-msgstr ""
+msgstr "Ο διακομιστής πιθανότατα εκτελεί διαφορετική έκδοση του %s."
#: src/client/game.cpp
#, c-format
msgid "Unable to connect to %s because IPv6 is disabled"
msgstr ""
+"Δεν είναι δυνατή η σύνδεση στο %s επειδή το IPv6 είναι απενεργοποιημένο"
#: src/client/game.cpp
#, c-format
msgid "Unable to listen on %s because IPv6 is disabled"
msgstr ""
+"Δεν είναι δυνατή η ακρόαση στο %s επειδή το IPv6 είναι απενεργοποιημένο"
#: src/client/game.cpp
#, c-format
msgid "Viewing range changed to %d"
-msgstr ""
+msgstr "Το εύρος προβολής άλλαξε σε %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at maximum: %d"
-msgstr ""
+msgstr "Το εύρος προβολής πρέπει να είναι έως: %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at minimum: %d"
-msgstr ""
+msgstr "Το εύρος προβολής πρέπει να είναι τουλάχιστον: %d"
#: src/client/game.cpp
#, c-format
msgid "Volume changed to %d%%"
-msgstr ""
+msgstr "Η ένταση άλλαξε σε %d%%"
#: src/client/game.cpp
msgid "Wireframe shown"
@@ -1554,7 +1692,7 @@ msgstr ""
#: src/client/game.cpp
msgid "Zoom currently disabled by game or mod"
-msgstr ""
+msgstr "Το ζουμ είναι απενεργοποιημένο από το παιχνίδι ή την τροποποίηση"
#: src/client/game.cpp
msgid "ok"
@@ -1562,11 +1700,11 @@ msgstr ""
#: src/client/gameui.cpp
msgid "Chat hidden"
-msgstr ""
+msgstr "Συνομιλία κρυφή"
#: src/client/gameui.cpp
msgid "Chat shown"
-msgstr ""
+msgstr "Συνομιλία εμφανής"
#: src/client/gameui.cpp
msgid "HUD hidden"
@@ -1623,7 +1761,7 @@ msgstr "Βοήθεια"
#: src/client/keycode.cpp
msgid "Home"
-msgstr ""
+msgstr "Σπίτι"
#: src/client/keycode.cpp
msgid "IME Accept"
@@ -1688,63 +1826,63 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Numpad *"
-msgstr "Numpad *"
+msgstr "Αριθμητικό Πληκτρολόγιο *"
#: src/client/keycode.cpp
msgid "Numpad +"
-msgstr "Numpad +"
+msgstr "Αριθμητικό Πληκτρολόγιο +"
#: src/client/keycode.cpp
msgid "Numpad -"
-msgstr "Numpad -"
+msgstr "Αριθμητικό Πληκτρολόγιο -"
#: src/client/keycode.cpp
msgid "Numpad ."
-msgstr "Numpad ."
+msgstr "Αριθμητικό Πληκτρολόγιο ."
#: src/client/keycode.cpp
msgid "Numpad /"
-msgstr "Numpad /"
+msgstr "Αριθμητικό Πληκτρολόγιο /"
#: src/client/keycode.cpp
msgid "Numpad 0"
-msgstr "Numpad 0"
+msgstr "Αριθμητικό Πληκτρολόγιο 0"
#: src/client/keycode.cpp
msgid "Numpad 1"
-msgstr "Numpad 1"
+msgstr "Αριθμητικό Πληκτρολόγιο 1"
#: src/client/keycode.cpp
msgid "Numpad 2"
-msgstr "Numpad 2"
+msgstr "Αριθμητικό Πληκτρολόγιο 2"
#: src/client/keycode.cpp
msgid "Numpad 3"
-msgstr "Numpad 3"
+msgstr "Αριθμητικό Πληκτρολόγιο 3"
#: src/client/keycode.cpp
msgid "Numpad 4"
-msgstr "Numpad 4"
+msgstr "Αριθμητικό Πληκτρολόγιο 4"
#: src/client/keycode.cpp
msgid "Numpad 5"
-msgstr "Numpad 5"
+msgstr "Αριθμητικό Πληκτρολόγιο 5"
#: src/client/keycode.cpp
msgid "Numpad 6"
-msgstr "Numpad 6"
+msgstr "Αριθμητικό Πληκτρολόγιο 6"
#: src/client/keycode.cpp
msgid "Numpad 7"
-msgstr "Numpad 7"
+msgstr "Αριθμητικό Πληκτρολόγιο 7"
#: src/client/keycode.cpp
msgid "Numpad 8"
-msgstr "Numpad 8"
+msgstr "Αριθμητικό Πληκτρολόγιο 8"
#: src/client/keycode.cpp
msgid "Numpad 9"
-msgstr "Numpad 9"
+msgstr "Αριθμητικό Πληκτρολόγιο 9"
#: src/client/keycode.cpp
msgid "OEM Clear"
@@ -1870,24 +2008,6 @@ msgstr ""
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr ""
@@ -1920,7 +2040,7 @@ msgstr ""
msgid "Change camera"
msgstr ""
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr ""
@@ -1973,7 +2093,7 @@ msgid "Key already in use"
msgstr "Το πλήκτρο ήδη χρησιμοποιείται"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -2045,10 +2165,6 @@ msgid "Change"
msgstr "Αλλαγή"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Επιβεβαίωση Κωδικού"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Νέος Κωδικός"
@@ -2056,6 +2172,10 @@ msgstr "Νέος Κωδικός"
msgid "Old Password"
msgstr "Παλιός Κωδικός"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr ""
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Έξοδος"
@@ -2065,15 +2185,9 @@ msgid "Muted"
msgstr "Σε σίγαση"
#: src/gui/guiVolumeChange.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Sound Volume: %d%%"
-msgstr "Ένταση ήχου: "
-
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
+msgstr "Sound Volume: %d%%"
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
@@ -2082,6 +2196,16 @@ msgstr ""
msgid "LANG_CODE"
msgstr "el"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Παρακαλώ επιλέξτε ένα όνομα!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2207,6 +2331,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2288,6 +2416,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Όνομα κόσμου"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Για προχωρημένους"
@@ -2301,7 +2434,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2370,6 +2503,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2410,10 +2547,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Βασικό"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2434,7 +2567,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2446,6 +2579,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2470,6 +2607,10 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Camera"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2544,9 +2685,8 @@ msgid "Chat command time message threshold"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat commands"
-msgstr "Εντολή"
+msgstr "Εντολές Συνομιλίας"
#: src/settings_translation_file.cpp
msgid "Chat font size"
@@ -2627,6 +2767,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2722,6 +2866,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2755,7 +2903,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2822,11 +2972,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2969,6 +3119,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Διακοσμήσεις"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -2989,6 +3144,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3058,6 +3219,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3074,19 +3239,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3160,6 +3319,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3178,6 +3341,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3255,7 +3422,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
+msgid "Filtering and Antialiasing"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3323,6 +3490,11 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Μέγεθος γραμματοσειράς"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3471,6 +3643,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Παιχνίδια"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3498,6 +3683,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Βαρύτητα"
@@ -3514,7 +3707,11 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3754,11 +3951,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3819,6 +4023,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3840,7 +4050,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3880,10 +4092,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3934,15 +4142,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4563,6 +4767,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4618,7 +4826,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4628,15 +4836,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4648,7 +4859,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4676,6 +4888,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Απαλός Φωτισμός"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5060,10 +5277,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5112,6 +5325,19 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Ασφάλεια"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5198,16 +5424,17 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Δίκτυο"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Δίκτυο"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5220,6 +5447,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Επισήμανση Στοιχείων"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5257,10 +5489,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5354,10 +5582,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Όνομα παίκτη"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5404,10 +5628,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5576,6 +5796,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Οθόνη:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5603,6 +5828,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Στιγμιότυπο οθόνης"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5615,10 +5845,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Ασφάλεια"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5658,8 +5884,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "URL διακομιστή"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Όνομα διακομιστή"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Περιγραφή Διακομιστή"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5686,10 +5923,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Θήρα Διακομιστή"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5700,12 +5946,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5713,7 +5961,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5789,7 +6037,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5989,6 +6237,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Ρυθμίσεις"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6191,7 +6444,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6215,10 +6468,19 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Πλήρης οθόνη"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6309,6 +6571,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6542,6 +6808,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6631,6 +6906,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6640,14 +6919,29 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
-msgstr ""
+msgstr "Παράλληλο όριο cURL"
#~ msgid "Address / Port"
#~ msgstr "Διεύθυνση / Θήρα"
+#~ msgid "Basic"
+#~ msgstr "Βασικό"
+
+#~ msgid "Connect"
+#~ msgstr "Σύνδεση"
+
#~ msgid "Credits"
#~ msgstr "Μνείες"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Κατέβασε ένα παιχνίδι, όπως το Minetest Game, από το minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Κατέβασε ένα από το minetest.net"
+
+#~ msgid "Game"
+#~ msgstr "Παιχνίδι"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Εγκατάσταση: αρχείο: \"$1\""
@@ -6657,6 +6951,9 @@ msgstr ""
#~ msgid "Ok"
#~ msgstr "Οκ"
+#~ msgid "Player name"
+#~ msgstr "Όνομα παίκτη"
+
#~ msgid "Special key"
#~ msgstr "Ειδικό πλήκτρο"
diff --git a/po/eo/minetest.po b/po/eo/minetest.po
index cbb13b904..73de3a5f1 100644
--- a/po/eo/minetest.po
+++ b/po/eo/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Esperanto (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2021-10-05 08:09+0000\n"
"Last-Translator: phlostically <phlostically@mailinator.com>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/minetest/"
@@ -114,6 +114,31 @@ msgid "The server has requested a reconnect:"
msgstr "La servilo petis rekonekton:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Elektu Modifaĵojn"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokola versia miskongruo. "
@@ -126,6 +151,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "La servilo subtenas protokolajn versiojn inter $1 kaj $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Ni nur subtenas protokolan version $1."
@@ -133,14 +162,21 @@ msgstr "Ni nur subtenas protokolan version $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Ni subtenas protokolajn versiojn inter versioj $1 kaj $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Nuligi"
@@ -279,7 +315,6 @@ msgid "Failed to download $1"
msgstr "Malsukcesis elŝuti $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Ludoj"
@@ -301,7 +336,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Instalo: Nesubtenata dosierspeco «$1» aŭ rompita arĥivo"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Modifaĵoj"
@@ -394,12 +428,9 @@ msgid "Decorations"
msgstr "Ornamoj"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Elŝuti ludon, ekzemple minetest_game, el minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Elŝutu ludon el minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Averto: La programista testo estas intencita por programistoj."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -417,10 +448,6 @@ msgstr "Flugantaj teramasoj en la ĉielo"
msgid "Floatlands (experimental)"
msgstr "Fluginsuloj (eksperimentaj)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Ludo"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Estigi nefraktalan terenon: oceano kaj subtero"
@@ -438,6 +465,15 @@ msgid "Increases humidity around rivers"
msgstr "Plialtigas malsekecon ĉirkaŭ riveroj"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Instali $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Lagoj"
@@ -540,10 +576,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Tre grandaj kavernoj profunde subtere"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Averto: La programista testo estas intencita por programistoj."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nomo de mondo"
@@ -573,6 +605,39 @@ msgstr "pkgmgr: malvalida dosiervojo «$1»"
msgid "Delete World \"$1\"?"
msgstr "Ĉu forigi mondon «$1»?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Konfirmi pasvorton"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Nomo de mondestigilo"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nomo"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Pasvorto"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Pasvortoj ne kongruas!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Registriĝi kaj aliĝi"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Akcepti"
@@ -605,6 +670,16 @@ msgstr "< Reiri al agorda paĝo"
msgid "Browse"
msgstr "Foliumi"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Enhavo"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Enhavo"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Malŝaltita"
@@ -662,7 +737,7 @@ msgstr "Elekti dosierujon"
msgid "Select file"
msgstr "Elekti dosieron"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Montri teĥnikajn nomojn"
@@ -811,6 +886,11 @@ msgstr "Eksaj kontribuistoj"
msgid "Previous Core Developers"
msgstr "Eksaj kernprogramistoj"
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Montri erarserĉajn informojn"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Foliumi enretan enhavon"
@@ -879,10 +959,6 @@ msgstr "Gastigi servilon"
msgid "Install games from ContentDB"
msgstr "Instali ludojn de ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nomo"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nova"
@@ -891,10 +967,6 @@ msgstr "Nova"
msgid "No world created or selected!"
msgstr "Neniu mondo estas kreita aŭ elektita!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Pasvorto"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Ludi"
@@ -928,10 +1000,6 @@ msgid "Clear"
msgstr "Vakigo"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Konekti"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Krea reĝimo"
@@ -942,10 +1010,6 @@ msgid "Damage / PvP"
msgstr "Difekto"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Forigi ŝataton"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "Ŝati"
@@ -959,6 +1023,10 @@ msgid "Join Game"
msgstr "Aliĝi al ludo"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Retprokrasto"
@@ -971,10 +1039,19 @@ msgid "Refresh"
msgstr "Reŝargi"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Fora pordo"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Priskribo pri servilo"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2×"
@@ -1019,7 +1096,8 @@ msgid "Dynamic shadows"
msgstr "Dinamikaj ombroj"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Dinamikaj ombroj: "
#: builtin/mainmenu/tab_settings.lua
@@ -1115,7 +1193,8 @@ msgid "Tone Mapping"
msgstr "Nuanca mapado"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Tuŝa sojlo: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1123,7 +1202,8 @@ msgid "Trilinear Filter"
msgstr "Trilineara filtrilo"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Altega"
#: builtin/mainmenu/tab_settings.lua
@@ -1142,6 +1222,11 @@ msgstr "Ondantaj fluaĵoj"
msgid "Waving Plants"
msgstr "Ondantaj plantoj"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Konekta eraro (ĉu eltempiĝo?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Konekto eltempiĝis."
@@ -1279,7 +1364,7 @@ msgid "Camera update enabled"
msgstr "Ĝisdatigo de vidpunkto ŝaltita"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1410,6 +1495,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Ŝaltis senliman vidodistancon"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Kreante klienton…"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Eliri al menuo"
@@ -1915,28 +2005,6 @@ msgstr "Malsukcesis elŝuti $1"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Pasvortoj ne kongruas!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registriĝi kaj aliĝi"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Vi estas aliĝonta al ĉi tiu servilo kun la nomo «%s» unuafoje.\n"
-"Se vi pluigos, nova konto kun viaj salutiloj registriĝos ĉe la servilo.\n"
-"Bonvolu retajpi vian pasvorton kaj klaki al «Registriĝi kaj aliĝi» por "
-"konfirmi kreon de konto, aŭ al «Nuligi» por ĉesigi."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Daŭrigi"
@@ -1970,7 +2038,7 @@ msgstr ""
msgid "Change camera"
msgstr "Ŝanĝi vidpunkton"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Babilo"
@@ -2023,9 +2091,8 @@ msgid "Key already in use"
msgstr "Klavo jam estas uzata"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Klavagordoj. (Se tiu menuo misfunkcias, forigu agordojn el minetest.conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2096,10 +2163,6 @@ msgid "Change"
msgstr "Ŝanĝi"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Konfirmi pasvorton"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nova pasvorto"
@@ -2107,6 +2170,10 @@ msgstr "Nova pasvorto"
msgid "Old Password"
msgstr "Malnova pasvorto"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Pasvortoj ne kongruas!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Foriri"
@@ -2120,12 +2187,6 @@ msgstr "Silentigita"
msgid "Sound Volume: %d%%"
msgstr "Laŭteco: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Enigi "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2133,6 +2194,16 @@ msgstr "Enigi "
msgid "LANG_CODE"
msgstr "eo"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Bonvolu elekti nomon!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2298,6 +2369,10 @@ msgstr ""
"Rimarku, ke la reĝimo «interlaced» postulas ŝaltitajn ombrigilojn."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2391,6 +2466,11 @@ msgstr ""
"kontrolu certige) kreas solidan tavolon de fluginsulaĵo."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Almeti nomon de portaĵo"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Specialaj"
@@ -2409,7 +2489,8 @@ msgstr ""
"tre malmulte efikas sur natura noktlumo."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Ĉiam en fluga kaj rapida reĝimoj"
#: src/settings_translation_file.cpp
@@ -2488,6 +2569,10 @@ msgstr ""
"Donita en mondopecoj (16 monderoj)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Memage antaŭen"
@@ -2530,10 +2615,6 @@ msgid "Base terrain height."
msgstr "Baza alteco de tereno."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Baza"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Bazaj rajtoj"
@@ -2554,7 +2635,8 @@ msgid "Bind address"
msgstr "Bindi adreson"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Parametroj de varmeco kaj sekeco por Klimata API"
#: src/settings_translation_file.cpp
@@ -2566,6 +2648,10 @@ msgid "Block send optimize distance"
msgstr "Optimuma distanco de monder-sendado"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Dosierindiko al egrasa kaj kursiva tiparo"
@@ -2590,6 +2676,11 @@ msgid "Builtin"
msgstr "Primitivaĵo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Ŝanĝi vidpunkton"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2756,6 +2847,11 @@ msgid "Client side node lookup range restriction"
msgstr "Limigoj de amplekso por klientflanka serĉado de monderoj"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Klienta modifado"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Suprenira rapido"
@@ -2881,6 +2977,11 @@ msgid "Console height"
msgstr "Alteco de konzolo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Enreta deponejo de enhavo"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Malpermesitaj flagoj de ContentDB"
@@ -2919,8 +3020,10 @@ msgstr ""
"72 = 20 minutoj, 360 = 4 minutoj, 1 = 24 horoj, 0 = restadas senŝanĝe."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Regas rapidon de profundiĝo en fluaĵoj."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2994,12 +3097,12 @@ msgid "Debug log level"
msgstr "Erarserĉa protokola nivelo"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Mallaŭtiga klavo"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Malpliigu ĉi tion por pliigi reziston de fluaĵoj al movo."
+msgid "Dec. volume key"
+msgstr "Mallaŭtiga klavo"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3154,6 +3257,11 @@ msgid "Desynchronize block animation"
msgstr "Malsamtempigi bildmovon de monderoj"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Ornamoj"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Klavo por fosi"
@@ -3174,6 +3282,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Domajna nomo de servilo montrota en la listo de serviloj."
@@ -3247,6 +3361,10 @@ msgid "Enable joysticks"
msgstr "Ŝalti stirstangojn"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Ŝalti subtenon de modifaĵaj kanaloj."
@@ -3263,18 +3381,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Ŝalti hazardan uzulan enigon (nur por testado)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Ŝalti konfirmon de registriĝo"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Ŝalti konfirmon de registriĝo dum konekto al servilo.\n"
-"Se ĝi estas malŝaltita, nova konto registriĝos memage."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3283,6 +3389,10 @@ msgstr ""
"Malŝaltu por rapido aŭ alia aspekto."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3375,6 +3485,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Profilo de valoj"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Intervalo inter presoj de profilaj datenoj de la motoro"
@@ -3400,6 +3515,10 @@ msgstr ""
"pli plataj malaltejoj, taŭgaj por solida tavolo de fluginsulaĵo."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "Maksimuma nombro de kadroj en sekundo dum paŭzo aŭ sen fokuso"
@@ -3489,8 +3608,9 @@ msgstr ""
"tion dum legado de teksturoj."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtrado"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Glatigo:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3558,6 +3678,11 @@ msgid "Fog toggle key"
msgstr "Nebula baskula klavo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Tipara grandeco"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Implice grasa tiparo"
@@ -3721,6 +3846,19 @@ msgid "GUI scaling filter txr2img"
msgstr "Skala filtrilo de grafika interfaco txr2img"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Ludoj"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Mallokaj revokoj"
@@ -3757,6 +3895,16 @@ msgid "Graphics"
msgstr "Grafiko"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafiko"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafiko"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Pezforto"
@@ -3773,8 +3921,13 @@ msgid "HTTP mods"
msgstr "HTTP-modifaĵoj"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Skala koeficiento por travida fasado"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Skalo de grafika fasado"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4030,14 +4183,23 @@ msgstr ""
"Bezonas ŝaltitajn ondantajn fluaĵojn."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Kioman tempon la servilo atendos antaŭ delasi neuzatajn mondopecojn.\n"
"Pli alta valoro estas pli glata, sed uzos pli da tujmemoro."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Malpliigu ĉi tion por pliigi reziston de fluaĵoj al movo."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Kiel larĝajn fari riverojn."
@@ -4110,6 +4272,15 @@ msgstr ""
"Ŝaltite, klavo «uzi» estas uzata anstataŭ klavo «kaŝiri» por malsupreniro."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Ŝalti konfirmon de registriĝo dum konekto al servilo.\n"
+"Se ĝi estas malŝaltita, nova konto registriĝos memage."
+
+#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
@@ -4138,7 +4309,10 @@ msgstr ""
"rigardo dum flugado aŭ naĝado."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr "Malebligas konekton kun malplena pasvorto."
#: src/settings_translation_file.cpp
@@ -4187,10 +4361,6 @@ msgid "Ignore world errors"
msgstr "Malatenti mondajn erarojn"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Lude"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Travidebleco de enluda babila konzolo (maltravidebleco, inter 0 kaj 255)."
@@ -4249,15 +4419,12 @@ msgid "Instrument the methods of entities on registration."
msgstr "Ekzameni la metodojn de estoj je registriĝo."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Ekzamenado"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "Periodo inter konservo de gravaj ŝanĝoj en la mondo, sekunde."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Periodo inter sendoj de tagtempo al klientoj."
#: src/settings_translation_file.cpp
@@ -5117,6 +5284,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr "Forpeli ludantojn, kiuj sendis pli ol X mesaĝojn en 10 sekundoj."
@@ -5173,10 +5344,11 @@ msgid "Left key"
msgstr "Maldekstra klavo"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Longeco de servila agociklo, kaj la intervalo dum kiu objektoj ĝenerale "
"ĝisdatiĝas\n"
@@ -5191,18 +5363,25 @@ msgstr ""
"Bezonas ondantajn fluaĵojn."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Tempodaŭro inter rulaj cikloj de Aktiva Modifilo de Monderoj (AMM)"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Tempodaŭro inter rulaj cikloj de NodeTimer"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Daŭro inter cikloj de aktiva administrado de monderoj"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5211,7 +5390,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Nivelo de protokolado skribota al debug.txt:\n"
"- <nenio> (nenio protokoliĝas)\n"
@@ -5247,6 +5427,11 @@ msgid "Light curve low gradient"
msgstr "Malalta transiro de luma kurbo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Glata lumado"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5692,10 +5877,6 @@ msgid "Maximum users"
msgstr "Maksimuma nombro da uzantoj"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menuoj"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Maŝa kaŝmemoro"
@@ -5744,6 +5925,20 @@ msgid "Mipmapping"
msgstr "Etmapigo"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Profililo"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Sekureco"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Kanaloj por modifaĵoj"
@@ -5842,10 +6037,6 @@ msgid "Near plane"
msgstr "Proksima ebeno"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Reto"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5854,6 +6045,11 @@ msgstr ""
"Komencante de la ĉefmenuo, ĉi tio estos transpasita."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Reto"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Novaj uzantoj devas enigi ĉi tiun pasvorton."
@@ -5866,6 +6062,11 @@ msgid "Noclip key"
msgstr "Trapasa klavo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Emfazado de monderoj"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Emfazado de monderoj"
@@ -5920,10 +6121,6 @@ msgstr ""
"kaj uzon de memoro (4096=100MB, proksimume)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Enreta deponejo de enhavo"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Netralumeblaj fluidoj"
@@ -6046,10 +6243,6 @@ msgstr ""
"Bezonas la rajton «flugi» je la servilo."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Nomo de ludanto"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Distanco por transsendo de ludantoj"
@@ -6104,10 +6297,6 @@ msgid "Profiler toggle key"
msgstr "Profilila baskula klavo"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Profilado"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Aŭskulta adreso de Prometheus"
@@ -6300,6 +6489,11 @@ msgstr ""
"per neentejraj kvantoj."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Ekrano:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Alteco de ekrano"
@@ -6330,6 +6524,11 @@ msgstr ""
"Uzu 0 por implicita kvalito."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Ekrankopio"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Bruo de marfundo"
@@ -6343,10 +6542,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Dua el la du 3d-aj bruoj, kiuj kune difinas tunelojn."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Sekureco"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Vidu https://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6405,8 +6600,19 @@ msgstr ""
"18 = 4D «Mandelbulb» aro de Julia."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Servilo / Ludo por unu"
+#, fuzzy
+msgid "Server"
+msgstr "URL de servilo"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Nomo de servilo"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Priskribo pri servilo"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6433,10 +6639,20 @@ msgid "Server side occlusion culling"
msgstr "Servilflanka elektado de postkaŝitoj"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Servila pordo"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "URL de listo de publikaj serviloj"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "URL de listo de publikaj serviloj"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Dosiero kun listo de serviloj"
@@ -6449,13 +6665,16 @@ msgstr ""
"Rerulo necesas post la ŝanĝo."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
"Agordi maksimuman longon de babilaj mesaĝoj (en signoj) sendotaj de klientoj."
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -6463,7 +6682,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6554,7 +6773,8 @@ msgstr ""
"Deŝovo de ombro de la norma tiparo. Se ĝi estas 0, la ombro ne desegniĝos."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+#, fuzzy
+msgid "Shadow strength gamma"
msgstr "Forto de ombro"
#: src/settings_translation_file.cpp
@@ -6793,6 +7013,11 @@ msgid "Temperature variation for biomes."
msgstr "Varmeca diverseco por klimatoj."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Agordoj"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Alternativa bruo de tereno"
@@ -7055,7 +7280,8 @@ msgid "Time speed"
msgstr "Rapido de tempo"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, fuzzy
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr "Tempolimo por forigi neuzatajn mapajn datenojn de klienta memoro."
#: src/settings_translation_file.cpp
@@ -7083,10 +7309,19 @@ msgid "Touch screen threshold"
msgstr "Sojlo de tuŝekrano"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Sojlo de tuŝekrano"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Bruo de arboj"
@@ -7195,6 +7430,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Uzi trilinearan filtradon skalante teksturojn."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "Vertica bufrobjekto"
@@ -7471,6 +7710,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
"Ĉu montri erarserĉajn informojn de la kliento (efikas samkiel premo de F5)."
@@ -7578,6 +7826,10 @@ msgid "Y-level of seabed."
msgstr "Y-nivelo de marplanko."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Tempolimo de dosiere elŝuto de cURL"
@@ -7624,6 +7876,9 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Back"
#~ msgstr "Reeniri"
+#~ msgid "Basic"
+#~ msgstr "Baza"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bitoj bildere (aŭ kolornombro) en tutekrana reĝimo."
@@ -7654,6 +7909,12 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Configure"
#~ msgstr "Agordi"
+#~ msgid "Connect"
+#~ msgstr "Konekti"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Regas rapidon de profundiĝo en fluaĵoj."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7699,6 +7960,9 @@ msgstr "Samtempa limo de cURL"
#~ "Difinas glatigan paŝon de teksturoj.\n"
#~ "Pli alta valoro signifas pli glatajn normalmapojn."
+#~ msgid "Del. Favorite"
+#~ msgstr "Forigi ŝataton"
+
#~ msgid ""
#~ "Deprecated, define and locate cave liquids using biome definitions "
#~ "instead.\n"
@@ -7708,12 +7972,21 @@ msgstr "Samtempa limo de cURL"
#~ "difinoj\n"
#~ "Y de supra limo de lafo en grandaj kavernoj."
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Elŝuti ludon, ekzemple minetest_game, el minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Elŝutu ludon el minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Elŝutante kaj instalante $1, bonvolu atendi…"
#~ msgid "Enable VBO"
#~ msgstr "Ŝalti VBO(Vertex Buffer Object)"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Ŝalti konfirmon de registriĝo"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7739,6 +8012,9 @@ msgstr "Samtempa limo de cURL"
#~ "Ŝaltas mapadon de paralaksa ombrigo.\n"
#~ "Bezonas ŝaltitajn ombrigilojn."
+#~ msgid "Enter "
+#~ msgstr "Enigi "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7758,6 +8034,9 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Fallback font size"
#~ msgstr "Grando de reenpaŝa tiparo"
+#~ msgid "Filtering"
+#~ msgstr "Filtrado"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Bruo de baza alteco de fluginsuloj"
@@ -7776,6 +8055,9 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Full screen BPP"
#~ msgstr "Kolornombro tutekrane"
+#~ msgid "Game"
+#~ msgstr "Ludo"
+
#~ msgid "Gamma"
#~ msgstr "Helĝustigo"
@@ -7785,15 +8067,29 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Generate normalmaps"
#~ msgstr "Estigi normalmapojn"
+#~ msgid "HUD scale factor"
+#~ msgstr "Skala koeficiento por travida fasado"
+
#~ msgid "High-precision FPU"
#~ msgstr "Preciza glitkoma datentraktilo (FPU)"
#~ msgid "IPv6 support."
#~ msgstr "Subteno de IPv6."
+#~ msgid "In-Game"
+#~ msgstr "Lude"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Instali: dosiero: «$1»"
+#~ msgid "Instrumentation"
+#~ msgstr "Ekzamenado"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Klavagordoj. (Se tiu menuo misfunkcias, forigu agordojn el minetest.conf)"
+
#~ msgid "Lava depth"
#~ msgstr "Lafo-profundeco"
@@ -7814,6 +8110,9 @@ msgstr "Samtempa limo de cURL"
#~ "Funkciigas programaron «DirectX» kun «LuaJIT». Malŝaltu okaze de "
#~ "problemoj."
+#~ msgid "Menus"
+#~ msgstr "Menuoj"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Mapeto en radara reĝimo, zomo ×2"
@@ -7887,6 +8186,12 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Path to save screenshots at."
#~ msgstr "Dosierindiko por konservi ekrankopiojn."
+#~ msgid "Player name"
+#~ msgstr "Nomo de ludanto"
+
+#~ msgid "Profiling"
+#~ msgstr "Profilado"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Planante forgeskelojn"
@@ -7899,6 +8204,9 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Select Package File:"
#~ msgstr "Elekti pakaĵan dosieron:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Servilo / Ludo por unu"
+
#~ msgid "Shadow limit"
#~ msgstr "Limo por ombroj"
@@ -7968,6 +8276,20 @@ msgstr "Samtempa limo de cURL"
#~ msgid "Yes"
#~ msgstr "Jes"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Vi estas aliĝonta al ĉi tiu servilo kun la nomo «%s» unuafoje.\n"
+#~ "Se vi pluigos, nova konto kun viaj salutiloj registriĝos ĉe la servilo.\n"
+#~ "Bonvolu retajpi vian pasvorton kaj klaki al «Registriĝi kaj aliĝi» por "
+#~ "konfirmi kreon de konto, aŭ al «Nuligi» por ĉesigi."
+
#~ msgid "You died."
#~ msgstr "Vi mortis."
diff --git a/po/es/minetest.po b/po/es/minetest.po
index c0248b97a..812e5945b 100644
--- a/po/es/minetest.po
+++ b/po/es/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Spanish (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-23 18:54+0000\n"
-"Last-Translator: rubenwardy <rw@rubenwardy.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-07-24 09:24+0000\n"
+"Last-Translator: Valentino <phamtomwhite@protonmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/minetest/"
"minetest/es/>\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 4.11-dev\n"
+"X-Generator: Weblate 4.14-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -115,6 +115,31 @@ msgid "The server has requested a reconnect:"
msgstr "El servidor ha solicitado una reconexión:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Selecciona Mods"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr "Más tarde"
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr "Nunca"
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "La versión del protocolo no coincide. "
@@ -127,6 +152,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "El servidor soporta versiones del protocolo entre $1 y $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr "Visitar el sitio web"
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Solo se soporta la versión de protocolo $1."
@@ -134,14 +163,22 @@ msgstr "Solo se soporta la versión de protocolo $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Nosotros soportamos versiones de protocolo entre la versión $1 y $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+#, fuzzy
+msgid "(Unsatisfied)"
+msgstr "(Insatisfecho)"
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Cancelar"
@@ -245,7 +282,7 @@ msgstr "$1 descargando..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr "$1 dependencias requeridas no se encuentran."
+msgstr "$1 dependencias requeridas no se encuentren."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
@@ -281,7 +318,6 @@ msgid "Failed to download $1"
msgstr "Fallo al descargar $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Juegos"
@@ -298,12 +334,10 @@ msgid "Install missing dependencies"
msgstr "Instalar dependencias faltantes"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install: Unsupported file type or broken archive"
-msgstr "Instalar: Formato de archivo \"$1\" no soportado o archivo corrupto"
+msgstr "Instalar: Formato de archivo no soportado o archivo corrupto"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -396,12 +430,10 @@ msgid "Decorations"
msgstr "Decoraciones"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Descarga un subjuego, como minetest_game, desde minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Descarga uno desde minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr ""
+"Advertencia: La prueba de desarrollo está destinada a los desarrolladores."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -419,10 +451,6 @@ msgstr "Tierras flotantes en el cielo"
msgid "Floatlands (experimental)"
msgstr "Tierras flotantes (experimental)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Juego"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Generar terreno no fractal: Oceanos y subterráneos"
@@ -440,6 +468,14 @@ msgid "Increases humidity around rivers"
msgstr "Incrementa humedad alrededor de los ríos"
#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install a game"
+msgstr "Instalar un juego"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Lagos"
@@ -543,11 +579,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Cavernas muy grandes en lo profundo del subsuelo"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-"Advertencia: La prueba de desarrollo está destinada a los desarrolladores."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nombre del mundo"
@@ -577,6 +608,38 @@ msgstr "pkgmgr: Ruta \"$1\" inválida"
msgid "Delete World \"$1\"?"
msgstr "¿Eliminar el mundo \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Confirmar contraseña"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Generador de mapas"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nombre"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Contraseña"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr "Las contraseñas no coinciden"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Registrarse y unirse"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Aceptar"
@@ -609,6 +672,14 @@ msgstr "< Volver a la página de configuración"
msgid "Browse"
msgstr "Explorar"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Games"
+msgstr "Contenido: Juegos"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Mods"
+msgstr "Contenido: Mods"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Desactivado"
@@ -640,7 +711,7 @@ msgstr "Persistencia"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr "Por favor, introduzca un entero válido."
+msgstr "Por favor, introduce un entero válido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
@@ -666,7 +737,7 @@ msgstr "Seleccionar carpeta"
msgid "Select file"
msgstr "Seleccionar archivo"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Mostrar los nombres técnicos"
@@ -817,6 +888,11 @@ msgstr "Antiguos colaboradores"
msgid "Previous Core Developers"
msgstr "Antiguos desarrolladores principales"
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Mostrar la informacion de la depuración"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Explorar contenido en línea"
@@ -885,10 +961,6 @@ msgstr "Hospedar servidor"
msgid "Install games from ContentDB"
msgstr "Instalar juegos desde ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nombre"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nuevo"
@@ -897,10 +969,6 @@ msgstr "Nuevo"
msgid "No world created or selected!"
msgstr "¡No se ha dado un nombre al mundo o no se ha seleccionado uno!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Contraseña"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Jugar juego"
@@ -934,10 +1002,6 @@ msgid "Clear"
msgstr "Limpiar"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Conectar"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Modo creativo"
@@ -947,10 +1011,6 @@ msgid "Damage / PvP"
msgstr "Daño / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Borrar Fav."
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Favoritos"
@@ -963,6 +1023,10 @@ msgid "Join Game"
msgstr "Unirse al juego"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -975,8 +1039,17 @@ msgid "Refresh"
msgstr "Actualizar"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Puerto remoto"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
-msgstr "Descripción del Servidor"
+msgstr "Descripción del servidor"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -1023,8 +1096,8 @@ msgid "Dynamic shadows"
msgstr "Sombras dinámicas"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr "Sombras dinámicas: "
+msgid "Dynamic shadows:"
+msgstr "Sombras dinámicas:"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -1068,7 +1141,7 @@ msgstr "Marcar nodos"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
-msgstr ""
+msgstr "Nada"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -1119,15 +1192,16 @@ msgid "Tone Mapping"
msgstr "Mapeado de tonos"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr "Umbral táctil: (px)"
+msgid "Touch threshold (px):"
+msgstr "Umbral táctil (px):"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr "Filtrado trilineal"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Ultra Alto"
#: builtin/mainmenu/tab_settings.lua
@@ -1146,6 +1220,11 @@ msgstr "Movimiento de líquidos"
msgid "Waving Plants"
msgstr "Movimiento de plantas"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Error de conexión (¿tiempo agotado?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Tiempo de espera de la conexión agotado."
@@ -1175,9 +1254,8 @@ msgid "Connection error (timed out?)"
msgstr "Error de conexión (¿tiempo agotado?)"
#: src/client/clientlauncher.cpp
-#, fuzzy
msgid "Could not find or load game: "
-msgstr "No se puede encontrar o cargar el juego \""
+msgstr "No se puede encontrar o cargar el juego: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -1250,7 +1328,7 @@ msgstr "Ha ocurrido un error:"
#: src/client/game.cpp
#, c-format
msgid "Access denied. Reason: %s"
-msgstr ""
+msgstr "Acceso denegado. Razón: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
@@ -1267,7 +1345,7 @@ msgstr "Límites de bloque"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
-msgstr ""
+msgstr "Límites de bloque mostrados para todos los bloques"
#: src/client/game.cpp
msgid "Block bounds shown for current block"
@@ -1286,12 +1364,12 @@ msgid "Camera update enabled"
msgstr "Actualización de la cámara activada"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "Cambiar Contraseña"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
@@ -1302,9 +1380,8 @@ msgid "Cinematic mode enabled"
msgstr "Modo cinematográfico activado"
#: src/client/game.cpp
-#, fuzzy
msgid "Client disconnected"
-msgstr "Customización del cliente"
+msgstr "El cliente se desconectó"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
@@ -1316,7 +1393,7 @@ msgstr "Conectando al servidor..."
#: src/client/game.cpp
msgid "Connection failed for unknown reason"
-msgstr ""
+msgstr "La conexión falló por razones desconocidas"
#: src/client/game.cpp
msgid "Continue"
@@ -1358,7 +1435,7 @@ msgstr ""
#: src/client/game.cpp
#, c-format
msgid "Couldn't resolve address: %s"
-msgstr ""
+msgstr "No se pudo resolver la dirección : %s"
#: src/client/game.cpp
msgid "Creating client..."
@@ -1417,6 +1494,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Rango de visión ilimitada activado"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Creando cliente..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Salir al menú"
@@ -1478,7 +1560,7 @@ msgstr "KiB/s"
#: src/client/game.cpp
msgid "Media..."
-msgstr "Media..."
+msgstr "Multimedia..."
#: src/client/game.cpp
msgid "MiB/s"
@@ -1567,12 +1649,12 @@ msgstr "Sonido no silenciado"
#: src/client/game.cpp
#, c-format
msgid "The server is probably running a different version of %s."
-msgstr ""
+msgstr "Este servidor probablemente use una versión diferente de %s."
#: src/client/game.cpp
#, c-format
msgid "Unable to connect to %s because IPv6 is disabled"
-msgstr ""
+msgstr "No se puede conectar a %s porque IPv6 esta"
#: src/client/game.cpp
#, c-format
@@ -1916,34 +1998,11 @@ msgstr "Minimapa en modo textura"
#: src/gui/guiChatConsole.cpp
#, fuzzy
msgid "Failed to open webpage"
-msgstr "Fallo al descargar $1"
+msgstr "Fallo al abrir la página web"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "¡Las contraseñas no coinciden!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registrarse y unirse"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Te vas unir al servidor con el nombre \"%s\" por primera vez.\n"
-"Cuando procedas, se creará una nueva cuenta en este servidor usando tus "
-"credenciales.\n"
-"Por favor, reescribe tu contraseña y haz clic en 'Registrarse y unirse' para "
-"confirmar la creación de la cuenta, o haz clic en 'Cancelar' para abortar."
+msgstr "Abriendo página web"
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
@@ -1977,7 +2036,7 @@ msgstr "Límites de bloque"
msgid "Change camera"
msgstr "Cambiar cámara"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Chat"
@@ -2030,10 +2089,8 @@ msgid "Key already in use"
msgstr "La tecla ya se está utilizando"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Combinaciones de teclas. (Si este menú da error, elimina líneas en minetest."
-"conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2104,10 +2161,6 @@ msgid "Change"
msgstr "Cambiar"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Confirmar contraseña"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Contraseña nueva"
@@ -2115,6 +2168,10 @@ msgstr "Contraseña nueva"
msgid "Old Password"
msgstr "Contraseña anterior"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "¡Las contraseñas no coinciden!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Cerrar"
@@ -2124,15 +2181,9 @@ msgid "Muted"
msgstr "Silenciado"
#: src/gui/guiVolumeChange.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Sound Volume: %d%%"
-msgstr "Volumen del sonido: "
-
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Ingresar "
+msgstr "Volumen del sonido: %d%%"
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
@@ -2141,6 +2192,16 @@ msgstr "Ingresar "
msgid "LANG_CODE"
msgstr "es"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "¡Por favor, elige un nombre!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2316,6 +2377,10 @@ msgstr ""
"Nota: el modo entrelazado requiere que los shaders estén activados."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2393,8 +2458,11 @@ msgstr ""
"sólo), por ejemplo para pantallas 4K."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Adjust the detected display density, used for scaling UI elements."
msgstr ""
+"Adjuste la densidad de visualización detectada, usada para escalar elementos "
+"de la interfaz."
#: src/settings_translation_file.cpp
#, c-format
@@ -2413,6 +2481,11 @@ msgstr ""
"siempre pruébelo para asegurarse) crea una isla flotante compacta."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Añadir nombre de objeto"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Avanzado"
@@ -2433,7 +2506,8 @@ msgstr ""
"tiene muy poco efecto en la luz natural nocturna."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Siempre volando y rápido"
#: src/settings_translation_file.cpp
@@ -2514,6 +2588,10 @@ msgstr ""
"Fijado en bloques de mapa (16 nodos)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Tecla de avance automático"
@@ -2523,7 +2601,7 @@ msgstr "Saltar obstáculos de un nodo automáticamente."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
-msgstr "Automáticamente informar a la lista del servidor."
+msgstr "Informar automáticamente a la lista del servidor."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
@@ -2554,10 +2632,6 @@ msgid "Base terrain height."
msgstr "Altura base del terreno."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Básico"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Privilegios básicos"
@@ -2578,7 +2652,8 @@ msgid "Bind address"
msgstr "Dirección BIND"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Parámetros de ruido y humedad en la API de temperatura de biomas"
#: src/settings_translation_file.cpp
@@ -2590,6 +2665,10 @@ msgid "Block send optimize distance"
msgstr "Optimizar la distancia del envío de bloques"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Ruta de la fuente en negrita y cursiva"
@@ -2614,6 +2693,11 @@ msgid "Builtin"
msgstr "Incorporado"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Cambiar cámara"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2781,6 +2865,11 @@ msgid "Client side node lookup range restriction"
msgstr "Restricción del rango de búsqueda del nodo del lado cliente"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Customización del cliente"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Velocidad de escalada"
@@ -2850,20 +2939,30 @@ msgid "Command key"
msgstr "Tecla comando"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Compression level to use when saving mapblocks to disk.\n"
"-1 - use default compression level\n"
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
+"Nivel de compresión a usar para guardar bloques del mapa al disco.\n"
+"-1 - usar compresión por defecto\n"
+"0 - menor compresión, más rápido\n"
+"9 - mejor compresión, más lento"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Compression level to use when sending mapblocks to the client.\n"
"-1 - use default compression level\n"
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
+"Nivel de compresión a usar cuando se envían bloques del mapa al cliente.\n"
+"-1 - usar nivel de compresión por defecto\n"
+"0 - menor compresión, más rápido\n"
+"9 - mejor compresión, más lento"
#: src/settings_translation_file.cpp
msgid "Connect glass"
@@ -2875,7 +2974,7 @@ msgstr "Conectar a un servidor media externo"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
-msgstr "Conectar gafas si el nodo lo soporta."
+msgstr "Conectar gafas si el nodo lo permite."
#: src/settings_translation_file.cpp
msgid "Console alpha"
@@ -2890,6 +2989,11 @@ msgid "Console height"
msgstr "Altura de consola"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Contenido del repositorio en linea"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Lista negra de Contenido de la Base de Datos"
@@ -2929,8 +3033,10 @@ msgstr ""
"inalterado."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Controla la velocidad de hundimiento en líquidos."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -3006,12 +3112,12 @@ msgid "Debug log level"
msgstr "Nivel de registro de depuración"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Dec. tecla de volumen"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Disminuya esto para aumentar la resistencia del líquido al movimiento."
+msgid "Dec. volume key"
+msgstr "Dec. tecla de volumen"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3055,6 +3161,9 @@ msgid ""
"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
"but also uses more resources."
msgstr ""
+"Define la calidad del filtro de sombras.\n"
+"Esto simula el efecto de sombras suaves aplicando un PCF o Poisson disk\n"
+"pero tambien utiliza más recursos."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
@@ -3072,7 +3181,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain."
-msgstr "Define is distribución del terreno alto."
+msgstr "Define la distribución del terreno alto."
#: src/settings_translation_file.cpp
msgid "Defines full size of caverns, smaller values create larger caverns."
@@ -3167,6 +3276,11 @@ msgid "Desynchronize block animation"
msgstr "Desincronizar la animación de los bloques"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Decoraciones"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Tecla Excavar"
@@ -3184,6 +3298,12 @@ msgstr "No permitir contraseñas vacías"
#: src/settings_translation_file.cpp
msgid "Display Density Scaling Factor"
+msgstr "Factor del Escalado de la Densidad de Visualización"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3236,15 +3356,14 @@ msgstr ""
"El soporte es experimental y la API puede cambiar."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Enable Poisson disk filtering.\n"
"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
"filtering."
msgstr ""
"Habilitar filtrado \"poisson disk\".\n"
-"Si el valor es \"verdadero\", utiliza \"poisson disk\" para proyectar "
-"sombras suaves. De otro modo utiliza filtrado PCF."
+"Si el valor es verdadero, utiliza \"poisson disk\" para proyectar sombras "
+"suaves. De otro modo utiliza filtrado PCF."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3269,6 +3388,10 @@ msgid "Enable joysticks"
msgstr "Activar joysticks"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Activar soporte para los canales de mods."
@@ -3285,18 +3408,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Habilitar entrada aleatoria (solo usar para pruebas)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Habilitar confirmación de registro"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Habilitar confirmación de registro al conectar al servidor\n"
-"Si esta deshabilitado, se registrará una nueva cuenta automáticamente."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3305,6 +3416,10 @@ msgstr ""
"Deshabilítalo para mayor velocidad o una vista diferente."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3397,6 +3512,15 @@ 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 ""
+"Habilita compensaciones que reducen la carga del procesador o aumentan el "
+"rendimiento de la renderizacion\n"
+"a cambio de pequeños errores visuales que no impactan a la jugabilidad del "
+"juego."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Perfilador"
#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
@@ -3426,6 +3550,10 @@ msgstr ""
"tierras bajas más planas, apropiada para una capa de tierra flotante sólida."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "FPS cuando está en segundo plano o pausado"
@@ -3500,23 +3628,24 @@ msgid "Filmic tone mapping"
msgstr "Mapa de tonos fílmico"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Filtered textures can blend RGB values with fully-transparent neighbors,\n"
"which PNG optimizers usually discard, often resulting in dark or\n"
"light edges to transparent textures. Apply a filter to clean that up\n"
"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
-"Las texturas filtradas pueden mezclar valores RGB con sus vecinos "
-"completamente transparentes, \n"
+"Las texturas filtradas pueden mezclar valores RGB con sus nodos adyacentes "
+"que sean completamente transparentes,\n"
"los cuales los optimizadores de PNG usualmente descartan, lo que a veces "
"resulta en un borde claro u\n"
-"oscuro en las texturas transparentes. Aplica éste filtro para limpiar ésto\n"
-"al cargar las texturas."
+"oscuro en las texturas transparentes. Aplica éste filtro para limpiar esto\n"
+"al cargar las texturas. Esto se habilita automaticamente si el mapeado MIP "
+"tambien lo está."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtrado"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Suavizado:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3583,6 +3712,11 @@ msgid "Fog toggle key"
msgstr "Tecla para alternar niebla"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Tamaño de la fuente"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Fuente en negrita por defecto"
@@ -3604,17 +3738,15 @@ msgstr "Tamaño de la fuente"
#: src/settings_translation_file.cpp
msgid "Font size divisible by"
-msgstr ""
+msgstr "Tamaño de fuente divisible por"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Tamaño de la fuente por defecto en punto (pt)."
+msgstr "Tamaño de la fuente por defecto donde 1 unidad = 1 pixel a 96 DPI"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Tamaño de la fuente del monoespacio en punto (pt)."
+msgstr "Tamaño de la fuente monoespaciada donde 1 unidad = 1 pixel a 96 DPI"
#: src/settings_translation_file.cpp
msgid ""
@@ -3635,6 +3767,14 @@ msgid ""
"be\n"
"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
msgstr ""
+"Para fuentes pixeladas que no escalan bien, esto asegura que los tamaños de "
+"fuente utilizados\n"
+"con esta fuente siempre seran divisibles por este valor, en píxeles. Por "
+"ejemplo,\n"
+"una fuente pixelada de 16 píxeles de alto debería tener un valor de 16, "
+"entonces solo tendrá\n"
+"un tamaño de 16,32,48,etc., por lo que un mod pidiendo un tamaño de 25 "
+"recibira uno de 32."
#: src/settings_translation_file.cpp
msgid ""
@@ -3751,19 +3891,31 @@ msgid "GUI scaling filter txr2img"
msgstr "Filtro de escala de IGU \"txr2img\""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Juegos"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Llamadas globales"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
-"Atributos del generador de mapas globales.\n"
+"Atributos globales del generador de mapas.\n"
"En el generador de mapas V6 la opción (o marcador) \"decorations\" controla "
-"todos los elementos decorativos excepto los árboles \n"
+"todos los elementos decorativos excepto los árboles\n"
"y la hierba de la jungla, en todos los otros generadores de mapas esta "
"opción controla todas las decoraciones."
@@ -3788,6 +3940,16 @@ msgid "Graphics"
msgstr "Gráficos"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Gráficos"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Gráficos"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravedad"
@@ -3804,8 +3966,13 @@ msgid "HTTP mods"
msgstr "Mods HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Factor de escala HUD"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Escala de IGU"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -3848,10 +4015,11 @@ msgid "Heat noise"
msgstr "Calor del ruido"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Height component of the initial window size. Ignored in fullscreen mode."
-msgstr "Componente de altura del tamaño inicial de la ventana."
+msgstr ""
+"Componente de altura del tamaño inicial de la ventana. Ignorado en el modo "
+"de pantalla completa."
#: src/settings_translation_file.cpp
msgid "Height noise"
@@ -4065,8 +4233,10 @@ msgstr ""
"Requiere que se habiliten los líquidos de agitación."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Cuanto espera el servidor antes de descargar los bloques de mapa no "
@@ -4074,6 +4244,13 @@ msgstr ""
"Con valores mayores es mas fluido, pero se utiliza mas RAM."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Disminuya esto para aumentar la resistencia del líquido al movimiento."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Ancho de los ríos."
@@ -4140,17 +4317,25 @@ msgstr ""
"Requiere del privilegio \"noclip\" en el servidor."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
"and\n"
"descending."
msgstr ""
-"Si está activada, la tecla \"especial\" en lugar de la tecla \"sneak\" se "
+"Si está activada, la tecla \"Aux1\" en lugar de la tecla \"Sneak\" se "
"utilizará para bajar y\n"
"descender."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Habilitar confirmación de registro al conectar al servidor\n"
+"Si esta deshabilitado, se registrará una nueva cuenta automáticamente."
+
+#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
@@ -4170,7 +4355,7 @@ msgid ""
msgstr ""
"Si se habilita, los datos del mundo inválidos no causarán que el servidor se "
"apague.\n"
-"Actívelo sólo si sabe lo que hace."
+"Actívelo solo si sabe lo que hace."
#: src/settings_translation_file.cpp
msgid ""
@@ -4181,7 +4366,10 @@ msgstr ""
"lanzamiento del jugador cuando vuela o nada."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
"Si esta activado, los nuevos jugadores no pueden unirse con contraseñas "
"vacías."
@@ -4236,10 +4424,6 @@ msgid "Ignore world errors"
msgstr "Ignora los errores del mundo"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Dentro del juego"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Valor alfa del fondo de la consola de chat durante el juego (opacidad, entre "
@@ -4302,16 +4486,13 @@ msgid "Instrument the methods of entities on registration."
msgstr "Instrumenta los métodos de las entidades en el registro."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentación"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervalo de guardar cambios importantes en el mundo, expresado en segundos."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Intervalo de envío de la hora del día a los clientes."
#: src/settings_translation_file.cpp
@@ -5175,6 +5356,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Expulsa a los jugadores que enviaron más de X mensajes cada 10 segundos."
@@ -5232,10 +5417,11 @@ msgid "Left key"
msgstr "Tecla izquierda"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Duración de un tick del servidor y el intervalo en el que los objetos se "
"actualizan generalmente sobre la\n"
@@ -5250,19 +5436,26 @@ msgstr ""
"Requiere que se habiliten los líquidos ondulados."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
"Período de tiempo entre ciclos de ejecución de Active Block Modifier (ABM)"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Cantidad de tiempo entre ciclos de ejecución de NodeTimer"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Periodo de tiempo entre ciclos de gestión de bloques activos"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5271,7 +5464,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Nivel de registro que se escribirá en debug.txt:\n"
"- <nada> (sin registro)\n"
@@ -5307,6 +5501,11 @@ msgid "Light curve low gradient"
msgstr "Curva de luz de bajo gradiente"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Iluminación suave"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5586,9 +5785,8 @@ msgid "Max block send distance"
msgstr "Distancia máxima de envío de bloques"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Max liquids processed per step."
-msgstr "Líquidos máximos procesados por paso."
+msgstr "Máxima cantidad de líquidos procesada por paso."
#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
@@ -5765,10 +5963,6 @@ msgid "Maximum users"
msgstr "Usuarios máximos"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menús"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Caché de mallas poligonales"
@@ -5803,7 +5997,7 @@ msgstr "Altura de escaneo del minimapa"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Minimum limit of random number of large caves per mapchunk."
-msgstr "Ruido 3D que determina la cantidad de mazmorras por chunk."
+msgstr "Límite mínimo del número aleatorio de cuevas grandes por mapchunk."
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of small caves per mapchunk."
@@ -5819,12 +6013,26 @@ msgid "Mipmapping"
msgstr "Mapeado de relieve"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Perfilador"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Seguridad"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Modifies the size of the HUD elements."
-msgstr ""
+msgstr "Modifica el tamaño de los elementos del HUD."
#: src/settings_translation_file.cpp
msgid "Monospace font path"
@@ -5835,13 +6043,12 @@ msgid "Monospace font size"
msgstr "Tamaño de fuente monoespaciada"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Monospace font size divisible by"
-msgstr "Tamaño de fuente monoespaciada"
+msgstr "Tamaño de fuente monoespaciada divisible por"
#: src/settings_translation_file.cpp
msgid "Mountain height noise"
-msgstr ""
+msgstr "Ruido de altura de montañas"
#: src/settings_translation_file.cpp
msgid "Mountain noise"
@@ -5849,7 +6056,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Mountain variation noise"
-msgstr ""
+msgstr "Variación del ruido de montaña"
#: src/settings_translation_file.cpp
msgid "Mountain zero level"
@@ -5865,13 +6072,15 @@ msgstr "Multiplicador de sensiblidad del ratón."
#: src/settings_translation_file.cpp
msgid "Mud noise"
-msgstr ""
+msgstr "Ruido del barro"
#: src/settings_translation_file.cpp
msgid ""
"Multiplier for fall bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
+"Multiplicador del balanceo de caída.\n"
+"Por ejemplo: 0 para no ver balanceo; 1.0 para normal; 2.0 para doble."
#: src/settings_translation_file.cpp
msgid "Mute key"
@@ -5888,6 +6097,10 @@ msgid ""
"Current mapgens in a highly unstable state:\n"
"- The optional floatlands of v7 (disabled by default)."
msgstr ""
+"Nombre del generador de mapas que se utilizará al crear un nuevo mundo.\n"
+"Crear un mundo en el menú principal anulará esto.\n"
+"Los generadores de mapas actuales estan en un estado altamente inestable:\n"
+"- …Las floatlands opcionales de la v7 (desactivado por defecto)."
#: src/settings_translation_file.cpp
msgid ""
@@ -5904,20 +6117,25 @@ msgstr ""
msgid ""
"Name of the server, to be displayed when players join and in the serverlist."
msgstr ""
+"Nombre del servior, será mostrado cuando los jugadores se unan y en la lista "
+"de servidores."
#: src/settings_translation_file.cpp
msgid "Near plane"
msgstr "Plano cercano"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Red"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
+"Puerto de red a escuchar (UDP).\n"
+"Este valor será anulado al iniciar desde el menú principal."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Red"
#: src/settings_translation_file.cpp
msgid "New users need to input this password."
@@ -5932,16 +6150,21 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Resaltar nodos"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Resaltado de los nodos"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
-msgstr ""
+msgstr "Intervalo de cronometro de nodo"
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Ruidos"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
@@ -5962,15 +6185,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Number of extra blocks that can be loaded by /clearobjects at once.\n"
"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Contenido del repositorio en linea"
+"Número de bloques extra que pueden ser cargados por /clearobjects a la vez.\n"
+"Esto es un intercambio entre una sobrecarga de transacciones SQLite y\n"
+"consumo de memoria (4096=100MB, como regla general)."
#: src/settings_translation_file.cpp
msgid "Opaque liquids"
@@ -5980,6 +6203,8 @@ msgstr "Líquidos opacos"
msgid ""
"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255."
msgstr ""
+"Opacidad (alfa) de la sombra detrás de la fuente predeterminada, entre 0 y "
+"255."
#: src/settings_translation_file.cpp
msgid ""
@@ -5987,10 +6212,13 @@ msgid ""
"formspec is\n"
"open."
msgstr ""
+"Abrir el menú de pausa al perder el foco de la ventana. No se pausa si hay "
+"un formulario\n"
+"abierto."
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
-msgstr ""
+msgstr "Anulación opcional del color de un enlace web en el chat."
#: src/settings_translation_file.cpp
msgid ""
@@ -5998,46 +6226,62 @@ msgid ""
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
+"Ruta de la fuente de respaldo. Debe ser una fuente TrueType.\n"
+"Esta fuente será utilizada para ciertos idiomas o si la fuente por defecto "
+"no está disponible."
#: src/settings_translation_file.cpp
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 ""
+"Ruta en la que guardar capturas de pantalla. Puede ser una ruta absoluta o "
+"relativa.\n"
+"La carpeta será creada si no existe."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Path to shader directory. If no path is defined, default location will be "
"used."
msgstr ""
+"Ruta al directorio de los shaders. Si no es especificada, se usará la "
+"ubicación por defecto."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
msgstr ""
+"Ruta al directorio de texturas. Todas las texturas se buscaran primero desde "
+"aquí."
#: src/settings_translation_file.cpp
msgid ""
"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
+"Ruta a la fuente por defecto. Debe ser una fuente TrueType.\n"
+"La fuente de respaldo se utilizará si la fuente no se puede cargar."
#: src/settings_translation_file.cpp
msgid ""
"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
+"Ruta a la fuente monoespaciada. Debe ser una fuente TrueType.\n"
+"Este fuente es usada, por ejemplo, para la consola y la pantalla del "
+"perfilador."
#: src/settings_translation_file.cpp
msgid "Pause on lost window focus"
-msgstr ""
+msgstr "Pausar cuando se pierda el foco de la ventana"
#: src/settings_translation_file.cpp
msgid "Per-player limit of queued blocks load from disk"
-msgstr ""
+msgstr "Límite por jugador de bloques en cola que se cargan desde el disco"
#: src/settings_translation_file.cpp
msgid "Per-player limit of queued blocks to generate"
-msgstr ""
+msgstr "Límite por jugador de bloques en espera para generar"
#: src/settings_translation_file.cpp
msgid "Physics"
@@ -6056,22 +6300,19 @@ msgstr "Modo de movimiento de inclinación activado"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Place key"
-msgstr "Tecla vuelo"
+msgstr "Tecla Colocar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Place repetition interval"
-msgstr "Intervalo de repetición del botón del Joystick"
+msgstr "Intervalo de repetición para colocar"
#: src/settings_translation_file.cpp
msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Nombre del jugador"
+"El jugador es capaz de volar sin ser afectado por la gravedad.\n"
+"Esto requiere el privilegio \"fly\" en el servidor."
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@@ -6099,6 +6340,9 @@ msgid ""
"Prevent digging and placing from repeating when holding the mouse buttons.\n"
"Enable this when you dig or place too often by accident."
msgstr ""
+"Evite que cavar y colocar se repita cuando mantenga presionados los botones "
+"del ratón.\n"
+"Habilite esto cuando excave o coloque con demasiada frecuencia por accidente."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
@@ -6109,10 +6353,13 @@ msgid ""
"Print the engine's profiling data in regular intervals (in seconds).\n"
"0 = disable. Useful for developers."
msgstr ""
+"Imprima los datos de perfilado del motor en intervalos regulares (en "
+"segundos).\n"
+"0 = desactivar. Útil para desarrolladores."
#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "Privilegios que los jugadores con privilegios basicos pueden otorgar"
#: src/settings_translation_file.cpp
msgid "Profiler"
@@ -6120,11 +6367,7 @@ msgstr "Perfilador"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Perfilando"
+msgstr "Tecla para alternar perfiles"
#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
@@ -6140,7 +6383,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
-msgstr ""
+msgstr "Proporción de cuevas grandes que contienen líquido."
#: src/settings_translation_file.cpp
msgid ""
@@ -6148,10 +6391,13 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
+"Radio del área de nube indicado en número de 64 nodos cuadrados de nube.\n"
+"Los valores mayores de 26 comenzarán a producir cortes agudos en las "
+"esquinas del área de nubes."
#: src/settings_translation_file.cpp
msgid "Raises terrain to make valleys around the rivers."
-msgstr ""
+msgstr "Levanta terreno para hacer valles alrededor de los ríos."
#: src/settings_translation_file.cpp
msgid "Random input"
@@ -6163,7 +6409,7 @@ msgstr "Tecla seleccionar rango de visión"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
-msgstr ""
+msgstr "Mensajes Recientes del Chat"
#: src/settings_translation_file.cpp
msgid "Regular font path"
@@ -6182,6 +6428,8 @@ msgid ""
"Remove color codes from incoming chat messages\n"
"Use this to stop players from being able to use color in their messages"
msgstr ""
+"Eliminar códigos de color de los mensajes de chat entrantes\n"
+"Use esto para evitar que los jugadores puedan usar color en sus mensajes"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
@@ -6205,6 +6453,23 @@ msgid ""
"csm_restriction_noderange)\n"
"READ_PLAYERINFO: 32 (disable get_player_names call client-side)"
msgstr ""
+"Restringe el acceso de ciertas funciones del lado del cliente en los "
+"servidores.\n"
+"Combine los byteflags a continuación para restringir las características del "
+"lado del cliente, o establezca en 0\n"
+"para no tener restricciones:\n"
+"LOAD_CLIENT_MODS: 1 (desactivar la carga de mods proporcionados por el "
+"cliente)\n"
+"CHAT_MESSAGES: 2 (desactivar la llamada send_chat_message del lado del "
+"cliente)\n"
+"READ_ITEMDEFS: 4 (deshabilitar la llamada get_item_def del lado del "
+"cliente)\n"
+"READ_NODEDEFS: 8 (deshabilitar la llamada get_node_def del lado del "
+"cliente)\n"
+"LOOKUP_NODES_LIMIT: 16 (limita la llamada get_node del lado del cliente a\n"
+"csm_restriction_noderange)\n"
+"READ_PLAYERINFO: 32 (desactivar la llamada get_player_names del lado del "
+"cliente)"
#: src/settings_translation_file.cpp
msgid "Ridge mountain spread noise"
@@ -6216,7 +6481,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Ridge underwater noise"
-msgstr ""
+msgstr "Ruido de las crestas marinas"
#: src/settings_translation_file.cpp
msgid "Ridged mountain size noise"
@@ -6248,9 +6513,8 @@ msgid "River size"
msgstr "Tamaño del río"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "River valley width"
-msgstr "Profundidad del relleno"
+msgstr "Anchura de los valles con ríos"
#: src/settings_translation_file.cpp
msgid "Rollback recording"
@@ -6266,7 +6530,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "Minimapa redondo"
#: src/settings_translation_file.cpp
msgid "Safe digging and placing"
@@ -6274,21 +6538,22 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Sandy beaches occur when np_beach exceeds this value."
-msgstr ""
+msgstr "Las playas de arena se producen cuando np_beach supera este valor."
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Guardar el mapa recibido por el cliente en el disco."
#: src/settings_translation_file.cpp
msgid "Save window size automatically when modified."
-msgstr ""
+msgstr "Guardar el tamaño de la ventana automáticamente cuando se modifique."
#: src/settings_translation_file.cpp
msgid "Saving map received from server"
-msgstr ""
+msgstr "Guardando el mapa recibido del servidor"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Scale GUI by a user specified value.\n"
"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n"
@@ -6296,18 +6561,29 @@ msgid ""
"pixels when scaling down, at the cost of blurring some\n"
"edge pixels when images are scaled by non-integer sizes."
msgstr ""
+"Escala la interfaz por un valor epecificado por el usuario.\n"
+"Utilice el filtro anti-alias mas cercano para escalar la interfaz.\n"
+"Esto suavizará algunos de los bordes ásperos y mezclará\n"
+"píxeles al reducir el tamaño, a costa de difuminar algunos\n"
+"píxeles en los bordes cuando las imágenes son escaladas por tamaños que no "
+"sean números enteros"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Pantalla:"
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "Altura de la pantalla"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "Ancho de la pantalla"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
-msgstr ""
+msgstr "Carpeta de captura de pantalla"
#: src/settings_translation_file.cpp
msgid "Screenshot format"
@@ -6323,41 +6599,43 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Calidad de captura de pantalla. Solo se utiliza para el formato JPEG.\n"
+"1 significa la peor calidad; 100 significa la mejor calidad.\n"
+"Utilice 0 para la calidad predeterminada."
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Screenshots"
+msgstr "Captura de pantalla"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
-msgstr "Ruido de cueva Nº1"
+msgstr "Ruido del lecho marino"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Second of 4 2D noises that together define hill/mountain range height."
-msgstr "Primero de 2 ruidos 3D que juntos definen túneles."
+msgstr ""
+"Segundo de 4 ruidos 2D que juntos definen la altura de la colina/cordillera."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Second of two 3D noises that together define tunnels."
-msgstr "Primero de 2 ruidos 3D que juntos definen túneles."
-
-#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Seguridad"
+msgstr "Segundo de 2 ruidos 3D que juntos definen túneles."
#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Ver https://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "Color del borde del cuadro de selección (R, G, B)."
#: src/settings_translation_file.cpp
msgid "Selection box color"
-msgstr ""
+msgstr "Color del cuadro de selección"
#: src/settings_translation_file.cpp
msgid "Selection box width"
-msgstr ""
+msgstr "Ancho de la caja de selección"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -6403,8 +6681,19 @@ msgstr ""
"18 = Conjunto de Julia 4D \"Mandelbulb\"."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Servidor / Un jugador"
+#, fuzzy
+msgid "Server"
+msgstr "URL del servidor"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Nombre del servidor"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Descripción del servidor"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6431,10 +6720,20 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Puerto del servidor"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "Lista de las URLs de servidores"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "Lista de las URLs de servidores"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Archivo de la lista de servidores"
@@ -6443,23 +6742,39 @@ msgid ""
"Set the language. Leave empty to use the system language.\n"
"A restart is required after changing this."
msgstr ""
+"Seleccionar el idioma. Dejar vacío para usar el idioma del sistema.\n"
+"Se requiere reiniciar para cambiar esto."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
+"Establecer la longitud máxima de caracteres de un mensaje de chat enviado "
+"por los clientes."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
+"Establecer la fuerza de la sombra.\n"
+"Un valor menor significa sombras más claras, un valor mayor valor significa "
+"sombras más oscuras."
#: 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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
+"Establecer el tamaño del radio de las sombras suaves.\n"
+"Los valores más bajos significan sombras más nítidas, los valores más altos "
+"significan sombras más suaves.\n"
+"Valor mínimo: 1.0; valor máximo: 10.0"
#: src/settings_translation_file.cpp
msgid ""
@@ -6467,15 +6782,17 @@ msgid ""
"Value of 0 means no tilt / vertical orbit.\n"
"Minimum value: 0.0; maximum value: 60.0"
msgstr ""
+"Establecer la inclinación de la órbita del Sol/Luna en grados.\n"
+"El valor 0 significa que no hay inclinación / órbita vertical.\n"
+"Valor mínimo: 0.0; valor máximo: 60.0"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Set to true to enable Shadow Mapping.\n"
"Requires shaders to be enabled."
msgstr ""
-"Habilita mapeado de oclusión de paralaje.\n"
-"Requiere habilitar sombreadores."
+"Establecer en verdero para habilitar el mapeo de sombras.\n"
+"Requiere que los sombreadores estén habilitados."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -6522,6 +6839,10 @@ msgid ""
"cards.\n"
"This only works with the OpenGL video backend."
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."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -6548,16 +6869,17 @@ msgid ""
msgstr "Compensado de sombra de fuente, si es 0 no se dibujará la sombra."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
-msgstr ""
+#, fuzzy
+msgid "Shadow strength gamma"
+msgstr "Intensidad de sombra"
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Forma del minimapa. Habilitado = redodondo, deshabilitado = cuadrado."
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "Mostrar la informacion de la depuración"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
@@ -6632,14 +6954,18 @@ msgid ""
"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
+"Suaviza la cámara al mirar alrededor. También se llama suavizado de mirada o "
+"ratón.\n"
+"Útil para grabar vídeos."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
msgstr ""
+"Suaviza la rotación de la cámara en modo cinematográfico. 0 para desactivar."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Suaviza la rotación de la cámara. 0 para desactivar."
#: src/settings_translation_file.cpp
msgid "Sneak key"
@@ -6652,7 +6978,7 @@ msgstr "Velocidad del caminar"
#: src/settings_translation_file.cpp
msgid "Sneaking speed, in nodes per second."
-msgstr ""
+msgstr "Velocidad agachado, en nodos por segundo."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -6672,11 +6998,16 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Specifies the default stack size of nodes, items and tools.\n"
"Note that mods or games may explicitly set a stack for certain (or all) "
"items."
msgstr ""
+"Especifica el tamaño por defecto de los stacks (Montónes) de nodos, items y "
+"bloques.\n"
+"Cabe aclarar que los mods o juegos pueden establecer un stack para algunos "
+"items (o todos)."
#: src/settings_translation_file.cpp
msgid ""
@@ -6695,7 +7026,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr ""
+msgstr "Punto de aparición estático"
#: src/settings_translation_file.cpp
msgid "Steepness noise"
@@ -6748,20 +7079,24 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Temperature variation for biomes."
-msgstr ""
+msgstr "Variación de temperatura de los biomas."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Ajustes"
#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
-msgstr ""
+msgstr "Ruido alternativo de terreno"
#: src/settings_translation_file.cpp
msgid "Terrain base noise"
-msgstr ""
+msgstr "Ruido base del terreno"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Terrain height"
-msgstr "Altura base del terreno"
+msgstr "Altura del terreno"
#: src/settings_translation_file.cpp
msgid "Terrain higher noise"
@@ -6769,7 +7104,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Terrain noise"
-msgstr ""
+msgstr "Ruido del terreno"
#: src/settings_translation_file.cpp
msgid ""
@@ -6777,6 +7112,9 @@ msgid ""
"Controls proportion of world area covered by hills.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Umbral de ruido del terreno para las colinas.\n"
+"Controla la proporción del mundo cubierta por colinas.\n"
+"Ajústalo hacia 0.0 para una mayor proporción."
#: src/settings_translation_file.cpp
msgid ""
@@ -6784,6 +7122,9 @@ msgid ""
"Controls proportion of world area covered by lakes.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Umbral de ruido del terreno para los lagos.\n"
+"Controla la proporción del mundo cubierta por lagos.\n"
+"Ajústalo hacia 0.0 para una mayor proporción."
#: src/settings_translation_file.cpp
msgid "Terrain persistence noise"
@@ -6812,11 +7153,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The URL for the content repository"
-msgstr ""
+msgstr "La URL para el repositorio de contenido"
#: src/settings_translation_file.cpp
msgid "The dead zone of the joystick"
-msgstr ""
+msgstr "La zona muerta del joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -6826,7 +7167,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other biome filler node."
-msgstr ""
+msgstr "La profundidad de la tierra u otros nodos de relleno de biomas."
#: src/settings_translation_file.cpp
msgid ""
@@ -6919,10 +7260,12 @@ msgid ""
"The time in seconds it takes between repeated node placements when holding\n"
"the place button."
msgstr ""
+"El tiempo en segundos entre la colocación de cada nodo mientras\n"
+"se mantiene pulsado el botón para colocar."
#: src/settings_translation_file.cpp
msgid "The type of joystick"
-msgstr ""
+msgstr "El tipo de joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -6952,10 +7295,10 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Velocidad del tiempo"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6968,7 +7311,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
-msgstr ""
+msgstr "Tecla para cambiar el modo de cámara"
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
@@ -6980,14 +7323,23 @@ msgid "Touch screen threshold"
msgstr "Límite de ruido de playa"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Límite de ruido de playa"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Trees noise"
+msgid "Transparency Sorting Distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Trees noise"
+msgstr "Ruido de árboles"
+
+#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
msgstr "Filtrado trilineal"
@@ -6997,6 +7349,9 @@ msgid ""
"False = 128\n"
"Usable to make minimap smoother on slower machines."
msgstr ""
+"Habilitado = 256\n"
+"Deshabilitado= 128\n"
+"Sirve para suavizar el minimapa en dispositivos mas lentos."
#: src/settings_translation_file.cpp
msgid "Trusted mods"
@@ -7004,7 +7359,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL a la lista de servidores mostrada en la pestaña de Multijugador."
#: src/settings_translation_file.cpp
msgid "Undersampling"
@@ -7037,11 +7392,11 @@ msgstr "Límite superior Y de las tierras flotantes."
#: src/settings_translation_file.cpp
msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "Usar nubes 3D en lugar de planas."
#: src/settings_translation_file.cpp
msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "Usar nubes con animaciones para el fondo del menú principal."
#: src/settings_translation_file.cpp
msgid "Use anisotropic filtering when viewing at textures from an angle."
@@ -7049,7 +7404,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "Usar filtrado bilinear al escalar texturas."
#: src/settings_translation_file.cpp
msgid ""
@@ -7068,9 +7423,22 @@ msgid ""
"If set to 0, MSAA is disabled.\n"
"A restart is required after changing this option."
msgstr ""
+"Usa el antialiasing multimuestra (MSAA) para suavizar los bordes de los "
+"bloques.\n"
+"Este algoritmo suaviza la vizualización 3D mientras que la imagen sigue "
+"nítida,\n"
+"pero esto no afecta el interior de las texturas\n"
+"(lo que es especialmente visible con texturas transparentes).\n"
+"Aparecen espacios visibles cuando los sombreadores estan deshabilitados.\n"
+"Si se establece en 0, se desactiva MSAA.\n"
+"Se requiere un reinicio después de cambiar esta opción."
#: src/settings_translation_file.cpp
msgid "Use trilinear filtering when scaling textures."
+msgstr "Usar filtrado trilinear al escalar texturas."
+
+#: src/settings_translation_file.cpp
+msgid "User Interfaces"
msgstr ""
#: src/settings_translation_file.cpp
@@ -7078,8 +7446,9 @@ msgid "VBO"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "VSync"
-msgstr ""
+msgstr "VSync (Sincronización vertical)"
#: src/settings_translation_file.cpp
msgid "Valley depth"
@@ -7103,7 +7472,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Variation of maximum mountain height (in nodes)."
-msgstr ""
+msgstr "Variación de la altura maxima de las montañas (En nodos)."
#: src/settings_translation_file.cpp
msgid "Variation of number of caves."
@@ -7132,11 +7501,11 @@ msgstr "Controla lo escarpado/alto de las colinas."
#: src/settings_translation_file.cpp
msgid "Vertical climbing speed, in nodes per second."
-msgstr ""
+msgstr "Velocidad de escalado vertical, en nodos por segundo."
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "Sincronización vertical de la pantalla."
#: src/settings_translation_file.cpp
msgid "Video driver"
@@ -7148,15 +7517,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "View distance in nodes."
-msgstr ""
+msgstr "Distancia de visión en nodos."
#: src/settings_translation_file.cpp
msgid "View range decrease key"
-msgstr ""
+msgstr "Tecla para disminuir el rango de visión"
#: src/settings_translation_file.cpp
msgid "View range increase key"
-msgstr ""
+msgstr "Tecla para aumentar el rango de visión"
#: src/settings_translation_file.cpp
msgid "View zoom key"
@@ -7194,7 +7563,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Walking and flying speed, in nodes per second."
-msgstr ""
+msgstr "Velocidad al caminar y volar, en nodos por segundo."
#: src/settings_translation_file.cpp
msgid "Walking speed"
@@ -7206,7 +7575,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Nivel del agua"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
@@ -7315,6 +7684,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -7333,6 +7711,9 @@ msgid ""
"background.\n"
"Contains the same information as the file debug.txt (default name)."
msgstr ""
+"Solo para sistemas Windows: Iniciar Minetest con la ventana de la linea de "
+"comandos en el fondo.\n"
+"Contiene la misma información que el archivo debug.txt (Nombre por defecto)."
#: src/settings_translation_file.cpp
msgid ""
@@ -7390,7 +7771,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y-level of cavern upper limit."
-msgstr ""
+msgstr "Nivel Y del límite superior de las cavernas."
#: src/settings_translation_file.cpp
msgid "Y-level of higher terrain that creates cliffs."
@@ -7398,11 +7779,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y-level of lower terrain and seabed."
-msgstr ""
+msgstr "Nivel Y del terreno bajo y el fondo marino."
#: src/settings_translation_file.cpp
msgid "Y-level of seabed."
-msgstr ""
+msgstr "Nivel Y del fondo marino."
+
+#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr "cURL"
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
@@ -7453,6 +7838,9 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Back"
#~ msgstr "Atrás"
+#~ msgid "Basic"
+#~ msgstr "Básico"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr ""
#~ "Bits por píxel (también conocido como profundidad de color) en modo de "
@@ -7483,6 +7871,12 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Configure"
#~ msgstr "Configurar"
+#~ msgid "Connect"
+#~ msgstr "Conectar"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Controla la velocidad de hundimiento en líquidos."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7528,12 +7922,24 @@ msgstr "Límite de cURL en paralelo"
#~ "Define el intervalo de muestreo de las texturas.\n"
#~ "Un valor más alto causa mapas de relieve más suaves."
+#~ msgid "Del. Favorite"
+#~ msgstr "Borrar Fav."
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Descarga un subjuego, como minetest_game, desde minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Descarga uno desde minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Descargando e instalando $1, por favor espere..."
#~ msgid "Enable VBO"
#~ msgstr "Activar VBO"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Habilitar confirmación de registro"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7564,6 +7970,9 @@ msgstr "Límite de cURL en paralelo"
#~ "Habilita mapeado de oclusión de paralaje.\n"
#~ "Requiere habilitar sombreadores."
+#~ msgid "Enter "
+#~ msgstr "Ingresar "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7583,6 +7992,9 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Fallback font size"
#~ msgstr "Tamaño de la fuente de reserva"
+#~ msgid "Filtering"
+#~ msgstr "Filtrado"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Ruido de altura base para tierra flotante"
@@ -7601,6 +8013,9 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Full screen BPP"
#~ msgstr "Profundidad de color en pantalla completa"
+#~ msgid "Game"
+#~ msgstr "Juego"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7610,15 +8025,30 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Generate normalmaps"
#~ msgstr "Generar mapas normales"
+#~ msgid "HUD scale factor"
+#~ msgstr "Factor de escala HUD"
+
#~ msgid "High-precision FPU"
#~ msgstr "Alta-precisión FPU"
#~ msgid "IPv6 support."
#~ msgstr "soporte IPv6."
+#~ msgid "In-Game"
+#~ msgstr "Dentro del juego"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Instalar: Archivo: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentación"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Combinaciones de teclas. (Si este menú da error, elimina líneas en "
+#~ "minetest.conf)"
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Características de la Lava"
@@ -7633,6 +8063,9 @@ msgstr "Límite de cURL en paralelo"
#~ msgstr ""
#~ "Hace que DirectX funcione con LuaJIT. Desactivar si ocasiona problemas."
+#~ msgid "Menus"
+#~ msgstr "Menús"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Minimapa en modo radar, Zoom x2"
@@ -7683,6 +8116,12 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Path to save screenshots at."
#~ msgstr "Ruta para guardar las capturas de pantalla."
+#~ msgid "Player name"
+#~ msgstr "Nombre del jugador"
+
+#~ msgid "Profiling"
+#~ msgstr "Perfilando"
+
#~ msgid "PvP enabled"
#~ msgstr "PvP activado"
@@ -7692,6 +8131,9 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Select Package File:"
#~ msgstr "Seleccionar el archivo del paquete:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Servidor / Un jugador"
+
#, fuzzy
#~ msgid ""
#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will "
@@ -7729,6 +8171,22 @@ msgstr "Límite de cURL en paralelo"
#~ msgid "Yes"
#~ msgstr "Sí"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Te vas unir al servidor con el nombre \"%s\" por primera vez.\n"
+#~ "Cuando procedas, se creará una nueva cuenta en este servidor usando tus "
+#~ "credenciales.\n"
+#~ "Por favor, reescribe tu contraseña y haz clic en 'Registrarse y unirse' "
+#~ "para confirmar la creación de la cuenta, o haz clic en 'Cancelar' para "
+#~ "abortar."
+
#~ msgid "You died."
#~ msgstr "Has muerto."
diff --git a/po/et/minetest.po b/po/et/minetest.po
index 8031c9451..150005f02 100644
--- a/po/et/minetest.po
+++ b/po/et/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Estonian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2021-06-29 10:33+0000\n"
"Last-Translator: Janar Leas <janarleas+ubuntuone@googlemail.com>\n"
"Language-Team: Estonian <https://hosted.weblate.org/projects/minetest/"
@@ -113,6 +113,31 @@ msgid "The server has requested a reconnect:"
msgstr "Server taotles taasühendumist:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Vali mod"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokolli versioon ei sobi. "
@@ -125,6 +150,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Server toetab protokolli versioone $1 kuni $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Meie toetame ainult protokolli versiooni $1."
@@ -132,14 +161,21 @@ msgstr "Meie toetame ainult protokolli versiooni $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Meie toetame protokolli versioone $1 kuni $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Tühista"
@@ -278,7 +314,6 @@ msgid "Failed to download $1"
msgstr "$1 allalaadimine nurjus"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Mängud"
@@ -300,7 +335,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Paigaldus: Toetamata failitüüp \"$1\" või katkine arhiiv"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "MOD-id"
@@ -393,12 +427,9 @@ msgid "Decorations"
msgstr "Ilmestused"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Lae alla mäng: näiteks „Minetest Game“, aadressilt: minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Laadi minetest.net-st üks mäng alla"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Hoiatus: \"Arendustest\" on mõeldud arendajatele."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -416,10 +447,6 @@ msgstr "Taevas hõljuvad saared"
msgid "Floatlands (experimental)"
msgstr "Lendsaared (katseline)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Mäng"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Mitte-fraktaalse maastiku tekitamine: mered ja süvapinnas"
@@ -437,6 +464,15 @@ msgid "Increases humidity around rivers"
msgstr "Suurendab niiskust jõe lähistel"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Paigalda $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Järved"
@@ -538,10 +574,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Väga suured koopasaalid maapõue sügavuses"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Hoiatus: \"Arendustest\" on mõeldud arendajatele."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Maailma nimi"
@@ -571,6 +603,39 @@ msgstr "PakiHaldur: väär asukoht „$1“"
msgid "Delete World \"$1\"?"
msgstr "Kustutad maailma \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Kinnita parooli"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Maailma tekitus-valemi nimi"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nimi"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Salasõna"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Paroolid ei ole samad!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Registreeru ja liitu"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Nõustu"
@@ -603,6 +668,16 @@ msgstr "< Tagasi lehele „Seaded“"
msgid "Browse"
msgstr "Sirvi"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Sisu"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Sisu"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Keelatud"
@@ -660,7 +735,7 @@ msgstr "Vali kataloog"
msgid "Select file"
msgstr "Vali fail"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Kuva tehnilised nimetused"
@@ -810,6 +885,10 @@ msgstr "Eelnevad panustajad"
msgid "Previous Core Developers"
msgstr "Eelnevad põhi-arendajad"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Sirvi veebist sisu"
@@ -878,10 +957,6 @@ msgstr "Majuta külastajatele"
msgid "Install games from ContentDB"
msgstr "Lisa mänge sisuvaramust"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nimi"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Uus"
@@ -890,10 +965,6 @@ msgstr "Uus"
msgid "No world created or selected!"
msgstr "Pole valitud ega loodud ühtegi maailma!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Salasõna"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Mängi"
@@ -927,10 +998,6 @@ msgid "Clear"
msgstr "Tühjenda"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Ühine"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Looja"
@@ -940,10 +1007,6 @@ msgid "Damage / PvP"
msgstr "Vigastused mängijatelt"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Pole lemmik"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Lemmikud"
@@ -956,6 +1019,10 @@ msgid "Join Game"
msgstr "Ühine"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Viivitus"
@@ -968,10 +1035,19 @@ msgid "Refresh"
msgstr "Värskenda"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Pole lemmik"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Võõrustaja kirjeldus"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1016,7 +1092,8 @@ msgid "Dynamic shadows"
msgstr "Elavad varjud"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Elavad varjud: "
#: builtin/mainmenu/tab_settings.lua
@@ -1112,7 +1189,8 @@ msgid "Tone Mapping"
msgstr "Tooni kaardistamine"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Puutelävi: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1120,7 +1198,8 @@ msgid "Trilinear Filter"
msgstr "Tri-lineaar filtreerimine"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Ülikõrge"
#: builtin/mainmenu/tab_settings.lua
@@ -1139,6 +1218,11 @@ msgstr "Lainetavad vedelikud"
msgid "Waving Plants"
msgstr "Lehvivad taimed"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Ühenduse viga (Aeg otsas?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Ühendus aegus."
@@ -1277,7 +1361,7 @@ msgid "Camera update enabled"
msgstr "Kaamera värskendamine on lubatud"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1407,6 +1491,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Piiramatu vaatamisulatus lubatud"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Kliendi loomine..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Välju menüüsse"
@@ -1912,29 +2001,6 @@ msgstr "$1 allalaadimine nurjus"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Paroolid ei ole samad!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registreeru ja liitu"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Oled esmakordselt liitumas selle võõrustajaga, kandes nime \"%s\".\n"
-"Kui jätkad, siis luuakse sellele võõrustajale uus konto sinu volitus "
-"andmetega.\n"
-"Trüki salasõna uuesti ning klõpsa 'Registreeru ja ühine' konto loomisega "
-"nõustumiseks, või 'Loobu' keeldumiseks."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Jätka"
@@ -1967,7 +2033,7 @@ msgstr "Klotsi piirid"
msgid "Change camera"
msgstr "Muuda kaamerat"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Jututuba"
@@ -2020,10 +2086,8 @@ msgid "Key already in use"
msgstr "Nupp juba kasutuses"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Nupusätted. (Kui see menüü sassi läheb, siis kustuta asju failist minetest."
-"conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2094,10 +2158,6 @@ msgid "Change"
msgstr "Muuda"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Kinnita parooli"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Uus parool"
@@ -2105,6 +2165,10 @@ msgstr "Uus parool"
msgid "Old Password"
msgstr "Vana parool"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Paroolid ei ole samad!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Välju"
@@ -2118,12 +2182,6 @@ msgstr "Vaigistatud"
msgid "Sound Volume: %d%%"
msgstr "Hääle Volüüm: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Sisesta "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2131,6 +2189,16 @@ msgstr "Sisesta "
msgid "LANG_CODE"
msgstr "et"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Palun vali nimi!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2261,6 +2329,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2342,6 +2414,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Maailma nimi"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Arenenud sätted"
@@ -2355,7 +2432,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2424,6 +2501,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Automaatse edasiliikumise klahv"
@@ -2464,10 +2545,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2488,7 +2565,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2500,6 +2577,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2524,6 +2605,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Muuda kaamerat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2682,6 +2768,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2777,6 +2867,10 @@ msgid "Console height"
msgstr "Konsooli kõrgus"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2810,7 +2904,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2877,11 +2973,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3026,6 +3122,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Ilmestused"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Kaevuri klahv"
@@ -3046,6 +3147,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3115,6 +3222,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3131,19 +3242,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3217,6 +3322,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3235,6 +3344,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3312,8 +3425,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtreerimine"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Silu servad:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3380,6 +3494,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3528,6 +3646,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Mängud"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3559,6 +3690,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3575,10 +3714,15 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Liidese näitamine"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3815,11 +3959,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3880,6 +4031,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3901,7 +4058,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3941,10 +4100,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Mängu-sisene"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3995,15 +4150,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4624,6 +4775,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4679,7 +4834,7 @@ msgstr "Vasak klahv"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4689,15 +4844,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4709,7 +4867,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4737,6 +4896,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Sujuv valgustus"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5126,10 +5290,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menüüd"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5178,6 +5338,18 @@ msgid "Mipmapping"
msgstr "Astmik-tapeetimine"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5264,16 +5436,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5286,6 +5458,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Valitud klotsi ilme"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5323,10 +5500,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5420,10 +5593,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5470,10 +5639,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5642,6 +5807,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Ekraan:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5669,6 +5839,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Kuvatõmmis"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5681,10 +5856,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5724,10 +5895,21 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
+#, fuzzy
+msgid "Server"
+msgstr "Majuta külastajatele"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
msgstr "Võõrusta / Üksi"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Võõrustaja kirjeldus"
+
+#: src/settings_translation_file.cpp
msgid "Server URL"
msgstr ""
@@ -5752,10 +5934,20 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Võõrustaja kanal"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "Võõrustaja-loendi aadress"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "Võõrustaja-loendi aadress"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Võõrustaja-loendi fail"
@@ -5766,12 +5958,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5779,7 +5973,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5855,7 +6049,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6055,6 +6249,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Sätted"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6257,7 +6456,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6281,10 +6480,19 @@ msgid "Touch screen threshold"
msgstr "Puuteekraani lävi"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Puuteekraani lävi"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6375,6 +6583,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6608,6 +6820,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6697,6 +6918,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "cURL faili allalaadimine aegus"
@@ -6735,6 +6960,9 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "Kohanda"
+#~ msgid "Connect"
+#~ msgstr "Ühine"
+
#~ msgid "Credits"
#~ msgstr "Tegijad"
@@ -6744,6 +6972,12 @@ msgstr ""
#~ msgid "Darkness sharpness"
#~ msgstr "Pimeduse teravus"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Lae alla mäng: näiteks „Minetest Game“, aadressilt: minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Laadi minetest.net-st üks mäng alla"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Palun oota $1 allalaadimist ja paigaldamist…"
@@ -6754,18 +6988,39 @@ msgstr ""
#~ msgid "Enables filmic tone mapping"
#~ msgstr "Lubab filmic tone mapping"
+#~ msgid "Enter "
+#~ msgstr "Sisesta "
+
+#~ msgid "Filtering"
+#~ msgstr "Filtreerimine"
+
+#~ msgid "Game"
+#~ msgstr "Mäng"
+
#~ msgid "Generate Normal Maps"
#~ msgstr "Loo normaalkaardistusi"
+#~ msgid "In-Game"
+#~ msgstr "Mängu-sisene"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Paigaldus: fail: \"$1\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Nupusätted. (Kui see menüü sassi läheb, siis kustuta asju failist "
+#~ "minetest.conf)"
+
#~ msgid "Main"
#~ msgstr "Peamine"
#~ msgid "Main menu style"
#~ msgstr "Peamenüü ilme"
+#~ msgid "Menus"
+#~ msgstr "Menüüd"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Radarkaart, Suurendus ×2"
@@ -6819,6 +7074,21 @@ msgstr ""
#~ msgid "Yes"
#~ msgstr "Jah"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Oled esmakordselt liitumas selle võõrustajaga, kandes nime \"%s\".\n"
+#~ "Kui jätkad, siis luuakse sellele võõrustajale uus konto sinu volitus "
+#~ "andmetega.\n"
+#~ "Trüki salasõna uuesti ning klõpsa 'Registreeru ja ühine' konto loomisega "
+#~ "nõustumiseks, või 'Loobu' keeldumiseks."
+
#~ msgid "You died."
#~ msgstr "Said otsa."
diff --git a/po/eu/minetest.po b/po/eu/minetest.po
index 2cd9b4b74..dc360ef85 100644
--- a/po/eu/minetest.po
+++ b/po/eu/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-02-23 15:50+0000\n"
-"Last-Translator: Osoitz <oelkoro@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-04-29 20:12+0000\n"
+"Last-Translator: JonAnder Oier <jonanderetaoier@gmail.com>\n"
"Language-Team: Basque <https://hosted.weblate.org/projects/minetest/minetest/"
"eu/>\n"
"Language: eu\n"
@@ -17,15 +17,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.5\n"
+"X-Generator: Weblate 4.12.1\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
-msgstr ""
+msgstr "Garbitu txat-ilara"
#: builtin/client/chatcommands.lua
msgid "Empty command."
-msgstr ""
+msgstr "Agindu hutsa."
#: builtin/client/chatcommands.lua
#, fuzzy
@@ -33,29 +33,28 @@ msgid "Exit to main menu"
msgstr "Itzuli menu nagusira"
#: builtin/client/chatcommands.lua
-#, fuzzy
msgid "Invalid command: "
-msgstr "Agindu lokala"
+msgstr "Komando baliogabea: "
#: builtin/client/chatcommands.lua
msgid "Issued command: "
-msgstr ""
+msgstr "Igorritako komandoa: "
#: builtin/client/chatcommands.lua
msgid "List online players"
-msgstr ""
+msgstr "Online jokalariak zerrendatu"
#: builtin/client/chatcommands.lua
msgid "Online players: "
-msgstr ""
+msgstr "Online jokalariak: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr ""
+msgstr "Irteerako txat-ilara hutsik dago orain."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
-msgstr ""
+msgstr "Komando hau serbitzariaren bidez desgaituta dago."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -66,31 +65,31 @@ msgid "You died"
msgstr "Hil zara"
#: builtin/common/chatcommands.lua
-#, fuzzy
msgid "Available commands:"
-msgstr "Agindu lokala"
+msgstr "Komando erabilgarriak:"
#: builtin/common/chatcommands.lua
-#, fuzzy
msgid "Available commands: "
-msgstr "Agindu lokala"
+msgstr "Komando erabilgarriak: "
#: builtin/common/chatcommands.lua
msgid "Command not available: "
-msgstr ""
+msgstr "Komandoa ez dago eskuragarri: "
#: builtin/common/chatcommands.lua
msgid "Get help for commands"
-msgstr ""
+msgstr "Eskuratu laguntza komandoetarako"
#: builtin/common/chatcommands.lua
msgid ""
"Use '.help <cmd>' to get more information, or '.help all' to list everything."
msgstr ""
+"Erabili '.help <cmd>' informazio gehiago eskuratzeko, edo '.help all' guztia "
+"zerrendatzeko."
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[guztia | <cmd>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
@@ -98,7 +97,7 @@ msgstr "Ados"
#: builtin/fstk/ui.lua
msgid "<none available>"
-msgstr ""
+msgstr "<bat ere ez dago eskuragarri>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
@@ -121,6 +120,31 @@ msgid "The server has requested a reconnect:"
msgstr "Zerbitzariak birkonexioa eskatu du:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Hautatu Modak"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokoloaren bertsioen desadostasuna. "
@@ -133,6 +157,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Zerbitzariak $1 eta $2 arteko protokolo bertsioak onartzen ditu. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "$1 bertsioa soilik onartzen dugu."
@@ -140,14 +168,21 @@ msgstr "$1 bertsioa soilik onartzen dugu."
msgid "We support protocol versions between version $1 and $2."
msgstr "$1 eta $2 arteko protokolo bertsioak onartzen ditugu."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Utzi"
@@ -235,7 +270,7 @@ msgstr "$1 et $2 mendekotasunak instalatuko dira."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 bider $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
@@ -287,7 +322,6 @@ msgid "Failed to download $1"
msgstr "Huts egin du $1 deskargatzean"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Jolasak"
@@ -304,14 +338,10 @@ msgid "Install missing dependencies"
msgstr "Falta diren mendekotasunak instalatu"
#: builtin/mainmenu/dlg_contentstore.lua
-#, fuzzy
msgid "Install: Unsupported file type or broken archive"
-msgstr ""
-"Instalakuntza: \"$1\" sustengu gabeko fitxategi formatua edo hondatutako "
-"fitxategia"
+msgstr "Instalazioa: Fitxategi ez bateragarria edo fitxategi hautsia"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mod-ak"
@@ -404,13 +434,9 @@ msgid "Decorations"
msgstr "Apaingarriak"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr ""
-"Deskargatu jolasen bat, esaterako Minetest Game, minetest.net zerbitzaritik"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Deskargatu minetest.net zerbitzaritik"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Abisua: Garapen Testa garatzaileentzat da."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -422,15 +448,11 @@ msgstr "Lurrazal laua"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr ""
+msgstr "Zeruan flotatzen duten lur-masak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Jolasa"
+msgstr "Lur flotagarriak (esperimentala)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
@@ -449,6 +471,15 @@ msgid "Increases humidity around rivers"
msgstr "Hezetasuna areagotu erreka inguruetan"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "$1 Instalatu"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Lakuak"
@@ -468,19 +499,19 @@ msgstr "Mapgen banderatxoak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr ""
+msgstr "Mapgen berariazko banderak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
-msgstr ""
+msgstr "Mendiak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr ""
+msgstr "Lokatz-jarioa"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr ""
+msgstr "Tunel eta kobazuloen sarea"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
@@ -488,19 +519,19 @@ msgstr "Ez da jolasik aukeratu"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr ""
+msgstr "Beroa murrizten du altuerarekin"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr ""
+msgstr "Hezetasuna murrizten du altuerarekin"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Rivers"
-msgstr ""
+msgstr "Ibaiak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Sea level rivers"
-msgstr ""
+msgstr "Itsas mailako ibaiak"
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -509,50 +540,47 @@ msgstr "Hazia"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr ""
+msgstr "Biomen arteko trantsizio leuna"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
+"Lurrean agertzen diren egiturak (v6-z sortutako ohianeko zuhaitzetan eta "
+"belarretan eraginik gabe)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
-msgstr ""
+msgstr "Lurrean agertzen diren egiturak, normalean zuhaitzak eta landareak"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
-msgstr ""
+msgstr "Epela, Basamortua"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
-msgstr ""
+msgstr "Epela, Basamortua, Ohiana"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
-msgstr ""
+msgstr "Epela, Basamortua, Ohiana, Tundra, Taiga"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
-msgstr ""
+msgstr "Lurraren gainazaleko higidura"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
-msgstr ""
+msgstr "Zuhaitzak eta ohianeko belarra"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Vary river depth"
-msgstr ""
+msgstr "Ibaiaren sakonera aldatu"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Abisua: \"Minimal development test\" garatzaileentzako da."
+msgstr "Kobazulo oso handiak lurpean sakon"
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -584,6 +612,38 @@ msgstr "pkgmgr: \"$1\" bide baliogabea"
msgid "Delete World \"$1\"?"
msgstr "Ezabatu \"$1\" mundua?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Berretsi pasahitza"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Izena"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Pasahitza"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Pasahitzak ez datoz bat!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Eman izena eta hasi saioa"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Onartu"
@@ -616,6 +676,16 @@ msgstr "< Itzuli ezarpenen orrira"
msgid "Browse"
msgstr "Arakatu"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Edukia"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Edukia"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Desgaituta"
@@ -634,11 +704,11 @@ msgstr "Hutsunetasuna"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Octaves"
-msgstr ""
+msgstr "Zortzigarrenak"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Offset"
-msgstr ""
+msgstr "Desplazamendua"
#: builtin/mainmenu/dlg_settings_advanced.lua
#, fuzzy
@@ -673,7 +743,7 @@ msgstr "Hautatu direktorioa"
msgid "Select file"
msgstr "Hautatu fitxategia"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Erakutsi izen teknikoak"
@@ -779,7 +849,7 @@ msgstr "Kargatzen..."
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr ""
+msgstr "Zerbitzari publikoen zerrenda desgaituta dago"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
@@ -789,31 +859,31 @@ msgstr ""
#: builtin/mainmenu/tab_about.lua
msgid "About"
-msgstr ""
+msgstr "Buruz"
#: builtin/mainmenu/tab_about.lua
msgid "Active Contributors"
msgstr "Laguntzaile aktiboak"
#: builtin/mainmenu/tab_about.lua
-#, fuzzy
msgid "Active renderer:"
-msgstr "Objektu aktiboak bidaltzeko barrutia"
+msgstr "Renderizatzaile aktiboa:"
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
msgstr "Garatzaile nagusiak"
#: builtin/mainmenu/tab_about.lua
-#, fuzzy
msgid "Open User Data Directory"
-msgstr "Hautatu direktorioa"
+msgstr "Ireki Erabiltzaile Datuen Direktorioa"
#: builtin/mainmenu/tab_about.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
+"Erabiltzaileak emandako munduak, jokoak, modak\n"
+"eta testura paketeak fitxategi kudeatzaile / esploratzaile batean."
#: builtin/mainmenu/tab_about.lua
msgid "Previous Contributors"
@@ -823,6 +893,10 @@ msgstr "Lehenagoko laguntzaileak"
msgid "Previous Core Developers"
msgstr "Lehenagoko garatzaile nagusiak"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Lineako edukiak esploratu"
@@ -891,59 +965,45 @@ msgstr "Zerbitzari ostalaria"
msgid "Install games from ContentDB"
msgstr "Instalatu ContentDB-ko jolasak"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
-msgstr ""
+msgstr "Berria"
#: builtin/mainmenu/tab_local.lua
msgid "No world created or selected!"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr ""
+msgstr "Ez da mundurik sortu edo hautatu!"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
-msgstr ""
+msgstr "Jolastu Jokoa"
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
-msgstr ""
+msgstr "Portua"
#: builtin/mainmenu/tab_local.lua
-#, fuzzy
msgid "Select Mods"
-msgstr "Hautatu"
+msgstr "Hautatu Modak"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
-msgstr ""
+msgstr "Munduko selekzioa:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr ""
+msgstr "Zerbitzariaren portua"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
msgstr "Hasi partida"
#: builtin/mainmenu/tab_online.lua
-#, fuzzy
msgid "Address"
-msgstr "Helbidea lotu"
+msgstr "Helbidea"
#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
msgid "Clear"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr ""
+msgstr "Garbi"
#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
@@ -951,58 +1011,66 @@ msgstr "Sormen modua"
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-#, fuzzy
msgid "Damage / PvP"
-msgstr "Kaltea"
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
+msgstr "Mina / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
-msgstr ""
+msgstr "Gogokoak"
#: builtin/mainmenu/tab_online.lua
msgid "Incompatible Servers"
-msgstr ""
+msgstr "Zerbitzari bateraezinak"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
msgstr "Elkartu partidara"
#: builtin/mainmenu/tab_online.lua
-msgid "Ping"
+msgid "Login"
msgstr ""
#: builtin/mainmenu/tab_online.lua
+msgid "Ping"
+msgstr "Ping"
+
+#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Public Servers"
msgstr "Zerbitzaria iragarri"
#: builtin/mainmenu/tab_online.lua
msgid "Refresh"
-msgstr ""
+msgstr "Freskatu"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Ez. gogokoena"
#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
+msgstr "Zerbitzariaren deskribapena"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
-msgstr ""
+msgstr "3D Hodeiak"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr ""
+msgstr "4x"
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr ""
+msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
msgid "All Settings"
@@ -1010,71 +1078,75 @@ msgstr "Ezarpen guztiak"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Antialiasinga:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr ""
+msgstr "Gorde automatikoki Pantailaren Tamaina"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr ""
+msgstr "Iragazki bilineala"
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
-msgstr ""
+msgstr "Aldatu teklak"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr ""
+msgstr "Konektatutako beira"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
-msgstr ""
+msgstr "Itzal dinamikoak"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Itzal dinamikoak: "
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "Fancy Leaves"
-msgstr ""
+msgstr "Luxuzko hostoak"
#: builtin/mainmenu/tab_settings.lua
msgid "High"
-msgstr ""
+msgstr "Altua"
#: builtin/mainmenu/tab_settings.lua
msgid "Low"
-msgstr ""
+msgstr "Baxua"
#: builtin/mainmenu/tab_settings.lua
msgid "Medium"
-msgstr ""
+msgstr "Erdi"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr ""
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Iragazki Aniso."
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "Iragazkirik gabe"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
msgid "No Mipmap"
-msgstr ""
+msgstr "Mipmap gabe"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr ""
+msgstr "Nabarmendu nodoak"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr ""
+msgstr "Nodoen ingerada"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
@@ -1090,11 +1162,11 @@ msgstr "Ur opakoa"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr ""
+msgstr "Partikulak"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
-msgstr ""
+msgstr "Pantaila:"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -1102,119 +1174,125 @@ msgstr "Ezarpenak"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr ""
+msgstr "Itzalgailuak"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (experimental)"
-msgstr ""
+msgstr "Itzalgailuak (esperimentala)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
-msgstr ""
+msgstr "Itzalgailuak (ez dago eskuragarri)"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr ""
+msgstr "Orri sinpleak"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr ""
+msgstr "Argiztapen leuna"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "Testurizazioa:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr ""
+msgstr "Iragazki hirulineala"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
-msgstr ""
+#, fuzzy
+msgid "Very High"
+msgstr "Ultra Altua"
#: builtin/mainmenu/tab_settings.lua
msgid "Very Low"
-msgstr ""
+msgstr "Oso Baxua"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "Hosto Uhinduak"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr ""
+msgstr "Likido Uhinduak"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "Landare Uhinduak"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Konexio-errorea (denbora agortua?)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "Konexioaren itxaronaldia agortu egin da."
#: src/client/client.cpp
msgid "Done!"
-msgstr ""
+msgstr "Egina!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "Nodoak hasieratzen"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "Nodoak hasieratzen..."
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Testurak kargatzen..."
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Itzalgailuak berreraikitzen..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "Konexio-errorea (denbora agortua?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr ""
+msgstr "Ezin izan da jokoa aurkitu edo kargatu: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr ""
+msgstr "Jokoaren espezifikazioa ez da baliozkoa."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
-msgstr ""
+msgstr "Menu nagusia"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "Ez da mundurik hautatu eta ez da helbiderik eman. Ez dago zer eginik."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr ""
+msgstr "Jokalariaren izena luzeegia da."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
-msgstr ""
+msgstr "Mesedez, aukeratu izen bat!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr ""
+msgstr "Ezin izan da ireki emandako pasahitzaren fitxategia: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "Zehaztutako munduaren ibilbidea ez da existitzen: "
#: src/client/game.cpp
msgid ""
@@ -1224,28 +1302,28 @@ msgstr ""
#: src/client/game.cpp
msgid "- Address: "
-msgstr ""
+msgstr "- Helbidea: "
#: src/client/game.cpp
msgid "- Mode: "
-msgstr ""
+msgstr "- Modua: "
#: src/client/game.cpp
msgid "- Port: "
-msgstr ""
+msgstr "- Ataka: "
#: src/client/game.cpp
msgid "- Public: "
-msgstr ""
+msgstr "- Publikoa: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
msgid "- PvP: "
-msgstr ""
+msgstr "- Jokalaria Jokalariaren aurka (PvP): "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr ""
+msgstr "- Zerbitzariaren izena: "
#: src/client/game.cpp
#, fuzzy
@@ -1255,7 +1333,7 @@ msgstr "Errore bat gertatu da:"
#: src/client/game.cpp
#, c-format
msgid "Access denied. Reason: %s"
-msgstr ""
+msgstr "Sarbidea ukatuta. Arrazoia: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
@@ -1283,31 +1361,31 @@ msgstr ""
#: src/client/game.cpp
msgid "Camera update disabled"
-msgstr ""
+msgstr "Kameraren eguneraketa desaktibatuta dago"
#: src/client/game.cpp
msgid "Camera update enabled"
-msgstr ""
+msgstr "Kameraren eguneraketa gaituta dago"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "Pasahitza aldatu"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr ""
+msgstr "Modu zinematografiko desaktibatuta"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr ""
+msgstr "Modu zinematografiko gaituta"
#: src/client/game.cpp
msgid "Client disconnected"
-msgstr ""
+msgstr "Bezero deskonektatua"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
@@ -1315,15 +1393,15 @@ msgstr ""
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "Zerbitzarira konektatzen..."
#: src/client/game.cpp
msgid "Connection failed for unknown reason"
-msgstr ""
+msgstr "Konexioak huts egin du arrazoi ezezagun batengatik"
#: src/client/game.cpp
msgid "Continue"
-msgstr ""
+msgstr "Jarraitu"
#: src/client/game.cpp
#, c-format
@@ -1347,7 +1425,7 @@ msgstr ""
#: src/client/game.cpp
#, c-format
msgid "Couldn't resolve address: %s"
-msgstr ""
+msgstr "Ezin izan da helbidea ebatzi: %s"
#: src/client/game.cpp
msgid "Creating client..."
@@ -1363,7 +1441,7 @@ msgstr "Arazte informazioa eta profilariaren grafikoa ezkutatuta"
#: src/client/game.cpp
msgid "Debug info shown"
-msgstr ""
+msgstr "Arazketari buruzko informazioa erakusten da"
#: src/client/game.cpp
msgid "Debug info, profiler graph, and wireframe hidden"
@@ -1394,20 +1472,25 @@ msgid "Enabled unlimited viewing range"
msgstr "Gaitu mugagabeko ikusmen barrutia"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Bezeroa sortzen..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
-msgstr ""
+msgstr "Irten menura"
#: src/client/game.cpp
msgid "Exit to OS"
-msgstr ""
+msgstr "Irten sistema eragilera"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr ""
+msgstr "Modu azkarra desaktibatuta"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr ""
+msgstr "Modu azkarra gaituta"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
@@ -1427,15 +1510,15 @@ msgstr ""
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr ""
+msgstr "Lainoa desaktibatuta"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr ""
+msgstr "Lainoa gaituta"
#: src/client/game.cpp
msgid "Game info:"
-msgstr ""
+msgstr "Jokoari buruzko informazioa:"
#: src/client/game.cpp
msgid "Game paused"
@@ -1447,7 +1530,7 @@ msgstr ""
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Itemen definizioak..."
#: src/client/game.cpp
msgid "KiB/s"
@@ -1483,7 +1566,7 @@ msgstr ""
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr ""
+msgstr "Nodoen definizioak..."
#: src/client/game.cpp
msgid "Off"
@@ -1507,7 +1590,7 @@ msgstr "Profilariaren grafikoa ikusigai"
#: src/client/game.cpp
msgid "Remote server"
-msgstr ""
+msgstr "Urruneko zerbitzaria"
#: src/client/game.cpp
msgid "Resolving address..."
@@ -1515,15 +1598,15 @@ msgstr ""
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "Itzaltzen..."
#: src/client/game.cpp
msgid "Singleplayer"
-msgstr ""
+msgstr "Jokalari bakarra"
#: src/client/game.cpp
msgid "Sound Volume"
-msgstr ""
+msgstr "Soinuaren bolumena"
#: src/client/game.cpp
msgid "Sound muted"
@@ -1544,17 +1627,17 @@ msgstr ""
#: src/client/game.cpp
#, c-format
msgid "The server is probably running a different version of %s."
-msgstr ""
+msgstr "Zerbitzaria ziurrenik %s bertsio desberdin bat exekutatzen ari da."
#: src/client/game.cpp
#, c-format
msgid "Unable to connect to %s because IPv6 is disabled"
-msgstr ""
+msgstr "Ezin da %s-ra konektatu IPv6 desaktibatuta dagoelako"
#: src/client/game.cpp
#, c-format
msgid "Unable to listen on %s because IPv6 is disabled"
-msgstr ""
+msgstr "Ezin da %s-n entzun IPv6 desaktibatuta dagoelako"
#: src/client/game.cpp
#, c-format
@@ -1574,7 +1657,7 @@ msgstr "Ikusmen barrutia minimoan dago: %d"
#: src/client/game.cpp
#, c-format
msgid "Volume changed to %d%%"
-msgstr ""
+msgstr "Bolumena %d%%ra aldatu da"
#: src/client/game.cpp
msgid "Wireframe shown"
@@ -1586,11 +1669,11 @@ msgstr ""
#: src/client/game.cpp
msgid "ok"
-msgstr ""
+msgstr "Ados"
#: src/client/gameui.cpp
msgid "Chat hidden"
-msgstr ""
+msgstr "Txat ezkutua"
#: src/client/gameui.cpp
msgid "Chat shown"
@@ -1635,7 +1718,7 @@ msgstr "Behera"
#: src/client/keycode.cpp
msgid "End"
-msgstr ""
+msgstr "Amaiera"
#: src/client/keycode.cpp
msgid "Erase EOF"
@@ -1651,7 +1734,7 @@ msgstr "Laguntza"
#: src/client/keycode.cpp
msgid "Home"
-msgstr ""
+msgstr "Hasiera"
#: src/client/keycode.cpp
msgid "IME Accept"
@@ -1704,7 +1787,7 @@ msgstr "Ezkerreko leihoa"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
msgid "Menu"
-msgstr ""
+msgstr "Menu"
#: src/client/keycode.cpp
msgid "Middle Button"
@@ -1792,7 +1875,7 @@ msgstr ""
#: src/client/keycode.cpp
msgid "Play"
-msgstr ""
+msgstr "Jolastu"
#. ~ "Print screen" key
#: src/client/keycode.cpp
@@ -1801,7 +1884,7 @@ msgstr "Inprimatu"
#: src/client/keycode.cpp
msgid "Return"
-msgstr ""
+msgstr "Itzuli"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Right"
@@ -1850,7 +1933,7 @@ msgstr "Pantaila-argazkia"
#: src/client/keycode.cpp
msgid "Space"
-msgstr ""
+msgstr "Espazioa"
#: src/client/keycode.cpp
msgid "Tab"
@@ -1870,7 +1953,7 @@ msgstr "2. X botoia"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Zoom"
-msgstr ""
+msgstr "Zoom"
#: src/client/minimap.cpp
msgid "Minimap hidden"
@@ -1897,25 +1980,7 @@ msgstr "Huts egin du $1 deskargatzean"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Pasahitzak ez datoz bat!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Eman izena eta hasi saioa"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
+msgstr "Web orria irekitzen"
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
@@ -1931,7 +1996,7 @@ msgstr "Aurrera automatikoki"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Automatic jumping"
-msgstr ""
+msgstr "Jauzi automatikoa"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
@@ -1949,7 +2014,7 @@ msgstr ""
msgid "Change camera"
msgstr "Aldatu kamera"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Txata"
@@ -1999,10 +2064,10 @@ msgstr "Jauzi"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Key already in use"
-msgstr ""
+msgstr "Dagoeneko erabiltzen ari den tekla"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -2071,11 +2136,7 @@ msgstr "sakatu tekla"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
-msgstr ""
-
-#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr ""
+msgstr "Aldatu"
#: src/gui/guiPasswordChange.cpp
msgid "New Password"
@@ -2085,6 +2146,10 @@ msgstr ""
msgid "Old Password"
msgstr ""
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Pasahitzak ez datoz bat!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr ""
@@ -2098,12 +2163,6 @@ msgstr ""
msgid "Sound Volume: %d%%"
msgstr ""
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2111,6 +2170,16 @@ msgstr ""
msgid "LANG_CODE"
msgstr "eu"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Mesedez, aukeratu izen bat!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2236,6 +2305,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2317,6 +2390,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Munduaren izena"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr ""
@@ -2330,7 +2408,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2399,6 +2477,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2440,10 +2522,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2464,7 +2542,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2476,6 +2554,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2500,6 +2582,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Aldatu kamera"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2657,6 +2744,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2752,6 +2843,11 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Sareko eduki biltegia"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2785,7 +2881,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2852,11 +2950,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3002,6 +3100,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Developer Options"
+msgstr "Apaingarriak"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Dig key"
msgstr "Eskuinera tekla"
@@ -3022,6 +3125,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3092,6 +3201,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3108,19 +3221,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3198,6 +3305,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Profilaria"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3216,6 +3328,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3293,8 +3409,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Antialiasinga:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3362,6 +3479,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3516,6 +3637,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Jolasak"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3543,6 +3677,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3559,7 +3701,11 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3799,11 +3945,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3864,6 +4017,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3885,7 +4044,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3925,10 +4086,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3979,15 +4136,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4638,6 +4791,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4693,7 +4850,7 @@ msgstr "Ezkerrera tekla"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4703,15 +4860,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4723,7 +4883,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4751,6 +4912,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Argiztapen leuna"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5138,10 +5304,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5190,6 +5352,19 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Profilaria"
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5276,16 +5451,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5298,6 +5473,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Nabarmendu nodoak"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5335,10 +5515,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Sareko eduki biltegia"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5433,10 +5609,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Jokalariaren transferentzia distantzia"
@@ -5483,10 +5655,6 @@ msgid "Profiler toggle key"
msgstr "Profilaria txandakatzeko tekla"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5655,6 +5823,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Pantaila:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5682,6 +5855,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Pantaila-argazkia"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5694,10 +5872,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5737,8 +5911,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "Zerbitzari ostalaria"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "- Zerbitzariaren izena: "
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Zerbitzariaren deskribapena"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5765,10 +5950,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Zerbitzariaren portua"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5779,12 +5973,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5792,7 +5988,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5868,7 +6064,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6068,6 +6264,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Ezarpenak"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6273,7 +6474,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6300,10 +6501,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6394,6 +6603,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6629,6 +6842,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6718,6 +6940,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6742,12 +6968,26 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "Konfiguratu"
+#~ msgid "Connect"
+#~ msgstr "Konektatu"
+
#~ msgid "Credits"
#~ msgstr "Kredituak"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr ""
+#~ "Deskargatu jolasen bat, esaterako Minetest Game, minetest.net "
+#~ "zerbitzaritik"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Deskargatu minetest.net zerbitzaritik"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 deskargatu eta instalatzen, itxaron mesedez..."
+#~ msgid "Game"
+#~ msgstr "Jolasa"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Instalakuntza: fitxategia: \"$1\""
diff --git a/po/fi/minetest.po b/po/fi/minetest.po
index 3639a255c..489b66b52 100644
--- a/po/fi/minetest.po
+++ b/po/fi/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-09-19 07:38+0000\n"
-"Last-Translator: Markus Mikkonen <markus.mikkonen@outlook.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-07-07 17:16+0000\n"
+"Last-Translator: Oftox <oftox@protonmail.com>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/minetest/"
"minetest/fi/>\n"
"Language: fi\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 4.9-dev\n"
+"X-Generator: Weblate 4.13.1-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -88,16 +88,15 @@ msgstr ""
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[kaikki | <komento>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
msgstr "OK"
#: builtin/fstk/ui.lua
-#, fuzzy
msgid "<none available>"
-msgstr "Komento ei ole käytettävissä: "
+msgstr "<ei saatavilla>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
@@ -120,6 +119,31 @@ msgid "The server has requested a reconnect:"
msgstr "Palvelin pyysi yhteyden muodostamista uudelleen:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Valitse modit"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Protokollaversiot epäyhteensopivat. "
@@ -129,7 +153,11 @@ msgstr "Palvelin vaatii protokollaversion $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Palvelin tukee protokollaversioita välillä $1 ja $2. "
+msgstr "Palvelin tukee protokollia versioiden $1 ja $2 välillä. "
+
+#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
@@ -139,14 +167,21 @@ msgstr "Tuemme vain protokollaversiota $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Tuemme protokollaversioita välillä $1 ja $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Peruuta"
@@ -230,7 +265,7 @@ msgstr "\"$1\" on jo olemassa. Haluatko korvata sen?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "Riippuvuudet $1 ja $2 asennetaan."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
@@ -241,6 +276,8 @@ msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
+"$1 lataa,\n"
+"$2 jonossa"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 downloading..."
@@ -248,11 +285,11 @@ msgstr "$1 latautuu..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "$1 tarvittavaa riippuvuutta ei löytynyt."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "$1 asennetaan, ja $2 riippuvuutta sivuutetaan."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
@@ -283,7 +320,6 @@ msgid "Failed to download $1"
msgstr "Epäonnistui ladata $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Pelit"
@@ -301,16 +337,15 @@ msgstr "Asenna puuttuvat riippuvuudet"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install: Unsupported file type or broken archive"
-msgstr ""
+msgstr "Lataus: Tukematon tiedostotyyppi tai rikkinäinen arkisto"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Modit"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr "Paketteja ei voitu noutaa"
+msgstr "Paketteja ei löydetty"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
@@ -382,7 +417,7 @@ msgstr "Biomit"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr ""
+msgstr "Luolat"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
@@ -394,15 +429,12 @@ msgstr "Luo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Decorations"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Lataa peli, kuten Minetest Game, minetest.netistä"
+msgstr "Koristeet"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Lataa yksi minetest.netistä"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Varoitus: Development Test on tarkoitettu kehittäjille."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -414,16 +446,12 @@ msgstr "Tasainen maasto"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr ""
+msgstr "Taivaalla leijuvat maamassat"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
msgstr ""
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Peli"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -434,13 +462,22 @@ msgstr "Mäet"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Humid rivers"
-msgstr ""
+msgstr "Kosteat joet"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Asenna $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Järvet"
@@ -540,10 +577,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Varoitus: Development Test on tarkoitettu kehittäjille."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Maailman nimi"
@@ -573,6 +606,38 @@ msgstr "pkgmgr: virheellinen polku \"$1\""
msgid "Delete World \"$1\"?"
msgstr "Poista maailma \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Vahvista salasana"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nimi"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Salasana"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Salasanat eivät täsmää!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Rekisteröidy ja liity"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Hyväksy"
@@ -603,6 +668,16 @@ msgstr "< Palaa asetussivulle"
msgid "Browse"
msgstr "Selaa"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Sisältö"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Sisältö"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Poistettu käytöstä"
@@ -659,7 +734,7 @@ msgstr "Valitse hakemisto"
msgid "Select file"
msgstr "Valitse tiedosto"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Näytä tekniset nimet"
@@ -806,6 +881,10 @@ msgstr ""
msgid "Previous Core Developers"
msgstr ""
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Selaa sisältöä verkossa"
@@ -874,10 +953,6 @@ msgstr "Isännöi palvelin"
msgid "Install games from ContentDB"
msgstr "Asenna pelejä ContentDB:stä"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nimi"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Uusi"
@@ -886,10 +961,6 @@ msgstr "Uusi"
msgid "No world created or selected!"
msgstr "Maailmaa ei ole luotu tai valittu!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Salasana"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Pelaa peliä"
@@ -923,10 +994,6 @@ msgid "Clear"
msgstr "Tyhjennä"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Yhdistä"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Luova tila"
@@ -936,10 +1003,6 @@ msgid "Damage / PvP"
msgstr "Vahinko / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Suosikit"
@@ -952,6 +1015,10 @@ msgid "Join Game"
msgstr "Liity peliin"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Viive"
@@ -964,10 +1031,18 @@ msgid "Refresh"
msgstr "Päivitä"
#: builtin/mainmenu/tab_online.lua
+msgid "Remove favorite"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Palvelimen kuvaus"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1012,7 +1087,8 @@ msgid "Dynamic shadows"
msgstr "Dynaamiset varjot"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Dynaamiset varjot: "
#: builtin/mainmenu/tab_settings.lua
@@ -1108,7 +1184,7 @@ msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1116,7 +1192,7 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1135,6 +1211,11 @@ msgstr ""
msgid "Waving Plants"
msgstr ""
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Yhteys aikakatkaistiin."
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Yhteys aikakatkaistiin."
@@ -1269,7 +1350,7 @@ msgid "Camera update enabled"
msgstr ""
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1373,6 +1454,11 @@ msgid "Enabled unlimited viewing range"
msgstr ""
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Luodaan asiakasta..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Poistu valikkoon"
@@ -1870,36 +1956,13 @@ msgid "Minimap in texture mode"
msgstr ""
#: src/gui/guiChatConsole.cpp
-#, fuzzy
msgid "Failed to open webpage"
-msgstr "Epäonnistui ladata $1"
+msgstr "Verkkosivun avaaminen epäonnistui"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Salasanat eivät täsmää!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Rekisteröidy ja liity"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Olet aikeissa liittyä tälle palvelimelle nimellä \"%s\" ensimmäistä kertaa.\n"
-"Jos jatkat, uusi tili kirjautumistietojen kera luodaan tälle palvelimelle.\n"
-"Kirjoita salasana ja napsauta \"Rekisteröidy ja liity\" vahvistaaksesi tilin "
-"luomisen, tai napsauta \"Peruuta\" lopettaaksesi."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr ""
@@ -1932,7 +1995,7 @@ msgstr ""
msgid "Change camera"
msgstr "Vaihda kameraa"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Keskustelu"
@@ -1985,10 +2048,8 @@ msgid "Key already in use"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Näppäimistöasetukset. (Jos tämä valikko rikkoutuu, poista asioita minetest."
-"conf-tiedostosta)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2059,10 +2120,6 @@ msgid "Change"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Vahvista salasana"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Uusi salasana"
@@ -2070,6 +2127,10 @@ msgstr "Uusi salasana"
msgid "Old Password"
msgstr "Vanha salasana"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Salasanat eivät täsmää!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Poistu"
@@ -2079,15 +2140,9 @@ msgid "Muted"
msgstr "Mykistetty"
#: src/gui/guiVolumeChange.cpp
-#, fuzzy, c-format
+#, c-format
msgid "Sound Volume: %d%%"
-msgstr "Äänenvoimakkuus: "
-
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
+msgstr "Äänenvoimakkuus: %d%%"
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
@@ -2096,6 +2151,16 @@ msgstr ""
msgid "LANG_CODE"
msgstr "fi"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Valitse nimi!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2221,6 +2286,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2302,6 +2371,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Maailman nimi"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Lisäasetukset"
@@ -2315,7 +2389,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+msgid "Always fly fast"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2384,6 +2458,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2424,10 +2502,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2448,7 +2522,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2460,6 +2534,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2484,6 +2562,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Vaihda kameraa"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2560,7 +2643,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Chat commands"
-msgstr "Komento"
+msgstr "Chat-komennnot"
#: src/settings_translation_file.cpp
msgid "Chat font size"
@@ -2641,6 +2724,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2736,6 +2823,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2769,7 +2860,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2836,11 +2929,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2983,6 +3076,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Koristeet"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -3003,6 +3101,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3072,6 +3176,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3088,19 +3196,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3174,6 +3276,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3192,6 +3298,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3269,8 +3379,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Reunanpehmennys:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3337,6 +3448,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3485,6 +3600,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Pelit"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3512,6 +3640,16 @@ msgid "Graphics"
msgstr "Grafiikka"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafiikka"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafiikka"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3528,7 +3666,11 @@ msgid "HTTP mods"
msgstr "HTTP-modit"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3768,11 +3910,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3833,6 +3982,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3854,7 +4009,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3894,10 +4051,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Pelinsisäinen"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3948,15 +4101,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4577,6 +4726,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4632,7 +4785,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4642,15 +4795,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4662,7 +4818,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4690,6 +4847,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Tasainen valaistus"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5074,10 +5236,6 @@ msgid "Maximum users"
msgstr "Käyttäjiä enintään"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Valikot"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5126,6 +5284,19 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Turvallisuus"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5212,16 +5383,17 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Verkko"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Verkko"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Uusien käyttäjien tulee syöttää tämä salasana."
@@ -5234,6 +5406,10 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Node and Entity Highlighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5271,10 +5447,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5368,10 +5540,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Pelaajan nimi"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5418,10 +5586,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5590,6 +5754,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Näyttö:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Näytön korkeus"
@@ -5617,6 +5786,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Kuvakaappaus"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5629,10 +5803,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Turvallisuus"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Lue https://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -5672,8 +5842,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Palvelin / yksinpeli"
+#, fuzzy
+msgid "Server"
+msgstr "Palvelimen URL"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Palvelimen nimi"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Palvelimen kuvaus"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5700,10 +5881,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Palvelimen portti"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5714,12 +5904,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5727,7 +5919,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5803,7 +5995,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6003,6 +6195,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Asetukset"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6205,7 +6402,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6229,10 +6426,19 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Koko näyttö"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6323,6 +6529,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6556,6 +6766,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6645,6 +6864,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6662,18 +6885,64 @@ msgstr ""
#~ msgid "- Damage: "
#~ msgstr "- Vahinko: "
+#~ msgid "Connect"
+#~ msgstr "Yhdistä"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Lataa peli, kuten Minetest Game, minetest.netistä"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Lataa yksi minetest.netistä"
+
#~ msgid "FreeType fonts"
#~ msgstr "FreeType-fontit"
+#~ msgid "Game"
+#~ msgstr "Peli"
+
+#~ msgid "In-Game"
+#~ msgstr "Pelinsisäinen"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Asenna: tiedosto: \"$1\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Näppäimistöasetukset. (Jos tämä valikko rikkoutuu, poista asioita "
+#~ "minetest.conf-tiedostosta)"
+
+#~ msgid "Menus"
+#~ msgstr "Valikot"
+
#~ msgid "Name / Password"
#~ msgstr "Nimi / Salasana"
+#~ msgid "Player name"
+#~ msgstr "Pelaajan nimi"
+
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Palvelin / yksinpeli"
+
#~ msgid "To enable shaders the OpenGL driver needs to be used."
#~ msgstr "Varjostimien käyttäminen vaatii, että käytössä on OpenGL-ajuri."
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Olet aikeissa liittyä tälle palvelimelle nimellä \"%s\" ensimmäistä "
+#~ "kertaa.\n"
+#~ "Jos jatkat, uusi tili kirjautumistietojen kera luodaan tälle "
+#~ "palvelimelle.\n"
+#~ "Kirjoita salasana ja napsauta \"Rekisteröidy ja liity\" vahvistaaksesi "
+#~ "tilin luomisen, tai napsauta \"Peruuta\" lopettaaksesi."
+
#~ msgid "You died."
#~ msgstr "Kuolit."
diff --git a/po/fil/minetest.po b/po/fil/minetest.po
index ef7f88986..85444da23 100644
--- a/po/fil/minetest.po
+++ b/po/fil/minetest.po
@@ -7,685 +7,779 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-06-27 03:16+0000\n"
+"Last-Translator: Marco Santos <enum.scima@gmail.com>\n"
+"Language-Team: Filipino <https://hosted.weblate.org/projects/minetest/"
+"minetest/fil/>\n"
"Language: fil\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 "
+"|| n % 10 == 6 || n % 10 == 9);\n"
+"X-Generator: Weblate 4.13.1-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
-msgstr ""
+msgstr "Linisin ang pila ng out chat"
#: builtin/client/chatcommands.lua
msgid "Empty command."
-msgstr ""
+msgstr "Bakanteng utos."
#: builtin/client/chatcommands.lua
msgid "Exit to main menu"
-msgstr ""
+msgstr "Umalis sa main menu"
#: builtin/client/chatcommands.lua
msgid "Invalid command: "
-msgstr ""
+msgstr "Invalid na utos: "
#: builtin/client/chatcommands.lua
msgid "Issued command: "
-msgstr ""
+msgstr "Inisyu na utos: "
#: builtin/client/chatcommands.lua
msgid "List online players"
-msgstr ""
+msgstr "Ilista ang mga naka-online na player"
#: builtin/client/chatcommands.lua
msgid "Online players: "
-msgstr ""
+msgstr "Mga naka-online na player: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr ""
+msgstr "Bakante na ang pila ng out chat."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
-msgstr ""
+msgstr "Sinara ng server ang utos na ito."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
-msgstr ""
+msgstr "Mag-respawn"
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "You died"
-msgstr ""
+msgstr "Namatay ka"
#: builtin/common/chatcommands.lua
msgid "Available commands:"
-msgstr ""
+msgstr "Mga magagamit na utos:"
#: builtin/common/chatcommands.lua
msgid "Available commands: "
-msgstr ""
+msgstr "Mga magagamit na utos: "
#: builtin/common/chatcommands.lua
msgid "Command not available: "
-msgstr ""
+msgstr "Di magagamit ang utos: "
#: builtin/common/chatcommands.lua
msgid "Get help for commands"
-msgstr ""
+msgstr "Humingi ng tulong para sa mga utos"
#: builtin/common/chatcommands.lua
msgid ""
"Use '.help <cmd>' to get more information, or '.help all' to list everything."
msgstr ""
+"Gamitin ang '.help <utos>' para makakuha ka pa ng mas maraming impormasyon, "
+"o '.help all' para ilista lahat."
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[all | <utos>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
-msgstr ""
+msgstr "Sige"
#: builtin/fstk/ui.lua
msgid "<none available>"
-msgstr ""
+msgstr "<wala>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
-msgstr ""
+msgstr "May error sa Lua script:"
#: builtin/fstk/ui.lua
msgid "An error occurred:"
-msgstr ""
+msgstr "May error:"
#: builtin/fstk/ui.lua
msgid "Main menu"
-msgstr ""
+msgstr "Main menu"
#: builtin/fstk/ui.lua
msgid "Reconnect"
-msgstr ""
+msgstr "Kumonekta uli"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
+msgstr "Humiling ang server ng pagkonekta muli:"
+
+#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
msgstr ""
#: builtin/mainmenu/common.lua
-msgid "Protocol version mismatch. "
+#, fuzzy
+msgid "Client Mods"
+msgstr "Pumili ng mga Mod"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
msgstr ""
#: builtin/mainmenu/common.lua
-msgid "Server enforces protocol version $1. "
+msgid "Later"
msgstr ""
#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Protocol version mismatch. "
+msgstr "Di tumugmang bersyon ng protocol. "
+
+#: builtin/mainmenu/common.lua
+msgid "Server enforces protocol version $1. "
+msgstr "Pinapatupad ng server ang bersyon ng protocol na $1. "
+
+#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
msgstr ""
+"Sinusuportahan ng server ang mga bersyon ng protocol sa pagitan $1 at $2. "
#: builtin/mainmenu/common.lua
-msgid "We only support protocol version $1."
+msgid "Visit website"
msgstr ""
#: builtin/mainmenu/common.lua
+msgid "We only support protocol version $1."
+msgstr "Suportado lang po namin ang bersyon ng protocol na $1."
+
+#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
msgstr ""
+"Suportado lang po namin ang mga bersyon ng protocol sa pagitan ng $1 at $2."
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
-msgstr ""
+msgstr "Ikansela"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/tab_content.lua
msgid "Dependencies:"
-msgstr ""
+msgstr "Mga kailangan:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable all"
-msgstr ""
+msgstr "Isara lahat"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr ""
+msgstr "Isara ang modpack"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
-msgstr ""
+msgstr "Buksan lahat"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr ""
+msgstr "Buksan ang modpack"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"characters [a-z0-9_] are allowed."
msgstr ""
+"Bigong mabuksan ang mod na \"$1\" dahil naglalaman ito ng mga bawal na "
+"karakter. Tanging mga karakter na [a-z0-9_] lang ang pwede."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Find More Mods"
-msgstr ""
+msgstr "Maghanap pa ng mga Mod"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr ""
+msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No (optional) dependencies"
-msgstr ""
+msgstr "Walang (optional na) kailangan"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No game description provided."
-msgstr ""
+msgstr "Walang binigay na paglalarawan sa laro."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No hard dependencies"
-msgstr ""
+msgstr "Walang kailangang kailangan"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No modpack description provided."
-msgstr ""
+msgstr "Walang binigay na paglalarawan sa modpack."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No optional dependencies"
-msgstr ""
+msgstr "Walang mga optional na kailangan"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua
msgid "Optional dependencies:"
-msgstr ""
+msgstr "Mga optional na kailangan:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp
msgid "Save"
-msgstr ""
+msgstr "I-save"
#: builtin/mainmenu/dlg_config_world.lua
msgid "World:"
-msgstr ""
+msgstr "Mundo:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
-msgstr ""
+msgstr "bukas"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
-msgstr ""
+msgstr "Meron na'ng \"$1\". Gusto mo bang i-overwrite ito?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "Ii-install ang mga kailangan na $1 at $2."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 ni $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
+"$1 dina-download,\n"
+"$2 nakapila"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 downloading..."
-msgstr ""
+msgstr "$1 dina-download..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "Di makita ang $1 (na) kailangan."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "Ii-install ang $1, at lalaktawan ang %2."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
-msgstr ""
+msgstr "Lahat ng package"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Already installed"
-msgstr ""
+msgstr "Naka-install na"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu"
-msgstr ""
+msgstr "Balik sa Main Menu"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr ""
+msgstr "Basehang Laro:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
msgstr ""
+"Di magagamit ang ContentDB kapag na-compile ang Minetest nang walang cURL"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Downloading..."
-msgstr ""
+msgstr "Dina-download..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Failed to download $1"
-msgstr ""
+msgstr "Bigong ma-download ang $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
-msgstr ""
+msgstr "Mga Laro"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install"
-msgstr ""
+msgstr "I-install"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install $1"
-msgstr ""
+msgstr "I-install ang $1"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install missing dependencies"
-msgstr ""
+msgstr "I-install ang mga nawawalang kailangan"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install: Unsupported file type or broken archive"
-msgstr ""
+msgstr "I-install: Di-suportadong file type o sirang archive"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
-msgstr ""
+msgstr "Mga Mod"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr ""
+msgstr "Walang makuhang mga package"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
-msgstr ""
+msgstr "Walang mga resulta"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No updates"
-msgstr ""
+msgstr "Walang mga update"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
-msgstr ""
+msgstr "Di nakita"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr ""
+msgstr "I-overwrite"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr ""
+msgstr "Siguraduhing tama ang basehang laro."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
-msgstr ""
+msgstr "Nakapila"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
-msgstr ""
+msgstr "Mga Texture Pack"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Uninstall"
-msgstr ""
+msgstr "Burahin"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update"
-msgstr ""
+msgstr "I-update"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
-msgstr ""
+msgstr "I-update Lahat [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "Tumingin pa ng mas maraming impormasyon sa web browser"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "Meron na'ng mundong may pangalang \"$1\""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Additional terrain"
-msgstr ""
+msgstr "Karagdagang terrain"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Altitude chill"
-msgstr ""
+msgstr "Lamig ng altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Altitude dry"
-msgstr ""
+msgstr "Tuyo ng altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biome blending"
-msgstr ""
+msgstr "Paghahalo ng biome"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biomes"
-msgstr ""
+msgstr "Mga biome"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr ""
+msgstr "Mga kweba"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
-msgstr ""
+msgstr "Mga kweba"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
-msgstr ""
+msgstr "Gumawa"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Decorations"
-msgstr ""
+msgstr "Mga dekorasyon"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr ""
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Babala: Para sa mga developer ang Development Test."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
-msgstr ""
+msgstr "Mga dungeon"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Flat terrain"
-msgstr ""
+msgstr "Patag na terrain"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr ""
+msgstr "Mga lumulutang na kalupaan sa langit"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr ""
+msgstr "Lumulutang na Lupa (eksperimento)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr ""
+msgstr "Gumawa ng di fractal na terrain: Mga karagatan at ilalim ng lupa"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
-msgstr ""
+msgstr "Mga burol"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Humid rivers"
-msgstr ""
+msgstr "Mga mahalumigmig na ilog"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
+msgstr "Pinapataas ang halumigmig sa mga ilog"
+
+#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "I-install ang $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
-msgstr ""
+msgstr "Mga lawa"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
msgstr ""
+"Bumababa o natutuyo ang mga ilog kapag mababa ang halumigmig at mataas ang "
+"init"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr ""
+msgstr "Mapgen"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr ""
+msgstr "Mga flag ng mapgen"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr ""
+msgstr "Mga flag na specific sa mapgen"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
-msgstr ""
+msgstr "Mga bundok"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr ""
+msgstr "Agos ng putik"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr ""
+msgstr "Network ng mga tunnel at kweba"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
-msgstr ""
+msgstr "Walang larong napili"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr ""
+msgstr "Binabawasan ang init ng altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr ""
+msgstr "Binabawasan ang halumigmig ng altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Rivers"
-msgstr ""
+msgstr "Mga ilog"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Sea level rivers"
-msgstr ""
+msgstr "Lebel ng dagat sa mga ilog"
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Seed"
-msgstr ""
+msgstr "Seed"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr ""
+msgstr "Malinis na transition sa pagitan ng mga biome"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
+"Mga istrakturang magpapakita sa terrain (walang epekto sa mga puno at damo "
+"sa gubat na nagawa ng v6)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
msgstr ""
+"Mga istrakturang magpapakita sa terrain, tipikal na mga puno at halaman"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
-msgstr ""
+msgstr "Temperate, Disyerto"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
-msgstr ""
+msgstr "Temperate, Disyerto, Kagubatan"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
-msgstr ""
+msgstr "Temperate, Disyerto, Kagubatan, Tundra, Taiga"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
-msgstr ""
+msgstr "Erosyon sa lupa ng terrain"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
-msgstr ""
+msgstr "Mga puno at damo sa gubat"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Vary river depth"
-msgstr ""
+msgstr "Nagbabagong lalim ng ilog"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
+msgstr "Mga napakalaking malalalim na kweba"
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
-msgstr ""
+msgstr "Pangalan ng mundo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no games installed."
-msgstr ""
+msgstr "Wala kang na-install na mga laro."
#: builtin/mainmenu/dlg_delete_content.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "Sigurado ka bang buburahin mo ang \"$1\"?"
#: builtin/mainmenu/dlg_delete_content.lua
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
#: src/client/keycode.cpp
msgid "Delete"
-msgstr ""
+msgstr "Burahin"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "pkgmgr: bigong mabura ang \"$1\""
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: invalid path \"$1\""
-msgstr ""
+msgstr "pkgmgr: invalid na path na \"$1\""
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
+msgstr "Burahin ang Mundong \"$1\"?"
+
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Kumpirmahin ang Password"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
msgstr ""
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Pangalan"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Password"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Di tugma ang mga password!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Magparehistro at Sumali"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
-msgstr ""
+msgstr "Tanggapin"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr ""
+msgstr "I-rename ang Modpack:"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid ""
"This modpack has an explicit name given in its modpack.conf which will "
"override any renaming here."
msgstr ""
+"May explicit na pangalan ang modpack na ito na nakalagay sa modpack.conf "
+"nito na mag-o-override sa kahit anong pag-rename dito."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr ""
+msgstr "(Walang binigay na paglalarawan)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "2D Noise"
-msgstr ""
+msgstr "2D Noise"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "< Balik sa Pagsasaayos"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr ""
+msgstr "Mag-browse"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Content"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Content"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
-msgstr ""
+msgstr "Nakasara"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
-msgstr ""
+msgstr "Baguhin"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Enabled"
-msgstr ""
+msgstr "Nakabukas"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Lacunarity"
-msgstr ""
+msgstr "Lacunarity"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Octaves"
-msgstr ""
+msgstr "Mga octave"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Offset"
-msgstr ""
+msgstr "Offset"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Persistence"
-msgstr ""
+msgstr "Persistence"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr ""
+msgstr "Mangyaring maglagay ng valid na integer."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
-msgstr ""
+msgstr "Mangyaring maglagay ng valid na bilang."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr ""
+msgstr "I-restore ang Default"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Scale"
-msgstr ""
+msgstr "Scale"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
-msgstr ""
+msgstr "Maghanap"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select directory"
-msgstr ""
+msgstr "Pumili ng directory"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select file"
-msgstr ""
+msgstr "Pumili ng file"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
-msgstr ""
+msgstr "Ipakita ang mga teknikal na pangalan"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be at least $1."
-msgstr ""
+msgstr "Dapat di bababa sa $1 ang value."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must not be larger than $1."
-msgstr ""
+msgstr "Dapat di lalaki sa $1 ang value."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
-msgstr ""
+msgstr "X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X spread"
-msgstr ""
+msgstr "Pagkalat ng X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y"
-msgstr ""
+msgstr "Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y spread"
-msgstr ""
+msgstr "Pagkalat ng Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z"
-msgstr ""
+msgstr "Z"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z spread"
-msgstr ""
+msgstr "Pagkalat ng Z"
#. ~ "absvalue" is a noise parameter flag.
#. It is short for "absolute value".
@@ -693,14 +787,14 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "absvalue"
-msgstr ""
+msgstr "absvalue"
#. ~ "defaults" is a noise parameter flag.
#. It describes the default processing options
#. for noise settings in main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "defaults"
-msgstr ""
+msgstr "defaults"
#. ~ "eased" is a noise parameter flag.
#. It is used to make the map smoother and
@@ -708,590 +802,610 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "eased"
-msgstr ""
+msgstr "eased"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 (Enabled)"
-msgstr ""
+msgstr "$1 (Nakabukas)"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 mods"
-msgstr ""
+msgstr "$1 (na) mod"
#: builtin/mainmenu/pkgmgr.lua
msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "Bigong ma-install ang $1 sa $2"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find real mod name for: $1"
-msgstr ""
+msgstr "I-install ang Mod: Bigong mahanap ang tunay na pangalan ng mod ng: $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
+"I-install ang Mod: Bigong mahanap ang akmang pangalan ng folder para sa "
+"modpack na $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
-msgstr ""
+msgstr "Bigong makahanap ng valid na mod o modpack"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a $1 as a texture pack"
-msgstr ""
+msgstr "Bigong ma-install ang $1 bilang texture pack"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a game as a $1"
-msgstr ""
+msgstr "Bigong ma-install ang laro bilang $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a mod as a $1"
-msgstr ""
+msgstr "Bigong ma-install ang mod bilang $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a modpack as a $1"
-msgstr ""
+msgstr "Bigong ma-install ang modpack bilang $1"
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
-msgstr ""
+msgstr "Nilo-load..."
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr ""
+msgstr "Nakasara ang listahan ng mga pampublikong server"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
+"Subukang buksan muli ang listahan ng pampublikong server at tingnan ang "
+"koneksyon mo sa internet."
#: builtin/mainmenu/tab_about.lua
msgid "About"
-msgstr ""
+msgstr "Patungkol"
#: builtin/mainmenu/tab_about.lua
msgid "Active Contributors"
-msgstr ""
+msgstr "Mga Aktibong Nag-aambag"
#: builtin/mainmenu/tab_about.lua
msgid "Active renderer:"
-msgstr ""
+msgstr "Aktibong renderer:"
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
-msgstr ""
+msgstr "Mga Core Developer"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
-msgstr ""
+msgstr "Buksan ang User Data Directory"
#: builtin/mainmenu/tab_about.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
+"Bubuksan ang directory na naglalaman ng mga user-provided na mundo,\n"
+"laro, mod, at texture pack sa isang file manager/explorer."
#: builtin/mainmenu/tab_about.lua
msgid "Previous Contributors"
-msgstr ""
+msgstr "Mga Nakaraang Nag-ambag"
#: builtin/mainmenu/tab_about.lua
msgid "Previous Core Developers"
+msgstr "Mga Nakaraang Core Developer"
+
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
msgstr ""
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
-msgstr ""
+msgstr "Mag-browse ng online content"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
-msgstr ""
+msgstr "Content"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
-msgstr ""
+msgstr "Isara ang Texture Pack"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
-msgstr ""
+msgstr "Impormasyon:"
#: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:"
-msgstr ""
+msgstr "Mga Naka-install na Package:"
#: builtin/mainmenu/tab_content.lua
msgid "No dependencies."
-msgstr ""
+msgstr "Walang mga kailangan."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr ""
+msgstr "Walang paglalarawan sa package"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
-msgstr ""
+msgstr "I-rename"
#: builtin/mainmenu/tab_content.lua
msgid "Uninstall Package"
-msgstr ""
+msgstr "Burahin ang Package"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
-msgstr ""
+msgstr "Gumamit ng Texture Pack"
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
-msgstr ""
+msgstr "Ianunsyo ang Server"
#: builtin/mainmenu/tab_local.lua
msgid "Bind Address"
-msgstr ""
+msgstr "I-bind ang Address"
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
-msgstr ""
+msgstr "Creative Mode"
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
-msgstr ""
+msgstr "Buksan ang Pinsala"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr ""
+msgstr "Mag-host ng Laro"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
-msgstr ""
+msgstr "Mag-host ng Server"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
+msgstr "Mag-install ng mga laro mula sa ContentDB"
#: builtin/mainmenu/tab_local.lua
msgid "New"
-msgstr ""
+msgstr "Bago"
#: builtin/mainmenu/tab_local.lua
msgid "No world created or selected!"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr ""
+msgstr "Walang nagawa o napiling mundo!"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
-msgstr ""
+msgstr "Maglaro"
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
-msgstr ""
+msgstr "Port"
#: builtin/mainmenu/tab_local.lua
msgid "Select Mods"
-msgstr ""
+msgstr "Pumili ng mga Mod"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
-msgstr ""
+msgstr "Pumili ng Mundo:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr ""
+msgstr "Port ng Server"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
-msgstr ""
+msgstr "Magsimula"
#: builtin/mainmenu/tab_online.lua
msgid "Address"
-msgstr ""
+msgstr "Address"
#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
msgid "Clear"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr ""
+msgstr "Linisin"
#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
-msgstr ""
+msgstr "Creative mode"
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
msgid "Damage / PvP"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
+msgstr "Pinsala/PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
-msgstr ""
+msgstr "Mga Paborito"
#: builtin/mainmenu/tab_online.lua
msgid "Incompatible Servers"
-msgstr ""
+msgstr "Di compatible na mga Server"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
+msgstr "Sumali sa Laro"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Login"
msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
-msgstr ""
+msgstr "Ping"
#: builtin/mainmenu/tab_online.lua
msgid "Public Servers"
-msgstr ""
+msgstr "Mga Pampublikong Server"
#: builtin/mainmenu/tab_online.lua
msgid "Refresh"
-msgstr ""
+msgstr "I-refresh"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Burahin Paborito"
#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
+msgstr "Paglalarawan sa Server"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
-msgstr ""
+msgstr "3D na Ulap"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr ""
+msgstr "4x"
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr ""
+msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
msgid "All Settings"
-msgstr ""
+msgstr "Lahat ng Pagsasaayos"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Antialiasing:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr ""
+msgstr "Kusang I-save ang Laki ng Screen"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr ""
+msgstr "Bilinear Filter"
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
-msgstr ""
+msgstr "Baguhin ang mga Key"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr ""
+msgstr "Konektadong Salamin"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
-msgstr ""
+msgstr "Dynamic na mga anino"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Dynamic na mga anino: "
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr ""
+msgstr "Magagarang Dahon"
#: builtin/mainmenu/tab_settings.lua
msgid "High"
-msgstr ""
+msgstr "Mataas"
#: builtin/mainmenu/tab_settings.lua
msgid "Low"
-msgstr ""
+msgstr "Mababa"
#: builtin/mainmenu/tab_settings.lua
msgid "Medium"
-msgstr ""
+msgstr "Katamtaman"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr ""
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Aniso. Filter"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "Walang Filter"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr ""
+msgstr "Walang Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr ""
+msgstr "Pag-highlight sa Node"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr ""
+msgstr "Pag-outline sa Node"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
-msgstr ""
+msgstr "Wala"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
-msgstr ""
+msgstr "Opaque na Dahon"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Water"
-msgstr ""
+msgstr "Opaque na Tubig"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr ""
+msgstr "Mga Particle"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
-msgstr ""
+msgstr "Screen:"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
-msgstr ""
+msgstr "Pagsasaayos"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr ""
+msgstr "Mga Shader"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (experimental)"
-msgstr ""
+msgstr "Mga Shader (eksperimento)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
-msgstr ""
+msgstr "Mga Shader (di available)"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr ""
+msgstr "Simpleng Dahon"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr ""
+msgstr "Malinis na Liwanag"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "Pagte-texture:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr ""
+msgstr "Tone Mapping"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr ""
+#, fuzzy
+msgid "Touch threshold (px):"
+msgstr "Touchthreshold: (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr ""
+msgstr "Trilinear Filter"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
-msgstr ""
+#, fuzzy
+msgid "Very High"
+msgstr "Napakataas"
#: builtin/mainmenu/tab_settings.lua
msgid "Very Low"
-msgstr ""
+msgstr "Napakababa"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "Nahahanginang Dahon"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr ""
+msgstr "Umaalong Tubig"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "Nahahanginang Halaman"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Error sa koneksyon (nag-timeout?)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "Nag-timeout ang koneksyon."
#: src/client/client.cpp
msgid "Done!"
-msgstr ""
+msgstr "Tapos na!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "Ini-initialize ang mga node"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "Ini-initialize ang mga node..."
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Nilo-load ang mga texture..."
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Rine-rebuild ang mga shader..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "Error sa koneksyon (nag-timeout?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr ""
+msgstr "Di mahanap o ma-load ang laro: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr ""
+msgstr "Invalid na gamespec."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
-msgstr ""
+msgstr "Main Menu"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "Walang napiling mundo at walang binigay na address. Walang gagawin."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr ""
+msgstr "Masyadong mahaba ang pangalan ng player."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
-msgstr ""
+msgstr "Mangyaring pumili po ng pangalan!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr ""
+msgstr "Bigong mabuksan ang binigay na password file: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "Walang path sa mundo na tumugma sa binigay: "
#: src/client/game.cpp
msgid ""
"\n"
"Check debug.txt for details."
msgstr ""
+"\n"
+"Tingnan ang debug.txt para sa mga detalye."
#: src/client/game.cpp
msgid "- Address: "
-msgstr ""
+msgstr "- Address: "
#: src/client/game.cpp
msgid "- Mode: "
-msgstr ""
+msgstr "- Mode: "
#: src/client/game.cpp
msgid "- Port: "
-msgstr ""
+msgstr "- Port: "
#: src/client/game.cpp
msgid "- Public: "
-msgstr ""
+msgstr "- Pampubliko: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
msgid "- PvP: "
-msgstr ""
+msgstr "- PvP: "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr ""
+msgstr "- Pangalan ng Server: "
#: src/client/game.cpp
msgid "A serialization error occurred:"
-msgstr ""
+msgstr "May naganap na serialization error:"
#: src/client/game.cpp
#, c-format
msgid "Access denied. Reason: %s"
-msgstr ""
+msgstr "Tinanggihan ang access: Dahilan: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
-msgstr ""
+msgstr "Nakasara ang kusang pag-abante"
#: src/client/game.cpp
msgid "Automatic forward enabled"
-msgstr ""
+msgstr "Nakabukas ang kusang pag-abante"
#: src/client/game.cpp
msgid "Block bounds hidden"
-msgstr ""
+msgstr "Nakatago ang mga block bound"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
-msgstr ""
+msgstr "Ipinapakita ang mga block bound para sa lahat ng mga block"
#: src/client/game.cpp
msgid "Block bounds shown for current block"
-msgstr ""
+msgstr "Ipinapakita ang block bound para sa kasalukuyang block"
#: src/client/game.cpp
msgid "Block bounds shown for nearby blocks"
-msgstr ""
+msgstr "Ipinapakita ang mga block bound para sa mga malalapit na block"
#: src/client/game.cpp
msgid "Camera update disabled"
-msgstr ""
+msgstr "Nakasara ang pag-update sa kamera"
#: src/client/game.cpp
msgid "Camera update enabled"
-msgstr ""
+msgstr "Nakabukas ang pag-update sa kamera"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
+"Bawal maipakita ang mga block bound (kailangan ng pribilehiyong "
+"'basic_debug')"
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "Baguhin ang Password"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr ""
+msgstr "Nakasara ang cinematic mode"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr ""
+msgstr "Nakabukas ang cinematic mode"
#: src/client/game.cpp
msgid "Client disconnected"
-msgstr ""
+msgstr "Nadiskonekta ang client"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
-msgstr ""
+msgstr "Nakasara ang scripting sa client side"
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "Kumokonekta sa server..."
#: src/client/game.cpp
msgid "Connection failed for unknown reason"
-msgstr ""
+msgstr "Bigong makakonekta dahil sa di matukoy na dahilan"
#: src/client/game.cpp
msgid "Continue"
-msgstr ""
+msgstr "Magpatuloy"
#: src/client/game.cpp
#, c-format
@@ -1311,31 +1425,45 @@ msgid ""
"- Mouse wheel: select item\n"
"- %s: chat\n"
msgstr ""
+"Mga kontrol:\n"
+"- %s: abante paharap\n"
+"- %s: abante patalikod\n"
+"- %s: kumaliwa\n"
+"- %s: kumanan\n"
+"- %s: tumalon/umakyat\n"
+"- %s: maghukay/sumuntok\n"
+"- %s: maglagay/gumamit\n"
+"- %s: dahan-dahan/bumaba\n"
+"- %s: ihulog ang item\n"
+"- %s: inventory\n"
+"- Mouse: umikot/tumingin\n"
+"- Mouse wheel: pumili ng item\n"
+"- %s: chat\n"
#: src/client/game.cpp
#, c-format
msgid "Couldn't resolve address: %s"
-msgstr ""
+msgstr "Di maresolba ang address: %s"
#: src/client/game.cpp
msgid "Creating client..."
-msgstr ""
+msgstr "Ginagawa ang client..."
#: src/client/game.cpp
msgid "Creating server..."
-msgstr ""
+msgstr "Ginagawa ang server..."
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
-msgstr ""
+msgstr "Nakatago ang debug info at profiler graph"
#: src/client/game.cpp
msgid "Debug info shown"
-msgstr ""
+msgstr "Ipinapakita ang debug info"
#: src/client/game.cpp
msgid "Debug info, profiler graph, and wireframe hidden"
-msgstr ""
+msgstr "Nakatago ang debug info, profiler graph, at wireframe"
#: src/client/game.cpp
msgid ""
@@ -1352,737 +1480,742 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
+"Mga Default na Kontrol:\n"
+"Kapag walang makikitang Menu:\n"
+"- isang pindot: i-activate ang button\n"
+"- dobleng pindot: ilagay/gamitin\n"
+"- padulasin ang daliri: tumingin-tingin sa paligid\n"
+"Kapag makikita ang Menu/Inventory:\n"
+"- dobleng pindot (sa labas):\n"
+" -->isara\n"
+"- pindutin ang stack, pindutin ang slot:\n"
+" --> ilipat ang stack\n"
+"- pindutin at i-drag, pindutin pangalawang daliri\n"
+" --> ilagay ang isang item sa slot\n"
#: src/client/game.cpp
msgid "Disabled unlimited viewing range"
-msgstr ""
+msgstr "Nakasara ang unlimited na viewing range"
#: src/client/game.cpp
msgid "Enabled unlimited viewing range"
-msgstr ""
+msgstr "Nakabukas ang unlimited na viewing range"
+
+#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Ginagawa ang client..."
#: src/client/game.cpp
msgid "Exit to Menu"
-msgstr ""
+msgstr "Umalis sa Menu"
#: src/client/game.cpp
msgid "Exit to OS"
-msgstr ""
+msgstr "Umalis sa OS"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr ""
+msgstr "Nakasara ang fast mode"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr ""
+msgstr "Nakabukas ang fast mode"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr ""
+msgstr "Nakabukas ang fast mode (paalala: walang pribilehiyong 'fast')"
#: src/client/game.cpp
msgid "Fly mode disabled"
-msgstr ""
+msgstr "Nakasara ang fly mode"
#: src/client/game.cpp
msgid "Fly mode enabled"
-msgstr ""
+msgstr "Nakabukas ang fly mode"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
-msgstr ""
+msgstr "Nakabukas ang fly mode (paalala: walang pribilehiyong 'fly')"
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr ""
+msgstr "Nakasara ang hamog"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr ""
+msgstr "Nakabukas ang hamog"
#: src/client/game.cpp
msgid "Game info:"
-msgstr ""
+msgstr "Info ng laro:"
#: src/client/game.cpp
msgid "Game paused"
-msgstr ""
+msgstr "Nakahinto ang laro"
#: src/client/game.cpp
msgid "Hosting server"
-msgstr ""
+msgstr "Nagho-host na server"
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Mga definition ng item..."
#: src/client/game.cpp
msgid "KiB/s"
-msgstr ""
+msgstr "KiB/s"
#: src/client/game.cpp
msgid "Media..."
-msgstr ""
+msgstr "Media..."
#: src/client/game.cpp
msgid "MiB/s"
-msgstr ""
+msgstr "MiB/s"
#: src/client/game.cpp
msgid "Minimap currently disabled by game or mod"
-msgstr ""
+msgstr "Kasalukuyang sinara ng laro o mod ang minimap"
#: src/client/game.cpp
msgid "Multiplayer"
-msgstr ""
+msgstr "Multiplayer"
#: src/client/game.cpp
msgid "Noclip mode disabled"
-msgstr ""
+msgstr "Nakasara ang noclip mode"
#: src/client/game.cpp
msgid "Noclip mode enabled"
-msgstr ""
+msgstr "Nakabukas ang noclip mode"
#: src/client/game.cpp
msgid "Noclip mode enabled (note: no 'noclip' privilege)"
-msgstr ""
+msgstr "Nakabukas ang noclip mode (paalala: walang pribilehiyong 'noclip')"
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr ""
+msgstr "Mga definition ng node..."
#: src/client/game.cpp
msgid "Off"
-msgstr ""
+msgstr "Sarado"
#: src/client/game.cpp
msgid "On"
-msgstr ""
+msgstr "Bukas"
#: src/client/game.cpp
msgid "Pitch move mode disabled"
-msgstr ""
+msgstr "Nakasara ang pitch move mode"
#: src/client/game.cpp
msgid "Pitch move mode enabled"
-msgstr ""
+msgstr "Nakabukas ang pitch move mode"
#: src/client/game.cpp
msgid "Profiler graph shown"
-msgstr ""
+msgstr "Ipinapakita ang profiler graph"
#: src/client/game.cpp
msgid "Remote server"
-msgstr ""
+msgstr "Remote na server"
#: src/client/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "Rineresolba ang address..."
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "Sina-shutdown..."
#: src/client/game.cpp
msgid "Singleplayer"
-msgstr ""
+msgstr "Singleplayer"
#: src/client/game.cpp
msgid "Sound Volume"
-msgstr ""
+msgstr "Volume ng Tunog"
#: src/client/game.cpp
msgid "Sound muted"
-msgstr ""
+msgstr "Naka-mute ang tunog"
#: src/client/game.cpp
msgid "Sound system is disabled"
-msgstr ""
+msgstr "Nakasara ang system ng tunog"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr ""
+msgstr "Di suportado ang system ng tunog sa build na ito"
#: src/client/game.cpp
msgid "Sound unmuted"
-msgstr ""
+msgstr "Di na naka-mute ang tunog"
#: src/client/game.cpp
#, c-format
msgid "The server is probably running a different version of %s."
-msgstr ""
+msgstr "Baka ibang bersyon ng %s ang pinapatakbo ng server."
#: src/client/game.cpp
#, c-format
msgid "Unable to connect to %s because IPv6 is disabled"
-msgstr ""
+msgstr "Bigong makakonekta sa %s dahil nakasara ang IPv6"
#: src/client/game.cpp
#, c-format
msgid "Unable to listen on %s because IPv6 is disabled"
-msgstr ""
+msgstr "Bigong makakinig sa %s dahil nakasara ang IPv6"
#: src/client/game.cpp
#, c-format
msgid "Viewing range changed to %d"
-msgstr ""
+msgstr "Binago ang viewing range papuntang %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at maximum: %d"
-msgstr ""
+msgstr "Nasa maximum na ang viewing range: %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at minimum: %d"
-msgstr ""
+msgstr "Nasa minimum na ang viewing range: %d"
#: src/client/game.cpp
#, c-format
msgid "Volume changed to %d%%"
-msgstr ""
+msgstr "Binago ang volume papuntang %d%%"
#: src/client/game.cpp
msgid "Wireframe shown"
-msgstr ""
+msgstr "Ipinapakita ang wireframe"
#: src/client/game.cpp
msgid "Zoom currently disabled by game or mod"
-msgstr ""
+msgstr "Kasalukuyang sinara ng laro o mod ang pag-zoom"
#: src/client/game.cpp
msgid "ok"
-msgstr ""
+msgstr "sige"
#: src/client/gameui.cpp
msgid "Chat hidden"
-msgstr ""
+msgstr "Nakatago ang chat"
#: src/client/gameui.cpp
msgid "Chat shown"
-msgstr ""
+msgstr "Ipinapakita ang chat"
#: src/client/gameui.cpp
msgid "HUD hidden"
-msgstr ""
+msgstr "Nakatago ang HUD"
#: src/client/gameui.cpp
msgid "HUD shown"
-msgstr ""
+msgstr "Ipinapakita ang HUD"
#: src/client/gameui.cpp
msgid "Profiler hidden"
-msgstr ""
+msgstr "Nakatago ang profiler"
#: src/client/gameui.cpp
#, c-format
msgid "Profiler shown (page %d of %d)"
-msgstr ""
+msgstr "Ipinapakita ang profiler (pahina %d ng %d)"
#: src/client/keycode.cpp
msgid "Apps"
-msgstr ""
+msgstr "Mga App"
#: src/client/keycode.cpp
msgid "Backspace"
-msgstr ""
+msgstr "Backspace"
#: src/client/keycode.cpp
msgid "Caps Lock"
-msgstr ""
+msgstr "Caps Lock"
#: src/client/keycode.cpp
msgid "Control"
-msgstr ""
+msgstr "Control"
#: src/client/keycode.cpp
msgid "Down"
-msgstr ""
+msgstr "Down"
#: src/client/keycode.cpp
msgid "End"
-msgstr ""
+msgstr "End"
#: src/client/keycode.cpp
msgid "Erase EOF"
-msgstr ""
+msgstr "Erase EOF"
#: src/client/keycode.cpp
msgid "Execute"
-msgstr ""
+msgstr "Execute"
#: src/client/keycode.cpp
msgid "Help"
-msgstr ""
+msgstr "Help"
#: src/client/keycode.cpp
msgid "Home"
-msgstr ""
+msgstr "Home"
#: src/client/keycode.cpp
msgid "IME Accept"
-msgstr ""
+msgstr "IME Accept"
#: src/client/keycode.cpp
msgid "IME Convert"
-msgstr ""
+msgstr "IME Convert"
#: src/client/keycode.cpp
msgid "IME Escape"
-msgstr ""
+msgstr "IME Escape"
#: src/client/keycode.cpp
msgid "IME Mode Change"
-msgstr ""
+msgstr "IME Mode Change"
#: src/client/keycode.cpp
msgid "IME Nonconvert"
-msgstr ""
+msgstr "IME Nonconvert"
#: src/client/keycode.cpp
msgid "Insert"
-msgstr ""
+msgstr "Insert"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Left"
-msgstr ""
+msgstr "Left"
#: src/client/keycode.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Left Button"
#: src/client/keycode.cpp
msgid "Left Control"
-msgstr ""
+msgstr "Left Control"
#: src/client/keycode.cpp
msgid "Left Menu"
-msgstr ""
+msgstr "Left Menu"
#: src/client/keycode.cpp
msgid "Left Shift"
-msgstr ""
+msgstr "Left Shift"
#: src/client/keycode.cpp
msgid "Left Windows"
-msgstr ""
+msgstr "Left Windows"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
msgid "Menu"
-msgstr ""
+msgstr "Menu"
#: src/client/keycode.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Middle Button"
#: src/client/keycode.cpp
msgid "Num Lock"
-msgstr ""
+msgstr "Num Lock"
#: src/client/keycode.cpp
msgid "Numpad *"
-msgstr ""
+msgstr "Numpad *"
#: src/client/keycode.cpp
msgid "Numpad +"
-msgstr ""
+msgstr "Numpad +"
#: src/client/keycode.cpp
msgid "Numpad -"
-msgstr ""
+msgstr "Numpad -"
#: src/client/keycode.cpp
msgid "Numpad ."
-msgstr ""
+msgstr "Numpad ."
#: src/client/keycode.cpp
msgid "Numpad /"
-msgstr ""
+msgstr "Numpad /"
#: src/client/keycode.cpp
msgid "Numpad 0"
-msgstr ""
+msgstr "Numpad 0"
#: src/client/keycode.cpp
msgid "Numpad 1"
-msgstr ""
+msgstr "Numpad 1"
#: src/client/keycode.cpp
msgid "Numpad 2"
-msgstr ""
+msgstr "Numpad 2"
#: src/client/keycode.cpp
msgid "Numpad 3"
-msgstr ""
+msgstr "Numpad 3"
#: src/client/keycode.cpp
msgid "Numpad 4"
-msgstr ""
+msgstr "Numpad 4"
#: src/client/keycode.cpp
msgid "Numpad 5"
-msgstr ""
+msgstr "Numpad 5"
#: src/client/keycode.cpp
msgid "Numpad 6"
-msgstr ""
+msgstr "Numpad 6"
#: src/client/keycode.cpp
msgid "Numpad 7"
-msgstr ""
+msgstr "Numpad 7"
#: src/client/keycode.cpp
msgid "Numpad 8"
-msgstr ""
+msgstr "Numpad 8"
#: src/client/keycode.cpp
msgid "Numpad 9"
-msgstr ""
+msgstr "Numpad 9"
#: src/client/keycode.cpp
msgid "OEM Clear"
-msgstr ""
+msgstr "OEM Clear"
#: src/client/keycode.cpp
msgid "Page down"
-msgstr ""
+msgstr "Page down"
#: src/client/keycode.cpp
msgid "Page up"
-msgstr ""
+msgstr "Page up"
#: src/client/keycode.cpp
msgid "Pause"
-msgstr ""
+msgstr "Pause"
#: src/client/keycode.cpp
msgid "Play"
-msgstr ""
+msgstr "Play"
#. ~ "Print screen" key
#: src/client/keycode.cpp
msgid "Print"
-msgstr ""
+msgstr "Print"
#: src/client/keycode.cpp
msgid "Return"
-msgstr ""
+msgstr "Return"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Right"
-msgstr ""
+msgstr "Right"
#: src/client/keycode.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Right Button"
#: src/client/keycode.cpp
msgid "Right Control"
-msgstr ""
+msgstr "Right Control"
#: src/client/keycode.cpp
msgid "Right Menu"
-msgstr ""
+msgstr "Right Menu"
#: src/client/keycode.cpp
msgid "Right Shift"
-msgstr ""
+msgstr "Right Shift"
#: src/client/keycode.cpp
msgid "Right Windows"
-msgstr ""
+msgstr "Right Windows"
#: src/client/keycode.cpp
msgid "Scroll Lock"
-msgstr ""
+msgstr "Scroll Lock"
#. ~ Key name
#: src/client/keycode.cpp
msgid "Select"
-msgstr ""
+msgstr "Select"
#: src/client/keycode.cpp
msgid "Shift"
-msgstr ""
+msgstr "Shift"
#: src/client/keycode.cpp
msgid "Sleep"
-msgstr ""
+msgstr "Sleep"
#: src/client/keycode.cpp
msgid "Snapshot"
-msgstr ""
+msgstr "Snapshot"
#: src/client/keycode.cpp
msgid "Space"
-msgstr ""
+msgstr "Space"
#: src/client/keycode.cpp
msgid "Tab"
-msgstr ""
+msgstr "Tab"
#: src/client/keycode.cpp
msgid "Up"
-msgstr ""
+msgstr "Up"
#: src/client/keycode.cpp
msgid "X Button 1"
-msgstr ""
+msgstr "X Button 1"
#: src/client/keycode.cpp
msgid "X Button 2"
-msgstr ""
+msgstr "X Button 2"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Zoom"
-msgstr ""
+msgstr "Zoom"
#: src/client/minimap.cpp
msgid "Minimap hidden"
-msgstr ""
+msgstr "Nakatago ang minimap"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in radar mode, Zoom x%d"
-msgstr ""
+msgstr "Minimap sa radar mode, Zoom x%d"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr ""
+msgstr "Minimap sa surface mode, Zoom x%d"
#: src/client/minimap.cpp
msgid "Minimap in texture mode"
-msgstr ""
+msgstr "Minimap sa texture mode"
#: src/gui/guiChatConsole.cpp
msgid "Failed to open webpage"
-msgstr ""
+msgstr "Bigong mabuksan ang webpage"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
+msgstr "Binubuksan ang webpage"
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
-msgstr ""
+msgstr "Tumuloy"
#: src/gui/guiKeyChangeMenu.cpp
msgid "\"Aux1\" = climb down"
-msgstr ""
+msgstr "\"Aux1\" = bumaba"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
-msgstr ""
+msgstr "Kusang abante"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Automatic jumping"
-msgstr ""
+msgstr "Kusang talon"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
-msgstr ""
+msgstr "Aux1"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
-msgstr ""
+msgstr "Pabalik"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Block bounds"
-msgstr ""
+msgstr "Mga block bound"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
-msgstr ""
+msgstr "Palitan ang kamera"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
-msgstr ""
+msgstr "Chat"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Command"
-msgstr ""
+msgstr "Utos"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Console"
-msgstr ""
+msgstr "Console"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. range"
-msgstr ""
+msgstr "Dec. range"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. volume"
-msgstr ""
+msgstr "Dec. volume"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
+msgstr "Dobleng pindutin ang \"tumalon\" para makalipad"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Drop"
-msgstr ""
+msgstr "Ihulog"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Forward"
-msgstr ""
+msgstr "Abante"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. range"
-msgstr ""
+msgstr "Inc. range"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. volume"
-msgstr ""
+msgstr "Inc. volume"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inventory"
-msgstr ""
+msgstr "Inventory"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Jump"
-msgstr ""
+msgstr "Tumalon"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Key already in use"
-msgstr ""
+msgstr "May gamit na ang key"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
-msgstr ""
+msgstr "Lokal na utos"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Mute"
-msgstr ""
+msgstr "I-mute"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Next item"
-msgstr ""
+msgstr "Susunod na item"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Prev. item"
-msgstr ""
+msgstr "Nakaraang item"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Range select"
-msgstr ""
+msgstr "Pagpili sa saklaw"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Screenshot"
-msgstr ""
+msgstr "Mag-screenshot"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr ""
+msgstr "Magdahan-dahan"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
-msgstr ""
+msgstr "I-toggle ang HUD"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle chat log"
-msgstr ""
+msgstr "I-toggle ang chat log"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fast"
-msgstr ""
+msgstr "I-toggle ang fast"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fly"
-msgstr ""
+msgstr "I-toggle ang fly"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fog"
-msgstr ""
+msgstr "I-toggle ang hamog"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle minimap"
-msgstr ""
+msgstr "I-toggle ang minimap"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle noclip"
-msgstr ""
+msgstr "I-toggle ang noclip"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle pitchmove"
-msgstr ""
+msgstr "I-toggle ang pitchmove"
#: src/gui/guiKeyChangeMenu.cpp
msgid "press key"
-msgstr ""
+msgstr "pumindot ng key"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
-msgstr ""
-
-#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr ""
+msgstr "Baguhin"
#: src/gui/guiPasswordChange.cpp
msgid "New Password"
-msgstr ""
+msgstr "Bagong Password"
#: src/gui/guiPasswordChange.cpp
msgid "Old Password"
-msgstr ""
+msgstr "Lumang Password"
+
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Di tugma ang mga password!"
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
-msgstr ""
+msgstr "Umalis"
#: src/gui/guiVolumeChange.cpp
msgid "Muted"
-msgstr ""
+msgstr "Naka-mute"
#: src/gui/guiVolumeChange.cpp
#, c-format
msgid "Sound Volume: %d%%"
-msgstr ""
-
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
+msgstr "Volume ng Tunog: %d%%"
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
#: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp
msgid "LANG_CODE"
+msgstr "fil"
+
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
msgstr ""
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Mangyaring pumili po ng pangalan!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
"If disabled, virtual joystick will center to first-touch's position."
msgstr ""
+"(Android) Inaayos ang posisyon ng virtual joystick.\n"
+"Kung nakasara, isesentro ang virtual joystick sa posisyon na unang pinindot."
#: src/settings_translation_file.cpp
msgid ""
@@ -2090,6 +2223,10 @@ msgid ""
"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
+"(Android) Gamitin ang virtual joystick para i-trigger ang button na "
+"\"Aux1\".\n"
+"Kung nakabukas, pipindutin din ng virtual joystick ang button na \"Aux1\" "
+"kapag nasa labas ng pinakabilog."
#: src/settings_translation_file.cpp
msgid ""
@@ -2102,6 +2239,16 @@ msgid ""
"situations.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z) offset ng fractal mula sa sentro ng mundo sa mga unit ng 'scale'.\n"
+"Pwedeng magamit para ilipat ang isang partikular na punto papunta sa (0,0) "
+"para\n"
+"makagawa ng isang maayos na spawn point, o para payagan ang\n"
+"pag-zoom papalapit sa naturang punto sa pamamagitan ng pagtaas sa 'scale'.\n"
+"Ginawa ang default para sa maayos na spawn point para sa\n"
+"mga Mandelbrot set na may mga default na parametro,\n"
+"posibleng kailangang baguhin ito sa ilang mga sitwasyon.\n"
+"Mula -2 hanggang 2 ang tipikal na saklaw. I-multiply sa 'scale' para sa "
+"offset sa mga node."
#: src/settings_translation_file.cpp
msgid ""
@@ -2113,56 +2260,70 @@ msgid ""
"Default is for a vertically-squashed shape suitable for\n"
"an island, set all 3 numbers equal for the raw shape."
msgstr ""
+"(X,Y,Z) scale ng fractal sa mga node.\n"
+"2 hanggang 3 beses na mas malaki ang aktwal na laki ng fractal.\n"
+"Pwede sobrang laki ang mga bilang nito, hindi naman dapat\n"
+"sinlaki ng mundo ang fractal.\n"
+"Palakihin ito para mag-zoom sa mga detalye ng fractal.\n"
+"Para sa isang hugis na inipit taas-baba ang default,\n"
+"na bagay para sa mga isla, itakda ang lahat ng 3 bilang nang magkakapareho "
+"para sa raw na hugis."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of ridged mountains."
msgstr ""
+"2D noise na kumokonttol sa hugis/laki ng mga mala-gulugod na kabundukan."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of rolling hills."
-msgstr ""
+msgstr "2D noise na kumokontrol sa hugis/laki ng mga malalambot na burol."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of step mountains."
-msgstr ""
+msgstr "2D noise na kumokontrol sa hugis/laki ng mga mala-hagdang kabundukan."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of ridged mountain ranges."
msgstr ""
+"2D noise na kumokontrol sa laki/paglitaw ng mga mala-gulugod na kabundukan."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of rolling hills."
-msgstr ""
+msgstr "2D noise na kumokontrol sa laki/paglitaw ng mga malalambot na burol."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of step mountain ranges."
msgstr ""
+"2D noise na kumokontrol sa laki/paglitaw ng mga mala-hagdang kabundukan."
#: src/settings_translation_file.cpp
msgid "2D noise that locates the river valleys and channels."
-msgstr ""
+msgstr "2D noise na nagpapakita sa mga lambak-ilog at daluyan."
#: src/settings_translation_file.cpp
msgid "3D clouds"
-msgstr ""
+msgstr "Mga 3D na ulap"
#: src/settings_translation_file.cpp
msgid "3D mode"
-msgstr ""
+msgstr "3D mode"
#: src/settings_translation_file.cpp
msgid "3D mode parallax strength"
-msgstr ""
+msgstr "Tindi ng parallax ng 3D mode"
#: src/settings_translation_file.cpp
msgid "3D noise defining giant caverns."
-msgstr ""
+msgstr "3D noise na gumagawa sa mga malalaking kweba."
#: src/settings_translation_file.cpp
msgid ""
"3D noise defining mountain structure and height.\n"
"Also defines structure of floatland mountain terrain."
msgstr ""
+"3D noise na gumagawa sa istraktura at taas ng bundok.\n"
+"Ito rij ang gumagawa sa istraktura ng terrain ng bundok sa mga lumulutang na "
+"lupa."
#: src/settings_translation_file.cpp
msgid ""
@@ -2171,22 +2332,30 @@ 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 ""
+"3D noise na gumagawa sa istraktura ng mga lumulutang na lupa.\n"
+"Kung binago sa default, posibleng kailangang baguhin ang noise 'scale' (0.7 "
+"sa default),\n"
+"dahil mas maganda na kalalabasan nito kung ang noise ay may value\n"
+"na nasa pagitan ng -2.0 at 2.0."
#: src/settings_translation_file.cpp
msgid "3D noise defining structure of river canyon walls."
msgstr ""
+"3D noise na gumagawa sa istraktura ng mga dingding ng bangin sa mga ilog."
#: src/settings_translation_file.cpp
msgid "3D noise defining terrain."
-msgstr ""
+msgstr "3D noise na gumagawa sa terrain."
#: src/settings_translation_file.cpp
msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations."
msgstr ""
+"3D noise para sa mga overhang ng bundok, dalisdis, atbp. Madalas na maliit "
+"ang mga pagbabago."
#: src/settings_translation_file.cpp
msgid "3D noise that determines number of dungeons per mapchunk."
-msgstr ""
+msgstr "3D noise na nagdedetermina sa bilang ng mga dungeon kada mapchunk."
#: src/settings_translation_file.cpp
msgid ""
@@ -2201,56 +2370,75 @@ msgid ""
"- pageflip: quadbuffer based 3d.\n"
"Note that the interlaced mode requires shaders to be enabled."
msgstr ""
+"Suporta sa 3D.\n"
+"Kasalukuyang suportado:\n"
+"- wala: walang 3d output.\n"
+"- anaglyph: kulay cyan/magenta color na 3d.\n"
+"- interlaced: linyang odd/even na nakabase sa suporta sa polarisation "
+"screen.\n"
+"- topbottom: hatiin ang screen taas-baba.\n"
+"- sidebyside: hatiin ang screen gilid sa gilid.\n"
+"- crossview: naka-cross eye na 3d\n"
+"- pageflip: nakabase sa quadbuffer na 3d.\n"
+"Tandaan na dapat nakabukas ang mga shader para gumana ang interlaced mode."
+
+#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
+"Piniling seed ng mapa para sa bagong mapa, ibakante para kahit ano.\n"
+"Io-override kapag gumagawa ng bagong mundo sa main menu."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
msgstr ""
+"Ipapakitang mensahe sa lahat ng mga client sakaling mag-crash ang server."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
msgstr ""
+"Mensaheng ipapakita sa lahat ng mga client kapag nag-shutdown ang server."
#: src/settings_translation_file.cpp
msgid "ABM interval"
-msgstr ""
+msgstr "Pagitan ng ABM"
#: src/settings_translation_file.cpp
msgid "ABM time budget"
-msgstr ""
+msgstr "Budget sa oras ng ABM"
#: src/settings_translation_file.cpp
msgid "Absolute limit of queued blocks to emerge"
-msgstr ""
+msgstr "Pinakalimit ng nakapilang block na lalabas"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
-msgstr ""
+msgstr "Acceleration sa ere"
#: src/settings_translation_file.cpp
msgid "Acceleration of gravity, in nodes per second per second."
-msgstr ""
+msgstr "Acceleration ng gravity, sa node kada segundo kada segundo."
#: src/settings_translation_file.cpp
msgid "Active Block Modifiers"
-msgstr ""
+msgstr "Mga Modifier sa Aktibong Block"
#: src/settings_translation_file.cpp
msgid "Active block management interval"
-msgstr ""
+msgstr "Pagitan sa management sa aktibong block"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "Saklaw na aktibong block"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr ""
+msgstr "Saklaw na mapapadala sa aktibong bagay"
#: src/settings_translation_file.cpp
msgid ""
@@ -2258,20 +2446,28 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
+"Address na kokonektahan.\n"
+"Ibakante para magsimula ng lokal na server.\n"
+"Tandaan na ang ino-override ng pagsasaayos na ito ang address field sa main "
+"menu."
#: src/settings_translation_file.cpp
msgid "Adds particles when digging a node."
-msgstr ""
+msgstr "Nagdadagdag ng mga particle habang naghuhukay ng node."
#: src/settings_translation_file.cpp
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
+"Ayusin ang dpi configuration ayon sa screen mo (non X11/Android lang) hal. "
+"para sa mga 4k screen."
#: src/settings_translation_file.cpp
msgid "Adjust the detected display density, used for scaling UI elements."
msgstr ""
+"Ayusin ang na-detect na display density, ginagamit para sa pag-scale sa mga "
+"UI element."
#: src/settings_translation_file.cpp
#, c-format
@@ -2282,10 +2478,22 @@ msgid ""
"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n"
"to be sure) creates a solid floatland layer."
msgstr ""
+"Ayusin ang density ng layer ng lumulutang na lupa.\n"
+"Pataasin ang value para pataasin ang density.\n"
+"Pwedeng maging postibo o negatibo.\n"
+"Value = 0.0: 50% ng volume ay lumulutang na lupa.\n"
+"Value = 2.0 (o mas mataas, depende sa 'mgv7_np_floatland', palaging subukan "
+"para makasiguro)\n"
+"gumagawa ng solidong layer ng lumulutang na lupa."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Idagdag ang pangalan ng item"
#: src/settings_translation_file.cpp
msgid "Advanced"
-msgstr ""
+msgstr "Karagdagan"
#: src/settings_translation_file.cpp
msgid ""
@@ -2295,60 +2503,70 @@ msgid ""
"This only has significant effect on daylight and artificial\n"
"light, it has very little effect on natural night light."
msgstr ""
+"Binabago ang kurba ng liwanag sa pamamagitan ng paglapat ng 'pagtama sa "
+"gamma' dito.\n"
+"Mas mataas ang value, mas maliwanag ang mga katamtaman at mabababang lebel "
+"ng liwanag.\n"
+"Kapag 1.0 ang value, walang mababago sa kurba ng liwanag.\n"
+"Malaki ang epekto nito sa liwanag ng araw at artipisyal,\n"
+"at maliit lang ang epekto nito sa natural na liwanag sa gabi."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
-msgstr ""
+#, fuzzy
+msgid "Always fly fast"
+msgstr "Palaging lumipad at mabilis"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
-msgstr ""
+msgstr "Ambient occlusion gamma"
#: src/settings_translation_file.cpp
msgid "Amount of messages a player may send per 10 seconds."
-msgstr ""
+msgstr "Dami ng mga mensaheng pwede maipadala ng isang player kada 10 segundo."
#: src/settings_translation_file.cpp
msgid "Amplifies the valleys."
-msgstr ""
+msgstr "Ina-amplify ang mga lambak."
#: src/settings_translation_file.cpp
msgid "Anisotropic filtering"
-msgstr ""
+msgstr "Anisotropic filtering"
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "Ianunsyo ang server"
#: src/settings_translation_file.cpp
msgid "Announce to this serverlist."
-msgstr ""
+msgstr "Ianunsyo sa serverlist na ito."
#: src/settings_translation_file.cpp
msgid "Append item name"
-msgstr ""
+msgstr "Idagdag ang pangalan ng item"
#: src/settings_translation_file.cpp
msgid "Append item name to tooltip."
-msgstr ""
+msgstr "Idagdag ang pangalan ng item sa tooltip."
#: src/settings_translation_file.cpp
msgid "Apple trees noise"
-msgstr ""
+msgstr "Noise ng mga puno ng mansanas"
#: src/settings_translation_file.cpp
msgid "Arm inertia"
-msgstr ""
+msgstr "Inertia ng braso"
#: src/settings_translation_file.cpp
msgid ""
"Arm inertia, gives a more realistic movement of\n"
"the arm when the camera moves."
msgstr ""
+"Inertia ng braso, nagbibigay ng mas makatotohanang paggalaw sa\n"
+"braso kapag gumagalaw ang kamera."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "Tanunging kung kokonekta uli matapos mag-crash"
#: src/settings_translation_file.cpp
msgid ""
@@ -2364,106 +2582,125 @@ msgid ""
"optimization.\n"
"Stated in mapblocks (16 nodes)."
msgstr ""
+"Sa layong ito, agresibong iooptimisa ng server ang mga\n"
+"block na ipapadala sa client.\n"
+"Posibleng humusay ang performance kapag mababa ang value, pero may mga "
+"makikita lang\n"
+"mga glitch sa pag-render (may mga block na hindi mare-render sa\n"
+"ilalim ng tubig at kweba, paminsan-minsan sa lupa rin).\n"
+"Kung lagpas ang value sa max_block_send_distance,\n"
+"isasara ang pag-ooptimisa.\n"
+"Tinukoy sa mga mapblock (16 na node)."
#: src/settings_translation_file.cpp
-msgid "Automatic forward key"
+msgid "Audio"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Automatic forward key"
+msgstr "Key sa kusang pag-abante"
+
+#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
-msgstr ""
+msgstr "Kusang tumalon sa mga harang na isang node."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
-msgstr ""
+msgstr "Kusang mag-ulat sa serverlist."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
-msgstr ""
+msgstr "Kusang i-save ang laki ng screen"
#: src/settings_translation_file.cpp
msgid "Autoscaling mode"
-msgstr ""
+msgstr "Kusang mag-scale"
#: src/settings_translation_file.cpp
msgid "Aux1 key"
-msgstr ""
+msgstr "Aux1 key"
#: src/settings_translation_file.cpp
msgid "Aux1 key for climbing/descending"
-msgstr ""
+msgstr "Aux1 key para sa pag-akyat/pagbaba"
#: src/settings_translation_file.cpp
msgid "Backward key"
-msgstr ""
+msgstr "Key sa pag-atras"
#: src/settings_translation_file.cpp
msgid "Base ground level"
-msgstr ""
+msgstr "Basehang lebel ng lupa"
#: src/settings_translation_file.cpp
msgid "Base terrain height."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
+msgstr "Basehang taas ng terrain."
#: src/settings_translation_file.cpp
msgid "Basic privileges"
-msgstr ""
+msgstr "Mga pribilehiyong basic"
#: src/settings_translation_file.cpp
msgid "Beach noise"
-msgstr ""
+msgstr "Noise ng dalampasigan"
#: src/settings_translation_file.cpp
msgid "Beach noise threshold"
-msgstr ""
+msgstr "Threshold ng noise ng dalampasigan"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
-msgstr ""
+msgstr "Bilinear filtering"
#: src/settings_translation_file.cpp
msgid "Bind address"
-msgstr ""
+msgstr "Bind address"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
-msgstr ""
+#, fuzzy
+msgid "Biome API noise parameters"
+msgstr "Mga parametro sa noise ng temperatura at halumigmig sa Biome API"
#: src/settings_translation_file.cpp
msgid "Biome noise"
-msgstr ""
+msgstr "Noise ng biome"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
+msgstr "Layo ng pag-optimisa sa pagpadala ng block"
+
+#: src/settings_translation_file.cpp
+msgid "Bobbing"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
-msgstr ""
+msgstr "Path ng font na bold at italic"
#: src/settings_translation_file.cpp
msgid "Bold and italic monospace font path"
-msgstr ""
+msgstr "Path ng monospace font na bold at italic"
#: src/settings_translation_file.cpp
msgid "Bold font path"
-msgstr ""
+msgstr "Path ng font na bold"
#: src/settings_translation_file.cpp
msgid "Bold monospace font path"
-msgstr ""
+msgstr "Path ng monospace font na bold"
#: src/settings_translation_file.cpp
msgid "Build inside player"
-msgstr ""
+msgstr "Build sa player"
#: src/settings_translation_file.cpp
msgid "Builtin"
-msgstr ""
+msgstr "Builtin"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Palitan ang kamera"
#: src/settings_translation_file.cpp
msgid ""
@@ -2472,182 +2709,198 @@ msgid ""
"Increasing can reduce artifacting on weaker GPUs.\n"
"0.1 = Default, 0.25 = Good value for weaker tablets."
msgstr ""
+"Layo sa node ng 'near clipping plane' ng kamera, mula 0 hanggang 0.25\n"
+"Gagana lang sa mga GLES platform. Hindi kailangang baguhin ito ng karamihan "
+"sa mga user.\n"
+"Posibleng mabawasan ang pag-artifact sa mga mahihinang GPU kapag tinaasan "
+"ito.\n"
+"0.1 = Default, 0.25 = Magandang value para sa mga mahihinang tablet."
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr ""
+msgstr "Pag-smooth sa kamera"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Pag-smooth sa kamera sa cinematic mode"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
-msgstr ""
+msgstr "Toggle key sa pag-update sa kamera"
#: src/settings_translation_file.cpp
msgid "Cave noise"
-msgstr ""
+msgstr "Noise ng kweba"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr ""
+msgstr "Noise ng kweba #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr ""
+msgstr "Noise ng kweba #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Lapad ng kweba"
#: src/settings_translation_file.cpp
msgid "Cave1 noise"
-msgstr ""
+msgstr "Cave1 noise"
#: src/settings_translation_file.cpp
msgid "Cave2 noise"
-msgstr ""
+msgstr "Cave2 noise"
#: src/settings_translation_file.cpp
msgid "Cavern limit"
-msgstr ""
+msgstr "Limit ng kweba"
#: src/settings_translation_file.cpp
msgid "Cavern noise"
-msgstr ""
+msgstr "Noise ng kweba"
#: src/settings_translation_file.cpp
msgid "Cavern taper"
-msgstr ""
+msgstr "Taper ng kweba"
#: src/settings_translation_file.cpp
msgid "Cavern threshold"
-msgstr ""
+msgstr "Threshold ng kweba"
#: src/settings_translation_file.cpp
msgid "Cavern upper limit"
-msgstr ""
+msgstr "Mataas na limit ng kweba"
#: src/settings_translation_file.cpp
msgid ""
"Center of light curve boost range.\n"
"Where 0.0 is minimum light level, 1.0 is maximum light level."
msgstr ""
+"Gitna ng saklaw ng boost sa kurba ng liwanag.\n"
+"Kung saan 0.0 ang pinakamababang lebel ng liwanag, 1.0 naman ang "
+"pinakamataas."
#: src/settings_translation_file.cpp
msgid "Chat command time message threshold"
-msgstr ""
+msgstr "Threshold sa mensahe sa oras ng utos sa chat"
#: src/settings_translation_file.cpp
msgid "Chat commands"
-msgstr ""
+msgstr "Mga utos sa chat"
#: src/settings_translation_file.cpp
msgid "Chat font size"
-msgstr ""
+msgstr "Laki ng font ng chat"
#: src/settings_translation_file.cpp
msgid "Chat key"
-msgstr ""
+msgstr "Key ng chat"
#: src/settings_translation_file.cpp
msgid "Chat log level"
-msgstr ""
+msgstr "Lebel ng pag-log sa chat"
#: src/settings_translation_file.cpp
msgid "Chat message count limit"
-msgstr ""
+msgstr "Limit sa bilang ng mga mensahe sa chat"
#: src/settings_translation_file.cpp
msgid "Chat message format"
-msgstr ""
+msgstr "Format ng mensahe sa chat"
#: src/settings_translation_file.cpp
msgid "Chat message kick threshold"
-msgstr ""
+msgstr "Threshold sa pagsipa sa mensahe sa chat"
#: src/settings_translation_file.cpp
msgid "Chat message max length"
-msgstr ""
+msgstr "Max na haba ng mensahe sa chat"
#: src/settings_translation_file.cpp
msgid "Chat toggle key"
-msgstr ""
+msgstr "Toggle key sa chat"
#: src/settings_translation_file.cpp
msgid "Chat weblinks"
-msgstr ""
+msgstr "Mga weblink sa chat"
#: src/settings_translation_file.cpp
msgid "Chunk size"
-msgstr ""
+msgstr "Laki ng chunk"
#: src/settings_translation_file.cpp
msgid "Cinematic mode"
-msgstr ""
+msgstr "Cinematic mode"
#: src/settings_translation_file.cpp
msgid "Cinematic mode key"
-msgstr ""
+msgstr "Key sa cinematic mode"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
-msgstr ""
+msgstr "Malilinis na transparent na texture"
#: src/settings_translation_file.cpp
msgid ""
"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
"output."
msgstr ""
+"Nakabukas ang napipindot na mga weblink (gitnang pindot o Ctrl+kaliwang "
+"pindot) sa chat console output."
#: src/settings_translation_file.cpp
msgid "Client"
-msgstr ""
+msgstr "Client"
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "Client at Server"
#: src/settings_translation_file.cpp
msgid "Client modding"
-msgstr ""
+msgstr "Pag-mod ng client"
#: src/settings_translation_file.cpp
msgid "Client side modding restrictions"
-msgstr ""
+msgstr "Mga restriksyon sa pag-mod ng client side"
#: src/settings_translation_file.cpp
msgid "Client side node lookup range restriction"
-msgstr ""
+msgstr "Restriksyon sa saklaw ng pagtingin sa node ng client side"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Pag-mod ng client"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-msgstr ""
+msgstr "Bilis ng pag-akyat"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr ""
+msgstr "Radius ng ulap"
#: src/settings_translation_file.cpp
msgid "Clouds"
-msgstr ""
+msgstr "Mga ulap"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "Epekto sa client side ang mga ulap."
#: src/settings_translation_file.cpp
msgid "Clouds in menu"
-msgstr ""
+msgstr "Mga ulap sa menu"
#: src/settings_translation_file.cpp
msgid "Colored fog"
-msgstr ""
+msgstr "May kulay na hamog"
#: src/settings_translation_file.cpp
msgid "Colored shadows"
-msgstr ""
+msgstr "Makukulay na anino"
#: src/settings_translation_file.cpp
msgid ""
@@ -2717,6 +2970,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2750,7 +3007,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2817,11 +3076,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2964,6 +3223,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Mga dekorasyon"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -2984,6 +3248,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3053,6 +3323,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3069,19 +3343,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3155,6 +3423,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3173,6 +3445,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3250,8 +3526,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Antialiasing:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3318,6 +3595,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3466,6 +3747,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Mga Laro"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3493,6 +3787,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3509,10 +3811,15 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Ipinapakita ang HUD"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3749,11 +4056,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3814,6 +4128,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3835,7 +4155,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3875,10 +4197,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -3929,15 +4247,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4558,6 +4872,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4613,7 +4931,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4623,15 +4941,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4643,7 +4964,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4671,6 +4993,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Malinis na Liwanag"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5055,10 +5382,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5107,6 +5430,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5193,16 +5528,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5215,6 +5550,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Pag-highlight sa Node"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5252,10 +5592,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5349,10 +5685,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5399,10 +5731,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5571,6 +5899,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Screen:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5598,6 +5931,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Mag-screenshot"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5610,10 +5948,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5653,8 +5987,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "Mag-host ng Server"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "- Pangalan ng Server: "
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Paglalarawan sa Server"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5681,10 +6026,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Port ng Server"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5695,12 +6049,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5708,7 +6064,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5784,7 +6140,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5984,6 +6340,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Pagsasaayos"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6186,7 +6547,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6210,10 +6571,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6304,6 +6673,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6537,6 +6910,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6626,6 +7008,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6636,3 +7022,43 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
+
+#~ msgid "Basic"
+#~ msgstr "Basic"
+
+#~ msgid "Connect"
+#~ msgstr "Kumonekta"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Mag-download ng laro, tulad ng Minetest Game, mula sa minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Mag-download ng isa mula sa minetest.net"
+
+#~ msgid "Enter "
+#~ msgstr "Ipasok "
+
+#~ msgid "Game"
+#~ msgstr "Laro"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Mga keybinding. (Kung pumalpak ang menu na ito, tanggalin ang laman ng "
+#~ "minetest.conf)"
+
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Sasali ka sa server na ito na may pangalang \"%s\" sa unang pagkakataon.\n"
+#~ "Kung tutuloy ka, may magagawang bagong account sa server na ito gamit ang "
+#~ "iyong mga credential.\n"
+#~ "Mangyaring i-type muli ang password mo at pindutin ang 'Magparehistro at "
+#~ "Sumali' para kumpirmahin ang paggawa sa account, o pindutin ang "
+#~ "'Ikansela' para pigilan ito."
diff --git a/po/fr/minetest.po b/po/fr/minetest.po
index 551052004..815a0a4c2 100644
--- a/po/fr/minetest.po
+++ b/po/fr/minetest.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: French (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-29 00:17+0000\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-07-24 18:04+0000\n"
"Last-Translator: waxtatect <piero@live.ie>\n"
"Language-Team: French <https://hosted.weblate.org/projects/minetest/minetest/"
"fr/>\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 4.11-dev\n"
+"X-Generator: Weblate 4.14-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -114,6 +114,34 @@ msgid "The server has requested a reconnect:"
msgstr "Le serveur souhaite rétablir une connexion :"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr "Une nouvelle $1 version est disponible"
+
+#: builtin/mainmenu/common.lua
+msgid "Client Mods"
+msgstr "Mods client"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+"Version installée : $1\n"
+"Nouvelle version : $2\n"
+"Visiter $3 pour savoir comment obtenir la nouvelle version et rester à jour "
+"des fonctionnalités et des corrections de bogues."
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr "Plus tard"
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr "Jamais"
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "La version du protocole ne correspond pas. "
@@ -126,6 +154,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Le serveur supporte les versions de protocole entre $1 et $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr "Visiter le site web"
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Nous supportons seulement la version du protocole $1."
@@ -133,14 +165,21 @@ msgstr "Nous supportons seulement la version du protocole $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Nous supportons seulement les versions du protocole entre $1 et $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr "(Activé, a une erreur)"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr "(Insatisfait)"
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Annuler"
@@ -280,7 +319,6 @@ msgid "Failed to download $1"
msgstr "Échec du téléchargement de $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Jeux"
@@ -301,7 +339,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Installation : type de fichier non supporté ou archive endommagée"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mods"
@@ -394,12 +431,8 @@ msgid "Decorations"
msgstr "Décorations"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Télécharger un jeu comme Minetest Game depuis minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Télécharger en un depuis minetest.net"
+msgid "Development Test is meant for developers."
+msgstr "« Development Test » est destiné aux développeurs."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -417,10 +450,6 @@ msgstr "Masses de terrains flottants dans le ciel"
msgid "Floatlands (experimental)"
msgstr "Terrains flottants (expérimental)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Jeu"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Générer un terrain non fractal : océans et souterrains"
@@ -438,6 +467,14 @@ msgid "Increases humidity around rivers"
msgstr "Augmente l'humidité autour des rivières"
#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install a game"
+msgstr "Installer un jeu"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr "Installer un autre jeu"
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Lacs"
@@ -542,10 +579,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Très grandes cavernes profondes souterraines"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Avertissement : le jeu minimal est fait pour les développeurs."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nom du monde"
@@ -575,6 +608,36 @@ msgstr "Gestionnaire de mods : chemin invalide de « $1 »"
msgid "Delete World \"$1\"?"
msgstr "Supprimer le monde « $1 » ?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Confirmer le mot de passe"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr "Rejoindre $1"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr "Nom manquant"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nom"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Mot de passe"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr "Les mots de passe ne correspondent pas"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr "S'inscrire"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Accepter"
@@ -607,6 +670,14 @@ msgstr "< Revenir aux paramètres"
msgid "Browse"
msgstr "Parcourir"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Games"
+msgstr "Contenu : Jeux"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Mods"
+msgstr "Contenu : Mods"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Désactivé"
@@ -663,7 +734,7 @@ msgstr "Choisir un répertoire"
msgid "Select file"
msgstr "Choisir un fichier"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Montrer les noms techniques"
@@ -815,6 +886,10 @@ msgstr "Anciens contributeurs"
msgid "Previous Core Developers"
msgstr "Anciens développeurs principaux"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr "Partager le journal de débogage"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Parcourir le contenu en ligne"
@@ -883,10 +958,6 @@ msgstr "Héberger le serveur"
msgid "Install games from ContentDB"
msgstr "Installer à partir de ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nom"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nouveau"
@@ -895,10 +966,6 @@ msgstr "Nouveau"
msgid "No world created or selected!"
msgstr "Aucun monde créé ou sélectionné !"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Mot de passe"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Jouer"
@@ -932,10 +999,6 @@ msgid "Clear"
msgstr "Effacer"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Rejoindre"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Mode créatif"
@@ -945,10 +1008,6 @@ msgid "Damage / PvP"
msgstr "Dégâts / JcJ"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Supprimer favori"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Favoris"
@@ -961,6 +1020,10 @@ msgid "Join Game"
msgstr "Rejoindre une partie"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr "Connexion"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -973,10 +1036,18 @@ msgid "Refresh"
msgstr "Actualiser"
#: builtin/mainmenu/tab_online.lua
+msgid "Remove favorite"
+msgstr "Supprimer le favori"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Description du serveur"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr "(support du jeu requis)"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2×"
@@ -998,7 +1069,7 @@ msgstr "Tous les paramètres"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr "Anti-crénelage :"
+msgstr "Anticrénelage :"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
@@ -1021,8 +1092,8 @@ msgid "Dynamic shadows"
msgstr "Ombres dynamiques"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr "Ombres dynamiques : "
+msgid "Dynamic shadows:"
+msgstr "Ombres dynamiques :"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -1117,15 +1188,15 @@ msgid "Tone Mapping"
msgstr "Mappage tonal"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr "Sensibilité du toucher (px)"
+msgid "Touch threshold (px):"
+msgstr "Sensibilité tactile (px) :"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr "Filtrage trilinéaire"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr "Très élevées"
#: builtin/mainmenu/tab_settings.lua
@@ -1144,6 +1215,10 @@ msgstr "Liquides ondulants"
msgid "Waving Plants"
msgstr "Plantes ondulantes"
+#: src/client/client.cpp
+msgid "Connection aborted (protocol error?)."
+msgstr "Connexion interrompue (erreur de protocole ?)."
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Connexion perdue."
@@ -1279,10 +1354,9 @@ msgid "Camera update enabled"
msgstr "Mise à jour de la caméra activée"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
-"Impossible d'afficher les limites des blocs (nécessite le privilège "
-"« basic_debug »)"
+"Impossible d'afficher les limites des blocs (désactivé par un jeu ou un mod)"
#: src/client/game.cpp
msgid "Change Password"
@@ -1408,6 +1482,11 @@ msgid "Enabled unlimited viewing range"
msgstr "La limite de vue a été désactivée"
#: src/client/game.cpp
+#, c-format
+msgid "Error creating client: %s"
+msgstr "Erreur de création du client : %s"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Menu principal"
@@ -1417,15 +1496,15 @@ msgstr "Quitter le jeu"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr "Vitesse en mode rapide désactivée"
+msgstr "Mode rapide désactivé"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr "Vitesse en mode rapide activée"
+msgstr "Mode rapide activé"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr "Vitesse en mode rapide activée (note : pas de privilège « fast »)"
+msgstr "Mode rapide activé (note : pas de privilège « fast »)"
#: src/client/game.cpp
msgid "Fly mode disabled"
@@ -1509,11 +1588,11 @@ msgstr "Activé"
#: src/client/game.cpp
msgid "Pitch move mode disabled"
-msgstr "Mode de mouvement à direction libre désactivé"
+msgstr "Mode mouvement de tangage désactivé"
#: src/client/game.cpp
msgid "Pitch move mode enabled"
-msgstr "Mode de mouvement à direction libre activé"
+msgstr "Mode mouvement de tangage activé"
#: src/client/game.cpp
msgid "Profiler graph shown"
@@ -1912,31 +1991,6 @@ msgstr "Échec de l'ouverture de la page Web"
msgid "Opening webpage"
msgstr "Ouverture de la page web"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Les mots de passe ne correspondent pas !"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "S'enregistrer et rejoindre"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Vous êtes sur le point de rejoindre ce serveur avec le nom « %s » pour la "
-"première fois.\n"
-"Si vous continuez, un nouveau compte utilisant vos identifiants sera créé "
-"sur ce serveur.\n"
-"Veuillez retaper votre mot de passe et cliquer sur « S'enregistrer et "
-"rejoindre » pour confirmer la création de votre compte, ou cliquer sur "
-"« Annuler »."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Procéder"
@@ -1969,7 +2023,7 @@ msgstr "Limites des blocs"
msgid "Change camera"
msgstr "Changer la caméra"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Tchat"
@@ -2022,7 +2076,7 @@ msgid "Key already in use"
msgstr "Touche déjà utilisée"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr "Raccourcis clavier"
#: src/gui/guiKeyChangeMenu.cpp
@@ -2083,7 +2137,7 @@ msgstr "Mode sans collision"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle pitchmove"
-msgstr "Mouvement vertical"
+msgstr "Mouvement de tang."
#: src/gui/guiKeyChangeMenu.cpp
msgid "press key"
@@ -2094,10 +2148,6 @@ msgid "Change"
msgstr "Changer"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Confirmer le mot de passe"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nouveau mot de passe"
@@ -2105,6 +2155,10 @@ msgstr "Nouveau mot de passe"
msgid "Old Password"
msgstr "Ancien mot de passe"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Les mots de passe ne correspondent pas !"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Quitter"
@@ -2118,12 +2172,6 @@ msgstr "Muet"
msgid "Sound Volume: %d%%"
msgstr "Volume du son : %d %%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Entrer "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2131,6 +2179,17 @@ msgstr "Entrer "
msgid "LANG_CODE"
msgstr "fr"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+"Le nom n'est pas enregistré. Pour créer un compte sur ce serveur, cliquer "
+"sur « S'inscrire »."
+
+#: src/network/clientpackethandler.cpp
+msgid "Name is taken. Please choose another name"
+msgstr "Le nom est pris. Veuillez choisir un autre nom."
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2228,7 +2287,7 @@ msgstr "Mode écran 3D"
#: src/settings_translation_file.cpp
msgid "3D mode parallax strength"
-msgstr "Paralaxe en mode 3D"
+msgstr "Intensité parallaxe en mode 3D"
#: src/settings_translation_file.cpp
msgid "3D noise defining giant caverns."
@@ -2297,6 +2356,10 @@ msgstr ""
"Noter que le mode entrelacé nécessite que les shaders soient activés."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr "3D"
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2307,13 +2370,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
-msgstr ""
-"Un message qui sera affiché à tous les joueurs quand le serveur plante."
+msgstr "Un message envoyé à tous les joueurs lorsque le serveur plante."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
-msgstr ""
-"Un message qui sera affiché à tous les joueurs quand le serveur s’interrompt."
+msgstr "Un message envoyé à tous les joueurs lorsque le serveur s’arrête."
#: src/settings_translation_file.cpp
msgid "ABM interval"
@@ -2397,6 +2458,10 @@ msgstr ""
"vérifier pour être sûr) créée une couche de terrain flottant solide."
#: src/settings_translation_file.cpp
+msgid "Admin name"
+msgstr "Nom de l’administrateur"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Avancé"
@@ -2416,8 +2481,8 @@ msgstr ""
"artificielle, elle a très peu d'effet sur la lumière naturelle nocturne."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
-msgstr "Toujours voler et être rapide"
+msgid "Always fly fast"
+msgstr "Toujours voler vite"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
@@ -2496,6 +2561,10 @@ msgstr ""
"Établie en blocs de carte (16 nœuds)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr "Audio"
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Touche marche automatique"
@@ -2536,10 +2605,6 @@ msgid "Base terrain height."
msgstr "Hauteur du terrain de base."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Principal"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Privilèges de base"
@@ -2560,8 +2625,8 @@ msgid "Bind address"
msgstr "Adresse à assigner"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
-msgstr "Paramètres de bruit de température et d'humidité de l'API des biomes"
+msgid "Biome API noise parameters"
+msgstr "Paramètres de bruit de l'API des biomes"
#: src/settings_translation_file.cpp
msgid "Biome noise"
@@ -2572,6 +2637,10 @@ msgid "Block send optimize distance"
msgstr "Distance d'optimisation d'envoi des blocs"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr "Balancement"
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Chemin de la police en gras et en italique"
@@ -2596,6 +2665,10 @@ msgid "Builtin"
msgstr "Intégré"
#: src/settings_translation_file.cpp
+msgid "Camera"
+msgstr "Caméra"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2763,6 +2836,10 @@ msgid "Client side node lookup range restriction"
msgstr "Restriction de distance de recherche des noeuds côté client"
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr "Modding côté client"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Vitesse d'escalade du joueur"
@@ -2805,7 +2882,7 @@ msgstr ""
"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/"
+"complète à l'adresse https://content.minetest.net/help/content_flags/."
#: src/settings_translation_file.cpp
msgid ""
@@ -2824,7 +2901,7 @@ msgid ""
msgstr ""
"Liste séparée par des virgules des mods de confiance qui sont autorisés à "
"accéder aux fonctions non sécurisées même lorsque l'option de sécurisation "
-"des mods est activée (via request_insecure_environment())."
+"des mods est activée (via « request_insecure_environment() »)."
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -2881,6 +2958,10 @@ msgid "Console height"
msgstr "Hauteur de la console"
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr "Dépôt de contenu"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Drapeaux ContentDB en liste noire"
@@ -2921,8 +3002,12 @@ msgstr ""
"quoi éternellement."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Contrôle la vitesse de descente dans un liquide."
+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 feront remonter."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2961,7 +3046,7 @@ msgid ""
"This also applies to the object crosshair."
msgstr ""
"Opacité du réticule (entre 0 et 255).\n"
-"Cela contrôle également la couleur du réticule de l'objet."
+"Ceci s'applique également au réticule de l'objet."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
@@ -2973,7 +3058,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"
+"Contrôle également la couleur du réticule de l'objet."
#: src/settings_translation_file.cpp
msgid "DPI"
@@ -2989,19 +3074,19 @@ msgstr "Touche infos de débogage"
#: src/settings_translation_file.cpp
msgid "Debug log file size threshold"
-msgstr "Seuil de la taille du fichier de journal"
+msgstr "Seuil de la taille du fichier journal de débogage"
#: src/settings_translation_file.cpp
msgid "Debug log level"
msgstr "Niveau du journal de débogage"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Touche réduire le volume"
+msgid "Debugging"
+msgstr "Débogage"
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Réduire ceci pour augmenter la résistance liquide au mouvement."
+msgid "Dec. volume key"
+msgstr "Touche réduire le volume"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3045,7 +3130,7 @@ msgid ""
"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
"but also uses more resources."
msgstr ""
-"Défini la qualité du filtrage des ombres. Cela simule l'effet d'ombres "
+"Définit la qualité du filtrage des ombres. Cela simule l'effet d'ombres "
"douces en appliquant un disque PCF ou Poisson mais utilise également plus de "
"ressources."
@@ -3161,6 +3246,10 @@ msgid "Desynchronize block animation"
msgstr "Désynchroniser les animations de blocs"
#: src/settings_translation_file.cpp
+msgid "Developer Options"
+msgstr "Options de développeur"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Touche creuser"
@@ -3181,6 +3270,16 @@ msgid "Display Density Scaling Factor"
msgstr "Facteur d'échelle de la densité d'affichage"
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+"Distance en nœuds à laquelle le tri de profondeur de la transparence est "
+"activé.\n"
+"Utiliser cette option pour limiter l'impact sur les performances du tri de "
+"profondeur de la transparence."
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Nom de domaine du serveur affichée sur la liste des serveurs."
@@ -3253,13 +3352,17 @@ msgstr "Activer la console"
#: src/settings_translation_file.cpp
msgid "Enable creative mode for all players"
-msgstr "Activer le mode créatif pour tous les joueurs"
+msgstr "Activer le mode créatif pour tous les joueurs."
#: src/settings_translation_file.cpp
msgid "Enable joysticks"
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."
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Activer le support des canaux de mods."
@@ -3277,24 +3380,16 @@ msgstr ""
"Active l'entrée aléatoire du joueur (seulement utilisé pour des tests)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Activer la confirmation d'enregistrement"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Active la confirmation d'enregistrement lors de la connexion à un serveur.\n"
-"Si cette option est désactivée, le nouveau compte sera créé automatiquement."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
"Active l'éclairage doux avec une occlusion ambiante simple.\n"
-"Désactiver pour davantage de performances."
+"Désactiver pour davantage de performances ou pour un visuel différent."
+
+#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr "Active la séparation de connexion / s'inscrire"
#: src/settings_translation_file.cpp
msgid ""
@@ -3334,8 +3429,9 @@ msgid ""
"Enable view bobbing and amount of view bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
-"Facteur de mouvement de bras.\n"
-"Par exemple : 0 = pas de mouvement, 1 = normal, 2 = double."
+"Active le balancement de la vue et la quantité de balancement de la vue.\n"
+"Par exemple : 0 pour aucun balancement de la vue, 1 pour normal, 2 pour "
+"double."
#: src/settings_translation_file.cpp
msgid ""
@@ -3394,6 +3490,10 @@ msgstr ""
"pas d'impact sur la jouabilité du jeu."
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr "Profileur de moteur"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Intervalle d'impression des données du moteur de profilage"
@@ -3420,6 +3520,10 @@ msgstr ""
"flottant."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr "FPS"
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "FPS lorsqu’il n’est pas sélectionné ou mis en pause"
@@ -3433,7 +3537,7 @@ msgstr "Facteur de bruit"
#: src/settings_translation_file.cpp
msgid "Fall bobbing factor"
-msgstr "Intensité du mouvement de tête en tombant"
+msgstr "Facteur de balancement de chute"
#: src/settings_translation_file.cpp
msgid "Fallback font path"
@@ -3507,8 +3611,8 @@ msgstr ""
"automatiquement activé si le mip-mapping est activé."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtrage"
+msgid "Filtering and Antialiasing"
+msgstr "Filtrage et anticrénelage"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3577,6 +3681,10 @@ msgid "Fog toggle key"
msgstr "Touche brouillard"
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr "Police"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Police en gras par défaut"
@@ -3697,7 +3805,8 @@ msgstr "Type fractal"
#: src/settings_translation_file.cpp
msgid "Fraction of the visible distance at which fog starts to be rendered"
msgstr ""
-"Fraction de la distance de vue à partir de laquelle le brouillard est affiché"
+"Fraction de la distance de vue à partir de laquelle le brouillard commence à "
+"être rendu."
#: src/settings_translation_file.cpp
msgid ""
@@ -3753,6 +3862,18 @@ msgid "GUI scaling filter txr2img"
msgstr "Filtrage de mise à l'échelle txr2img du GUI"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr "GUIs"
+
+#: src/settings_translation_file.cpp
+msgid "Gamepads"
+msgstr "Manettes de jeu"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr "Général"
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Rappels globaux"
@@ -3788,6 +3909,14 @@ msgid "Graphics"
msgstr "Graphiques"
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr "Effets graphiques"
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr "Graphiques et audio"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravité"
@@ -3804,8 +3933,12 @@ msgid "HTTP mods"
msgstr "Mods HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Facteur de mise à l'échelle de l'interface"
+msgid "HUD"
+msgstr "HUD"
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
+msgstr "Taille du HUD"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -3819,9 +3952,8 @@ msgid ""
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
"Traitement des appels d'API Lua obsolètes :\n"
-"– aucun : n'enregistre pas les appels obsolètes\n"
-"– journal : imite et enregistre la trace des appels obsolètes (par défaut en "
-"mode debug).\n"
+"– aucun : n'enregistre pas les appels obsolètes.\n"
+"– journal : imite et enregistre la trace des appels obsolètes (par défaut).\n"
"– erreur : s'interrompt lors d'un appel obsolète (recommandé pour les "
"développeurs de mods)."
@@ -4068,14 +4200,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Combien de temps le serveur attendra avant de décharger les blocs de carte "
-"inutilisés.\n"
+"inutilisés, établi en secondes.\n"
"Une valeur plus élevée est plus fluide, mais utilise plus de RAM."
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"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."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Quelle largeur doivent avoir les rivières."
@@ -4124,11 +4265,11 @@ msgid ""
"invisible\n"
"so that the utility of noclip mode is reduced."
msgstr ""
-"Si activé, le serveur effectuera la détermination des blocs de la carte "
+"Si activé, le serveur effectuera la détermination des blocs de carte "
"invisibles selon la position des yeux du joueur.\n"
"Cela peut réduire le nombre de blocs envoyés au client de 50 à 80 %.\n"
-"Le client ne recevra plus la plupart de blocs invisibles, de sorte que "
-"l'utilité du mode « noclip » est réduite."
+"Le client ne recevra plus la plupart des blocs invisibles, de sorte que "
+"l'utilité du mode sans collision est réduite."
#: src/settings_translation_file.cpp
msgid ""
@@ -4151,6 +4292,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Si activé, l'enregistrement du compte est séparé de la connexion dans "
+"l'interface utilisateur.\n"
+"Si désactivé, les nouveaux comptes seront enregistrés automatiquement lors "
+"de la connexion."
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -4175,14 +4326,16 @@ msgid ""
"If enabled, makes move directions relative to the player's pitch when flying "
"or swimming."
msgstr ""
-"Si activé en même temps que le mode de vol, la direction du vol dépendra de "
-"la rotation verticle (lacet) du joueur."
+"Si activé, rend les directions de déplacement relatives à l'assiette du "
+"joueur lorsqu'il vole ou nage."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
-"Si activé, les nouveaux joueurs ne pourront pas se connecter avec un mot de "
-"passe vide."
+"Si activé, les joueurs ne peuvent pas se connecter sans un mot de passe ou "
+"de le remplacer par un mot de passe vide."
#: src/settings_translation_file.cpp
msgid ""
@@ -4222,7 +4375,7 @@ msgstr ""
"Si la taille du fichier « debug.txt » dépasse le nombre de mégaoctets "
"spécifié par ce paramètre ; une fois ouvert, le fichier est déplacé vers "
"« debug.txt.1 » et supprime l'ancien « debug.txt.1 » s'il existe.\n"
-"« debug.tx t» est déplacé seulement si ce paramètre est activé."
+"« debug.txt » est déplacé seulement si ce paramètre est activé."
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
@@ -4233,10 +4386,6 @@ msgid "Ignore world errors"
msgstr "Ignorer les erreurs du monde"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Dans le jeu"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Opacité de l'arrière-plan de la console de tchat dans le jeu (entre 0 et "
@@ -4266,7 +4415,7 @@ msgid ""
msgstr ""
"Instrument d'intégration.\n"
"Ceci est habituellement nécessaire pour les contributeurs d'intégration au "
-"noyau"
+"noyau."
#: src/settings_translation_file.cpp
msgid "Instrument chat commands on registration."
@@ -4299,18 +4448,14 @@ msgid "Instrument the methods of entities on registration."
msgstr "Instrumentalise les systèmes d'entités lors de l'enregistrement."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentalisation"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervalle de sauvegarde des changements importants dans le monde, établi en "
"secondes."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
-msgstr "Intervalle d'envoi de l'heure aux clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
+msgstr "Intervalle d'envoi de l'heure aux clients, établi en secondes."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
@@ -4367,7 +4512,7 @@ msgstr "Intervalle de répétition des boutons de la manette"
#: src/settings_translation_file.cpp
msgid "Joystick dead zone"
-msgstr "Zone morte de la manette"
+msgstr "Zone morte de la manette."
#: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity"
@@ -4375,7 +4520,7 @@ msgstr "Sensibilité tronconique de la manette"
#: src/settings_translation_file.cpp
msgid "Joystick type"
-msgstr "Type de manette"
+msgstr "Type de manette."
#: src/settings_translation_file.cpp
msgid ""
@@ -4538,7 +4683,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour déplacer le joueurs en arrière.\n"
+"Touche pour déplacer le joueur en arrière.\n"
"Désactive également l’avance automatique, lorsqu’elle est active.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4549,7 +4694,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour avancer.\n"
+"Touche pour déplacer le joueur en avant.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4559,7 +4704,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour se déplacer à gauche.\n"
+"Touche pour déplacer le joueur à gauche.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4569,7 +4714,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour se déplacer à droite.\n"
+"Touche pour déplacer le joueur à droite.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5063,7 +5208,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour passer en mode sans-collision.\n"
+"Touche pour passer en mode sans collision.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5073,7 +5218,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour passer en mode de direction libre.\n"
+"Touche pour passer en mode mouvement de tangage.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5169,6 +5314,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr "Clavier et souris"
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Expulser les joueurs qui ont envoyé plus de X messages sur 10 secondes."
@@ -5230,8 +5379,10 @@ msgstr "Touche gauche"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
-msgstr "Temps d'intervalle entre la mise à jour des objets sur le réseau."
+"network, stated in seconds."
+msgstr ""
+"Durée d'intervalle serveur et intervalle auquel les objets sont généralement "
+"mis à jour sur le réseau, établie en secondes."
#: src/settings_translation_file.cpp
msgid ""
@@ -5242,17 +5393,22 @@ msgstr ""
"Nécessite les liquides ondulants pour être activé."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
-"Durée entre les cycles d’exécution du Modificateur de bloc actif (« ABM »)"
+"Durée entre les cycles d’exécution du Modificateur de Bloc Actif (« ABM »), "
+"établie en secondes."
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
-msgstr "Durée entre les cycles d’exécution « NodeTimer »"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
+msgstr "Durée entre les cycles d’exécution « NodeTimer », établie en secondes."
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
-msgstr "Durée entre les cycles de gestion des blocs actifs"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
+msgstr ""
+"Durée entre les cycles de gestion des blocs actifs, établie en secondes."
#: src/settings_translation_file.cpp
msgid ""
@@ -5263,7 +5419,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Niveau de journalisation à écrire dans « debug.txt » :\n"
"– < rien > (pas de journalisation)\n"
@@ -5272,7 +5429,8 @@ msgstr ""
"– avertissement\n"
"– action\n"
"– info\n"
-"– prolixe"
+"– prolixe\n"
+"– traçage"
#: src/settings_translation_file.cpp
msgid "Light curve boost"
@@ -5299,6 +5457,10 @@ msgid "Light curve low gradient"
msgstr "Faible gradient de la courbe de lumière"
#: src/settings_translation_file.cpp
+msgid "Lighting"
+msgstr "Lumière"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5391,7 +5553,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Makes all liquids opaque"
-msgstr "Rendre toutes les liquides opaques"
+msgstr "Rend toutes les liquides opaques."
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Disk Storage"
@@ -5399,7 +5561,7 @@ msgstr "Niveau de compression des cartes pour le stockage sur disque"
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Network Transfer"
-msgstr "Niveau de compression des cartes pour le transfert de réseau"
+msgstr "Niveau de compression de la carte pour le transfert réseau"
#: src/settings_translation_file.cpp
msgid "Map directory"
@@ -5631,9 +5793,9 @@ msgid ""
"The maximum total count is calculated dynamically:\n"
"max_total = ceil((#clients + max_users) * per_client / 4)"
msgstr ""
-"Le nombre maximal de blocs qui sont envoyés simultanément par client.\n"
+"Le nombre maximal de blocs envoyés simultanément par client.\n"
"Le compte total maximal est calculé dynamiquement :\n"
-"max_total = ceil((nbre clients + max_users) × per_client ÷ 4)"
+"max_total = ceil((nombre clients + max_users) × per_client ÷ 4)"
#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
@@ -5697,7 +5859,7 @@ msgstr "Nombre maximal de joueurs qui peuvent être connectés en même temps."
#: src/settings_translation_file.cpp
msgid "Maximum number of recent chat messages to show"
-msgstr "Nombre maximal de message récent à afficher"
+msgstr "Nombre maximal de message récent à afficher."
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
@@ -5754,10 +5916,6 @@ msgid "Maximum users"
msgstr "Joueurs maximums"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menus"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Mise en cache des maillages"
@@ -5808,6 +5966,18 @@ msgid "Mipmapping"
msgstr "Mip-mapping"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr "Divers"
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr "Profileur des mods"
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr "Sécurité des mods"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Canaux de mods"
@@ -5860,8 +6030,9 @@ msgid ""
"Multiplier for fall bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
-"Facteur de mouvement de bras en tombant.\n"
-"Exemples : 0 = aucun mouvement, 1 = normal, 2 = double."
+"Facteur de balancement de chute.\n"
+"Par exemple : 0 pour aucun balancement de la vue, 1 pour normal, 2 pour "
+"double."
#: src/settings_translation_file.cpp
msgid "Mute key"
@@ -5907,10 +6078,6 @@ msgid "Near plane"
msgstr "Plan à proximité"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Réseau"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5919,6 +6086,10 @@ msgstr ""
"Cette valeur est annulée en commençant depuis le menu."
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr "Réseau"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Les nouveaux joueurs ont besoin d'entrer ce mot de passe."
@@ -5931,6 +6102,10 @@ msgid "Noclip key"
msgstr "Touche mode sans collision"
#: src/settings_translation_file.cpp
+msgid "Node and Entity Highlighting"
+msgstr "Surbrillance des blocs et des entités"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Surbrillance des blocs"
@@ -5986,10 +6161,6 @@ msgstr ""
"(4096 = 100 Mo, comme règle générale)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Dépôt de contenu en ligne"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Liquides opaques"
@@ -6079,11 +6250,11 @@ msgstr "Physique"
#: src/settings_translation_file.cpp
msgid "Pitch move key"
-msgstr "Touche vol libre"
+msgstr "Touche mouvement de tangage"
#: src/settings_translation_file.cpp
msgid "Pitch move mode"
-msgstr "Mode de mouvement libre"
+msgstr "Mode mouvement de tangage"
#: src/settings_translation_file.cpp
msgid "Place key"
@@ -6102,10 +6273,6 @@ msgstr ""
"Nécessite le privilège « fly » sur le serveur."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Nom du joueur"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Distance de transfert du joueur"
@@ -6154,7 +6321,7 @@ msgstr ""
msgid "Privileges that players with basic_privs can grant"
msgstr ""
"Les privilèges que les joueurs avec le privilège « basic_privs » peuvent "
-"accorder"
+"accorder."
#: src/settings_translation_file.cpp
msgid "Profiler"
@@ -6165,10 +6332,6 @@ msgid "Profiler toggle key"
msgstr "Touche profilage"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Profilage"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Adresse d'écoute pour Prometheus"
@@ -6182,7 +6345,7 @@ msgstr ""
"Adresse d'écoute pour Prometheus.\n"
"Lorsque Minetest est compilé avec l'option « ENABLE_PROMETHEUS », cette "
"adresse est utilisée pour l'écoute de données pour Prometheus.\n"
-"Les métriques peuvent être récupérées sur http://127.0.0.1:30000/metrics"
+"Les métriques peuvent être récupérées sur http://127.0.0.1:30000/metrics."
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
@@ -6231,9 +6394,9 @@ msgid ""
"Remove color codes from incoming chat messages\n"
"Use this to stop players from being able to use color in their messages"
msgstr ""
-"Supprime les codes couleurs venant des messages du tchat\n"
+"Supprime les codes couleurs venant des messages du tchat.\n"
"Utiliser cette option pour empêcher les joueurs d’utiliser la couleur dans "
-"leurs messages"
+"leurs messages."
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
@@ -6256,15 +6419,15 @@ msgid ""
"csm_restriction_noderange)\n"
"READ_PLAYERINFO: 32 (disable get_player_names call client-side)"
msgstr ""
-"Limite l'accès de certaines fonctions côté client sur les serveurs\n"
+"Limite l'accès de certaines fonctions côté client sur les serveurs.\n"
"Combiner les « byteflags » ci dessous pour restreindre les fonctionnalités "
"client, ou mettre 0 pour laisser sans restriction :\n"
"LOAD_CLIENT_MODS : 1 (désactive le chargement des mods client)\n"
"CHAT_MESSAGES : 2 (désactive l'appel « send_chat_message côté » client)\n"
"READ_ITEMDEFS : 4 (désactive l'appel « get_item_def côté » client)\n"
"READ_NODEDEFS : 8 (désactive l'appel « get_node_def » côté client)\n"
-"LOOKUP_NODES_LIMIT : 16 (limite l'appel « get_node » côté client à "
-"« csm_restriction_noderange »)\n"
+"LOOKUP_NODES_LIMIT : 16 (limite l'appel « get_node » côté client à « "
+"csm_restriction_noderange »)\n"
"READ_PLAYERINFO : 32 (désactive l'appel « get_player_names » côté client)"
#: src/settings_translation_file.cpp
@@ -6364,6 +6527,10 @@ msgstr ""
"les images sont mises à l'échelle par des valeurs fractionnelles."
#: src/settings_translation_file.cpp
+msgid "Screen"
+msgstr "Écran"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Hauteur de la fenêtre"
@@ -6394,6 +6561,10 @@ msgstr ""
"Utiliser 0 pour la qualité par défaut."
#: src/settings_translation_file.cpp
+msgid "Screenshots"
+msgstr "Captures d'écran"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Bruit des fonds marins"
@@ -6408,10 +6579,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Deuxième des deux bruits 3D qui définissent ensemble les tunnels."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Sécurité"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Voir http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6470,8 +6637,16 @@ msgstr ""
"18 = réglage Julia « Mandelbulb » 4D."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Serveur / Partie solo"
+msgid "Server"
+msgstr "Serveur"
+
+#: src/settings_translation_file.cpp
+msgid "Server Gameplay"
+msgstr "Jeu du serveur"
+
+#: src/settings_translation_file.cpp
+msgid "Server Security"
+msgstr "Sécurité du serveur"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6498,10 +6673,18 @@ msgid "Server side occlusion culling"
msgstr "Détermination des blocs invisibles côté serveur"
#: src/settings_translation_file.cpp
+msgid "Server/Env Performance"
+msgstr "Performance du serveur"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "URL de la liste des serveurs"
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr "Liste des serveurs et message du jour"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Fichier de la liste des serveurs"
@@ -6510,21 +6693,24 @@ msgid ""
"Set the language. Leave empty to use the system language.\n"
"A restart is required after changing this."
msgstr ""
-"Détermine la langue. Laisser vide pour utiliser celui de votre système.\n"
+"Définit la langue. Laisser vide pour utiliser la langue du système.\n"
"Un redémarrage est nécessaire après cette modification."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
-"Définit la longueur maximale de caractères d'un message de discussion envoyé "
+"Définit la longueur maximale d'un message de tchat (en caractères) envoyé "
"par les clients."
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
-"Définit la force de l'ombre.\n"
+"Définit l'intensité gamma de l'ombre.\n"
+"Ajuste l’intensité des ombres dynamiques dans le jeu.\n"
"Une valeur plus faible signifie des ombres plus claires, une valeur plus "
"élevée signifie des ombres plus sombres."
@@ -6532,12 +6718,12 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
"Définit la taille du rayon de l'ombre douce.\n"
"Les valeurs les plus faibles signifient des ombres plus nettes, les valeurs "
"les plus élevées des ombres plus douces.\n"
-"Valeur minimale : 1,0 ; valeur maximale : 10,0"
+"Valeur minimale : 1,0 ; valeur maximale : 15,0"
#: src/settings_translation_file.cpp
msgid ""
@@ -6632,8 +6818,8 @@ msgstr ""
"valeur est 0."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
-msgstr "Force de l'ombre"
+msgid "Shadow strength gamma"
+msgstr "Intensité gamma de l'ombre"
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -6661,7 +6847,7 @@ msgstr "Afficher l'arrière-plan des badges par défaut"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr "Message d'arrêt du serveur"
+msgstr "Message d'arrêt"
#: src/settings_translation_file.cpp
msgid ""
@@ -6796,7 +6982,7 @@ msgid ""
"will consume more resources.\n"
"Minimum value: 1; maximum value: 16"
msgstr ""
-"Réparti une mise à jour complète de la carte des ombres sur un nombre donné "
+"Répartit une mise à jour complète de la carte des ombres sur un nombre donné "
"d'images.\n"
"Des valeurs plus élevées peuvent rendre les ombres plus lentes, des valeurs "
"plus faibles consommeront plus de ressources.\n"
@@ -6885,6 +7071,10 @@ msgid "Temperature variation for biomes."
msgstr "Variation de température pour les biomes."
#: src/settings_translation_file.cpp
+msgid "Temporary Settings"
+msgstr "Paramètres temporaires"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Bruit alternatif de terrain"
@@ -6963,7 +7153,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The URL for the content repository"
-msgstr "L'URL du dépôt de contenu en ligne"
+msgstr "L'URL du dépôt de contenu."
#: src/settings_translation_file.cpp
msgid "The dead zone of the joystick"
@@ -6992,7 +7182,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
-msgstr "L'identifiant de la manette à utiliser"
+msgstr "L'identifiant de la manette à utiliser."
#: src/settings_translation_file.cpp
msgid "The length in pixels it takes for touch screen interaction to start."
@@ -7059,7 +7249,7 @@ msgstr ""
"l'application peut ne pas démarrer.\n"
"Sur les autres plateformes, OpenGL est recommandé.\n"
"Les shaders sont pris en charge par OpenGL (ordinateur de bureau uniquement) "
-"et OGLES2 (expérimental)"
+"et OGLES2 (expérimental)."
#: src/settings_translation_file.cpp
msgid ""
@@ -7076,7 +7266,7 @@ msgid ""
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
"set to the nearest valid value."
msgstr ""
-"Force (obscurité) de l'ombrage des blocs avec l'occlusion ambiante.\n"
+"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"
"Une gamme valide de valeurs pour ceci se situe entre 0,25 et 4,0. Si la "
@@ -7161,10 +7351,10 @@ msgid "Time speed"
msgstr "Vitesse du temps"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
"Délai d'interruption pour le client pour supprimer les données de carte "
-"inutilisées de la mémoire."
+"inutilisées de la mémoire, établi en secondes."
#: src/settings_translation_file.cpp
msgid ""
@@ -7191,10 +7381,18 @@ msgid "Touch screen threshold"
msgstr "Sensibilité de l'écran tactile"
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr "Écran tactile"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr "Compromis pour la performance"
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr "Distance de tri de la transparence"
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Bruit des arbres"
@@ -7215,7 +7413,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr "Mods sécurisés"
+msgstr "Mods de confiance"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@@ -7312,6 +7510,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Utilisation du filtrage trilinéaire."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr "Interfaces utilisateur"
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7386,7 +7588,7 @@ msgstr "Pilote vidéo"
#: src/settings_translation_file.cpp
msgid "View bobbing factor"
-msgstr "Facteur du mouvement de tête"
+msgstr "Facteur de balancement de la vue"
#: src/settings_translation_file.cpp
msgid "View distance in nodes."
@@ -7568,7 +7770,7 @@ msgid ""
"Set this to true if your server is set up to restart automatically."
msgstr ""
"S’il faut demander aux clients de se reconnecter après un crash (Lua).\n"
-"Définir sur Activer si le serveur est paramétré pour redémarrer "
+"Définir sur « Activé » si le serveur est paramétré pour redémarrer "
"automatiquement."
#: src/settings_translation_file.cpp
@@ -7589,6 +7791,20 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+"Détermine si les noms techniques doivent être affichés.\n"
+"Affecte les mods et les packs de textures dans les menus « Contenu » et « "
+"Sélectionner les mods », ainsi que les noms de paramètres dans « Tous les "
+"paramètres ».\n"
+"Contrôlé par la case à cocher dans le menu « Tous les paramètres »."
+
+#: src/settings_translation_file.cpp
+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 "
@@ -7703,6 +7919,10 @@ msgid "Y-level of seabed."
msgstr "Limite Y du fond marin."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr "cURL"
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Délai d'interruption de cURL lors d'un téléchargement de fichier"
@@ -7749,6 +7969,9 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Back"
#~ msgstr "Retour"
+#~ msgid "Basic"
+#~ msgstr "Principal"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bits par pixel (profondeur de couleur) en mode plein-écran."
@@ -7782,6 +8005,12 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Configure"
#~ msgstr "Configurer"
+#~ msgid "Connect"
+#~ msgstr "Rejoindre"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Contrôle la vitesse de descente dans un liquide."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7827,12 +8056,24 @@ msgstr "Limite parallèle de cURL"
#~ "Niveau de lissage des normal maps.\n"
#~ "Une valeur plus grande lisse davantage les normal maps."
+#~ msgid "Del. Favorite"
+#~ msgstr "Supprimer favori"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Télécharger un jeu comme Minetest Game depuis minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Télécharger en un depuis minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Téléchargement et installation de $1, veuillez patienter..."
#~ msgid "Enable VBO"
#~ msgstr "Activer Vertex Buffer Object: objet tampon de vertex"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Activer la confirmation d'enregistrement"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7862,6 +8103,9 @@ msgstr "Limite parallèle de cURL"
#~ "Active l'occlusion parallaxe.\n"
#~ "Nécessite les shaders pour être activé."
+#~ msgid "Enter "
+#~ msgstr "Entrer "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7881,6 +8125,9 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Fallback font size"
#~ msgstr "Taille de la police alternative"
+#~ msgid "Filtering"
+#~ msgstr "Filtrage"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Le bruit de hauteur de base des terres flottantes"
@@ -7899,6 +8146,9 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Full screen BPP"
#~ msgstr "Bits par pixel en mode plein écran"
+#~ msgid "Game"
+#~ msgstr "Jeu"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7908,15 +8158,28 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Generate normalmaps"
#~ msgstr "Normal mapping"
+#~ msgid "HUD scale factor"
+#~ msgstr "Facteur de mise à l'échelle de l'interface"
+
#~ msgid "High-precision FPU"
#~ msgstr "FPU de haute précision"
#~ msgid "IPv6 support."
#~ msgstr "Support IPv6."
+#~ msgid "In-Game"
+#~ msgstr "Dans le jeu"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Installation : fichier : « $1 »"
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentalisation"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr "Raccourcis clavier"
+
#~ msgid "Lava depth"
#~ msgstr "Profondeur de lave"
@@ -7937,6 +8200,9 @@ msgstr "Limite parallèle de cURL"
#~ "Rendre DirectX compatible avec LuaJIT. Désactiver si cela cause des "
#~ "problèmes."
+#~ msgid "Menus"
+#~ msgstr "Menus"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Mini-carte en mode radar, zoom x2"
@@ -8009,6 +8275,12 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Path to save screenshots at."
#~ msgstr "Chemin où les captures d'écran sont sauvegardées."
+#~ msgid "Player name"
+#~ msgstr "Nom du joueur"
+
+#~ msgid "Profiling"
+#~ msgstr "Profilage"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Projection des donjons"
@@ -8021,6 +8293,9 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Select Package File:"
#~ msgstr "Sélectionner le fichier du mod :"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Serveur / Partie solo"
+
#~ msgid ""
#~ "Set the shadow update time.\n"
#~ "Lower value means shadows and map updates faster, but it consume more "
@@ -8113,6 +8388,23 @@ msgstr "Limite parallèle de cURL"
#~ msgid "Yes"
#~ msgstr "Oui"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Vous êtes sur le point de rejoindre ce serveur avec le nom « %s » pour la "
+#~ "première fois.\n"
+#~ "Si vous continuez, un nouveau compte utilisant vos identifiants sera créé "
+#~ "sur ce serveur.\n"
+#~ "Veuillez retaper votre mot de passe et cliquer sur « S'enregistrer et "
+#~ "rejoindre » pour confirmer la création de votre compte, ou cliquer sur "
+#~ "« Annuler »."
+
#~ msgid "You died."
#~ msgstr "Vous êtes mort."
diff --git a/po/gd/minetest.po b/po/gd/minetest.po
index dcc811dd4..5c46bfe9b 100644
--- a/po/gd/minetest.po
+++ b/po/gd/minetest.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2021-08-19 06:36+0000\n"
"Last-Translator: GunChleoc <fios@foramnagaidhlig.net>\n"
"Language-Team: Gaelic <https://hosted.weblate.org/projects/minetest/minetest/"
@@ -119,6 +119,30 @@ msgid "The server has requested a reconnect:"
msgstr ""
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Client Mods"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
#, fuzzy
msgid "Protocol version mismatch. "
msgstr " "
@@ -134,6 +158,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr " "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr ""
@@ -141,14 +169,21 @@ msgstr ""
msgid "We support protocol versions between version $1 and $2."
msgstr ""
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr ""
@@ -283,7 +318,6 @@ msgid "Failed to download $1"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr ""
@@ -306,7 +340,6 @@ msgstr ""
"Stàladh: Faidhle dhen t-seòrsa “$1” ris nach eil taic no tasglann bhriste"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr ""
@@ -399,11 +432,7 @@ msgid "Decorations"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
+msgid "Development Test is meant for developers."
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
@@ -422,10 +451,6 @@ msgstr "Tìr air fhleòd san speur"
msgid "Floatlands (experimental)"
msgstr ""
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr ""
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr ""
@@ -443,6 +468,15 @@ msgid "Increases humidity around rivers"
msgstr "Nì seo an tìr nas buige faisg air aibhnean"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Pacaidean air an stàladh:"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr ""
@@ -542,10 +576,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr ""
@@ -575,6 +605,37 @@ msgstr ""
msgid "Delete World \"$1\"?"
msgstr ""
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Ainm gineadair nam mapa"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Passwords do not match"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+msgid "Register"
+msgstr ""
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr ""
@@ -605,6 +666,14 @@ msgstr ""
msgid "Browse"
msgstr ""
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Games"
+msgstr ""
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Content: Mods"
+msgstr ""
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr ""
@@ -661,7 +730,7 @@ msgstr ""
msgid "Select file"
msgstr ""
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr ""
@@ -806,6 +875,10 @@ msgstr ""
msgid "Previous Core Developers"
msgstr ""
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr ""
@@ -874,10 +947,6 @@ msgstr ""
msgid "Install games from ContentDB"
msgstr "Stàlaich geamannan o ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr ""
@@ -886,10 +955,6 @@ msgstr ""
msgid "No world created or selected!"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr ""
@@ -924,10 +989,6 @@ msgid "Clear"
msgstr ""
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr ""
@@ -938,10 +999,6 @@ msgid "Damage / PvP"
msgstr "– Dochann: "
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr ""
@@ -954,6 +1011,10 @@ msgid "Join Game"
msgstr ""
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
@@ -967,10 +1028,18 @@ msgid "Refresh"
msgstr ""
#: builtin/mainmenu/tab_online.lua
+msgid "Remove favorite"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr ""
@@ -1015,7 +1084,7 @@ msgid "Dynamic shadows"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+msgid "Dynamic shadows:"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1111,7 +1180,7 @@ msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+msgid "Touch threshold (px):"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1119,7 +1188,7 @@ msgid "Trilinear Filter"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1138,6 +1207,10 @@ msgstr ""
msgid "Waving Plants"
msgstr ""
+#: src/client/client.cpp
+msgid "Connection aborted (protocol error?)."
+msgstr ""
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr ""
@@ -1279,7 +1352,7 @@ msgid "Camera update enabled"
msgstr ""
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1397,6 +1470,11 @@ msgid "Enabled unlimited viewing range"
msgstr ""
#: src/client/game.cpp
+#, c-format
+msgid "Error creating client: %s"
+msgstr ""
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr ""
@@ -1901,24 +1979,6 @@ msgstr ""
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr ""
@@ -1951,7 +2011,7 @@ msgstr ""
msgid "Change camera"
msgstr ""
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr ""
@@ -2004,7 +2064,7 @@ msgid "Key already in use"
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
@@ -2076,15 +2136,15 @@ msgid "Change"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
+msgid "New Password"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "New Password"
+msgid "Old Password"
msgstr ""
#: src/gui/guiPasswordChange.cpp
-msgid "Old Password"
+msgid "Passwords do not match!"
msgstr ""
#: src/gui/guiVolumeChange.cpp
@@ -2100,12 +2160,6 @@ msgstr ""
msgid "Sound Volume: %d%%"
msgstr " "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Cuir a-steach "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2113,6 +2167,15 @@ msgstr "Cuir a-steach "
msgid "LANG_CODE"
msgstr "gd"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+msgid "Name is taken. Please choose another name"
+msgstr ""
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2246,6 +2309,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2327,6 +2394,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Admin name"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr ""
@@ -2345,7 +2416,8 @@ msgstr ""
"agus cha mhòr nach bi buaidh air solas oidhche nàdarra idir."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Sgiathaich an-còmhnaidh ’s gu luath"
#: src/settings_translation_file.cpp
@@ -2414,6 +2486,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2454,10 +2530,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Sochairean bunasach"
@@ -2478,7 +2550,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2490,6 +2562,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2514,6 +2590,10 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Camera"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2674,6 +2754,11 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Cuingeachadh tuilleadain air a’ chliant"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2769,6 +2854,11 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Ionad-tasgaidh susbaint air loidhne"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2802,7 +2892,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2869,11 +2961,11 @@ msgid "Debug log level"
msgstr "Ìre an loga dì-bhugachaidh"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3018,6 +3110,10 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Developer Options"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -3038,6 +3134,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3107,6 +3209,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3123,19 +3229,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3209,6 +3309,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3235,6 +3339,10 @@ msgstr ""
"do bhreath tìre air fhleòd sholadach."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3315,7 +3423,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
+msgid "Filtering and Antialiasing"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3383,6 +3491,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3533,6 +3645,18 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Gamepads"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3570,6 +3694,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3586,7 +3718,11 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD scaling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3826,11 +3962,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Dè cho leathann ’s a bhios aibhnean."
@@ -3902,6 +4045,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3925,7 +4074,9 @@ msgstr ""
"sgiathaidh no snàimh."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3969,10 +4120,6 @@ msgid "Ignore world errors"
msgstr "Leig seachad mearachdan an t-saoghail"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -4023,15 +4170,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4787,6 +4930,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4842,7 +4989,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4852,18 +4999,22 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -4872,7 +5023,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Ìre an loga a thèid a sgrìobhadh gu debug.txt:\n"
"- <bàn> (gun logadh)\n"
@@ -4908,6 +5060,10 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Lighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5323,10 +5479,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5377,6 +5529,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5468,16 +5632,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5490,6 +5654,10 @@ msgid "Noclip key"
msgstr "Iuchair modha gun bhearradh"
#: src/settings_translation_file.cpp
+msgid "Node and Entity Highlighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5527,10 +5695,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Ionad-tasgaidh susbaint air loidhne"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5629,10 +5793,6 @@ msgstr ""
"Bidh feum air sochair “fly” air an fhrithealaiche."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5679,10 +5839,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5853,6 +6009,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Sgrìn:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5880,6 +6041,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Sgrìn:"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5892,10 +6058,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5935,7 +6097,17 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
+#, fuzzy
+msgid "Server"
+msgstr "Aibhnean boga"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr " "
+
+#: src/settings_translation_file.cpp
+msgid "Server Security"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5963,10 +6135,18 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Server/Env Performance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5977,12 +6157,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5990,7 +6172,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6066,7 +6248,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6288,6 +6470,10 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Temporary Settings"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6493,7 +6679,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6517,10 +6703,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6615,6 +6809,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6852,6 +7050,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6950,6 +7157,10 @@ msgid "Y-level of seabed."
msgstr "Àirde-Y aig grunnd na mara."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6971,6 +7182,9 @@ msgstr ""
#~ msgid "Address / Port"
#~ msgstr "Seòladh / Port"
+#~ msgid "Enter "
+#~ msgstr "Cuir a-steach "
+
#~ msgid "Overall bias of parallax occlusion effect, usually scale/2."
#~ msgstr ""
#~ "Claonadh na h-èifeachd occlusion na paraileig air fheadh, seo sgèile/2 "
diff --git a/po/gl/minetest.po b/po/gl/minetest.po
index 1593600ff..064f74087 100644
--- a/po/gl/minetest.po
+++ b/po/gl/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2020-07-08 20:47+0000\n"
-"Last-Translator: sfan5 <sfan5@live.de>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-06-27 03:16+0000\n"
+"Last-Translator: Raquel Fariña Agra <raquelagra1@gmail.com>\n"
"Language-Team: Galician <https://hosted.weblate.org/projects/minetest/"
"minetest/gl/>\n"
"Language: gl\n"
@@ -17,44 +17,43 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.2-dev\n"
+"X-Generator: Weblate 4.13.1-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
-msgstr ""
+msgstr "Limpar a fila de espera do chat"
#: builtin/client/chatcommands.lua
msgid "Empty command."
-msgstr ""
+msgstr "Comando baleiro."
#: builtin/client/chatcommands.lua
-#, fuzzy
msgid "Exit to main menu"
-msgstr "Menu principal"
+msgstr "Sair ao menú principal"
#: builtin/client/chatcommands.lua
msgid "Invalid command: "
-msgstr ""
+msgstr "Comando non válido: "
#: builtin/client/chatcommands.lua
msgid "Issued command: "
-msgstr ""
+msgstr "Comando emitido: "
#: builtin/client/chatcommands.lua
msgid "List online players"
-msgstr ""
+msgstr "Lista de xogadores en liña"
#: builtin/client/chatcommands.lua
msgid "Online players: "
-msgstr ""
+msgstr "Xogadores en liña: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr ""
+msgstr "A fila de espera do chat agora está baleira."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
-msgstr ""
+msgstr "Este comando está desactivado polo servidor."
#: builtin/client/death_formspec.lua src/client/game.cpp
msgid "Respawn"
@@ -66,630 +65,717 @@ msgstr "Morreches"
#: builtin/common/chatcommands.lua
msgid "Available commands:"
-msgstr ""
+msgstr "Comandos dispoñibeis:"
#: builtin/common/chatcommands.lua
msgid "Available commands: "
-msgstr ""
+msgstr "Comandos dispoñibeis: "
#: builtin/common/chatcommands.lua
msgid "Command not available: "
-msgstr ""
+msgstr "Comando non dispoñible: "
#: builtin/common/chatcommands.lua
msgid "Get help for commands"
-msgstr ""
+msgstr "Obter axuda para os comandos"
#: builtin/common/chatcommands.lua
msgid ""
"Use '.help <cmd>' to get more information, or '.help all' to list everything."
msgstr ""
+"Usa '.help <cmd>' para conseguir máis información ou '.help all' para ver a "
+"lista completa."
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[all | <cmd>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
-msgstr "Vale"
+msgstr "Aceptar"
#: builtin/fstk/ui.lua
msgid "<none available>"
-msgstr ""
+msgstr "<Comando non dispoñible>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
-msgstr ""
+msgstr "Produciuse un erro nun script Lua:"
#: builtin/fstk/ui.lua
msgid "An error occurred:"
-msgstr ""
+msgstr "Produciuse un erro:"
#: builtin/fstk/ui.lua
msgid "Main menu"
-msgstr "Menu principal"
+msgstr "Menú principal"
#: builtin/fstk/ui.lua
msgid "Reconnect"
-msgstr "Reconectar"
+msgstr "Volver conectar"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "O servidor solicitou que reconectes:"
+msgstr "O servidor solicitou volver conectar:"
#: builtin/mainmenu/common.lua
-msgid "Protocol version mismatch. "
+msgid "A new $1 version is available"
msgstr ""
#: builtin/mainmenu/common.lua
-msgid "Server enforces protocol version $1. "
+#, fuzzy
+msgid "Client Mods"
+msgstr "Seleccionar mods"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
msgstr ""
#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Protocol version mismatch. "
+msgstr "A versión do protocolo non coincide "
+
+#: builtin/mainmenu/common.lua
+msgid "Server enforces protocol version $1. "
+msgstr "O servidor impor a versión do protocolo $1. "
+
+#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
+msgstr "O servidor admite as versións de protocolo entre $1 e $2. "
+
+#: builtin/mainmenu/common.lua
+msgid "Visit website"
msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Só admítese a versión de protocolo $1."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
+msgstr "Só admítense as versións de protocolo entre $1 e $2."
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
msgstr ""
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/tab_content.lua
msgid "Dependencies:"
-msgstr ""
+msgstr "Dependencias:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable all"
-msgstr ""
+msgstr "Desactivar todo"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr ""
+msgstr "Desactivar paq. de mods"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
-msgstr ""
+msgstr "Activar todo"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr ""
+msgstr "Activar paq. de mods"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"characters [a-z0-9_] are allowed."
msgstr ""
+"Erro ao activar o mod \"$1\" porque conteñe caracteres non autorizados. Só "
+"permítense os caracteres [a-z e 0-9]."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Find More Mods"
-msgstr ""
+msgstr "Buscar máis mods"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr ""
+msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No (optional) dependencies"
-msgstr ""
+msgstr "Sen dependencias (opcionais)"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No game description provided."
-msgstr ""
+msgstr "Non se forneceu a descripción do xogo."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No hard dependencies"
-msgstr ""
+msgstr "Sen dependencias importantes"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No modpack description provided."
-msgstr ""
+msgstr "Non se forneceu a descripción do paquete de mods."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No optional dependencies"
-msgstr ""
+msgstr "Sen dependencias opcionais"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua
msgid "Optional dependencies:"
-msgstr ""
+msgstr "Dependencias opcionais:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp
msgid "Save"
-msgstr ""
+msgstr "Gardar"
#: builtin/mainmenu/dlg_config_world.lua
msgid "World:"
-msgstr ""
+msgstr "Mundo:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
-msgstr ""
+msgstr "activado"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
-msgstr ""
+msgstr "\"$1\" xa existe. Desexa substituílo?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr ""
+msgstr "Instalaranse as dependencias $1 e $2."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr ""
+msgstr "$1 por $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
+"$1 descargando,\n"
+"$2 en cola"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 downloading..."
-msgstr ""
+msgstr "Descargando $1..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr ""
+msgstr "Non se puido atopar as dependencias requeridas para $1 ."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr ""
+msgstr "Instalarase $1 e omitiranse as dependencias de $2."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
-msgstr ""
+msgstr "Todos os paq."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Already installed"
-msgstr ""
+msgstr "Xa está instalado"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu"
-msgstr ""
+msgstr "Volver ao menú principal"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr ""
+msgstr "Xogo base:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
-msgstr ""
+msgstr "ContentDB non está dispoñible cando Minetest compilouse sen cURL"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Downloading..."
-msgstr ""
+msgstr "Descargando..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Failed to download $1"
-msgstr ""
+msgstr "Erro ao descargar $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
-msgstr ""
+msgstr "Xogos"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install"
-msgstr ""
+msgstr "Instalar"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install $1"
-msgstr ""
+msgstr "Instalar $1"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install missing dependencies"
-msgstr ""
+msgstr "Instalar dependencias faltantes"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install: Unsupported file type or broken archive"
msgstr ""
+"Instalación: Formato de ficheiro \"$1\" non compatible ou ficheiro corrupto"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
-msgstr ""
+msgstr "Mods"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr ""
+msgstr "Non se puido recuperar ningún paquete"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
-msgstr ""
+msgstr "Non hai resultados"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No updates"
-msgstr ""
+msgstr "Sen actualizacións"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
-msgstr ""
+msgstr "Non atopado"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr ""
+msgstr "Sobrescribir"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr ""
+msgstr "Verifica que o xogo base esté correcto."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
-msgstr ""
+msgstr "En cola"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
-msgstr ""
+msgstr "Paq. de text."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Uninstall"
-msgstr ""
+msgstr "Desinstalar"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update"
-msgstr ""
+msgstr "Actualizar"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
-msgstr ""
+msgstr "Actualizar Todo [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr ""
+msgstr "Ver máis información nun navegador web"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "Xa existe un mundo chamado \"$1\""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Additional terrain"
-msgstr ""
+msgstr "Terreo adicional"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Altitude chill"
-msgstr ""
+msgstr "Frío de altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Altitude dry"
-msgstr ""
+msgstr "Sequedade en altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biome blending"
-msgstr ""
+msgstr "Mestura de biomas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biomes"
-msgstr ""
+msgstr "Biomas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caverns"
-msgstr ""
+msgstr "Cavernas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Caves"
-msgstr ""
+msgstr "Covas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
-msgstr ""
+msgstr "Crear"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Decorations"
-msgstr ""
+msgstr "Decoracións"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr ""
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Aviso: O Test de Desenvolvemento está destinado aos desenvolvedores."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
-msgstr ""
+msgstr "Calabozos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Flat terrain"
-msgstr ""
+msgstr "Terreo chan"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr ""
+msgstr "Terreos flotantes no ceo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr ""
+msgstr "Terreos flotantes (experimental)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr ""
+msgstr "Xerar terreo non fractal: Océanos e subsolo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
-msgstr ""
+msgstr "Outeiros"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Humid rivers"
-msgstr ""
+msgstr "Ríos húmidos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Increases humidity around rivers"
+msgstr "Incrementa a humidade arredor dos ríos"
+
+#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Instalar $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
-msgstr ""
+msgstr "Lagos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
msgstr ""
+"A baixa humidade e a calor elevada provocan ríos pouco profundos ou secos"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr ""
+msgstr "Xerador de mundos"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr ""
+msgstr "Parámetros do xerador de mundos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr ""
+msgstr "Parámetros específicos do xerador de mundos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
-msgstr ""
+msgstr "Montañas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr ""
+msgstr "Fluxo de lodo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
-msgstr ""
+msgstr "Rede de túneis e covas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No game selected"
-msgstr ""
+msgstr "Ningunha partida seleccionada"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces heat with altitude"
-msgstr ""
+msgstr "Reduce a calor coa altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Reduces humidity with altitude"
-msgstr ""
+msgstr "Reduce a humidade coa altitude"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Rivers"
-msgstr ""
+msgstr "Ríos"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Sea level rivers"
-msgstr ""
+msgstr "Ríos ao nivel do mar"
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Seed"
-msgstr ""
+msgstr "Semente"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr ""
+msgstr "Transición suave entre biomas"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
"Structures appearing on the terrain (no effect on trees and jungle grass "
"created by v6)"
msgstr ""
+"Estruturas que aparecen no terreo (sen efecto nas árbores e no céspede da "
+"xungla que creou a v6)"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Structures appearing on the terrain, typically trees and plants"
-msgstr ""
+msgstr "Estruturas que aparecen no terreo, xeralmente árbores e plantas"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert"
-msgstr ""
+msgstr "Temperado, Deserto"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle"
-msgstr ""
+msgstr "Temperado, Deserto, Xungla"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Temperate, Desert, Jungle, Tundra, Taiga"
-msgstr ""
+msgstr "Temperado, Deserto, Xungla, Tundra, Taiga"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Terrain surface erosion"
-msgstr ""
+msgstr "Erosión superficial do terreo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Trees and jungle grass"
-msgstr ""
+msgstr "Árbores e céspede da xungla"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Vary river depth"
-msgstr ""
+msgstr "Variar a profundidade do río"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Very large caverns deep in the underground"
-msgstr ""
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
+msgstr "Cavernas moi grandes nas profundidades do subsolo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
-msgstr ""
+msgstr "Nome do mundo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no games installed."
-msgstr ""
+msgstr "Non tes xogos instalados."
#: builtin/mainmenu/dlg_delete_content.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "Desexa eliminar \"$1\"?"
#: builtin/mainmenu/dlg_delete_content.lua
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
#: src/client/keycode.cpp
msgid "Delete"
-msgstr ""
+msgstr "Eliminar"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "pkgmgr: erro ao eliminar \"$1\""
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: invalid path \"$1\""
-msgstr ""
+msgstr "pkgmgr: ruta \"$1\" non válida"
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
+msgstr "Eliminar o mundo \"$1\"?"
+
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Confirmar contrasinal"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
msgstr ""
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Nome do xerador de mundos"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nome"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Contrasinal"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Os contrasinais non coinciden!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Rexistrarse e unirse"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
-msgstr ""
+msgstr "Aceptar"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr ""
+msgstr "Renomear paquete de mods:"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid ""
"This modpack has an explicit name given in its modpack.conf which will "
"override any renaming here."
msgstr ""
+"Este paquete de mods ten un nome explícito no seu modpack.conf que non "
+"permitirá cambios de nome aquí."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr ""
+msgstr "(Ningunha descripción da configuración dada)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "2D Noise"
-msgstr ""
+msgstr "Ruído 2D"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "<Volver á configuración"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr ""
+msgstr "Explorar"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Contido"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Contido"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
-msgstr ""
+msgstr "Desactivado"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
-msgstr ""
+msgstr "Editar"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Enabled"
-msgstr ""
+msgstr "Activado"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Lacunarity"
-msgstr ""
+msgstr "Lacunaridade"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Octaves"
-msgstr ""
+msgstr "Oitavas"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Offset"
-msgstr ""
+msgstr "Desprazamento"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Persistence"
-msgstr ""
+msgstr "Persistencia"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr ""
+msgstr "Introduce un número enteiro válido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
-msgstr ""
+msgstr "Introduce un número válido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr ""
+msgstr "Restaurar"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Scale"
-msgstr ""
+msgstr "Escala"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
-msgstr ""
+msgstr "Procurar"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select directory"
-msgstr ""
+msgstr "Seleccionar directorio"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select file"
-msgstr ""
+msgstr "Seleccionar ficheiro"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
-msgstr ""
+msgstr "Mostrar nomes técnicos"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be at least $1."
-msgstr ""
+msgstr "O valor debe ser polo menos $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must not be larger than $1."
-msgstr ""
+msgstr "O valor non debe ser máis grande que $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
-msgstr ""
+msgstr "X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X spread"
-msgstr ""
+msgstr "Amplitude X"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y"
-msgstr ""
+msgstr "Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Y spread"
-msgstr ""
+msgstr "Amplitude Y"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z"
-msgstr ""
+msgstr "Z"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Z spread"
-msgstr ""
+msgstr "Amplitude Z"
#. ~ "absvalue" is a noise parameter flag.
#. It is short for "absolute value".
@@ -697,14 +783,14 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "absvalue"
-msgstr ""
+msgstr "Valor absoluto"
#. ~ "defaults" is a noise parameter flag.
#. It describes the default processing options
#. for noise settings in main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "defaults"
-msgstr ""
+msgstr "Predefinido"
#. ~ "eased" is a noise parameter flag.
#. It is used to make the map smoother and
@@ -712,590 +798,610 @@ msgstr ""
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "eased"
-msgstr ""
+msgstr "Suavizado"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 (Enabled)"
-msgstr ""
+msgstr "$1 (Activado)"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 mods"
-msgstr ""
+msgstr "$1 mods"
#: builtin/mainmenu/pkgmgr.lua
msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "Error ao instalar $1 en $2"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find real mod name for: $1"
-msgstr ""
+msgstr "Instalación do mod: Non se puido atopar o nome real do mod para: $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
+"Instalación do mod: Non se puido atopar un nome de cartafol adecuado para o "
+"paquete de mods $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
-msgstr ""
+msgstr "Non se puido atopar un mod ou paquete de mods válido"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a $1 as a texture pack"
-msgstr ""
+msgstr "Non se puido instalar $1 como paquete de texturas"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a game as a $1"
-msgstr ""
+msgstr "Non se puido instalar un xogo como $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a mod as a $1"
-msgstr ""
+msgstr "Non se puido instalar un mod como $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a modpack as a $1"
-msgstr ""
+msgstr "Non se puido instalar un paquete de mods como $1"
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
-msgstr ""
+msgstr "Cargando..."
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr ""
+msgstr "A lista de servidores públicos está desactivada"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
+"Tente volver activar a lista de servidores públicos e verifique a súa "
+"conexión a Internet."
#: builtin/mainmenu/tab_about.lua
msgid "About"
-msgstr ""
+msgstr "Acerca de"
#: builtin/mainmenu/tab_about.lua
msgid "Active Contributors"
-msgstr ""
+msgstr "Colaboradores activos"
#: builtin/mainmenu/tab_about.lua
msgid "Active renderer:"
-msgstr ""
+msgstr "Renderizador activo:"
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
-msgstr ""
+msgstr "Desenvolvedores principais"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
-msgstr ""
+msgstr "Abrir dir. datos de usuario"
#: builtin/mainmenu/tab_about.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
+"Abre o directorio que contén mundos, xogos, mods fornecidos polo usuario\n"
+"e paquetes de textura nun xestor de ficheiros ou explorador."
#: builtin/mainmenu/tab_about.lua
msgid "Previous Contributors"
-msgstr ""
+msgstr "Colaboradores anteriores"
#: builtin/mainmenu/tab_about.lua
msgid "Previous Core Developers"
-msgstr ""
+msgstr "Desenvolvedores principais anteriores"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Mostrar información de depuración"
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
-msgstr ""
+msgstr "Explorar contido en liña"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
-msgstr ""
+msgstr "Contido"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
-msgstr ""
+msgstr "Desactivar paq. de texturas"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
-msgstr ""
+msgstr "Información:"
#: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:"
-msgstr ""
+msgstr "Paquetes instalados:"
#: builtin/mainmenu/tab_content.lua
msgid "No dependencies."
-msgstr ""
+msgstr "Sen dependencias."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr ""
+msgstr "A descripción do paquete non está dispoñible"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
-msgstr ""
+msgstr "Renomear"
#: builtin/mainmenu/tab_content.lua
msgid "Uninstall Package"
-msgstr ""
+msgstr "Desinstalar paquete"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
-msgstr ""
+msgstr "Usar paquete de texturas"
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
-msgstr ""
+msgstr "Anunciar servidor"
#: builtin/mainmenu/tab_local.lua
msgid "Bind Address"
-msgstr ""
+msgstr "Ligazón de enderezo"
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
-msgstr ""
+msgstr "Modo creativo"
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
-msgstr ""
+msgstr "Activar danos"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr ""
+msgstr "Hospedar xogo"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
-msgstr ""
+msgstr "Hospedar servidor"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
+msgstr "Instalar xogos do ContentDB"
#: builtin/mainmenu/tab_local.lua
msgid "New"
-msgstr ""
+msgstr "Novo"
#: builtin/mainmenu/tab_local.lua
msgid "No world created or selected!"
-msgstr ""
-
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr ""
+msgstr "Ningún mundo creado ou seleccionado!"
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
-msgstr ""
+msgstr "Xogar"
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
msgid "Port"
-msgstr ""
+msgstr "Porto"
#: builtin/mainmenu/tab_local.lua
msgid "Select Mods"
-msgstr ""
+msgstr "Seleccionar mods"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
-msgstr ""
+msgstr "Seleccionar mundo:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr ""
+msgstr "Porto do servidor"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
-msgstr ""
+msgstr "Xogar só"
#: builtin/mainmenu/tab_online.lua
msgid "Address"
-msgstr ""
+msgstr "Enderezo"
#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp
msgid "Clear"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr ""
+msgstr "Limpar"
#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
-msgstr ""
+msgstr "Modo creativo"
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
msgid "Damage / PvP"
-msgstr ""
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr ""
+msgstr "Dano / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
-msgstr ""
+msgstr "Favoritos"
#: builtin/mainmenu/tab_online.lua
msgid "Incompatible Servers"
-msgstr ""
+msgstr "Servidores incompatibles"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
+msgstr "Xogar en liña"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Login"
msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
-msgstr ""
+msgstr "Ping"
#: builtin/mainmenu/tab_online.lua
msgid "Public Servers"
-msgstr ""
+msgstr "Servidores públicos"
#: builtin/mainmenu/tab_online.lua
msgid "Refresh"
-msgstr ""
+msgstr "Actualizar"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Porto remoto"
#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
+msgstr "Descripción do servidor"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
-msgstr ""
+msgstr "Nubes 3D"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr ""
+msgstr "4x"
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr ""
+msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
msgid "All Settings"
-msgstr ""
+msgstr "Toda a configuración"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Suavizado:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr ""
+msgstr "Autogardar tam. pantalla"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr ""
+msgstr "Filtrado bilineal"
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
-msgstr ""
+msgstr "Configurar teclas"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr ""
+msgstr "Vidro unificado"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
-msgstr ""
+msgstr "Sombras dinámicas"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
-msgstr ""
+#, fuzzy
+msgid "Dynamic shadows:"
+msgstr "Sombras dinámicas: "
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr ""
+msgstr "Follas detalladas"
#: builtin/mainmenu/tab_settings.lua
msgid "High"
-msgstr ""
+msgstr "Alto"
#: builtin/mainmenu/tab_settings.lua
msgid "Low"
-msgstr ""
+msgstr "Baixo"
#: builtin/mainmenu/tab_settings.lua
msgid "Medium"
-msgstr ""
+msgstr "Medio"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr ""
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Filtro aniso."
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "Sen filtros"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr ""
+msgstr "Sen Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr ""
+msgstr "Resaltar nodos"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr ""
+msgstr "Marcar nodos"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
-msgstr ""
+msgstr "Ningún"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
-msgstr ""
+msgstr "Follas opacas"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Water"
-msgstr ""
+msgstr "Auga opaca"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr ""
+msgstr "Partículas"
#: builtin/mainmenu/tab_settings.lua
msgid "Screen:"
-msgstr ""
+msgstr "Pantalla:"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
-msgstr ""
+msgstr "Configuración"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr ""
+msgstr "Sombreadores"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (experimental)"
-msgstr ""
+msgstr "Sombreadores (experimental)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
-msgstr ""
+msgstr "Sombreadores (non dispoñible)"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr ""
+msgstr "Follas simples"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr ""
+msgstr "Iluminación suave"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "Texturización:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr ""
+msgstr "Mapeado de tons"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr ""
+#, fuzzy
+msgid "Touch threshold (px):"
+msgstr "Nivel de sensibilidade ao toque (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr ""
+msgstr "Filtro trilineal"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
-msgstr ""
+#, fuzzy
+msgid "Very High"
+msgstr "Moi alto"
#: builtin/mainmenu/tab_settings.lua
msgid "Very Low"
-msgstr ""
+msgstr "Moi baixo"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "Movemento das follas"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr ""
+msgstr "Movemento dos líquidos"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "Movemento das plantas"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Erro de conexión (tempo esgotado?)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "Esgotouse o tempo de conexión."
#: src/client/client.cpp
msgid "Done!"
-msgstr ""
+msgstr "Feito!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "Iniciando nodos"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "Iniciando nodos..."
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Cargando texturas..."
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Reconstruíndo sombreadores..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "Erro de conexión (tempo esgotado?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr ""
+msgstr "Non se puido atopar ou cargar o xogo: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr ""
+msgstr "Especificación do xogo non válida."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
-msgstr ""
+msgstr "Menú principal"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "Ningún mundo seleccionado e ningún enderezo fornecido. Nada que facer."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr ""
+msgstr "Nome do xogador demasiado longo."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
-msgstr ""
+msgstr "Escolle un nome!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr ""
+msgstr "O ficheiro do contrasinal fornecido non se puido abrir: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "O camiño do mundo fornecido non existe: "
#: src/client/game.cpp
msgid ""
"\n"
"Check debug.txt for details."
msgstr ""
+"\n"
+"Verifique debug.txt para obter detalles."
#: src/client/game.cpp
msgid "- Address: "
-msgstr ""
+msgstr "- Enderezo: "
#: src/client/game.cpp
msgid "- Mode: "
-msgstr ""
+msgstr "- Modo: "
#: src/client/game.cpp
msgid "- Port: "
-msgstr ""
+msgstr "- Porto: "
#: src/client/game.cpp
msgid "- Public: "
-msgstr ""
+msgstr "- Público: "
#. ~ PvP = Player versus Player
#: src/client/game.cpp
msgid "- PvP: "
-msgstr ""
+msgstr "- PvP: "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr ""
+msgstr "- Nome do servidor: "
#: src/client/game.cpp
msgid "A serialization error occurred:"
-msgstr ""
+msgstr "Ocurreu un erro:"
#: src/client/game.cpp
#, c-format
msgid "Access denied. Reason: %s"
-msgstr ""
+msgstr "Acceso negado. Motivo: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
-msgstr ""
+msgstr "Avance automático desactivado"
#: src/client/game.cpp
msgid "Automatic forward enabled"
-msgstr ""
+msgstr "Avance automático activado"
#: src/client/game.cpp
msgid "Block bounds hidden"
-msgstr ""
+msgstr "Lím. bloques ocultos"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
-msgstr ""
+msgstr "Límites de bloque mostrados para todos os bloques"
#: src/client/game.cpp
msgid "Block bounds shown for current block"
-msgstr ""
+msgstr "Límites de bloques mostrados para o bloque actual"
#: src/client/game.cpp
msgid "Block bounds shown for nearby blocks"
-msgstr ""
+msgstr "Límites de bloques mostrados para bloques pretos"
#: src/client/game.cpp
msgid "Camera update disabled"
-msgstr ""
+msgstr "Actualización da cámara desactivada"
#: src/client/game.cpp
msgid "Camera update enabled"
-msgstr ""
+msgstr "Actualización da cámara activada"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
+"Non se puido mostrar os límites de bloco (é preciso o permiso 'basic_debug')"
#: src/client/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "Cambiar contrasinal"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr ""
+msgstr "Modo cinematográfico desactivado"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr ""
+msgstr "Modo cinematográfico activado"
#: src/client/game.cpp
msgid "Client disconnected"
-msgstr ""
+msgstr "Cliente desconectado"
#: src/client/game.cpp
msgid "Client side scripting is disabled"
-msgstr ""
+msgstr "O scripting de cliente está desactivado"
#: src/client/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "Conectando ao servidor..."
#: src/client/game.cpp
msgid "Connection failed for unknown reason"
-msgstr ""
+msgstr "Erro na conexión por un motivo descoñecido"
#: src/client/game.cpp
msgid "Continue"
-msgstr ""
+msgstr "Continuar"
#: src/client/game.cpp
#, c-format
@@ -1315,31 +1421,46 @@ msgid ""
"- Mouse wheel: select item\n"
"- %s: chat\n"
msgstr ""
+"Controis:\n"
+"- %s: ir cara adiante\n"
+"- %s: ir cara atrás\n"
+"- %s: ir cara esquerda\n"
+"- %s: ir cara dereita\n"
+"- %s: saltar/escalar\n"
+"- %s: romper bloque/golpear\n"
+"- %s: colocar/usar\n"
+"- %s: agacharse/abaxaise\n"
+"- %s: soltar obxecto\n"
+"- %s: inventario\n"
+"- Rato: virarse/ver\n"
+"- Roda do rato: seleccionar obxecto\n"
+"- %s: chat\n"
#: src/client/game.cpp
#, c-format
msgid "Couldn't resolve address: %s"
-msgstr ""
+msgstr "Non se puido resolver o enderezo: %s"
#: src/client/game.cpp
msgid "Creating client..."
-msgstr ""
+msgstr "Creando cliente..."
#: src/client/game.cpp
msgid "Creating server..."
-msgstr ""
+msgstr "Creando servidor..."
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
-msgstr ""
+msgstr "Información de depuración e gráfico de análise do mundo ocultos"
#: src/client/game.cpp
msgid "Debug info shown"
-msgstr ""
+msgstr "Info de depuración mostrada"
#: src/client/game.cpp
msgid "Debug info, profiler graph, and wireframe hidden"
msgstr ""
+"Info de depuración, gráfico de análise do mundo e estrutura de arames ocultos"
#: src/client/game.cpp
msgid ""
@@ -1356,724 +1477,717 @@ 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"
#: src/client/game.cpp
msgid "Disabled unlimited viewing range"
-msgstr ""
+msgstr "Campo de visión ilimitada desactivado"
#: src/client/game.cpp
msgid "Enabled unlimited viewing range"
-msgstr ""
+msgstr "Campo de visión ilimitada activado"
+
+#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Creando cliente..."
#: src/client/game.cpp
msgid "Exit to Menu"
-msgstr ""
+msgstr "Saír ao menú"
#: src/client/game.cpp
msgid "Exit to OS"
-msgstr ""
+msgstr "Saír do xogo"
#: src/client/game.cpp
msgid "Fast mode disabled"
-msgstr ""
+msgstr "Modo rápido desactivado"
#: src/client/game.cpp
msgid "Fast mode enabled"
-msgstr ""
+msgstr "Modo rápido activado"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr ""
+msgstr "Modo rápido activado (nota: sen permiso 'rápido')"
#: src/client/game.cpp
msgid "Fly mode disabled"
-msgstr ""
+msgstr "Modo voo desactivado"
#: src/client/game.cpp
msgid "Fly mode enabled"
-msgstr ""
+msgstr "Modo voo activado"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
-msgstr ""
+msgstr "Modo voo activado (nota: sen permiso de 'voo')"
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr ""
+msgstr "Néboa desactivada"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr ""
+msgstr "Néboa activada"
#: src/client/game.cpp
msgid "Game info:"
-msgstr ""
+msgstr "Información do xogo:"
#: src/client/game.cpp
msgid "Game paused"
-msgstr ""
+msgstr "Xogo pausado"
#: src/client/game.cpp
msgid "Hosting server"
-msgstr ""
+msgstr "Servidor anfitrión"
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Definicións dos obxectos..."
#: src/client/game.cpp
msgid "KiB/s"
-msgstr ""
+msgstr "KiB/s"
#: src/client/game.cpp
msgid "Media..."
-msgstr ""
+msgstr "Multimedia..."
#: src/client/game.cpp
msgid "MiB/s"
-msgstr ""
+msgstr "MiB/s"
#: src/client/game.cpp
msgid "Minimap currently disabled by game or mod"
-msgstr ""
+msgstr "O minimapa está actualmente desactivado polo xogo ou mod"
#: src/client/game.cpp
msgid "Multiplayer"
-msgstr ""
+msgstr "Xogar en liña"
#: src/client/game.cpp
msgid "Noclip mode disabled"
-msgstr ""
+msgstr "Modo espectador desactivado"
#: src/client/game.cpp
msgid "Noclip mode enabled"
-msgstr ""
+msgstr "Modo espectador activado"
#: src/client/game.cpp
msgid "Noclip mode enabled (note: no 'noclip' privilege)"
-msgstr ""
+msgstr "Modo espectador activado (nota: sen permiso 'noclip')"
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr ""
+msgstr "Definicións de nodos..."
#: src/client/game.cpp
msgid "Off"
-msgstr ""
+msgstr "Desactivado"
#: src/client/game.cpp
msgid "On"
-msgstr ""
+msgstr "Activado"
#: src/client/game.cpp
msgid "Pitch move mode disabled"
-msgstr ""
+msgstr "Modo de movemiento rotación vertical desactivado"
#: src/client/game.cpp
msgid "Pitch move mode enabled"
-msgstr ""
+msgstr "Modo de movemiento de rotación vertical activado"
#: src/client/game.cpp
msgid "Profiler graph shown"
-msgstr ""
+msgstr "Gráfico de análise do mundo mostrado"
#: src/client/game.cpp
msgid "Remote server"
-msgstr ""
+msgstr "Servidor remoto"
#: src/client/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "Resolvendo enderezo..."
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "Cerrando..."
#: src/client/game.cpp
msgid "Singleplayer"
-msgstr ""
+msgstr "Un xogador"
#: src/client/game.cpp
msgid "Sound Volume"
-msgstr ""
+msgstr "Volume do son"
#: src/client/game.cpp
msgid "Sound muted"
-msgstr ""
+msgstr "Sonido silenciado"
#: src/client/game.cpp
msgid "Sound system is disabled"
-msgstr ""
+msgstr "O sistema de son está desactivado"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr ""
+msgstr "O sistema de son non é compatible con esta versión"
#: src/client/game.cpp
msgid "Sound unmuted"
-msgstr ""
+msgstr "Son reactivado"
#: src/client/game.cpp
#, c-format
msgid "The server is probably running a different version of %s."
-msgstr ""
+msgstr "É posible que o servidor esté executando unha versión diferente de %s."
#: src/client/game.cpp
#, c-format
msgid "Unable to connect to %s because IPv6 is disabled"
-msgstr ""
+msgstr "Non se puido conectar a %s porque o IPv6 está desactivado"
#: src/client/game.cpp
#, c-format
msgid "Unable to listen on %s because IPv6 is disabled"
-msgstr ""
+msgstr "Non se puido escoitar %s porque o IPv6 está desactivado"
#: src/client/game.cpp
#, c-format
msgid "Viewing range changed to %d"
-msgstr ""
+msgstr "Campo de visión cambiada a %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at maximum: %d"
-msgstr ""
+msgstr "O campo de visión está ao máximo: %d"
#: src/client/game.cpp
#, c-format
msgid "Viewing range is at minimum: %d"
-msgstr ""
+msgstr "O campo de visión está ao mínimo: %d"
#: src/client/game.cpp
#, c-format
msgid "Volume changed to %d%%"
-msgstr ""
+msgstr "Volume cambiado a %d%%"
#: src/client/game.cpp
msgid "Wireframe shown"
-msgstr ""
+msgstr "Estrutura de arames mostrada"
#: src/client/game.cpp
msgid "Zoom currently disabled by game or mod"
-msgstr ""
+msgstr "O zoom está actualmente desactivado polo xogo ou mod"
#: src/client/game.cpp
msgid "ok"
-msgstr ""
+msgstr "ok"
#: src/client/gameui.cpp
msgid "Chat hidden"
-msgstr ""
+msgstr "Chat oculto"
#: src/client/gameui.cpp
msgid "Chat shown"
-msgstr ""
+msgstr "Chat visible"
#: src/client/gameui.cpp
msgid "HUD hidden"
-msgstr ""
+msgstr "HUD oculto"
#: src/client/gameui.cpp
msgid "HUD shown"
-msgstr ""
+msgstr "HUD visible"
#: src/client/gameui.cpp
msgid "Profiler hidden"
-msgstr ""
+msgstr "Análise do mundo oculta"
#: src/client/gameui.cpp
#, c-format
msgid "Profiler shown (page %d of %d)"
-msgstr ""
+msgstr "Análise do mundo visible (páx. %d de %d)"
#: src/client/keycode.cpp
msgid "Apps"
-msgstr ""
+msgstr "Aplicaciones"
#: src/client/keycode.cpp
msgid "Backspace"
-msgstr ""
+msgstr "Retroceso"
#: src/client/keycode.cpp
msgid "Caps Lock"
-msgstr ""
+msgstr "Bloq Maiús"
#: src/client/keycode.cpp
msgid "Control"
-msgstr ""
+msgstr "Control"
#: src/client/keycode.cpp
msgid "Down"
-msgstr ""
+msgstr "Abaixo"
#: src/client/keycode.cpp
msgid "End"
-msgstr ""
+msgstr "Fin"
#: src/client/keycode.cpp
msgid "Erase EOF"
-msgstr ""
+msgstr "Borrar EOF"
#: src/client/keycode.cpp
msgid "Execute"
-msgstr ""
+msgstr "Executar"
#: src/client/keycode.cpp
msgid "Help"
-msgstr ""
+msgstr "Axuda"
#: src/client/keycode.cpp
msgid "Home"
-msgstr ""
+msgstr "Inicio"
#: src/client/keycode.cpp
msgid "IME Accept"
-msgstr ""
+msgstr "Aceptar IME"
#: src/client/keycode.cpp
msgid "IME Convert"
-msgstr ""
+msgstr "Converter IME"
#: src/client/keycode.cpp
msgid "IME Escape"
-msgstr ""
+msgstr "Saír do IME"
#: src/client/keycode.cpp
msgid "IME Mode Change"
-msgstr ""
+msgstr "Cambiar modo do IME"
#: src/client/keycode.cpp
msgid "IME Nonconvert"
-msgstr ""
+msgstr "Non converter IME"
#: src/client/keycode.cpp
msgid "Insert"
-msgstr ""
+msgstr "Inserir"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Left"
-msgstr ""
+msgstr "Esquerda"
#: src/client/keycode.cpp
msgid "Left Button"
-msgstr ""
+msgstr "Botón esquerdo"
#: src/client/keycode.cpp
msgid "Left Control"
-msgstr ""
+msgstr "Ctrl esq."
#: src/client/keycode.cpp
msgid "Left Menu"
-msgstr ""
+msgstr "Menú esquerdo"
#: src/client/keycode.cpp
msgid "Left Shift"
-msgstr ""
+msgstr "Shift esq."
#: src/client/keycode.cpp
msgid "Left Windows"
-msgstr ""
+msgstr "Win. esq."
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
msgid "Menu"
-msgstr ""
+msgstr "Menú"
#: src/client/keycode.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "Botón central"
#: src/client/keycode.cpp
msgid "Num Lock"
-msgstr ""
+msgstr "Bloq. núm."
#: src/client/keycode.cpp
msgid "Numpad *"
-msgstr ""
+msgstr "Teclado numérico *"
#: src/client/keycode.cpp
msgid "Numpad +"
-msgstr ""
+msgstr "Teclado numérico +"
#: src/client/keycode.cpp
msgid "Numpad -"
-msgstr ""
+msgstr "Teclado numérico -"
#: src/client/keycode.cpp
msgid "Numpad ."
-msgstr ""
+msgstr "Teclado numérico ."
#: src/client/keycode.cpp
msgid "Numpad /"
-msgstr ""
+msgstr "Teclado numérico /"
#: src/client/keycode.cpp
msgid "Numpad 0"
-msgstr ""
+msgstr "Teclado numérico 0"
#: src/client/keycode.cpp
msgid "Numpad 1"
-msgstr ""
+msgstr "Teclado numérico 1"
#: src/client/keycode.cpp
msgid "Numpad 2"
-msgstr ""
+msgstr "Teclado numérico 2"
#: src/client/keycode.cpp
msgid "Numpad 3"
-msgstr ""
+msgstr "Teclado numérico 3"
#: src/client/keycode.cpp
msgid "Numpad 4"
-msgstr ""
+msgstr "Teclado numérico 4"
#: src/client/keycode.cpp
msgid "Numpad 5"
-msgstr ""
+msgstr "Teclado numérico 5"
#: src/client/keycode.cpp
msgid "Numpad 6"
-msgstr ""
+msgstr "Teclado numérico 6"
#: src/client/keycode.cpp
msgid "Numpad 7"
-msgstr ""
+msgstr "Teclado numérico 7"
#: src/client/keycode.cpp
msgid "Numpad 8"
-msgstr ""
+msgstr "Teclado numérico 8"
#: src/client/keycode.cpp
msgid "Numpad 9"
-msgstr ""
+msgstr "Teclado numérico 9"
#: src/client/keycode.cpp
msgid "OEM Clear"
-msgstr ""
+msgstr "Limpar OEM"
#: src/client/keycode.cpp
msgid "Page down"
-msgstr ""
+msgstr "Avance páx."
#: src/client/keycode.cpp
msgid "Page up"
-msgstr ""
+msgstr "Retroceso pax."
#: src/client/keycode.cpp
msgid "Pause"
-msgstr ""
+msgstr "Pausa"
#: src/client/keycode.cpp
msgid "Play"
-msgstr ""
+msgstr "Xogar"
#. ~ "Print screen" key
#: src/client/keycode.cpp
msgid "Print"
-msgstr ""
+msgstr "Impr. pant."
#: src/client/keycode.cpp
msgid "Return"
-msgstr ""
+msgstr "Enter"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Right"
-msgstr ""
+msgstr "Dereita"
#: src/client/keycode.cpp
msgid "Right Button"
-msgstr ""
+msgstr "Botón dereito"
#: src/client/keycode.cpp
msgid "Right Control"
-msgstr ""
+msgstr "Ctrl der."
#: src/client/keycode.cpp
msgid "Right Menu"
-msgstr ""
+msgstr "Menú dereito"
#: src/client/keycode.cpp
msgid "Right Shift"
-msgstr ""
+msgstr "Shift der."
#: src/client/keycode.cpp
msgid "Right Windows"
-msgstr ""
+msgstr "Win. der."
#: src/client/keycode.cpp
msgid "Scroll Lock"
-msgstr ""
+msgstr "Bloq. Despr."
#. ~ Key name
#: src/client/keycode.cpp
msgid "Select"
-msgstr ""
+msgstr "Seleccionar"
#: src/client/keycode.cpp
msgid "Shift"
-msgstr ""
+msgstr "Shift"
#: src/client/keycode.cpp
msgid "Sleep"
-msgstr ""
+msgstr "Suspender"
#: src/client/keycode.cpp
msgid "Snapshot"
-msgstr ""
+msgstr "Instantánea"
#: src/client/keycode.cpp
msgid "Space"
-msgstr ""
+msgstr "Espazo"
#: src/client/keycode.cpp
msgid "Tab"
-msgstr ""
+msgstr "Tabulador"
#: src/client/keycode.cpp
msgid "Up"
-msgstr ""
+msgstr "Arriba"
#: src/client/keycode.cpp
msgid "X Button 1"
-msgstr ""
+msgstr "X Botón 1"
#: src/client/keycode.cpp
msgid "X Button 2"
-msgstr ""
+msgstr "X Botón 2"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Zoom"
-msgstr ""
+msgstr "Zoom"
#: src/client/minimap.cpp
msgid "Minimap hidden"
-msgstr ""
+msgstr "Minimapa oculto"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in radar mode, Zoom x%d"
-msgstr ""
+msgstr "Minimapa en modo radar, Zoom x%d"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr ""
+msgstr "Minimapa en modo superficie, Zoom x%d"
#: src/client/minimap.cpp
msgid "Minimap in texture mode"
-msgstr ""
+msgstr "Minimapa en modo textura"
#: src/gui/guiChatConsole.cpp
msgid "Failed to open webpage"
-msgstr ""
+msgstr "Erro ao abrir páxina web"
#: src/gui/guiChatConsole.cpp
msgid "Opening webpage"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr ""
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
+msgstr "Abrindo páxina web"
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
-msgstr ""
+msgstr "Continuar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "\"Aux1\" = climb down"
-msgstr ""
+msgstr "\"Aux1\" = baixar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
-msgstr ""
+msgstr "Avance automático"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Automatic jumping"
-msgstr ""
+msgstr "Salto automático"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
-msgstr ""
+msgstr "Aux1"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
-msgstr ""
+msgstr "Atrás"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Block bounds"
-msgstr ""
+msgstr "Lím. bloques"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Change camera"
-msgstr ""
+msgstr "Cambiar cámara"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
-msgstr ""
+msgstr "Chat"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Command"
-msgstr ""
+msgstr "Comando"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Console"
-msgstr ""
+msgstr "Consola"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. range"
-msgstr ""
+msgstr "Dism. alcance"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Dec. volume"
-msgstr ""
+msgstr "Baixar volume"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
+msgstr "Con 2 veces \"saltar\" voas"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Drop"
-msgstr ""
+msgstr "Soltar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Forward"
-msgstr ""
+msgstr "Adiante"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. range"
-msgstr ""
+msgstr "Aum. alcance"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inc. volume"
-msgstr ""
+msgstr "Subir volume"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Inventory"
-msgstr ""
+msgstr "Inventario"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Jump"
-msgstr ""
+msgstr "Saltar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Key already in use"
-msgstr ""
+msgstr "A tecla xa está en uso"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
-msgstr ""
+msgstr "Comando local"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Mute"
-msgstr ""
+msgstr "Silenciar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Next item"
-msgstr ""
+msgstr "Seg. obxecto"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Prev. item"
-msgstr ""
+msgstr "Obxecto ant."
#: src/gui/guiKeyChangeMenu.cpp
msgid "Range select"
-msgstr ""
+msgstr "Sel. alcance"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Screenshot"
-msgstr ""
+msgstr "Captura"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr ""
+msgstr "Ir agachado"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle HUD"
-msgstr ""
+msgstr "Alt. HUD"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle chat log"
-msgstr ""
+msgstr "Alt. rexistro chat"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fast"
-msgstr ""
+msgstr "Alt. correr"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fly"
-msgstr ""
+msgstr "Alt. voo"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle fog"
-msgstr ""
+msgstr "Alt. néboa"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle minimap"
-msgstr ""
+msgstr "Alt. minimapa"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle noclip"
-msgstr ""
+msgstr "Modo espectar"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Toggle pitchmove"
-msgstr ""
+msgstr "Alt. rot. vertical"
#: src/gui/guiKeyChangeMenu.cpp
msgid "press key"
-msgstr ""
+msgstr "Unha tecla"
#: src/gui/guiPasswordChange.cpp
msgid "Change"
-msgstr ""
-
-#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr ""
+msgstr "Cambiar"
#: src/gui/guiPasswordChange.cpp
msgid "New Password"
-msgstr ""
+msgstr "Novo"
#: src/gui/guiPasswordChange.cpp
msgid "Old Password"
-msgstr ""
+msgstr "Anterior contrasinal"
+
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Os contrasinais non coinciden!"
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
-msgstr ""
+msgstr "Pechar"
#: src/gui/guiVolumeChange.cpp
msgid "Muted"
-msgstr ""
+msgstr "Silenciado"
#: src/gui/guiVolumeChange.cpp
#, c-format
msgid "Sound Volume: %d%%"
-msgstr ""
-
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr ""
+msgstr "Son: %d%%"
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
@@ -2082,11 +2196,24 @@ msgstr ""
msgid "LANG_CODE"
msgstr "gl"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Escolle un nome!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) 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."
#: src/settings_translation_file.cpp
msgid ""
@@ -2094,6 +2221,9 @@ msgid ""
"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."
#: src/settings_translation_file.cpp
msgid ""
@@ -2106,6 +2236,17 @@ msgid ""
"situations.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z) compensación do fractal do centro do mundo en unidades de 'escala'.\n"
+"Pódese usar para mover un punto desexado a (0, 0) e para crear un\n"
+"punto de reaparición adecuado, ou para permitir \"aproximarse\" a un\n"
+"punto desexado aumentando a \"escala\".\n"
+"O valor predeterminado está axustado para un punto de aparición adecuado "
+"para Mandelbrot\n"
+"conxuntos con parámetros predeterminados, pode ser necesario modificar "
+"noutras\n"
+"situacións.\n"
+"Intervalo aproximadamente entre -2 e 2. Multiplique por \"escala\" para a "
+"compensación nos nós."
#: src/settings_translation_file.cpp
msgid ""
@@ -2117,56 +2258,66 @@ msgid ""
"Default is for a vertically-squashed shape suitable for\n"
"an island, set all 3 numbers equal for the raw shape."
msgstr ""
+"(X,Y,Z) Escala fractal en nós\n"
+"O tamaño real do fractal será de 2 a 3 veces maior.\n"
+"Estes números poden ser moi grandes, pero o fractal\n"
+"non ten que caber no mundo.\n"
+"Aumenta estes valores para indagar nos detalles do fractal.\n"
+"O valor por defecto é para axustar verticalmente a forma e que sexa "
+"adecuada\n"
+"para unha illa, establece os 3 números iguais para a forma inicial."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of ridged mountains."
-msgstr ""
+msgstr "Ruído 2D que controla a forma/tamaño das montañas escarpadas."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of rolling hills."
-msgstr ""
+msgstr "Ruído 2D que controla a forma/tamaño dos outeiros."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the shape/size of step mountains."
-msgstr ""
+msgstr "Ruído 2D que controla a forma/tamaño das montañas inclinadas."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of ridged mountain ranges."
-msgstr ""
+msgstr "Ruído 2D que controla o tamaño/frecuencia das cordilleiras montañosas."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of rolling hills."
-msgstr ""
+msgstr "Ruído 2D que controla o tamaño/frecuencia dos outeiros."
#: src/settings_translation_file.cpp
msgid "2D noise that controls the size/occurrence of step mountain ranges."
-msgstr ""
+msgstr "Ruído 2D que controla o tamaño/frecuencia das cordilleiras de paso."
#: src/settings_translation_file.cpp
msgid "2D noise that locates the river valleys and channels."
-msgstr ""
+msgstr "Ruído 2D que localiza os vales fluviais e canles dos ríos."
#: src/settings_translation_file.cpp
msgid "3D clouds"
-msgstr ""
+msgstr "Nubes 3D"
#: src/settings_translation_file.cpp
msgid "3D mode"
-msgstr ""
+msgstr "Modo 3D"
#: src/settings_translation_file.cpp
msgid "3D mode parallax strength"
-msgstr ""
+msgstr "Forza de paralaxe en modo 3D"
#: src/settings_translation_file.cpp
msgid "3D noise defining giant caverns."
-msgstr ""
+msgstr "Ruído 3D que define cavernas xigantes."
#: src/settings_translation_file.cpp
msgid ""
"3D noise defining mountain structure and height.\n"
"Also defines structure of floatland mountain terrain."
msgstr ""
+"Ruído 3D que define a estrutura e a altura da montaña.\n"
+"Tamén define a estrutura do terreo montañoso flotante."
#: src/settings_translation_file.cpp
msgid ""
@@ -2175,22 +2326,30 @@ 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 ""
+"Ruído 3D que define a estrutura dos terreos flotantes.\n"
+"Se se modifica a partir do valor por defecto, é posible que necesite a "
+"\"escala\" de ruído (0,7 por defecto).\n"
+"para ser axustado, xa que o tapering flotante funciona mellor cando este "
+"ruído ten\n"
+"un intervalo de valores de aproximadamente -2,0 a 2,0."
#: src/settings_translation_file.cpp
msgid "3D noise defining structure of river canyon walls."
-msgstr ""
+msgstr "Ruído 3D que define a estrutura das paredes do canón do río."
#: src/settings_translation_file.cpp
msgid "3D noise defining terrain."
-msgstr ""
+msgstr "Ruído 3D que define o terreo."
#: src/settings_translation_file.cpp
msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations."
msgstr ""
+"Ruído 3D que define saíntes de montañas, acantilados, etc. Normalmente "
+"pequenas variacións."
#: src/settings_translation_file.cpp
msgid "3D noise that determines number of dungeons per mapchunk."
-msgstr ""
+msgstr "Ruído 3D que determina a cantidade de calabozos por chunk."
#: src/settings_translation_file.cpp
msgid ""
@@ -2205,56 +2364,74 @@ msgid ""
"- pageflip: quadbuffer based 3d.\n"
"Note that the interlaced mode requires shaders to be enabled."
msgstr ""
+"Soporte 3D.\n"
+"Modos admitidos actualmente:\n"
+"- none: ningún efecto 3D.\n"
+"- anaglyph: sistema de cor Ciano/Magenta (lentes 3D azul e vermelho).\n"
+"- interlaced: sistema interlazado (lentes polarizadas).\n"
+"- topbottom: divide a pantalla en dous: unha encima e a outra debaixo.\n"
+"- sidebyside: divide a pantalla en dous: lado a lado.\n"
+" - crossview: 3D de ollos cruzados.\n"
+" - pageflip: quadbuffer basado en 3D.\n"
+"Ten en conta que o modo interlazado precisa que os sombreadores estean "
+"activados."
+
+#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
+"Semente aleatoria para un novo mundo (deixar en branco para que sexa "
+"aleatoria).\n"
+"Será sustituída ao crearse un novo mundo no menú principal."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
-msgstr ""
+msgstr "Mostrarase unha mensaxe a todos os clientes cando o servidor falle."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
-msgstr ""
+msgstr "Mostrarase unha mensaxe a todos os clientes cando o servidor peche."
#: src/settings_translation_file.cpp
msgid "ABM interval"
-msgstr ""
+msgstr "Intervalo ABM"
#: src/settings_translation_file.cpp
msgid "ABM time budget"
-msgstr ""
+msgstr "Límite de tempo para MBA"
#: src/settings_translation_file.cpp
msgid "Absolute limit of queued blocks to emerge"
-msgstr ""
+msgstr "Límite absoluto de bloques en proceso de emerxer"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
-msgstr ""
+msgstr "Aceleración no aire"
#: src/settings_translation_file.cpp
msgid "Acceleration of gravity, in nodes per second per second."
-msgstr ""
+msgstr "Aceleración da gravidade, en nós por segundo."
#: src/settings_translation_file.cpp
msgid "Active Block Modifiers"
-msgstr ""
+msgstr "Modificadores de bloques activos"
#: src/settings_translation_file.cpp
msgid "Active block management interval"
-msgstr ""
+msgstr "Intervalo de administración de bloques activos"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "Rango de bloque activo"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr ""
+msgstr "Rango de envío en obxetos activos"
#: src/settings_translation_file.cpp
msgid ""
@@ -2262,20 +2439,28 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
+"Enderezo ao que se conectar.\n"
+"Deixa isto en branco para iniciar un servidor local.\n"
+"Teña en conta que o campo de enderezo do menú principal anula esta "
+"configuración."
#: src/settings_translation_file.cpp
msgid "Adds particles when digging a node."
-msgstr ""
+msgstr "Añade partículas ao excavar un nó."
#: src/settings_translation_file.cpp
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
+"Axusta a configuración de ppp á túa pantalla (no X11/Android non) p. ex. "
+"para pantallas 4K."
#: src/settings_translation_file.cpp
msgid "Adjust the detected display density, used for scaling UI elements."
msgstr ""
+"Axusta a densidade de visualización detectada, usada para escalar os "
+"elementos da IU."
#: src/settings_translation_file.cpp
#, c-format
@@ -2286,10 +2471,20 @@ msgid ""
"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n"
"to be sure) creates a solid floatland layer."
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 = 2.0 (pode ser maior dependendo de 'mgv7_np_floatland', probar\n"
+"para estar seguro) crea una capa sólida de terreo flotante."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Añadir nome de obxeto"
#: src/settings_translation_file.cpp
msgid "Advanced"
-msgstr ""
+msgstr "Avanzado"
#: src/settings_translation_file.cpp
msgid ""
@@ -2299,60 +2494,69 @@ msgid ""
"This only has significant effect on daylight and artificial\n"
"light, it has very little effect on natural night light."
msgstr ""
+"Altera a curva de luz aplicándolle \"corrección gamma\".\n"
+"Os valores máis altos fan que os niveis de luz medio e inferior sexan máis "
+"brillantes.\n"
+"O valor \"1,0\" deixa a curva de luz inalterada.\n"
+"Isto só ten máis efecto na luz do día e na artificia,\n"
+"ten moi pouco efecto sobre a luz nocturna natural."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
-msgstr ""
+#, fuzzy
+msgid "Always fly fast"
+msgstr "Sempre voar e correr"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
-msgstr ""
+msgstr "Oclusión ambiental gamma"
#: src/settings_translation_file.cpp
msgid "Amount of messages a player may send per 10 seconds."
-msgstr ""
+msgstr "Cantidade de mensaxes que un xogador pode enviar en 10 segundos."
#: src/settings_translation_file.cpp
msgid "Amplifies the valleys."
-msgstr ""
+msgstr "Amplifica os vales."
#: src/settings_translation_file.cpp
msgid "Anisotropic filtering"
-msgstr ""
+msgstr "Filtrado anisotrópico"
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "Anunciar o servidor"
#: src/settings_translation_file.cpp
msgid "Announce to this serverlist."
-msgstr ""
+msgstr "Anuncar en esta lista de servidores."
#: src/settings_translation_file.cpp
msgid "Append item name"
-msgstr ""
+msgstr "Añadir nome de obxeto"
#: src/settings_translation_file.cpp
msgid "Append item name to tooltip."
-msgstr ""
+msgstr "Añadir nome do obxecto á descripción."
#: src/settings_translation_file.cpp
msgid "Apple trees noise"
-msgstr ""
+msgstr "Ruído das maceiras"
#: src/settings_translation_file.cpp
msgid "Arm inertia"
-msgstr ""
+msgstr "Inercia do brazo"
#: src/settings_translation_file.cpp
msgid ""
"Arm inertia, gives a more realistic movement of\n"
"the arm when the camera moves."
msgstr ""
+"Inercia do brazo proporciona un movementomáis realista\n"
+"do brazo cando a cámara se move."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "Preguntar para reconectar logo dunha caída de conexión"
#: src/settings_translation_file.cpp
msgid ""
@@ -2368,106 +2572,127 @@ msgid ""
"optimization.\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)."
#: src/settings_translation_file.cpp
-msgid "Automatic forward key"
+msgid "Audio"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Automatic forward key"
+msgstr "Tecla de avance automático"
+
+#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
-msgstr ""
+msgstr "Saltar obstáculos de un só no automáticamente."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
-msgstr ""
+msgstr "Informar automáticamente á lista do servidor."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
-msgstr ""
+msgstr "Autogardar o tamaño da pantalla"
#: src/settings_translation_file.cpp
msgid "Autoscaling mode"
-msgstr ""
+msgstr "Modo de autoescalado"
#: src/settings_translation_file.cpp
msgid "Aux1 key"
-msgstr ""
+msgstr "Tecla Aux1"
#: src/settings_translation_file.cpp
msgid "Aux1 key for climbing/descending"
-msgstr ""
+msgstr "Tecla Aux1 para escalar/descender"
#: src/settings_translation_file.cpp
msgid "Backward key"
-msgstr ""
+msgstr "Tecla retroceso"
#: src/settings_translation_file.cpp
msgid "Base ground level"
-msgstr ""
+msgstr "Nivel do chán base"
#: src/settings_translation_file.cpp
msgid "Base terrain height."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
+msgstr "Altura base do terreo."
#: src/settings_translation_file.cpp
msgid "Basic privileges"
-msgstr ""
+msgstr "Permisos básicos"
#: src/settings_translation_file.cpp
msgid "Beach noise"
-msgstr ""
+msgstr "Ruído da praia"
#: src/settings_translation_file.cpp
msgid "Beach noise threshold"
-msgstr ""
+msgstr "Límite de ruído de praia"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
-msgstr ""
+msgstr "Filtrado bilineal"
#: src/settings_translation_file.cpp
msgid "Bind address"
-msgstr ""
+msgstr "Vincular enderezo"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
-msgstr ""
+#, fuzzy
+msgid "Biome API noise parameters"
+msgstr "Parámetros de ruído de humidade e temperatura da API de bioma"
#: src/settings_translation_file.cpp
msgid "Biome noise"
-msgstr ""
+msgstr "Ruído de bioma"
#: src/settings_translation_file.cpp
msgid "Block send optimize distance"
+msgstr "Distancia de optimización do envío de bloques"
+
+#: src/settings_translation_file.cpp
+msgid "Bobbing"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
-msgstr ""
+msgstr "Camiño das fontes negras e cursivas"
#: src/settings_translation_file.cpp
msgid "Bold and italic monospace font path"
-msgstr ""
+msgstr "Camiño das fontes negras e cursivas monoespaciadas"
#: src/settings_translation_file.cpp
msgid "Bold font path"
-msgstr ""
+msgstr "Camiño das fontes negras"
#: src/settings_translation_file.cpp
msgid "Bold monospace font path"
-msgstr ""
+msgstr "Camiño das fontes negras monoespaciadas"
#: src/settings_translation_file.cpp
msgid "Build inside player"
-msgstr ""
+msgstr "Colocar bloque na posición do xogador"
#: src/settings_translation_file.cpp
msgid "Builtin"
-msgstr ""
+msgstr "Integrado"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Cambiar cámara"
#: src/settings_translation_file.cpp
msgid ""
@@ -2476,182 +2701,196 @@ msgid ""
"Increasing can reduce artifacting on weaker GPUs.\n"
"0.1 = Default, 0.25 = Good value for weaker tablets."
msgstr ""
+"Distancia do plano próximo á cámara en nós, entre 0 e 0,25\n"
+"Só funciona en plataformas GLES. A maioría dos usuarios non terán que "
+"cambiar isto.\n"
+"Aumentalo pode reducir a aparición de artefactos en GPU máis débiles.\n"
+"0,1 = Por defecto, 0,25 = Bo valor para tabletas débiles."
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr ""
+msgstr "Suavizado de cámara"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Suavizado de cámara en modo cinematográfico"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
-msgstr ""
+msgstr "Alt. actualización de cámara"
#: src/settings_translation_file.cpp
msgid "Cave noise"
-msgstr ""
+msgstr "Ruído de covas"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr ""
+msgstr "Ruído de covas #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr ""
+msgstr "Sonido de covas #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Ancho da cova"
#: src/settings_translation_file.cpp
msgid "Cave1 noise"
-msgstr ""
+msgstr "Sonido de cova1"
#: src/settings_translation_file.cpp
msgid "Cave2 noise"
-msgstr ""
+msgstr "Sonido de cova2"
#: src/settings_translation_file.cpp
msgid "Cavern limit"
-msgstr ""
+msgstr "Limite da cova"
#: src/settings_translation_file.cpp
msgid "Cavern noise"
-msgstr ""
+msgstr "Ruído da cova"
#: src/settings_translation_file.cpp
msgid "Cavern taper"
-msgstr ""
+msgstr "Conicidade da cova"
#: src/settings_translation_file.cpp
msgid "Cavern threshold"
-msgstr ""
+msgstr "Límite da cova"
#: src/settings_translation_file.cpp
msgid "Cavern upper limit"
-msgstr ""
+msgstr "Límite superior da cova"
#: src/settings_translation_file.cpp
msgid ""
"Center of light curve boost range.\n"
"Where 0.0 is minimum light level, 1.0 is maximum light level."
msgstr ""
+"Rango de aumento do centro da curva de luz.\n"
+"0,0 é o nível mínimo de luz, 1,0 é o nível máximo."
#: src/settings_translation_file.cpp
msgid "Chat command time message threshold"
-msgstr ""
+msgstr "Límite de tempo de mensaxe de comando de chat"
#: src/settings_translation_file.cpp
msgid "Chat commands"
-msgstr ""
+msgstr "Comandos do chat"
#: src/settings_translation_file.cpp
msgid "Chat font size"
-msgstr ""
+msgstr "Tamaño da fonte do chat"
#: src/settings_translation_file.cpp
msgid "Chat key"
-msgstr ""
+msgstr "Tecla do chat"
#: src/settings_translation_file.cpp
msgid "Chat log level"
-msgstr ""
+msgstr "Nivel de rexistro do chat"
#: src/settings_translation_file.cpp
msgid "Chat message count limit"
-msgstr ""
+msgstr "Límite de mensaxes do chat"
#: src/settings_translation_file.cpp
msgid "Chat message format"
-msgstr ""
+msgstr "Formato da mensaxe do chat"
#: src/settings_translation_file.cpp
msgid "Chat message kick threshold"
-msgstr ""
+msgstr "Límite da mensaxe de expulsión"
#: src/settings_translation_file.cpp
msgid "Chat message max length"
-msgstr ""
+msgstr "Lonxitude máxima da mensaxe do chat"
#: src/settings_translation_file.cpp
msgid "Chat toggle key"
-msgstr ""
+msgstr "Alt. chat"
#: src/settings_translation_file.cpp
msgid "Chat weblinks"
-msgstr ""
+msgstr "Ligazóns web do chat"
#: src/settings_translation_file.cpp
msgid "Chunk size"
-msgstr ""
+msgstr "Tamaño do chunk"
#: src/settings_translation_file.cpp
msgid "Cinematic mode"
-msgstr ""
+msgstr "Modo cinematográfico"
#: src/settings_translation_file.cpp
msgid "Cinematic mode key"
-msgstr ""
+msgstr "Tecla para modo cinematográfico"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
-msgstr ""
+msgstr "Limpar texturas transparentes"
#: src/settings_translation_file.cpp
msgid ""
"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console "
"output."
msgstr ""
+"Ligazóns da web que se poden clicar (clic do medio ou Ctrl + botón "
+"esquerdo). Actívanse na saída da consola do chat."
#: src/settings_translation_file.cpp
msgid "Client"
-msgstr ""
+msgstr "Cliente"
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "Cliente e servidor"
#: src/settings_translation_file.cpp
msgid "Client modding"
-msgstr ""
+msgstr "Personalización do cliente"
#: src/settings_translation_file.cpp
msgid "Client side modding restrictions"
-msgstr ""
+msgstr "Restricións para modear no lado do cliente"
#: src/settings_translation_file.cpp
msgid "Client side node lookup range restriction"
-msgstr ""
+msgstr "Restrición do rango de busca do nodo do lado do cliente"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Personalización do cliente"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-msgstr ""
+msgstr "Velocidade de escalada"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr ""
+msgstr "Radio de nubes"
#: src/settings_translation_file.cpp
msgid "Clouds"
-msgstr ""
+msgstr "Nubes"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "As nubes son un efecto do lado do cliente."
#: src/settings_translation_file.cpp
msgid "Clouds in menu"
-msgstr ""
+msgstr "Nubes no menú"
#: src/settings_translation_file.cpp
msgid "Colored fog"
-msgstr ""
+msgstr "Néboa colorida"
#: src/settings_translation_file.cpp
msgid "Colored shadows"
-msgstr ""
+msgstr "Sombras coloridas"
#: src/settings_translation_file.cpp
msgid ""
@@ -2663,22 +2902,36 @@ msgid ""
"These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/"
msgstr ""
+"Lista de marcas separadas por comas para ocultar no repositorio de contido.\n"
+"\"Non libre\" pódese usar para ocultar paquetes que non sexan \"software "
+"libre\",\n"
+"segundo a definición da Free Software Foundation.\n"
+"Tamén podes especificar clasificacións de contido.\n"
+"Estas marcas son independentes das versións de Minetest,\n"
+"así que consulta unha lista completa en https://content.minetest.net/help/"
+"content_flags/"
#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
"allow them to upload and download data to/from the internet."
msgstr ""
+"Lista separada por comas de mods que poden acceder ás API de HTTP, que\n"
+"permiten cargar e descargar datos a/desde Internet."
#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"Lista separada por comas de mods de confianza que poden acceder funcións "
+"inseguras\n"
+"incluso cando a seguridade mod está activada (cía "
+"request_insecure_environment())."
#: src/settings_translation_file.cpp
msgid "Command key"
-msgstr ""
+msgstr "Tecla comando"
#: src/settings_translation_file.cpp
msgid ""
@@ -2687,6 +2940,10 @@ msgid ""
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
+"Nivel de compresión para usar ao gardar mundos no disco.\n"
+"-1 - usa o nivel de compresión por defecto\n"
+"0 - menor compresión, máis rápido\n"
+"9 - mellor compresión, máis lenta"
#: src/settings_translation_file.cpp
msgid ""
@@ -2695,56 +2952,67 @@ msgid ""
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
+"Nivel de compresión para usar ao mandar mundos ao cliente:\n"
+"-1 - usa o nivel de compresión por defecto\n"
+"0 - menor compresión, máis rápido\n"
+"9 - mellor compresión, máis lenta"
#: src/settings_translation_file.cpp
msgid "Connect glass"
-msgstr ""
+msgstr "Unificar vidro"
#: src/settings_translation_file.cpp
msgid "Connect to external media server"
-msgstr ""
+msgstr "Conectar a un servidor multimedia externo"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
-msgstr ""
+msgstr "Unifica o vidro se o bloque é compatible."
#: src/settings_translation_file.cpp
msgid "Console alpha"
-msgstr ""
+msgstr "Opacidade da consola"
#: src/settings_translation_file.cpp
msgid "Console color"
-msgstr ""
+msgstr "Cor da consola"
#: src/settings_translation_file.cpp
msgid "Console height"
-msgstr ""
+msgstr "Altura da consola"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Contido do repositorio en liña"
#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
-msgstr ""
+msgstr "Lista negra de marcas de ContentDB"
#: src/settings_translation_file.cpp
msgid "ContentDB Max Concurrent Downloads"
-msgstr ""
+msgstr "Descargas máximas simultáneas para ContentDB"
#: src/settings_translation_file.cpp
msgid "ContentDB URL"
-msgstr ""
+msgstr "Ligazón URL de ContentDB"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr ""
+msgstr "Avance contínuo"
#: src/settings_translation_file.cpp
msgid ""
"Continuous forward movement, toggled by autoforward key.\n"
"Press the autoforward key again or the backwards movement to disable."
msgstr ""
+"Movemento contínuo cara diante. Actívase coa tecla de autoavance.\n"
+"Preme a tecla de autoavance outra vez ou retrocede para desactivar."
#: src/settings_translation_file.cpp
msgid "Controls"
-msgstr ""
+msgstr "Controis"
#: src/settings_translation_file.cpp
msgid ""
@@ -2752,18 +3020,23 @@ msgid ""
"Examples:\n"
"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."
msgstr ""
+"Controla a duración do ciclo de día/noite.\n"
+"Exemplos:\n"
+"72 = 20min, 360 = 4min, 1 = 24hour, 0 = Día/noite permanece inalterado."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Controla a inclinación/profundidade dos lagos."
#: src/settings_translation_file.cpp
msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Controla a inclinación/altura dos outeiros."
#: src/settings_translation_file.cpp
msgid ""
@@ -2771,96 +3044,105 @@ msgid ""
"Value >= 10.0 completely disables generation of tunnels and avoids the\n"
"intensive noise calculations."
msgstr ""
+"Controla o ancho dos túneis. Un valor menor crea túneis máis anchos.\n"
+"Valor >= 10.0 desactiva completamente a xeración de túneis e evita\n"
+"cálculos intensivos de ruído."
#: src/settings_translation_file.cpp
msgid "Crash message"
-msgstr ""
+msgstr "Mensaxe de erro"
#: src/settings_translation_file.cpp
msgid "Creative"
-msgstr ""
+msgstr "Creativo"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
-msgstr ""
+msgstr "Opacidade do cursor"
#: src/settings_translation_file.cpp
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
"This also applies to the object crosshair."
msgstr ""
+"Opacidade do cursor (entre 0 e 255).\n"
+"Tamén pasa o menos con a cruz do obxecto."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
-msgstr ""
+msgstr "Cor da cruz"
#: src/settings_translation_file.cpp
msgid ""
"Crosshair color (R,G,B).\n"
"Also controls the object crosshair color"
msgstr ""
+"Cor da cruz (R, G, B)\n"
+"Tamén pasa o mesmo coa cruz do obxecto"
#: src/settings_translation_file.cpp
msgid "DPI"
-msgstr ""
+msgstr "DPI"
#: src/settings_translation_file.cpp
msgid "Damage"
-msgstr ""
+msgstr "Dano"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
-msgstr ""
+msgstr "Alt. inf. para depuración"
#: src/settings_translation_file.cpp
msgid "Debug log file size threshold"
-msgstr ""
+msgstr "Límite do tamaño do ficheiro de información de depuración"
#: src/settings_translation_file.cpp
msgid "Debug log level"
-msgstr ""
+msgstr "Nivel de rexistro de depuración"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr ""
+msgid "Dec. volume key"
+msgstr "Tecla baixar volume"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
-msgstr ""
+msgstr "Intervalo de servidor dedicado"
#: src/settings_translation_file.cpp
msgid "Default acceleration"
-msgstr ""
+msgstr "Aceleración por defecto"
#: src/settings_translation_file.cpp
msgid "Default game"
-msgstr ""
+msgstr "Xogo por defecto"
#: src/settings_translation_file.cpp
msgid ""
"Default game when creating a new world.\n"
"This will be overridden when creating a world from the main menu."
msgstr ""
+"Xogo por defecto ao crear un novo mundo.\n"
+"Sobreescribirase ao crear un mundo desde o menú principal."
#: src/settings_translation_file.cpp
msgid "Default password"
-msgstr ""
+msgstr "Contrasinal por defecto"
#: src/settings_translation_file.cpp
msgid "Default privileges"
-msgstr ""
+msgstr "Permisos por defecto"
#: src/settings_translation_file.cpp
msgid "Default report format"
-msgstr ""
+msgstr "Formato de reporte por defecto"
#: src/settings_translation_file.cpp
msgid "Default stack size"
-msgstr ""
+msgstr "Tamaño do agrupamento de obxectos por defecto"
#: src/settings_translation_file.cpp
msgid ""
@@ -2868,168 +3150,198 @@ msgid ""
"This simulates the soft shadows effect by applying a PCF or Poisson disk\n"
"but also uses more resources."
msgstr ""
+"Define a calidade do filtrado de sombras.\n"
+"Isto simula un efecto de sombras suaves aplicando un PCF ou Poisson disk\n"
+"pero tamén consume máis recursos."
#: src/settings_translation_file.cpp
msgid "Defines areas where trees have apples."
-msgstr ""
+msgstr "Define as áreas onde as árbores teñen mazás."
#: src/settings_translation_file.cpp
msgid "Defines areas with sandy beaches."
-msgstr ""
+msgstr "Define áreas con praias areosas."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain and steepness of cliffs."
msgstr ""
+"Define a distribución de terreos más elevados e a inclinación de acantilados."
#: src/settings_translation_file.cpp
msgid "Defines distribution of higher terrain."
-msgstr ""
+msgstr "Define a distribución de terreos elevados."
#: src/settings_translation_file.cpp
msgid "Defines full size of caverns, smaller values create larger caverns."
msgstr ""
+"Define o tamaño de covas. Valores máis baixos crean covas máis grandes."
#: src/settings_translation_file.cpp
msgid "Defines large-scale river channel structure."
-msgstr ""
+msgstr "Define estruturas de canles fluviais a gran escala."
#: src/settings_translation_file.cpp
msgid "Defines location and terrain of optional hills and lakes."
-msgstr ""
+msgstr "Define a localización e terreo de outeiros e lagos opcionais."
#: src/settings_translation_file.cpp
msgid "Defines the base ground level."
-msgstr ""
+msgstr "Define o nivel base do terreo."
#: src/settings_translation_file.cpp
msgid "Defines the depth of the river channel."
-msgstr ""
+msgstr "Define a profundidade da canle do río."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
+"Define a distancia máxima de transferencia de xogadores en bloques (0 = "
+"ilimitado)."
#: src/settings_translation_file.cpp
msgid "Defines the width of the river channel."
-msgstr ""
+msgstr "Define a largura da canle do río."
#: src/settings_translation_file.cpp
msgid "Defines the width of the river valley."
-msgstr ""
+msgstr "Define a largura do val do río."
#: src/settings_translation_file.cpp
msgid "Defines tree areas and tree density."
-msgstr ""
+msgstr "Define as áreas arbóreas e a densidade das árbores."
#: src/settings_translation_file.cpp
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 ""
+"Atraso entre as actualizacións de mallas do cliente en ms. Incrementar isto "
+"consegue\n"
+"reducir a cantidade de actualizacións de mallas, reducindo así a "
+"inestabilidade nos clientes máis lentos."
#: src/settings_translation_file.cpp
msgid "Delay in sending blocks after building"
-msgstr ""
+msgstr "Atraso no envío de bloques logo de construír"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Atraso para mostrar información de herramientas, en milisegundos."
#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
-msgstr ""
+msgstr "Manexo de funcións de API Lua obsoletas"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find giant caverns."
-msgstr ""
+msgstr "Profundidade na que atoparás cavernas xigantes."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Profundidade na que atoparás covas grandes."
#: src/settings_translation_file.cpp
msgid ""
"Description of server, to be displayed when players join and in the "
"serverlist."
msgstr ""
+"Descripción do servidor. Móstrase na lista de servidores e cando os "
+"xogadores únense."
#: src/settings_translation_file.cpp
msgid "Desert noise threshold"
-msgstr ""
+msgstr "Límite do ruído do deserto"
#: src/settings_translation_file.cpp
msgid ""
"Deserts occur when np_biome exceeds this value.\n"
"When the 'snowbiomes' flag is enabled, this is ignored."
msgstr ""
+"Os desertos aparecen cando np_biome supera este valor.\n"
+"Cando a marca 'snowbiomes' actívase, isto é ignorado."
#: src/settings_translation_file.cpp
msgid "Desynchronize block animation"
-msgstr ""
+msgstr "Desincronizar a animación dos bloques"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Decoracións"
#: src/settings_translation_file.cpp
msgid "Dig key"
-msgstr ""
+msgstr "Tecla romper bloque"
#: src/settings_translation_file.cpp
msgid "Digging particles"
-msgstr ""
+msgstr "Partículas ao excavar"
#: src/settings_translation_file.cpp
msgid "Disable anticheat"
-msgstr ""
+msgstr "Desactivar anticheat"
#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
-msgstr ""
+msgstr "Non permitir contrasinais baleiros"
#: src/settings_translation_file.cpp
msgid "Display Density Scaling Factor"
+msgstr "Factor de escala de densidade de exposición"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Nome do servidor. Mostrarase na lista de servidores."
#: src/settings_translation_file.cpp
msgid "Double tap jump for fly"
-msgstr ""
+msgstr "Pulsar dúas veces \"salto\" para voar"
#: src/settings_translation_file.cpp
msgid "Double-tapping the jump key toggles fly mode."
-msgstr ""
+msgstr "Pulsar dúas veces \"salto\" serve para activar e desactivar o voo."
#: src/settings_translation_file.cpp
msgid "Drop item key"
-msgstr ""
+msgstr "Tecla para soltar obxecto"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug information."
-msgstr ""
+msgstr "Mostrar información de depuración do xerador de terreos."
#: src/settings_translation_file.cpp
msgid "Dungeon maximum Y"
-msgstr ""
+msgstr "Nº máx. de calabozos Y"
#: src/settings_translation_file.cpp
msgid "Dungeon minimum Y"
-msgstr ""
+msgstr "Nº mín. de calabozos Y"
#: src/settings_translation_file.cpp
msgid "Dungeon noise"
-msgstr ""
+msgstr "Sonido de calabozos"
#: src/settings_translation_file.cpp
msgid ""
"Enable IPv6 support (for both client and server).\n"
"Required for IPv6 connections to work at all."
msgstr ""
+"Activar axuda IPv6 (para o cliente e o servidor).\n"
+"É preciso para que as conexións IPv6 funcionen."
#: src/settings_translation_file.cpp
msgid ""
"Enable Lua modding support on client.\n"
"This support is experimental and API can change."
msgstr ""
+"Activar a axuda de mods de Lua no cliente.\n"
+"Isto é experimental e a API pode cambiar."
#: src/settings_translation_file.cpp
msgid ""
@@ -3037,55 +3349,61 @@ msgid ""
"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF "
"filtering."
msgstr ""
+"Activar filtrado \"poisson disk\".\n"
+"Utiliza o \"poisson disk\" para proxectar sombras suaves cando o valor sexa "
+"verdadero. Senón, utiliza o filtrado PCF."
#: src/settings_translation_file.cpp
msgid ""
"Enable colored shadows.\n"
"On true translucent nodes cast colored shadows. This is expensive."
msgstr ""
+"Activar sombras coloridas.\n"
+"Se o valor é verdadeiro, os bloques traslúcidos proxectarán sombras "
+"coloridas. Esta opción precisa de moitos recursos."
#: src/settings_translation_file.cpp
msgid "Enable console window"
-msgstr ""
+msgstr "Activar a xanela da consola"
#: src/settings_translation_file.cpp
msgid "Enable creative mode for all players"
-msgstr ""
+msgstr "Activar o modo creativo para todos os xogadores"
#: src/settings_translation_file.cpp
msgid "Enable joysticks"
+msgstr "Activar joysticks"
+
+#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
-msgstr ""
+msgstr "Activar axuda para as canles de mods."
#: src/settings_translation_file.cpp
msgid "Enable mod security"
-msgstr ""
+msgstr "Activar seguridade dos mods"
#: src/settings_translation_file.cpp
msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "Activar dano e morte dos xogadores."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
+msgstr "Activar a entrada de comandos aleatoria (só para tests)."
#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
+"Activar a iluminación suave con oclusión de ambiente simple.\n"
+"Desactivar para velocidade ou vistas diferentes."
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3096,6 +3414,10 @@ msgid ""
"to new servers, but they may not support all new features that you are "
"expecting."
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."
#: src/settings_translation_file.cpp
msgid ""
@@ -3104,18 +3426,26 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
+"Activa o uso do servidor multimedia remoto (se o proporciona o servidor).\n"
+"Os servidores remotos ofrecen unha forma máis rápida de descargar datos (por "
+"exemplo, texturas)\n"
+"ao conectarse ao servidor."
#: src/settings_translation_file.cpp
msgid ""
"Enable vertex buffer objects.\n"
"This should greatly improve graphics performance."
msgstr ""
+"Activar os objectos buffer de vértice.\n"
+"Isto debería mellorar muito o rendimento gráfico."
#: src/settings_translation_file.cpp
msgid ""
"Enable view bobbing and amount of view bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
+"Activa o balanceo de vista e canto o fai.\n"
+"Por exemplo: 0 para nada de balanceo; 1.0 para o normal; 2.0 para o dobre."
#: src/settings_translation_file.cpp
msgid ""
@@ -3123,6 +3453,9 @@ msgid ""
"Ignored if bind_address is set.\n"
"Needs enable_ipv6 to be enabled."
msgstr ""
+"Activa/desactiva a execución dun servidor IPv6.\n"
+"Ignorado se establécese bind_address.\n"
+"É preciso enable_ipv6 para activalo."
#: src/settings_translation_file.cpp
msgid ""
@@ -3131,18 +3464,22 @@ msgid ""
"appearance of high dynamic range images. Mid-range contrast is slightly\n"
"enhanced, highlights and shadows are gradually compressed."
msgstr ""
+"Activa o mapeo de tons fílmicos 'Uncharted 2' de Hable.\n"
+"Simula a curva de ton da película fotográfica e como esta se aproxima á\n"
+"aparición de imaxes de alto rango dinámico. O contraste de gama media é\n"
+"un poulllo mellor, pois as luces e as sombras comprímense gradualmente."
#: src/settings_translation_file.cpp
msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Activa a animación de obxetos no inventario."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Activa o rexistro de mallas xiradas."
#: src/settings_translation_file.cpp
msgid "Enables minimap."
-msgstr ""
+msgstr "Activa o minimapa."
#: src/settings_translation_file.cpp
msgid ""
@@ -3151,20 +3488,32 @@ msgid ""
"sound controls will be non-functional.\n"
"Changing this setting requires a restart."
msgstr ""
+"Activa o son.\n"
+"Se está desactivado, deixarán de escoitarse todos os sons e os sons do xogo\n"
+"xa non funcionarán.\n"
+"Para cambiar esta configuración, é necesario reiniciar."
#: 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 ""
+"Permite compensar para reducir a carga da CPU ou aumenta o desempeño de "
+"renderización\n"
+"a costa de pequenos falllos visuais que non afectan á hora de xogar."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Perfil dos vales"
#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
-msgstr ""
+msgstr "Intervalo de exposición dos datos da perfilaxe do motor"
#: src/settings_translation_file.cpp
msgid "Entity methods"
-msgstr ""
+msgstr "Métodos de entidade"
#: src/settings_translation_file.cpp
msgid ""
@@ -3175,56 +3524,70 @@ 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."
#: src/settings_translation_file.cpp
-msgid "FPS when unfocused or paused"
+msgid "FPS"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS when unfocused or paused"
+msgstr "FPS cando está en segundo plano ou pausado"
+
+#: src/settings_translation_file.cpp
msgid "FSAA"
-msgstr ""
+msgstr "FSAA"
#: src/settings_translation_file.cpp
msgid "Factor noise"
-msgstr ""
+msgstr "Factor de ruído"
#: src/settings_translation_file.cpp
msgid "Fall bobbing factor"
-msgstr ""
+msgstr "Factor de balanceo en caída"
#: src/settings_translation_file.cpp
msgid "Fallback font path"
-msgstr ""
+msgstr "Camiño da fonte alternativa"
#: src/settings_translation_file.cpp
msgid "Fast key"
-msgstr ""
+msgstr "Tecla de correr"
#: src/settings_translation_file.cpp
msgid "Fast mode acceleration"
-msgstr ""
+msgstr "Aceleración no modo rápido"
#: src/settings_translation_file.cpp
msgid "Fast mode speed"
-msgstr ""
+msgstr "Velocidade do modo rápido"
#: src/settings_translation_file.cpp
msgid "Fast movement"
-msgstr ""
+msgstr "Movemento rápido"
#: src/settings_translation_file.cpp
msgid ""
"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
+"Movemento rápido (vía tecla \"Aux1\").\n"
+"É preciso o permiso \"fast\" no servidor."
#: src/settings_translation_file.cpp
msgid "Field of view"
-msgstr ""
+msgstr "Campo de visión"
#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
-msgstr ""
+msgstr "Campo de visión en grados."
#: src/settings_translation_file.cpp
msgid ""
@@ -3232,18 +3595,21 @@ msgid ""
"the\n"
"Multiplayer Tab."
msgstr ""
+"Ficheiro no cartafol client/serverlist/ que contén os seus servidores "
+"favoritos.\n"
+"Móstranse na xanela de Xogar en liña."
#: src/settings_translation_file.cpp
msgid "Filler depth"
-msgstr ""
+msgstr "Profundidade de recheo"
#: src/settings_translation_file.cpp
msgid "Filler depth noise"
-msgstr ""
+msgstr "Ruído da profundidade de recheo"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Mapa de tons fílmico"
#: src/settings_translation_file.cpp
msgid ""
@@ -3252,112 +3618,129 @@ msgid ""
"light edges to transparent textures. Apply a filter to clean that up\n"
"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
+"As texturas filtradas poden combinar valores RGB con áreas totalmente "
+"transparentes.\n"
+"que os optimizadores PNG adoitan descartar, a miúdo resultando en\n"
+"bordos claros ou escuros en texturas transparentes. Aplique un filtro para "
+"limpalo\n"
+"no tempo de carga da textura. Isto habilitarase automaticamente se o "
+"\"mipmapping \"está activado."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Suavizado:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
msgstr ""
+"Primeiro de 4 ruídos 2D que xuntos definen a altura de outeiros/montañas."
#: src/settings_translation_file.cpp
msgid "First of two 3D noises that together define tunnels."
-msgstr ""
+msgstr "Primeiro de 2 ruídos 3D que xuntos definen túneis."
#: src/settings_translation_file.cpp
msgid "Fixed map seed"
-msgstr ""
+msgstr "Semente de mapa fixa"
#: src/settings_translation_file.cpp
msgid "Fixed virtual joystick"
-msgstr ""
+msgstr "Joystick virtual fixo"
#: src/settings_translation_file.cpp
msgid "Floatland density"
-msgstr ""
+msgstr "Densidade dos terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland maximum Y"
-msgstr ""
+msgstr "Valor máximo de Y dos terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland minimum Y"
-msgstr ""
+msgstr "Valor mínimo de Y dos terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland noise"
-msgstr ""
+msgstr "Ruído de terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland taper exponent"
-msgstr ""
+msgstr "Expoñente de conicidade de terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland tapering distance"
-msgstr ""
+msgstr "Distancia cónica de terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Floatland water level"
-msgstr ""
+msgstr "Nivel da auga de terreos flotantes"
#: src/settings_translation_file.cpp
msgid "Fly key"
-msgstr ""
+msgstr "Tecla de voo"
#: src/settings_translation_file.cpp
msgid "Flying"
-msgstr ""
+msgstr "Voar"
#: src/settings_translation_file.cpp
msgid "Fog"
-msgstr ""
+msgstr "Néboa"
#: src/settings_translation_file.cpp
msgid "Fog start"
-msgstr ""
+msgstr "Inicio de néboa"
#: src/settings_translation_file.cpp
msgid "Fog toggle key"
-msgstr ""
+msgstr "Alt. néboa"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Tamaño da fonte"
#: src/settings_translation_file.cpp
msgid "Font bold by default"
-msgstr ""
+msgstr "Fonte en negra por defecto"
#: src/settings_translation_file.cpp
msgid "Font italic by default"
-msgstr ""
+msgstr "Fonte en cursiva por defecto"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "Sombra da fonte"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
-msgstr ""
+msgstr "Opacidade da sombra da fonte"
#: src/settings_translation_file.cpp
msgid "Font size"
-msgstr ""
+msgstr "Tamaño da fonte"
#: src/settings_translation_file.cpp
msgid "Font size divisible by"
-msgstr ""
+msgstr "Tamaño da fonte divisible por"
#: src/settings_translation_file.cpp
msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
-msgstr ""
+msgstr "Tamaño da fonte por defecto. 1 unidade = 1 píxel en 96 DPI"
#: src/settings_translation_file.cpp
msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
-msgstr ""
+msgstr "Tamaño da fonte monoespacial. 1 unidade = 1 píxel en 96 DPI"
#: src/settings_translation_file.cpp
msgid ""
"Font size of the recent chat text and chat prompt in point (pt).\n"
"Value 0 will use the default font size."
msgstr ""
+"Tamaño da fonte do texto do chat reciente e do indicador do chat en puntos "
+"(pt).\n"
+"O valor 0 utilizará o tamaño de fonte por defecto."
#: src/settings_translation_file.cpp
msgid ""
@@ -3369,6 +3752,14 @@ msgid ""
"be\n"
"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
msgstr ""
+"Para fontes de estilo píxel que non se escalan ben, isto garante que se "
+"utilicen os tamaños de letra\n"
+"con este tipo de letra sempre serán divisible por este valor, en píxeles. "
+"Por exemplo,\n"
+"un tipo de letra de 16 píxeles de alto debería ter este valor establecido en "
+"16, polo que só o será\n"
+"tamaño 16, 32, 48, etc., polo que un mod que solicite un tamaño de 25 obterá "
+"32."
#: src/settings_translation_file.cpp
msgid ""
@@ -3376,69 +3767,74 @@ msgid ""
"placeholders:\n"
"@name, @message, @timestamp (optional)"
msgstr ""
+"Formato dos mensajes do chat do xogador. As seguintes cadeas son válidas:\n"
+"@name, @message, @timestamp (opcional)"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Formato das capturas de pantalla."
#: src/settings_translation_file.cpp
msgid "Formspec Default Background Color"
-msgstr ""
+msgstr "Cor de fondo por defecto para formularios"
#: src/settings_translation_file.cpp
msgid "Formspec Default Background Opacity"
-msgstr ""
+msgstr "Opacidade de fondo por defecto para formularios"
#: src/settings_translation_file.cpp
msgid "Formspec Full-Screen Background Color"
-msgstr ""
+msgstr "Cor de fondo para formularios en pantalla completa"
#: src/settings_translation_file.cpp
msgid "Formspec Full-Screen Background Opacity"
-msgstr ""
+msgstr "Opacidade dos formularios en pantalla completa"
#: src/settings_translation_file.cpp
msgid "Formspec default background color (R,G,B)."
-msgstr ""
+msgstr "Cor de fondo por defecto para os formularios (R, G, B)."
#: src/settings_translation_file.cpp
msgid "Formspec default background opacity (between 0 and 255)."
-msgstr ""
+msgstr "Opacidade por defecto do fondo dos formularios (entre 0 e 255)."
#: src/settings_translation_file.cpp
msgid "Formspec full-screen background color (R,G,B)."
-msgstr ""
+msgstr "Cor de fondo para os formularios en pantalla completa(R, G, B)."
#: src/settings_translation_file.cpp
msgid "Formspec full-screen background opacity (between 0 and 255)."
-msgstr ""
+msgstr "Opacidade de fondo por defecto para os formularios (entre 0 e 255)."
#: src/settings_translation_file.cpp
msgid "Forward key"
-msgstr ""
+msgstr "Tecla avance"
#: src/settings_translation_file.cpp
msgid "Fourth of 4 2D noises that together define hill/mountain range height."
-msgstr ""
+msgstr "Cuarto de 4 ruídos 2D que xuntos definen a altura das montañas."
#: src/settings_translation_file.cpp
msgid "Fractal type"
-msgstr ""
+msgstr "Tipo de fractal"
#: src/settings_translation_file.cpp
msgid "Fraction of the visible distance at which fog starts to be rendered"
-msgstr ""
+msgstr "Fracción de distancia visible na que a néboa comeza a aparecer"
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
+"Distancia máxima de xeración de bloques para clientes, en mapblocks (16x3 "
+"bloques)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
+"Distancia máxima de envío de bloques para clientes, en mapblocks (16 nós)."
#: src/settings_translation_file.cpp
msgid ""
@@ -3448,77 +3844,122 @@ msgid ""
"to maintain active objects up to this distance in the direction the\n"
"player is looking. (This can avoid mobs suddenly disappearing from view)"
msgstr ""
+"Onde ata os clientes receben información dos obxectos, indicado en bloques "
+"(16 nós).\n"
+"\n"
+"Establecer isto máis grande que active_block_range tamén fará que o "
+"servidor\n"
+"manteña os obxectos activos ata esta distancia na dirección que o\n"
+"xogador está mirando. (Isto pode evitar que os enemigos desaparezan "
+"repentinamente)"
#: src/settings_translation_file.cpp
msgid "Full screen"
-msgstr ""
+msgstr "Pantalla completa"
#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
-msgstr ""
+msgstr "Modo de pantalla completa."
#: src/settings_translation_file.cpp
msgid "GUI scaling"
-msgstr ""
+msgstr "Escala de IGU"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter"
-msgstr ""
+msgstr "Filtro de escala de IGU"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter txr2img"
+msgstr "Filtro de escala de IGU \"txr2img\""
+
+#: src/settings_translation_file.cpp
+msgid "GUIs"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Global callbacks"
+#, fuzzy
+msgid "Gamepads"
+msgstr "Xogos"
+
+#: src/settings_translation_file.cpp
+msgid "General"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Chamadas de retorno globais"
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
+"Atributos globais do xerador de mundos.\n"
+"En Mapgen v6 o marcador \"decoracións\" controla todas as decoracións "
+"excepto as árbores\n"
+"e herba da selva, en todos os demais xeradores de mundos este marcador "
+"controla todas as decoracións."
#: src/settings_translation_file.cpp
msgid ""
"Gradient of light curve at maximum light level.\n"
"Controls the contrast of the highest light levels."
msgstr ""
+"Gradiente da curva de luz no nivel máximo de luz.\n"
+"Controla o contraste dos niveis de luz máis altos."
#: src/settings_translation_file.cpp
msgid ""
"Gradient of light curve at minimum light level.\n"
"Controls the contrast of the lowest light levels."
msgstr ""
+"Gradiente da curva de luz no nivel mímino de luz.\n"
+"Controla o contraste dos niveis de luz máis baixos."
#: src/settings_translation_file.cpp
msgid "Graphics"
-msgstr ""
+msgstr "Gráficos"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Gráficos"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Gráficos"
#: src/settings_translation_file.cpp
msgid "Gravity"
-msgstr ""
+msgstr "Gravidade"
#: src/settings_translation_file.cpp
msgid "Ground level"
-msgstr ""
+msgstr "Nivel do chán"
#: src/settings_translation_file.cpp
msgid "Ground noise"
-msgstr ""
+msgstr "Ruído do chán"
#: src/settings_translation_file.cpp
msgid "HTTP mods"
-msgstr ""
+msgstr "Mods HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Escala de IGU"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
-msgstr ""
+msgstr "Alt. HUD"
#: src/settings_translation_file.cpp
msgid ""
@@ -3527,6 +3968,11 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Manexo de chamadas obsoletas da API de Lua:\n"
+"- none: non rexistrar chamadas obsoletas\n"
+"- log: imitar e rexistrar o rexistro de chamadas obsoletas (por defecto).\n"
+"- error: abortar ao usar a chamada obsoleta (suxerido para desenvolvedores "
+"do mod)."
#: src/settings_translation_file.cpp
msgid ""
@@ -3536,213 +3982,226 @@ msgid ""
"call).\n"
"* Instrument the sampler being used to update the statistics."
msgstr ""
+"Ter o propio instrumento de análise do mundor:\n"
+"* Instrumentar unha función baleira.\n"
+"Isto estima a sobrecarga que a instrumentación está engadindo (chamada de "
+"función +1).\n"
+"* Instrumentar a mostraxe que se utiliza para actualizar as estatísticas."
#: src/settings_translation_file.cpp
msgid "Heat blend noise"
-msgstr ""
+msgstr "Ruído de mestura de calor"
#: src/settings_translation_file.cpp
msgid "Heat noise"
-msgstr ""
+msgstr "Ruído da calor"
#: src/settings_translation_file.cpp
msgid ""
"Height component of the initial window size. Ignored in fullscreen mode."
msgstr ""
+"Componente de altura do tamaño inicial xanela inicial. Ignórase en pantalla "
+"completa."
#: src/settings_translation_file.cpp
msgid "Height noise"
-msgstr ""
+msgstr "Altura do ruído"
#: src/settings_translation_file.cpp
msgid "Height select noise"
-msgstr ""
+msgstr "Altura do ruído seleccionado"
#: src/settings_translation_file.cpp
msgid "Hill steepness"
-msgstr ""
+msgstr "Desnivel do outeiro"
#: src/settings_translation_file.cpp
msgid "Hill threshold"
-msgstr ""
+msgstr "Límites do outeiro"
#: src/settings_translation_file.cpp
msgid "Hilliness1 noise"
-msgstr ""
+msgstr "Sonido de outeiros 1"
#: src/settings_translation_file.cpp
msgid "Hilliness2 noise"
-msgstr ""
+msgstr "Sonido de outeiros 2"
#: src/settings_translation_file.cpp
msgid "Hilliness3 noise"
-msgstr ""
+msgstr "Sonido de outeiros 3"
#: src/settings_translation_file.cpp
msgid "Hilliness4 noise"
-msgstr ""
+msgstr "Sonido de outeiros 4"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Páxina web do servidor. Mostrarase na lista de servidores."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal acceleration in air when jumping or falling,\n"
"in nodes per second per second."
msgstr ""
+"Aceleración horizontal no aire ao saltar ou caer,\n"
+"en nodos por segundo."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration in fast mode,\n"
"in nodes per second per second."
msgstr ""
+"Aceleración horizontal e vertical en modo rápido,\n"
+"en nodos por segundo."
#: src/settings_translation_file.cpp
msgid ""
"Horizontal and vertical acceleration on ground or when climbing,\n"
"in nodes per second per second."
msgstr ""
+"Aceleración horizontal e vertical no chán ou ao escalar,\n"
+"en nodos por segundo."
#: src/settings_translation_file.cpp
msgid "Hotbar next key"
-msgstr ""
+msgstr "Tecla de próximo obxecto na barra principal"
#: src/settings_translation_file.cpp
msgid "Hotbar previous key"
-msgstr ""
+msgstr "Tecla de obxecto anterior na barra principal"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 1 key"
-msgstr ""
+msgstr "Tecla de rañura 1"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 10 key"
-msgstr ""
+msgstr "Tecla de rañura 10"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 11 key"
-msgstr ""
+msgstr "Tecla de rañura 11"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 12 key"
-msgstr ""
+msgstr "Tecla de rañura 12"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 13 key"
-msgstr ""
+msgstr "Tecla de rañura 13"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 14 key"
-msgstr ""
+msgstr "Tecla de rañura 14"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 15 key"
-msgstr ""
+msgstr "Tecla de rañura 15"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 16 key"
-msgstr ""
+msgstr "Tecla de rañura 16"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 17 key"
-msgstr ""
+msgstr "Tecla de rañura 17"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 18 key"
-msgstr ""
+msgstr "Tecla de rañura 18"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 19 key"
-msgstr ""
+msgstr "Tecla de rañura 19"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 2 key"
-msgstr ""
+msgstr "Tecla de rañura 2"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 20 key"
-msgstr ""
+msgstr "Tecla de rañura 20"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 21 key"
-msgstr ""
+msgstr "Tecla de rañura 21"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 22 key"
-msgstr ""
+msgstr "Tecla de rañura 22"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 23 key"
-msgstr ""
+msgstr "Tecla de rañura 23"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 24 key"
-msgstr ""
+msgstr "Tecla de rañura 24"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 25 key"
-msgstr ""
+msgstr "Tecla de rañura 25"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 26 key"
-msgstr ""
+msgstr "Tecla de rañura 26"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 27 key"
-msgstr ""
+msgstr "Tecla de rañura 27"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 28 key"
-msgstr ""
+msgstr "Tecla de rañura 28"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 29 key"
-msgstr ""
+msgstr "Tecla de rañura 29"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 3 key"
-msgstr ""
+msgstr "Tecla de rañura 3"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 30 key"
-msgstr ""
+msgstr "Tecla de rañura 30"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 31 key"
-msgstr ""
+msgstr "Tecla de rañura 31"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 32 key"
-msgstr ""
+msgstr "Tecla de rañura 32"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 4 key"
-msgstr ""
+msgstr "Tecla de rañura 4"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 5 key"
-msgstr ""
+msgstr "Tecla de rañura 5"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 6 key"
-msgstr ""
+msgstr "Tecla de rañura 6"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 7 key"
-msgstr ""
+msgstr "Tecla de rañura 7"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 8 key"
-msgstr ""
+msgstr "Tecla de rañura 8"
#: src/settings_translation_file.cpp
msgid "Hotbar slot 9 key"
-msgstr ""
+msgstr "Tecla de rañura 9"
#: src/settings_translation_file.cpp
msgid "How deep to make rivers."
-msgstr ""
+msgstr "Profundidade dos ríos."
#: src/settings_translation_file.cpp
msgid ""
@@ -3750,48 +4209,67 @@ msgid ""
"If negative, liquid waves will move backwards.\n"
"Requires waving liquids to be enabled."
msgstr ""
+"Velocidade das ondas dos líquidos. Máis alto = máis rápido.\n"
+"Se o valor é negativo, as ondas moveranse cara atrás.\n"
+"É necesario activar a ondulación dos líquidos."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"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."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Diminúe isto para aumentar a resistencia do líquido ao movemento."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
-msgstr ""
+msgstr "Largura dos ríos."
#: src/settings_translation_file.cpp
msgid "Humidity blend noise"
-msgstr ""
+msgstr "Ruído de mestura da humidade"
#: src/settings_translation_file.cpp
msgid "Humidity noise"
-msgstr ""
+msgstr "Ruído da humidade"
#: src/settings_translation_file.cpp
msgid "Humidity variation for biomes."
-msgstr ""
+msgstr "Variación da humidade dos biomas."
#: src/settings_translation_file.cpp
msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "Servidor IPv6"
#: src/settings_translation_file.cpp
msgid ""
"If FPS would go higher than this, limit it by sleeping\n"
"to not waste CPU power for no benefit."
msgstr ""
+"Se os FPS fosen máis altos que isto, limítaos suspendendo o programa\n"
+"para non gastar a potencia da CPU innecesariamente."
#: src/settings_translation_file.cpp
msgid ""
"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
+"Se está desactivado, a tecla \"Aux1\" usarase para voar rápido se o modo voo "
+"e rápido están\n"
+"ativados."
#: src/settings_translation_file.cpp
msgid ""
@@ -3801,6 +4279,12 @@ msgid ""
"invisible\n"
"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"
+"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."
#: src/settings_translation_file.cpp
msgid ""
@@ -3808,6 +4292,9 @@ msgid ""
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
+"Se se activa xunto co modo voar, o xogador poderá voar a través de nós "
+"sólidos.\n"
+"Isto require o permiso \"noclip\" no servidor."
#: src/settings_translation_file.cpp
msgid ""
@@ -3815,32 +4302,58 @@ msgid ""
"and\n"
"descending."
msgstr ""
+"Se está activada, a tecla \"Aux1\" utilízase en lugar da tecla \"Agacharse\" "
+"para baixar e\n"
+"descender."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Activar confirmación de rexistro ao se conectar ao servidor\n"
+"Se está desactivado, rexistrarase unha nova conta automáticamente."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
+"Se está activado, as accións rexístranse para logo podelas desfacer.\n"
+"Esta opción só funciona cando se inicia o servidor."
#: src/settings_translation_file.cpp
msgid "If enabled, disable cheat prevention in multiplayer."
msgstr ""
+"Se está activado, o sistema de prevención de trampas no modo de xogo en liña "
+"desactivarase."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, invalid world data won't cause the server to shut down.\n"
"Only enable this if you know what you are doing."
msgstr ""
+"Se está activado, os datos non válidos do mundo non farán que o servidor "
+"peche.\n"
+"Actívao só se sabes o que fas."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, makes move directions relative to the player's pitch when flying "
"or swimming."
msgstr ""
+"Se está activado, fai direccións de movemento relativas á rotación vertical "
+"do xogador cando voa ou nada."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, 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."
#: src/settings_translation_file.cpp
msgid ""
@@ -3848,6 +4361,9 @@ msgid ""
"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."
#: src/settings_translation_file.cpp
msgid ""
@@ -3855,12 +4371,17 @@ msgid ""
"limited\n"
"to this distance from the player to the node."
msgstr ""
+"Se a restrición CSM para o intervalo de nodos está activada, as chamadas "
+"get_node están limitadas\n"
+"a esta distancia do xogador ao nó."
#: src/settings_translation_file.cpp
msgid ""
"If the execution of a chat command takes longer than this specified time in\n"
"seconds, add the time information to the chat command message"
msgstr ""
+"Se a execución dun comando de chat leva máis tempo do que o especificado en\n"
+"segundos, engade a información da hora á mensaxe de comando de chat"
#: src/settings_translation_file.cpp
msgid ""
@@ -3869,112 +4390,121 @@ msgid ""
"deleting an older debug.txt.1 if it exists.\n"
"debug.txt is only moved if this setting is positive."
msgstr ""
+"Se o tamaño do ficheiro de debug.txt supera o número de megabytes "
+"especificado en\n"
+"esta configuración cando se abre, o ficheiro móvese a debug.txt.1,\n"
+"eliminando un debug.txt.1 máis antigo se existe.\n"
+"debug.txt só se move se esta configuración ten un valor positivo."
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
msgstr ""
+"Se isto se establece, os xogadores sempre (re) aparecerán na posición "
+"indicada."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
+msgstr "Ignorar erros do mundo"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Opacidade do fondo da consola do chat no xogo (entre 0 e 255)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
-msgstr ""
+msgstr "Cor do fondo da consola do chat no xogo (R, G, B)."
#: src/settings_translation_file.cpp
msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)."
-msgstr ""
+msgstr "Altura da consola do chat no xogo, entre 0,1 (10 %) e 1,0 (100 %)."
#: src/settings_translation_file.cpp
msgid "Inc. volume key"
-msgstr ""
+msgstr "Tecla para aumentar o volume"
#: src/settings_translation_file.cpp
msgid "Initial vertical speed when jumping, in nodes per second."
-msgstr ""
+msgstr "Velocidade vertical ao saltar, en nodos por segundo."
#: src/settings_translation_file.cpp
msgid ""
"Instrument builtin.\n"
"This is usually only needed by core/builtin contributors"
msgstr ""
+"Instrumento aplicado.\n"
+"Isto case sempre só o necesitan os contribuidores principais"
#: src/settings_translation_file.cpp
msgid "Instrument chat commands on registration."
-msgstr ""
+msgstr "Instrumento de comandos do chat no rexistro."
#: src/settings_translation_file.cpp
msgid ""
"Instrument global callback functions on registration.\n"
"(anything you pass to a minetest.register_*() function)"
msgstr ""
+"Instrumentación das funcións de chamadas de retorno globais no rexistro.\n"
+"(todo o que pasee a unha función minetest.register_*())"
#: src/settings_translation_file.cpp
msgid ""
"Instrument the action function of Active Block Modifiers on registration."
msgstr ""
+"Instrumenta a función de acción dos modificadores de bloque activos no "
+"rexistro."
#: src/settings_translation_file.cpp
msgid ""
"Instrument the action function of Loading Block Modifiers on registration."
msgstr ""
+"Instrumenta e función de acción de carga de modificadores de bloque no "
+"rexistro."
#: src/settings_translation_file.cpp
msgid "Instrument the methods of entities on registration."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
+msgstr "Instrumenta os métodos das entidades durante o rexistro."
#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
+"Intervalo para gardado de cambios importantes no mundo, indicado en segundos."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
-msgstr ""
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
+msgstr "Intervalo de envío da hora do dia aos clientes."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
-msgstr ""
+msgstr "Animacións dos obxectos do inventario"
#: src/settings_translation_file.cpp
msgid "Inventory key"
-msgstr ""
+msgstr "Tecla de inventario"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
-msgstr ""
+msgstr "Inverter rato"
#: src/settings_translation_file.cpp
msgid "Invert vertical mouse movement."
-msgstr ""
+msgstr "Inverter o movemento vertical do rato."
#: src/settings_translation_file.cpp
msgid "Italic font path"
-msgstr ""
+msgstr "Ruta da fonte cursiva"
#: src/settings_translation_file.cpp
msgid "Italic monospace font path"
-msgstr ""
+msgstr "Ruta da fonte monoespaciada en cursiva"
#: src/settings_translation_file.cpp
msgid "Item entity TTL"
-msgstr ""
+msgstr "TTL da entidade obxecto"
#: src/settings_translation_file.cpp
msgid "Iterations"
-msgstr ""
+msgstr "Iteracións"
#: src/settings_translation_file.cpp
msgid ""
@@ -3983,26 +4513,30 @@ msgid ""
"increases processing load.\n"
"At iterations = 20 this mapgen has a similar load to mapgen V7."
msgstr ""
+"Iteracións da función recursiva.\n"
+"Aumentar isto aumenta a cantidade de pequenos detalles, pero tamén\n"
+"aumenta a carga de procesamento.\n"
+"En iteracións = 20 este xerador de mundos ten unha carga similar ao da V7."
#: src/settings_translation_file.cpp
msgid "Joystick ID"
-msgstr ""
+msgstr "ID do joystick"
#: src/settings_translation_file.cpp
msgid "Joystick button repetition interval"
-msgstr ""
+msgstr "Intervalo de repetición do botón do joystick"
#: src/settings_translation_file.cpp
msgid "Joystick dead zone"
-msgstr ""
+msgstr "Zona morta do joystick"
#: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity"
-msgstr ""
+msgstr "Sensibilidade do gatillo do joystick"
#: src/settings_translation_file.cpp
msgid "Joystick type"
-msgstr ""
+msgstr "Tipo de joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -4012,6 +4546,11 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Só conxunto de Julia.\n"
+"Compoñente W da constante hipercomplexa.\n"
+"Altera a forma do fractal.\n"
+"Non ten efecto nos fractais 3D.\n"
+"Rango de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -4020,6 +4559,10 @@ msgid ""
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
+"Só conxunto de Julia.\n"
+"Compoñente X da constante hipercomplexa.\n"
+"Altera a forma do fractal.\n"
+"Rango de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -4028,6 +4571,10 @@ msgid ""
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
+"Só conxunto de Julia.\n"
+"Compoñente Y da constante hipercomplexa.\n"
+"Altera a forma do fractal.\n"
+"Rango de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -4036,30 +4583,34 @@ msgid ""
"Alters the shape of the fractal.\n"
"Range roughly -2 to 2."
msgstr ""
+"Só conxunto de Julia.\n"
+"Compoñente Z da constante hipercomplexa.\n"
+"Altera a forma do fractal.\n"
+"Rango de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid "Julia w"
-msgstr ""
+msgstr "Julia w"
#: src/settings_translation_file.cpp
msgid "Julia x"
-msgstr ""
+msgstr "Julia x"
#: src/settings_translation_file.cpp
msgid "Julia y"
-msgstr ""
+msgstr "Julia y"
#: src/settings_translation_file.cpp
msgid "Julia z"
-msgstr ""
+msgstr "Julia z"
#: src/settings_translation_file.cpp
msgid "Jump key"
-msgstr ""
+msgstr "Tecla de salto"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
-msgstr ""
+msgstr "Velocidade de salto"
#: src/settings_translation_file.cpp
msgid ""
@@ -4067,6 +4618,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para disminuir o campo de visión.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4074,6 +4628,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para disminuir o volume.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4081,6 +4638,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para romper bloques.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4088,6 +4648,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para soltar o obxecto seleccionado.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4095,6 +4658,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para aumentar o campo de visión.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4102,6 +4668,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para aumentar o volume.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4109,6 +4678,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para saltar.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4116,6 +4688,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para moverse máis axilmente en modo rápido.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4124,6 +4699,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para mover o xogador cara atrás.\n"
+"Tamén desactivará o desprazamento automático cando estea activo.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4131,6 +4710,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para moverse cara adiante.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4138,6 +4720,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para moverse cara esquerda.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4145,6 +4730,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para moverse cara dereita.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4152,6 +4740,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para silenciar o xogo.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4159,6 +4750,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para abrir a xanela do chat e escribir comandos.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4166,6 +4760,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para abrir a xanela do chat e escribir comandos locales.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4173,6 +4770,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para abrir a xanela do chat.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4180,6 +4780,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para abrir o inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4187,6 +4790,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para colocar un obxecto.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4194,6 +4800,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 11 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4201,6 +4810,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 12 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4208,6 +4820,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 13 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4215,6 +4830,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 14 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4222,6 +4840,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 15 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4229,6 +4850,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 16 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4236,6 +4860,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 17 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4243,6 +4870,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 18 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4250,6 +4880,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 19 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4257,6 +4890,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 20 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4264,6 +4900,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 21 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4271,6 +4910,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 22 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4278,6 +4920,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 23 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4285,6 +4930,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 24 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4292,6 +4940,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 25 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4299,6 +4950,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 26 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4306,6 +4960,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 27 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4313,6 +4970,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 28 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4320,6 +4980,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 29 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4327,6 +4990,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 30 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4334,6 +5000,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 31 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4341,6 +5010,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 32 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4348,6 +5020,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 8 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4355,6 +5030,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 5 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4362,6 +5040,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 1 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4369,6 +5050,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 4 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4376,6 +5060,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar o seguinte obxecto na barra de acceso directo do "
+"inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4383,6 +5071,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 9 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4390,6 +5081,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar o obxecto anterior na barra de acceso directo do "
+"inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4397,6 +5092,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 2 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4404,6 +5102,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 7 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4411,6 +5112,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 6 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4418,6 +5122,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 10 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4425,6 +5132,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para seleccionar a rañura 3 do inventario.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4434,6 +5144,11 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para agacharse.\n"
+"Tamén serve para descender dentro da auga se aux1_descends está "
+"desactivado.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4441,6 +5156,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para cambiar entre a cámara en primeira e terceira persoa.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4448,6 +5166,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para facer capturas.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4455,6 +5176,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar avance automático.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4462,6 +5186,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar modo cinemático.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4469,6 +5196,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar visualización do minimapa.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4476,6 +5206,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar modo rápido.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4483,6 +5216,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar voo.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4490,6 +5226,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar modo espectador.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4497,6 +5236,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar modo de rotación horizontal.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4504,6 +5246,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar actualización da cámara. Usado só para o "
+"desenvolvemento.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4511,6 +5257,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar chat.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4518,6 +5267,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar visualización de información de depuración.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4525,6 +5277,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar a visualización da néboa.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4532,6 +5287,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar visualización do HUD.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4539,6 +5297,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar visualización do chat de consola largo.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4546,6 +5307,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar a análise do mundo. Emprégase para o desenvolvemento.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4553,6 +5317,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para alternar campo de visión ilimitado.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -4560,46 +5327,53 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para facer zoom cando sexa posible.\n"
+"Ver http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-msgid "Kick players who sent more than X messages per 10 seconds."
+msgid "Keyboard and Mouse"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Kick players who sent more than X messages per 10 seconds."
+msgstr "Expulsar xogadores que enviaron máis de X mensaxes cada 10 segundos."
+
+#: src/settings_translation_file.cpp
msgid "Lake steepness"
-msgstr ""
+msgstr "Inclinación dos lagos"
#: src/settings_translation_file.cpp
msgid "Lake threshold"
-msgstr ""
+msgstr "Límite de lagos no mapa"
#: src/settings_translation_file.cpp
msgid "Language"
-msgstr ""
+msgstr "Idiomas"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr ""
+msgstr "Profundidade das covas grandes"
#: src/settings_translation_file.cpp
msgid "Large cave maximum number"
-msgstr ""
+msgstr "Número máximo de covas grandes"
#: src/settings_translation_file.cpp
msgid "Large cave minimum number"
-msgstr ""
+msgstr "Número mínimo de covas grandes"
#: src/settings_translation_file.cpp
msgid "Large cave proportion flooded"
-msgstr ""
+msgstr "Proporción de covas grandes inundadas"
#: src/settings_translation_file.cpp
msgid "Large chat console key"
-msgstr ""
+msgstr "Tecla da consola do chat grande"
#: src/settings_translation_file.cpp
msgid "Leaves style"
-msgstr ""
+msgstr "Apariencia das follas"
#: src/settings_translation_file.cpp
msgid ""
@@ -4608,37 +5382,55 @@ msgid ""
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"Apariencia das follas:\n"
+"- Detalladas: todas as caras son visibles\n"
+"- Simples: só vense as caras externas, se se utilizan special_tiles "
+"definidos\n"
+"- Opacas: desactiva a transparencia"
#: src/settings_translation_file.cpp
msgid "Left key"
-msgstr ""
+msgstr "Tecla esquerda"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
+"Duración do tick do servidor e o intervalo no que os obxetos actualízanse "
+"polo xeral\n"
+"na rede."
#: src/settings_translation_file.cpp
msgid ""
"Length of liquid waves.\n"
"Requires waving liquids to be enabled."
msgstr ""
+"Lonxitude das ondas de líquidos.\n"
+"É necesario que a ondulación dos líquidos estea activa."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
-msgstr ""
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
+msgstr "Periodo de tempo entre os ciclos de execución dos ABM"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
+msgstr "Periodo de tempo entre os ciclos de execución de NodeTimer"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
-msgstr ""
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
+msgstr "Periodo de tempo entre os ciclos de xestión de bloques activos"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -4647,32 +5439,46 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
+"Nivel de rexistro que se gardará en debug.txt:\n"
+"- <nothing> (sen rexistro)\n"
+"- none (mensaxes sen nivel)\n"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose"
#: src/settings_translation_file.cpp
msgid "Light curve boost"
-msgstr ""
+msgstr "Impulso da curva da luz"
#: src/settings_translation_file.cpp
msgid "Light curve boost center"
-msgstr ""
+msgstr "Centro de impulso da curva de luz"
#: src/settings_translation_file.cpp
msgid "Light curve boost spread"
-msgstr ""
+msgstr "Dispersión de impulso de curva de luz"
#: src/settings_translation_file.cpp
msgid "Light curve gamma"
-msgstr ""
+msgstr "Gamma da curva de luz"
#: src/settings_translation_file.cpp
msgid "Light curve high gradient"
-msgstr ""
+msgstr "Gradiente alto da curva de luz"
#: src/settings_translation_file.cpp
msgid "Light curve low gradient"
-msgstr ""
+msgstr "Gradiente baixo da curva de luz"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Iluminación suave"
#: src/settings_translation_file.cpp
msgid ""
@@ -4680,6 +5486,9 @@ msgid ""
"Only mapchunks completely within the mapgen limit are generated.\n"
"Value is stored per-world."
msgstr ""
+"Límite de xeración de mundos, en nós, nas 6 direccións desde (0, 0, 0).\n"
+"Só se xeran fragmentos do mundo dentro do límite.\n"
+"O valor almacénase por mundo."
#: src/settings_translation_file.cpp
msgid ""
@@ -4689,38 +5498,44 @@ msgid ""
"- Downloads performed by main menu (e.g. mod manager).\n"
"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"
+"- 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."
#: src/settings_translation_file.cpp
msgid "Liquid fluidity"
-msgstr ""
+msgstr "Fluidez dos líquidos"
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Suavizado da fluidez dos líquidos"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
-msgstr ""
+msgstr "Límite de procesamento de líquidos"
#: src/settings_translation_file.cpp
msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Tempo para eliminar filas de líquidos"
#: src/settings_translation_file.cpp
msgid "Liquid sinking"
-msgstr ""
+msgstr "Afundimento en líquidos"
#: src/settings_translation_file.cpp
msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Intervalo de actualización de líquidos en segundos."
#: src/settings_translation_file.cpp
msgid "Liquid update tick"
-msgstr ""
+msgstr "Periodo de actualización dos líquidos"
#: src/settings_translation_file.cpp
msgid "Load the game profiler"
-msgstr ""
+msgstr "Cargar a análise do mundo"
#: src/settings_translation_file.cpp
msgid ""
@@ -4728,53 +5543,61 @@ msgid ""
"Provides a /profiler command to access the compiled profile.\n"
"Useful for mod developers and server operators."
msgstr ""
+"Carga a análise do mundo para recoller datos.\n"
+"Ofrece un comando /profiler para acceder ao perfil compilado.\n"
+"É útil para desenvolvedores de mods e operadores de servidores."
#: src/settings_translation_file.cpp
msgid "Loading Block Modifiers"
-msgstr ""
+msgstr "Carga de modiificadores de bloques"
#: src/settings_translation_file.cpp
msgid "Lower Y limit of dungeons."
-msgstr ""
+msgstr "Límite inferior Y de calabozos."
#: src/settings_translation_file.cpp
msgid "Lower Y limit of floatlands."
-msgstr ""
+msgstr "Límite inferior Y de terreos flotantes."
#: src/settings_translation_file.cpp
msgid "Main menu script"
-msgstr ""
+msgstr "Script do menú principal"
#: src/settings_translation_file.cpp
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
+"Facer que as cores da néboa e do ceo dependan do día (amencer/posta de sol) "
+"e da dirección da vista."
#: src/settings_translation_file.cpp
msgid "Makes all liquids opaque"
-msgstr ""
+msgstr "Fai que todos os líquidos sexan opacos"
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Disk Storage"
-msgstr ""
+msgstr "Nivel de compresión do mapa para almacenamiento de disco"
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Network Transfer"
-msgstr ""
+msgstr "Nivel de compresión do mapa para tranferencias pola rede"
#: src/settings_translation_file.cpp
msgid "Map directory"
-msgstr ""
+msgstr "Directorio de mapas"
#: src/settings_translation_file.cpp
msgid "Map generation attributes specific to Mapgen Carpathian."
msgstr ""
+"Atributos de xeración de mundos específicos do xerador de mundos carpatianos."
#: src/settings_translation_file.cpp
msgid ""
"Map generation attributes specific to Mapgen Flat.\n"
"Occasional lakes and hills can be added to the flat world."
msgstr ""
+"Atributos de xeración de mapas específicos de mundos planos.\n"
+"Os lagos e outeiros pódense engadir ao mundo plano ás veces."
#: src/settings_translation_file.cpp
msgid ""
@@ -4782,6 +5605,9 @@ msgid ""
"'terrain' enables the generation of non-fractal terrain:\n"
"ocean, islands and underground."
msgstr ""
+"Atributos de xeración de mundos específicos de mundos planos.\n"
+"'terreo' permite a xeración de terreos non fractales:\n"
+"océanos, illas e subterráneos."
#: src/settings_translation_file.cpp
msgid ""
@@ -4792,10 +5618,17 @@ msgid ""
"to become shallower and occasionally dry.\n"
"'altitude_dry': Reduces humidity with altitude."
msgstr ""
+"Atributos de xeración de mapas específicos de xerador de mundos con vales.\n"
+"'altitude_chill': reduce a calor coa altitude.\n"
+"'humid_rivers': aumenta a humidade arredor dos ríos.\n"
+"'vary_river_depth': se está activado, a baixa humidade e a alta calor fan os "
+"ríos\n"
+"máis profundos e ocasionalmente secos.\n"
+"'altitude_dry': reduce a humidade coa altitude."
#: src/settings_translation_file.cpp
msgid "Map generation attributes specific to Mapgen v5."
-msgstr ""
+msgstr "Atributos de xeración de mundos específicos do xerador de mundos v5."
#: src/settings_translation_file.cpp
msgid ""
@@ -4804,6 +5637,11 @@ msgid ""
"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n"
"the 'jungles' flag is ignored."
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 "
+"automaticamente e\n"
+"o marcador \"selvas\" é ignorado."
#: src/settings_translation_file.cpp
msgid ""
@@ -4812,152 +5650,162 @@ msgid ""
"'floatlands': Floating land masses in the atmosphere.\n"
"'caverns': Giant caves deep underground."
msgstr ""
+"Atributos de xeración de mapas específicos do xerador de mundos v7.\n"
+"'cristas': ríos.\n"
+"'floatlands': masas terrestres flotantes na atmosfera.\n"
+"'cavernas': covas xigantes no subsolo."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
-msgstr ""
+msgstr "Límite de xeración de mapas"
#: src/settings_translation_file.cpp
msgid "Map save interval"
-msgstr ""
+msgstr "Intervalo de gardado de mapa"
#: src/settings_translation_file.cpp
msgid "Map shadows update frames"
-msgstr ""
+msgstr "Tempo de actualización das sombras do mapa"
#: src/settings_translation_file.cpp
msgid "Mapblock limit"
-msgstr ""
+msgstr "Límite do mapa de bloques"
#: src/settings_translation_file.cpp
msgid "Mapblock mesh generation delay"
-msgstr ""
+msgstr "Retraso da xeración da malla do mapa de bloques"
#: src/settings_translation_file.cpp
msgid "Mapblock mesh generator's MapBlock cache size in MB"
msgstr ""
+"Tamaño da caché do mapa de bloques do xerador da malla do mapa de bloques en "
+"MB"
#: src/settings_translation_file.cpp
msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Tempo límite de eliminación do mapa de bloques"
#: src/settings_translation_file.cpp
msgid "Mapgen Carpathian"
-msgstr ""
+msgstr "Xerador de mundos carpatianos"
#: src/settings_translation_file.cpp
msgid "Mapgen Carpathian specific flags"
-msgstr ""
+msgstr "Parámetros específicos de mundos carpatianos"
#: src/settings_translation_file.cpp
msgid "Mapgen Flat"
-msgstr ""
+msgstr "Xerador de mundos planos"
#: src/settings_translation_file.cpp
msgid "Mapgen Flat specific flags"
-msgstr ""
+msgstr "Parámetros específicos de mundos planos"
#: src/settings_translation_file.cpp
msgid "Mapgen Fractal"
-msgstr ""
+msgstr "Xerador de mundos fractais"
#: src/settings_translation_file.cpp
msgid "Mapgen Fractal specific flags"
-msgstr ""
+msgstr "Parámetros específicos de mundos fractais"
#: src/settings_translation_file.cpp
msgid "Mapgen V5"
-msgstr ""
+msgstr "Xerador de mundos v5"
#: src/settings_translation_file.cpp
msgid "Mapgen V5 specific flags"
-msgstr ""
+msgstr "Parámetros específicos do xerador de mundos v5"
#: src/settings_translation_file.cpp
msgid "Mapgen V6"
-msgstr ""
+msgstr "Xerador de mundos v6"
#: src/settings_translation_file.cpp
msgid "Mapgen V6 specific flags"
-msgstr ""
+msgstr "Parámetros específicos do xerador de mundos v6"
#: src/settings_translation_file.cpp
msgid "Mapgen V7"
-msgstr ""
+msgstr "Xerador de mundos v7"
#: src/settings_translation_file.cpp
msgid "Mapgen V7 specific flags"
-msgstr ""
+msgstr "Parámetros específicos do xerador de mundos v7"
#: src/settings_translation_file.cpp
msgid "Mapgen Valleys"
-msgstr ""
+msgstr "Xerador de mundos con vales"
#: src/settings_translation_file.cpp
msgid "Mapgen Valleys specific flags"
-msgstr ""
+msgstr "Parámetros espcíficos o xerador de mundos con vales"
#: src/settings_translation_file.cpp
msgid "Mapgen debug"
-msgstr ""
+msgstr "Depuración do xerador de mundos"
#: src/settings_translation_file.cpp
msgid "Mapgen name"
-msgstr ""
+msgstr "Nome do xerador de mundos"
#: src/settings_translation_file.cpp
msgid "Max block generate distance"
-msgstr ""
+msgstr "Distancia máxima de xeración de bloques"
#: src/settings_translation_file.cpp
msgid "Max block send distance"
-msgstr ""
+msgstr "Distancia máxima de envío de bloques"
#: src/settings_translation_file.cpp
msgid "Max liquids processed per step."
-msgstr ""
+msgstr "Máximo de líquidos procesados por paso."
#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
-msgstr ""
+msgstr "Max. clearobjects bloques extra"
#: src/settings_translation_file.cpp
msgid "Max. packets per iteration"
-msgstr ""
+msgstr "Máx. paquetes por iteración"
#: src/settings_translation_file.cpp
msgid "Maximum FPS"
-msgstr ""
+msgstr "FPS máximos"
#: src/settings_translation_file.cpp
msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr ""
+"FPS máximos cando a xanela non está enfocada ou cando o xogo está en pausa."
#: src/settings_translation_file.cpp
msgid "Maximum distance to render shadows."
-msgstr ""
+msgstr "Distancia máxima para renderizar as sombras."
#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
-msgstr ""
+msgstr "Máximo de bloques cargados de maneira forzada"
#: src/settings_translation_file.cpp
msgid "Maximum hotbar width"
-msgstr ""
+msgstr "Largura máxima da barra do inventario"
#: src/settings_translation_file.cpp
msgid "Maximum limit of random number of large caves per mapchunk."
-msgstr ""
+msgstr "Límite máximo de covas grandes aleatorias por chunk."
#: src/settings_translation_file.cpp
msgid "Maximum limit of random number of small caves per mapchunk."
-msgstr ""
+msgstr "Límite máximo de covas pequenas aleatorias por chunk."
#: src/settings_translation_file.cpp
msgid ""
"Maximum liquid resistance. Controls deceleration when entering liquid at\n"
"high speed."
msgstr ""
+"Resistencia máxma a líquidos. Controla a desaceleración ao entrar en "
+"líquidos a\n"
+"alta velocidade."
#: src/settings_translation_file.cpp
msgid ""
@@ -4965,22 +5813,30 @@ msgid ""
"The maximum total count is calculated dynamically:\n"
"max_total = ceil((#clients + max_users) * per_client / 4)"
msgstr ""
+"Número máximo de bloques que se envían simultaneamente por cliente.\n"
+"O reconto total máximo calcúlase de forma dinámica:\n"
+"max_total = ceil((#clientes + max_users) * por_cliente / 4)"
#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
-msgstr ""
+msgstr "Número máximo de bloques que se poden poñer en cola para a súa carga."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of blocks to be queued that are to be generated.\n"
"This limit is enforced per player."
msgstr ""
+"Número máximo de bloques a poñer en cola que se van xerar.\n"
+"Este límite aplícase por xogador."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of blocks to be queued that are to be loaded from file.\n"
"This limit is enforced per player."
msgstr ""
+"Número máximo de bloques que se deben poñer en cola que se van cargar desde "
+"o ficheiro.\n"
+"Este límite aplícase por xogador."
#: src/settings_translation_file.cpp
msgid ""
@@ -4988,16 +5844,21 @@ msgid ""
"be queued.\n"
"This should be lower than curl_parallel_limit."
msgstr ""
+"Número máximo de descargas simultáneas. As descargas que superen este límite "
+"poñeranse en cola.\n"
+"Debería ser inferior a curl_parallel_limit."
#: src/settings_translation_file.cpp
msgid "Maximum number of forceloaded mapblocks."
-msgstr ""
+msgstr "Número máximo de bloques de mapa cargados de maneira forzada."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of mapblocks for client to be kept in memory.\n"
"Set to -1 for unlimited amount."
msgstr ""
+"Número máximo de bloques de mapas para que o cliente os manteña na memoria.\n"
+"Establecese en -1 para cantidade ilimitada."
#: src/settings_translation_file.cpp
msgid ""
@@ -5005,172 +5866,197 @@ msgid ""
"try reducing it, but don't reduce it to a number below double of targeted\n"
"client number."
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."
#: src/settings_translation_file.cpp
msgid "Maximum number of players that can be connected simultaneously."
-msgstr ""
+msgstr "Número máximo de xogadores que se poden conectar simultaneamente."
#: src/settings_translation_file.cpp
msgid "Maximum number of recent chat messages to show"
-msgstr ""
+msgstr "Número máximo de mensaxes de chat recientes para mostrar"
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
-msgstr ""
+msgstr "Número máximo de obxectos almacenados estáticamente nun bloque."
#: src/settings_translation_file.cpp
msgid "Maximum objects per block"
-msgstr ""
+msgstr "Obxectos máximos por bloque"
#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
+"Proporción máxima da xanela actual que se utilizará para a barra do "
+"inventario.\n"
+"Útil se hai algo para mostrar á dereita ou á esquerda da barra."
#: src/settings_translation_file.cpp
msgid "Maximum simultaneous block sends per client"
-msgstr ""
+msgstr "Número máximo de envíos de bloques simultáneos por cliente"
#: src/settings_translation_file.cpp
msgid "Maximum size of the out chat queue"
-msgstr ""
+msgstr "Tamaño máximo da cola de saída do chat"
#: src/settings_translation_file.cpp
msgid ""
"Maximum size of the out 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."
#: src/settings_translation_file.cpp
msgid ""
"Maximum time a file download (e.g. a mod download) may take, stated in "
"milliseconds."
msgstr ""
+"Tempo máximo que pode tardar unha descarga dun ficheiro (por exemplo, un "
+"mod), expresado en milisegundos."
#: src/settings_translation_file.cpp
msgid ""
"Maximum time an interactive request (e.g. server list fetch) may take, "
"stated in milliseconds."
msgstr ""
+"Tempo máximo que pode tardar unha solicitude interactiva (por exemplo, a "
+"recuperación da lista de servidores), expresado en milisegundos."
#: src/settings_translation_file.cpp
msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
+msgstr "Usuarios máximos"
#: src/settings_translation_file.cpp
msgid "Mesh cache"
-msgstr ""
+msgstr "Caché de malla"
#: src/settings_translation_file.cpp
msgid "Message of the day"
-msgstr ""
+msgstr "Mensaxe do día"
#: src/settings_translation_file.cpp
msgid "Message of the day displayed to players connecting."
-msgstr ""
+msgstr "Mensaxe do día mostrada aos xogadores que se conectan."
#: src/settings_translation_file.cpp
msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Método usado para resaltar o obxecto seleccionado."
#: src/settings_translation_file.cpp
msgid "Minimal level of logging to be written to chat."
-msgstr ""
+msgstr "Nivel mínimo de rexistro para escribir no chat."
#: src/settings_translation_file.cpp
msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap key"
-msgstr ""
+msgstr "Tecla do minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap scan height"
-msgstr ""
+msgstr "Altura de escaneo do minimapa"
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of large caves per mapchunk."
-msgstr ""
+msgstr "Ruído 3D que determina a cantidade de calabozos por chunk."
#: src/settings_translation_file.cpp
msgid "Minimum limit of random number of small caves per mapchunk."
-msgstr ""
+msgstr "Límite mínimo do número aleatorio de covas pequenas por chunk."
#: src/settings_translation_file.cpp
msgid "Minimum texture size"
-msgstr ""
+msgstr "Tamaño mínimo de textura"
#: src/settings_translation_file.cpp
msgid "Mipmapping"
+msgstr "Mapeado do relieve"
+
+#: src/settings_translation_file.cpp
+msgid "Misc"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Análise do mundo"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Seguridade"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
-msgstr ""
+msgstr "Canais de mod"
#: src/settings_translation_file.cpp
msgid "Modifies the size of the HUD elements."
-msgstr ""
+msgstr "Modifica o tamaño dos elementos do HUD."
#: src/settings_translation_file.cpp
msgid "Monospace font path"
-msgstr ""
+msgstr "Ruta da fonte monoespaciada"
#: src/settings_translation_file.cpp
msgid "Monospace font size"
-msgstr ""
+msgstr "Tamaño da fonte monoespaciada"
#: src/settings_translation_file.cpp
msgid "Monospace font size divisible by"
-msgstr ""
+msgstr "Tamaño da fonte monoespaciada divisible por"
#: src/settings_translation_file.cpp
msgid "Mountain height noise"
-msgstr ""
+msgstr "Ruído da altura das montañas"
#: src/settings_translation_file.cpp
msgid "Mountain noise"
-msgstr ""
+msgstr "Ruído das montañas"
#: src/settings_translation_file.cpp
msgid "Mountain variation noise"
-msgstr ""
+msgstr "Variación do ruído das montañas"
#: src/settings_translation_file.cpp
msgid "Mountain zero level"
-msgstr ""
+msgstr "Nivel cero das montañas"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Sensibilidade do rato"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Multiplicador da sensibilidade do rato."
#: src/settings_translation_file.cpp
msgid "Mud noise"
-msgstr ""
+msgstr "Ruído do lodo"
#: src/settings_translation_file.cpp
msgid ""
"Multiplier for fall bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
+"Multiplicador para balanceo dos brazos en caída.\n"
+"Por exemplo: 0 para velos estáticos; 1.0 para normal; 2.0 para o dobre."
#: src/settings_translation_file.cpp
msgid "Mute key"
-msgstr ""
+msgstr "Tecla para silenciar"
#: src/settings_translation_file.cpp
msgid "Mute sound"
-msgstr ""
+msgstr "Silenciar son"
#: src/settings_translation_file.cpp
msgid ""
@@ -5179,6 +6065,10 @@ msgid ""
"Current mapgens in a highly unstable state:\n"
"- The optional floatlands of v7 (disabled by default)."
msgstr ""
+"Nome do xerador de mundos que se utilizará ao crear un mundo novo.\n"
+"Crear un mundo no menú principal substituirá isto.\n"
+"Xeradores de mundos actuais nun estado moi inestable:\n"
+"- Os terreos flotantes opcionais de v7 (desactivados por defecto)."
#: src/settings_translation_file.cpp
msgid ""
@@ -5186,53 +6076,67 @@ msgid ""
"When running a server, clients connecting with this name are admins.\n"
"When starting from the main menu, this is overridden."
msgstr ""
+"Nome do xogador.\n"
+"Cando se executa un servidor, os clientes que se conectan con este nome son "
+"administradores.\n"
+"Ao comezar desde o menú principal, isto substitúese."
#: src/settings_translation_file.cpp
msgid ""
"Name of the server, to be displayed when players join and in the serverlist."
msgstr ""
+"Nome do servidor, que se mostrará na lista de servidores e cando os "
+"xogadores se unan."
#: src/settings_translation_file.cpp
msgid "Near plane"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
+msgstr "Plano cercano"
#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
+"Porto de rede para recibir ratos (UDP).\n"
+"Este valor substituirase ao comezar desde o menú principal."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Rede"
#: src/settings_translation_file.cpp
msgid "New users need to input this password."
-msgstr ""
+msgstr "Os novos usuarios deben introducir este contrasinal."
#: src/settings_translation_file.cpp
msgid "Noclip"
-msgstr ""
+msgstr "Modo espectador"
#: src/settings_translation_file.cpp
msgid "Noclip key"
-msgstr ""
+msgstr "Tecla para modo espectador"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Resaltar nodos"
#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr ""
+msgstr "Resaltado dos nós"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
-msgstr ""
+msgstr "Intervalo NodeTimer"
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Ruídos"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
-msgstr ""
+msgstr "Número de fíos emerxentes"
#: src/settings_translation_file.cpp
msgid ""
@@ -5247,6 +6151,17 @@ msgid ""
"processes, especially in singleplayer and/or when running Lua code in\n"
"'on_generated'. For many users the optimum setting may be '1'."
msgstr ""
+"Número de fíos emerxentes a usar.\n"
+"Valor 0:\n"
+"- Selección automática. O número de fíos emerxentes será\n"
+"- \"número de procesadores - 2\", cun límite inferior de 1.\n"
+"Calquera outro valor:\n"
+"- Especifica o número de fíos emerxentes, cun límite inferior de 1.\n"
+"AVISO: aumentar o número de fíos emerxentes aumenta o mundo do motor\n"
+"velocidade, pero isto pode prexudicar o rendemento do xogo ao interferir con "
+"outros\n"
+"procesos, especialmente en modo único e/ou cando se executa código Lua\n"
+"'on_xerado'. Para moitos usuarios, a configuración óptima pode ser \"1\"."
#: src/settings_translation_file.cpp
msgid ""
@@ -5254,19 +6169,20 @@ msgid ""
"This is a trade-off between SQLite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
+"Número de bloques adicionais que se poden cargar con /clearobjects á vez.\n"
+"Esta é unha compensación entre a sobrecarga de transaccións de SQLite e\n"
+"consumo de memoria (4096=100MB, como regra xeral)."
#: src/settings_translation_file.cpp
msgid "Opaque liquids"
-msgstr ""
+msgstr "Líquidos opacos"
#: src/settings_translation_file.cpp
msgid ""
"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255."
msgstr ""
+"Opacidade (alfa) da sombra detrás do tipo de letra por defecto, entre 0 e "
+"255."
#: src/settings_translation_file.cpp
msgid ""
@@ -5274,10 +6190,13 @@ msgid ""
"formspec is\n"
"open."
msgstr ""
+"Abre o menú de pausa cando se perda o foco da xanela. Non se detén se hai "
+"unha especificación de formulario\n"
+"aberto."
#: src/settings_translation_file.cpp
msgid "Optional override for chat weblink color."
-msgstr ""
+msgstr "Substitución opcional da cor da ligazón web do chat."
#: src/settings_translation_file.cpp
msgid ""
@@ -5285,130 +6204,146 @@ msgid ""
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
+"Camiño da fonte alternativa. Debe ser un tipo de letra TrueType.\n"
+"Emprégarase para certos idiomas ou se o tipo de letra por defecto non está "
+"dispoñible."
#: src/settings_translation_file.cpp
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 ""
+"Camiño onde gardar capturas de pantalla. Pode ser un camiño absoluto ou "
+"relativo.\n"
+"O cartafol crearase se aínda non existe."
#: src/settings_translation_file.cpp
msgid ""
"Path to shader directory. If no path is defined, default location will be "
"used."
msgstr ""
+"Camiño ao directorio dos sombreadores. Se non se define ningún, utilizarase "
+"a localización por defecto."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
-msgstr ""
+msgstr "Camiño ao directorio de texturas. Primeiro búscanse alí."
#: src/settings_translation_file.cpp
msgid ""
"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
+"Camiño ao tipo de letra por defecto. Debe ser un tipo de letra TrueType.\n"
+"Usarase o tipo de letra alternativo se non se pode cargar."
#: src/settings_translation_file.cpp
msgid ""
"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
+"Camiño ao tipo de letra monoespacial. Debe ser un tipo de letra TrueType.\n"
+"Este tipo de letra úsase para, por exemplo, a consola e a pantalla da "
+"análise do mundo."
#: src/settings_translation_file.cpp
msgid "Pause on lost window focus"
-msgstr ""
+msgstr "Pausa cando se perfe o foco da pantalla"
#: src/settings_translation_file.cpp
msgid "Per-player limit of queued blocks load from disk"
-msgstr ""
+msgstr "Límite por xogador de carga de bloques en cola desde o disco"
#: src/settings_translation_file.cpp
msgid "Per-player limit of queued blocks to generate"
-msgstr ""
+msgstr "Límite por xogador de bloques en cola que xerar"
#: src/settings_translation_file.cpp
msgid "Physics"
-msgstr ""
+msgstr "Físicas"
#: src/settings_translation_file.cpp
msgid "Pitch move key"
-msgstr ""
+msgstr "Tecla de voo libre"
#: src/settings_translation_file.cpp
msgid "Pitch move mode"
-msgstr ""
+msgstr "Modo de rotación vertical"
#: src/settings_translation_file.cpp
msgid "Place key"
-msgstr ""
+msgstr "Tecla para colocar obxectos"
#: src/settings_translation_file.cpp
msgid "Place repetition interval"
-msgstr ""
+msgstr "Intervalo de repetición da acción \"colocar\""
#: src/settings_translation_file.cpp
msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
+"O xogador é capaz de voar sen ser afectado pola gravidade.\n"
+"Isto require o permiso \"fly\" no servidor."
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
-msgstr ""
+msgstr "Distancia de transferencia do xogador"
#: src/settings_translation_file.cpp
msgid "Player versus player"
-msgstr ""
+msgstr "Xogador contra xogador"
#: src/settings_translation_file.cpp
msgid "Poisson filtering"
-msgstr ""
+msgstr "Filtrado de Poisson"
#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
msgstr ""
+"Porto para conectarse á (UDP).\n"
+"Ten en conta que o campo do porto do menú principal substitúe esta "
+"configuración."
#: src/settings_translation_file.cpp
msgid ""
"Prevent digging and placing from repeating when holding the mouse buttons.\n"
"Enable this when you dig or place too often by accident."
msgstr ""
+"Evita que a acción de romper e colocar bloques se repitan cando se manteñen "
+"os botóns do rato.\n"
+"Activa isto se rompes ou colocas bloques por accidente moitas veces."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
+"Evita que os mods fagan cousas perigosas como executar comandos de shell."
#: src/settings_translation_file.cpp
msgid ""
"Print the engine's profiling data in regular intervals (in seconds).\n"
"0 = disable. Useful for developers."
msgstr ""
+"Expor os datos da perfilaxe en intervalos regulares (en segundos).\n"
+"0 = desactivar. Útil para desenvolvedores."
#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "Permisos que poden conceder os xogadores con basic_privs"
#: src/settings_translation_file.cpp
msgid "Profiler"
-msgstr ""
+msgstr "Análise do mundo"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
+msgstr "Alt. análise do mundo"
#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
-msgstr ""
+msgstr "Enderezo do Prometheus"
#: src/settings_translation_file.cpp
msgid ""
@@ -5417,10 +6352,14 @@ msgid ""
"enable metrics listener for Prometheus on that address.\n"
"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
+"Enderezo do Prometheus.\n"
+"Se Minetest se compila coa opción ENABLE_PROMETHEUS activada,\n"
+"habilita a obteción de métricas para Prometheus nese enderezo.\n"
+"As métricas pódense obter en http://127.0.0.1:30000/metrics"
#: src/settings_translation_file.cpp
msgid "Proportion of large caves that contain liquid."
-msgstr ""
+msgstr "Proporción de covas grandes que conteñen líquido."
#: src/settings_translation_file.cpp
msgid ""
@@ -5428,48 +6367,53 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
+"Rango da área de nubes indicado nun número de 64 cadrados de nubes de nós.\n"
+"Os valores superiores a 26 comezarán a producir cortes nítidos nas esquinas "
+"da área de nubes."
#: src/settings_translation_file.cpp
msgid "Raises terrain to make valleys around the rivers."
-msgstr ""
+msgstr "Eleva o terreo para facer vales arredor dos ríos."
#: src/settings_translation_file.cpp
msgid "Random input"
-msgstr ""
+msgstr "Entrada aleatoria"
#: src/settings_translation_file.cpp
msgid "Range select key"
-msgstr ""
+msgstr "Tecla de campo de visión"
#: src/settings_translation_file.cpp
msgid "Recent Chat Messages"
-msgstr ""
+msgstr "Mensaxes do chat recientes"
#: src/settings_translation_file.cpp
msgid "Regular font path"
-msgstr ""
+msgstr "Camiño da fonte regular"
#: src/settings_translation_file.cpp
msgid "Remote media"
-msgstr ""
+msgstr "Medios remotos"
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "Porto remoto"
#: src/settings_translation_file.cpp
msgid ""
"Remove color codes from incoming chat messages\n"
"Use this to stop players from being able to use color in their messages"
msgstr ""
+"Elimina os códigos de cores das mensaxes de chat entrantes\n"
+"Usa isto para evitar que os xogadores poidan usar cor nas súas mensaxes"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
-msgstr ""
+msgstr "Substitúe o menú principal por defecto por un personalizado."
#: src/settings_translation_file.cpp
msgid "Report path"
-msgstr ""
+msgstr "Directorio para logs"
#: src/settings_translation_file.cpp
msgid ""
@@ -5484,86 +6428,96 @@ msgid ""
"csm_restriction_noderange)\n"
"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 "
+"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 "
+"csm_restriction_noderange)\n"
+"READ_PLAYERINFO: 32 (desactiva a chamada \"get_player_names\" no cliente)"
#: src/settings_translation_file.cpp
msgid "Ridge mountain spread noise"
-msgstr ""
+msgstr "Ruído de extensión do cume de montañas"
#: src/settings_translation_file.cpp
msgid "Ridge noise"
-msgstr ""
+msgstr "Ruído da cresta da montaña"
#: src/settings_translation_file.cpp
msgid "Ridge underwater noise"
-msgstr ""
+msgstr "Ruído das cristas debaixo da auga"
#: src/settings_translation_file.cpp
msgid "Ridged mountain size noise"
-msgstr ""
+msgstr "Ruído do tamaño das dorsais das montañas"
#: src/settings_translation_file.cpp
msgid "Right key"
-msgstr ""
+msgstr "Tecla dereita"
#: src/settings_translation_file.cpp
msgid "River channel depth"
-msgstr ""
+msgstr "Profundidade da canle do río"
#: src/settings_translation_file.cpp
msgid "River channel width"
-msgstr ""
+msgstr "Largura da canle do río"
#: src/settings_translation_file.cpp
msgid "River depth"
-msgstr ""
+msgstr "Profundidade do río"
#: src/settings_translation_file.cpp
msgid "River noise"
-msgstr ""
+msgstr "Ruído do río"
#: src/settings_translation_file.cpp
msgid "River size"
-msgstr ""
+msgstr "Tamaño do río"
#: src/settings_translation_file.cpp
msgid "River valley width"
-msgstr ""
+msgstr "Largura do val do río"
#: src/settings_translation_file.cpp
msgid "Rollback recording"
-msgstr ""
+msgstr "Rexistro das accións"
#: src/settings_translation_file.cpp
msgid "Rolling hill size noise"
-msgstr ""
+msgstr "Tamaño do ruído de outeiros redondeados"
#: src/settings_translation_file.cpp
msgid "Rolling hills spread noise"
-msgstr ""
+msgstr "Ruído espallado de outeiros redondeados"
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "Minimapa circular"
#: src/settings_translation_file.cpp
msgid "Safe digging and placing"
-msgstr ""
+msgstr "Remover e colocar obxectos de maneira segura"
#: src/settings_translation_file.cpp
msgid "Sandy beaches occur when np_beach exceeds this value."
-msgstr ""
+msgstr "Aparecen praias areosas cando \"np_beach\" supera este valor."
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Gardar o mapa recibido polo cliente no disco."
#: src/settings_translation_file.cpp
msgid "Save window size automatically when modified."
-msgstr ""
+msgstr "Gardar automaticamente o tamaño da xanela cando é modificado."
#: src/settings_translation_file.cpp
msgid "Saving map received from server"
-msgstr ""
+msgstr "Gardar mapa recibido do servidor"
#: src/settings_translation_file.cpp
msgid ""
@@ -5573,26 +6527,36 @@ msgid ""
"pixels when scaling down, at the cost of blurring some\n"
"edge pixels when images are scaled by non-integer sizes."
msgstr ""
+"Escala a GUI por un valor especificado polo usuario.\n"
+"Use o filtro antialias de veciño máis próximo para escalar a GUI.\n"
+"Isto suavizará algúns dos bordos ásperos e mestura\n"
+"píxeles ao reducir a escala, a costa de difuminar algúns\n"
+"píxeles de bordo cando as imaxes son escaladas por tamaños non enteiros."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Pantalla:"
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "Altura da xanela"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "Largura da xanela"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
-msgstr ""
+msgstr "Cartafol das capturas"
#: src/settings_translation_file.cpp
msgid "Screenshot format"
-msgstr ""
+msgstr "Formato de captura de pantalla"
#: src/settings_translation_file.cpp
msgid "Screenshot quality"
-msgstr ""
+msgstr "Calidade de captura de pantalla"
#: src/settings_translation_file.cpp
msgid ""
@@ -5600,38 +6564,43 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Calidade da captura de pantalla. Só se usa para formato JPEG.\n"
+"1 é a peor calidade; 100 é a mellor calidade.\n"
+"Usa 0 para a calidade por defecto."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Captura"
#: src/settings_translation_file.cpp
msgid "Seabed noise"
-msgstr ""
+msgstr "Sonido do fondo marino"
#: src/settings_translation_file.cpp
msgid "Second of 4 2D noises that together define hill/mountain range height."
msgstr ""
+"Segundo de 4 ruídos 2D que xuntos definen a altura de outeiros/montañas."
#: src/settings_translation_file.cpp
msgid "Second of two 3D noises that together define tunnels."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
+msgstr "Segundo de 2 ruídos 3D que xuntos definen túneis."
#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Ver https://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "Cor dos bordes da caixa de selección (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Selection box color"
-msgstr ""
+msgstr "Cor da caixa de selección"
#: src/settings_translation_file.cpp
msgid "Selection box width"
-msgstr ""
+msgstr "Largura da caixa de selección"
#: src/settings_translation_file.cpp
msgid ""
@@ -5655,65 +6624,121 @@ msgid ""
"17 = 4D \"Mandelbulb\" Mandelbrot set.\n"
"18 = 4D \"Mandelbulb\" Julia set."
msgstr ""
+"Escolle un dos 18 tipos de fractais:\n"
+"1 = Conxunto 4D de Mandelbrot \"Roundy\".\n"
+"2 = Conxunto 4D de Julia \"Roundy\".\n"
+"3 = Conxunto 4D de Mandelbrot \"Squarry”.\n"
+"4 = Conxunto 4D de Julia \"Squarry”.\n"
+"5 = Conxunto 4D de Mandelbrot \"Mandy Cousin\".\n"
+"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"
+"10 = Conxunto 3D de Julia \"Mandelbrot/Mandelbar”.\n"
+"11 = Conxunto 3D de Mandelbrot \"Christmas Tree\".\n"
+"12 = Conxunto 3D de Julia \"Christmas Tree\".\n"
+"13 = Conxunto 3D de Mandelbrot \"Mandelbulb\".\n"
+"14 = Conxunto 3D de Julia \"Mandelbulb\".\n"
+"15 = Conxunto 3D de Mandelbrot \"Cosine Mandelbulb\".\n"
+"16 = Conxunto 3D de Julia \"Cosine Mandelbulb\".\n"
+"17 = Conxunto 3D de Mandelbrot \"Mandelbulb\".\n"
+"18 = Conxunto 3D de Julia \"Mandelbulb\"."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "URL do servidor"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Nome do servidor"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Descripción do servidor"
#: src/settings_translation_file.cpp
msgid "Server URL"
-msgstr ""
+msgstr "URL do servidor"
#: src/settings_translation_file.cpp
msgid "Server address"
-msgstr ""
+msgstr "Enderezo do servidor"
#: src/settings_translation_file.cpp
msgid "Server description"
-msgstr ""
+msgstr "Descripción do servidor"
#: src/settings_translation_file.cpp
msgid "Server name"
-msgstr ""
+msgstr "Nome do servidor"
#: src/settings_translation_file.cpp
msgid "Server port"
-msgstr ""
+msgstr "Porto do servidor"
#: src/settings_translation_file.cpp
msgid "Server side occlusion culling"
-msgstr ""
+msgstr "Determinar bloques invisibles do lado do servidor"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Porto do servidor"
#: src/settings_translation_file.cpp
msgid "Serverlist URL"
-msgstr ""
+msgstr "URL da lista de servidores"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "URL da lista de servidores"
#: src/settings_translation_file.cpp
msgid "Serverlist file"
-msgstr ""
+msgstr "Ficheiro da lista de servidores"
#: src/settings_translation_file.cpp
msgid ""
"Set the language. Leave empty to use the system language.\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."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, 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 "
+"polos clientes."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
+"Establece a forza da sombra.\n"
+"Un valor máis baixo son sombras máis claras, un valor máis alto son 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: 10.0"
+"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"
#: src/settings_translation_file.cpp
msgid ""
@@ -5721,30 +6746,42 @@ msgid ""
"Value of 0 means no tilt / vertical orbit.\n"
"Minimum value: 0.0; maximum value: 60.0"
msgstr ""
+"Establece a inclinación da órbita Sol/Lúa en graos.\n"
+"O valor de 0 é sen inclinación/órbita vertical.\n"
+"Valor mínimo: 0,0; valor máximo: 60,0"
#: src/settings_translation_file.cpp
msgid ""
"Set to true to enable Shadow Mapping.\n"
"Requires shaders to be enabled."
msgstr ""
+"Establece o valor verdadeiro para activar o mapeado de sombras.\n"
+"É necesario que os sombreadores estean activados."
#: src/settings_translation_file.cpp
msgid ""
"Set to true to enable waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
+"Establece o valor verdadeiro para activar o movemento das follas.\n"
+"É necesario que os sombreadores estean activados."
#: src/settings_translation_file.cpp
msgid ""
"Set to true to enable waving liquids (like water).\n"
"Requires shaders to be enabled."
msgstr ""
+"Establece o valor verdadeiro para activar o movemento dos líquidos (auga, "
+"por exemplo).\n"
+"É necesario que os sombreadores estean activados."
#: src/settings_translation_file.cpp
msgid ""
"Set to true to enable waving plants.\n"
"Requires shaders to be enabled."
msgstr ""
+"Establece o valor verdadeiro para activar o movemento das plantas.\n"
+"É necesario que os sombreadores estean activados."
#: src/settings_translation_file.cpp
msgid ""
@@ -5752,10 +6789,13 @@ msgid ""
"On false, 16 bits texture will be used.\n"
"This can cause much more artifacts in the shadow."
msgstr ""
+"Establece a calidade da textura da sombra en 32 bits.\n"
+"En valor falso, utilizarase textura de 16 bits.\n"
+"Isto pode causar moitos máis detalles na sombra."
#: src/settings_translation_file.cpp
msgid "Shader path"
-msgstr ""
+msgstr "Camiño dos sombreadores"
#: src/settings_translation_file.cpp
msgid ""
@@ -5764,58 +6804,67 @@ msgid ""
"cards.\n"
"This only works with the OpenGL video backend."
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."
#: src/settings_translation_file.cpp
msgid "Shadow filter quality"
-msgstr ""
+msgstr "Calidade do filtro de sombras"
#: src/settings_translation_file.cpp
msgid "Shadow map max distance in nodes to render shadows"
-msgstr ""
+msgstr "Distancia do mapa de sombras en nós para renderizar sombras"
#: src/settings_translation_file.cpp
msgid "Shadow map texture in 32 bits"
-msgstr ""
+msgstr "Textura do mapa de sombras en 32 bits"
#: src/settings_translation_file.cpp
msgid "Shadow map texture size"
-msgstr ""
+msgstr "Tamaño da textura do mapa de sombras"
#: src/settings_translation_file.cpp
msgid ""
"Shadow offset (in pixels) of the default font. If 0, then shadow will not be "
"drawn."
msgstr ""
+"Desfase de sombra (en píxeles) da fonte por defecto. Se é 0, non se fará a "
+"sombra."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
-msgstr ""
+#, fuzzy
+msgid "Shadow strength gamma"
+msgstr "Intensidade da sombra"
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Forma do minimapa. Activado = redondo, desactivado = cadrado."
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "Mostrar información de depuración"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Mostrar as caixas de selección de entidades"
#: src/settings_translation_file.cpp
msgid ""
"Show entity selection boxes\n"
"A restart is required after changing this."
msgstr ""
+"Mostrar as caixas de selección de entidades\n"
+"É necesario reiniciar despois de cambiar isto."
#: src/settings_translation_file.cpp
msgid "Show name tag backgrounds by default"
-msgstr ""
+msgstr "Mostra os fondos das etiquetas de nome por defecto"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "Mensaxe de desconexión"
#: src/settings_translation_file.cpp
msgid ""
@@ -5826,6 +6875,12 @@ msgid ""
"Altering this value is for special usage, leaving it unchanged is\n"
"recommended."
msgstr ""
+"Tamaño dos chunks que creou o xerador de terreos, indicado en bloques (16 "
+"nós).\n"
+"AVISO!: Non hai ningún beneficio, e hai varios perigos, ao\n"
+"aumentar este valor por riba de 5.\n"
+"Reducir este valor aumenta a densidade de covas e calabozos.\n"
+"Modificar este valor é para uso especial. Recoméndase non modificalo."
#: src/settings_translation_file.cpp
msgid ""
@@ -5833,72 +6888,79 @@ msgid ""
"increase the cache hit %, reducing the data being copied from the main\n"
"thread, thus reducing jitter."
msgstr ""
+"Tamaño da caché do xerador de terreos do xerador de malla. Isto fai que\n"
+"aumentae o % de acertos da caché, reducindo os datos que se copian do fío\n"
+"principal, reducindo así a fluctuación."
#: src/settings_translation_file.cpp
msgid "Sky Body Orbit Tilt"
-msgstr ""
+msgstr "Inclinación da órbita do ceo"
#: src/settings_translation_file.cpp
msgid "Slice w"
-msgstr ""
+msgstr "Porción w"
#: src/settings_translation_file.cpp
msgid "Slope and fill work together to modify the heights."
-msgstr ""
+msgstr "Pendente e recheo traballan xuntos para modificar as alturas."
#: src/settings_translation_file.cpp
msgid "Small cave maximum number"
-msgstr ""
+msgstr "Cantidade máxima de covas pequenas"
#: src/settings_translation_file.cpp
msgid "Small cave minimum number"
-msgstr ""
+msgstr "Cantidade mínima de covas pequenas"
#: src/settings_translation_file.cpp
msgid "Small-scale humidity variation for blending biomes on borders."
msgstr ""
+"Variación de humidade a pequena escala para mesturar biomas nos bordes."
#: src/settings_translation_file.cpp
msgid "Small-scale temperature variation for blending biomes on borders."
msgstr ""
+"Variación de temperatura a pequena escala para mesturar biomas nos bordes."
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
-msgstr ""
+msgstr "Iluminación suave"
#: src/settings_translation_file.cpp
msgid ""
"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
+"Suaviza a cámara ao mirar arredor. Tamén se chama suavización do rato.\n"
+"Útil para gravar vídeos."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotación da cámara en modo cinemático. 0 para desactivar."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotación da cámara. 0 para desactivar."
#: src/settings_translation_file.cpp
msgid "Sneak key"
-msgstr ""
+msgstr "Tecla para agacharse"
#: src/settings_translation_file.cpp
msgid "Sneaking speed"
-msgstr ""
+msgstr "Velocidade ao estar agachado"
#: src/settings_translation_file.cpp
msgid "Sneaking speed, in nodes per second."
-msgstr ""
+msgstr "Velocidade ao se agachar, en nós por segundo."
#: src/settings_translation_file.cpp
msgid "Soft shadow radius"
-msgstr ""
+msgstr "Radio das sombras suaves"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "Son"
#: src/settings_translation_file.cpp
msgid ""
@@ -5907,6 +6969,10 @@ msgid ""
"(obviously, remote_media should end with a slash).\n"
"Files that are not present will be fetched the usual way."
msgstr ""
+"Especifica o URL do que o cliente obtén os medios en lugar de usar UDP.\n"
+"$filename debe ser accesible desde $remote_media$filename a través de cURL\n"
+"(obviamente, remote_media debería rematar cunha barra).\n"
+"Os ficheiros que non están presentes buscaranse do xeito habitual."
#: src/settings_translation_file.cpp
msgid ""
@@ -5914,6 +6980,10 @@ msgid ""
"Note that mods or games may explicitly set a stack for certain (or all) "
"items."
msgstr ""
+"Especifica a cantidade por defecto na que se agrupan os nós, obxectos e "
+"ferramentas.\n"
+"Ten en conta que algúns xogos ou mods poden especificar unha cantidade na "
+"que agrupar algúns (ou todos) os obxectos."
#: src/settings_translation_file.cpp
msgid ""
@@ -5922,6 +6992,12 @@ msgid ""
"will consume more resources.\n"
"Minimum value: 1; maximum value: 16"
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"
+"consumirán máis recursos.\n"
+"Valor mínimo: 1; Valor máximo 16"
#: src/settings_translation_file.cpp
msgid ""
@@ -5929,26 +7005,29 @@ msgid ""
"Controls the width of the range to be boosted.\n"
"Standard deviation of the light curve boost Gaussian."
msgstr ""
+"Difusión do intervalo de aumento da curva de luz.\n"
+"Controla a largura do intervalo que se quere aumentar.\n"
+"A desviación estándar da curva de luz gaussiana aumenta."
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr ""
+msgstr "Punto de aparición estático"
#: src/settings_translation_file.cpp
msgid "Steepness noise"
-msgstr ""
+msgstr "Ruído das pendentes"
#: src/settings_translation_file.cpp
msgid "Step mountain size noise"
-msgstr ""
+msgstr "Ruído do tamaño das montañas de paso"
#: src/settings_translation_file.cpp
msgid "Step mountain spread noise"
-msgstr ""
+msgstr "Ruído doespallamento das montañas de paso"
#: src/settings_translation_file.cpp
msgid "Strength of 3D mode parallax."
-msgstr ""
+msgstr "Intensidade do modo de paralaxe 3D."
#: src/settings_translation_file.cpp
msgid ""
@@ -5956,14 +7035,17 @@ msgid ""
"The 3 'boost' parameters define a range of the light\n"
"curve that is boosted in brightness."
msgstr ""
+"Ampliación da curva de luz.\n"
+"Os 3 parámetros de \"impulso\" definen un rango da curva\n"
+"de luz que aumenta o brillo."
#: src/settings_translation_file.cpp
msgid "Strict protocol checking"
-msgstr ""
+msgstr "Verificación estricta do protocolo"
#: src/settings_translation_file.cpp
msgid "Strip color codes"
-msgstr ""
+msgstr "Eliminar códigos de cores"
#: src/settings_translation_file.cpp
msgid ""
@@ -5978,34 +7060,55 @@ msgid ""
"server-intensive extreme water flow and to avoid vast flooding of the\n"
"world surface below."
msgstr ""
+"Nivel superficial de auga opcional colocado sobre unha capa sólida de terreo "
+"flotante.\n"
+"A auga está desactivada por defecto e só se colocará se se establece este "
+"valor\n"
+"arriba 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (o inicio do\n"
+"afilamento superior).\n"
+"***ADVERTENCIA, PERIGO POTENCIAL PARA OS MUNDOS E O RENDEMENTO DO "
+"SERVIDOR***:\n"
+"Ao activar a colocación de auga débense configurar e probar os terreos "
+"flotantes\n"
+"para ser unha capa sólida configurando 'mgv7_floatland_density' en 2.0 (ou "
+"outro\n"
+"valor necesario en función de 'mgv7_np_floatland'), para evitar\n"
+"fluxo de auga extremo intensivo en servidores e evitar grandes inundacións "
+"do\n"
+"superficie do mundo abaixo."
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
-msgstr ""
+msgstr "SQLite sincrónico"
#: src/settings_translation_file.cpp
msgid "Temperature variation for biomes."
-msgstr ""
+msgstr "Variación de temperatura para biomas."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Configuración"
#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
-msgstr ""
+msgstr "Ruído alternativo do terreo"
#: src/settings_translation_file.cpp
msgid "Terrain base noise"
-msgstr ""
+msgstr "Ruído base do terreo"
#: src/settings_translation_file.cpp
msgid "Terrain height"
-msgstr ""
+msgstr "Altura do terreo"
#: src/settings_translation_file.cpp
msgid "Terrain higher noise"
-msgstr ""
+msgstr "Maior ruído do terreo"
#: src/settings_translation_file.cpp
msgid "Terrain noise"
-msgstr ""
+msgstr "Ruído do terreo"
#: src/settings_translation_file.cpp
msgid ""
@@ -6013,6 +7116,9 @@ msgid ""
"Controls proportion of world area covered by hills.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Limiar de ruído do terreo para outeiros.\n"
+"Controla a proporción da superficie do mundo cuberta por outeiros.\n"
+"Axusta cara a 0,0 para unha proporción maior."
#: src/settings_translation_file.cpp
msgid ""
@@ -6020,14 +7126,17 @@ msgid ""
"Controls proportion of world area covered by lakes.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Limiar de ruído do terreo para lagos.\n"
+"Controla a proporción da superficie do mundo cuberta por lagos.\n"
+"Axusta cara a 0,0 para unha proporción maior."
#: src/settings_translation_file.cpp
msgid "Terrain persistence noise"
-msgstr ""
+msgstr "Ruído de persistencia do terreo"
#: src/settings_translation_file.cpp
msgid "Texture path"
-msgstr ""
+msgstr "Camiño dos packs de textura"
#: src/settings_translation_file.cpp
msgid ""
@@ -6035,6 +7144,9 @@ msgid ""
"This must be a power of two.\n"
"Bigger numbers create better shadows but it is also more expensive."
msgstr ""
+"Tamaño da textura para renderizar o mapa de sombras.\n"
+"Este debe ser un poder de dous.\n"
+"Os números máis grandes crean mellores sombras pero tamén consume máis."
#: src/settings_translation_file.cpp
msgid ""
@@ -6045,37 +7157,51 @@ msgid ""
"this option allows enforcing it for certain node types. Note though that\n"
"that is considered EXPERIMENTAL and may not work properly."
msgstr ""
+"As texturas dun nodo poden estar aliñadas co nó ou co mundo.\n"
+"O primeiro modo se adapta mellor a cousas como máquinas, mobles, etc., "
+"mentres\n"
+"este último fai que as escaleiras e os microbloques se adapten mellor ao "
+"contorno.\n"
+"Non obstante, como esta posibilidade é nova, non pode ser utilizada por "
+"servidores máis antigos,\n"
+"esta opción permite aplicala para certos tipos de nodos. Ten en conta que\n"
+"que se considera EXPERIMENTAL e pode non funcionar correctamente."
#: src/settings_translation_file.cpp
msgid "The URL for the content repository"
-msgstr ""
+msgstr "O URL do repositorio de contido"
#: src/settings_translation_file.cpp
msgid "The dead zone of the joystick"
-msgstr ""
+msgstr "A zona morta do joystick"
#: src/settings_translation_file.cpp
msgid ""
"The default format in which profiles are being saved,\n"
"when calling `/profiler save [format]` without format."
msgstr ""
+"O formato por defecto no que se gardan as análises do mundo,\n"
+"ao chamar a `/profiler save [format]` sen formato."
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other biome filler node."
-msgstr ""
+msgstr "A profundidade da chán ou outro nó de recheo do bioma."
#: src/settings_translation_file.cpp
msgid ""
"The file path relative to your worldpath 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."
#: src/settings_translation_file.cpp
msgid "The identifier of the joystick to use"
-msgstr ""
+msgstr "O identificador do joystick que se vai utilizar"
#: src/settings_translation_file.cpp
msgid "The length in pixels it takes for touch screen interaction to start."
msgstr ""
+"A lonxitude en píxeles que tarda en iniciar a interacción da pantalla táctil."
#: src/settings_translation_file.cpp
msgid ""
@@ -6085,16 +7211,24 @@ msgid ""
"Default is 1.0 (1/2 node).\n"
"Requires waving liquids to be enabled."
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."
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
-msgstr ""
+msgstr "A interface de rede na que o servidor agarda a conexión."
#: src/settings_translation_file.cpp
msgid ""
"The privileges that new users automatically get.\n"
"See /privs in game for a full list on your server and mod configuration."
msgstr ""
+"Os permisos que obteñen automaticamente os novos usuarios.\n"
+"Consulta /privs no xogo para ver unha lista completa do teu servidor e da "
+"configuración do mod."
#: src/settings_translation_file.cpp
msgid ""
@@ -6106,6 +7240,12 @@ msgid ""
"maintained.\n"
"This should be configured together with active_object_send_range_blocks."
msgstr ""
+"O radio do volume de bloques ao redor de cada xogador que está suxeito ao\n"
+"material de bloque activo, indicado en bloques de mapas (16 nós).\n"
+"Nos bloques activos cárganse obxectos e execútanse os ABM.\n"
+"Este é tamén o intervalo mínimo no que se manteñen os obxectos activos "
+"(mobs).\n"
+"Isto debería configurarse xunto con active_object_send_range_blocks."
#: src/settings_translation_file.cpp
msgid ""
@@ -6116,12 +7256,21 @@ msgid ""
"On other platforms, OpenGL is recommended.\n"
"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)"
msgstr ""
+"O motor de renderizado.\n"
+"É necesario un reinicio logo de cambiar isto.\n"
+"Nota: en Android, segue con OGLES1 se non está seguro. A aplicación pode non "
+"iniciarse doutro xeito.\n"
+"Noutras plataformas recoméndase OpenGL.\n"
+"Os sombreadores son compatibles con OpenGL (só para escritorio) e OGLES2 "
+"(experimental)"
#: src/settings_translation_file.cpp
msgid ""
"The sensitivity of the joystick axes for moving the\n"
"in-game view frustum around."
msgstr ""
+"A sensibilidade dos eixes do joystick para mover o\n"
+"vista no xogo frustum ao redor."
#: src/settings_translation_file.cpp
msgid ""
@@ -6130,6 +7279,12 @@ msgid ""
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
"set to the nearest valid value."
msgstr ""
+"A intensidade (escuridade) do sombreado de oclusión ambiental do nó\n"
+"Abaixo é máis escuro, máis alto é máis claro. O intervalo de valores válido "
+"para isto\n"
+"a configuración é de 0,25 a 4,0 inclusive. Se o valor está fóra do intervalo "
+"será\n"
+"establecer o valor válido máis próximo."
#: src/settings_translation_file.cpp
msgid ""
@@ -6137,28 +7292,40 @@ msgid ""
"capacity until an attempt is made to decrease its size by dumping old queue\n"
"items. A value of 0 disables the functionality."
msgstr ""
+"O tempo (en segundos) que a cola de líquidos pode crecer máis alá da "
+"capacidade\n"
+"de procesamento ata que se intente diminuír o seu tamaño eliminando a cola "
+"antiga de\n"
+"elementos. Un valor de 0 desactiva isto."
#: src/settings_translation_file.cpp
msgid ""
"The time budget allowed for ABMs to execute on each step\n"
"(as a fraction of the ABM Interval)"
msgstr ""
+"O tempo permitido aos ABM para executarse en cada paso\n"
+"(como unha fracción do intervalo ABM)"
#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated events\n"
"when holding down a joystick button combination."
msgstr ""
+"O tempo en segundos que tarda entre eventos repetidos\n"
+"ao manter premida unha combinación de botóns do joystick."
#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated node placements when holding\n"
"the place 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."
#: src/settings_translation_file.cpp
msgid "The type of joystick"
-msgstr ""
+msgstr "O tipo de joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -6166,32 +7333,41 @@ msgid ""
"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."
#: src/settings_translation_file.cpp
msgid "Third of 4 2D noises that together define hill/mountain range height."
msgstr ""
+"Terceiro de 4 ruídos 2D que xuntos definen a altura de outeiros/montañas."
#: 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 ""
+"Tempo en segundos para que a entidade de obxecto (obxectos tirados) viva.\n"
+"Axustándoo a -1 desactiva a función."
#: src/settings_translation_file.cpp
msgid "Time of day when a new world is started, in millihours (0-23999)."
-msgstr ""
+msgstr "Hora do día en que se inicia un novo mundo, en milihoras (0-23999)."
#: src/settings_translation_file.cpp
msgid "Time send interval"
-msgstr ""
+msgstr "Intervalo de envío de tempo"
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Velocidade do tempo"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, 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."
#: src/settings_translation_file.cpp
msgid ""
@@ -6200,30 +7376,43 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
+"Para reducir a latencia, as transferencias en bloque son máis lentas cando "
+"un xogador está a construír algo.\n"
+"Isto determina canto tempo se ralentizan despois de colocar ou eliminar un "
+"nó."
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
-msgstr ""
+msgstr "Tecla para alternar o modo cámara"
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
-msgstr ""
+msgstr "Atraso da información sobre ferramentas"
#: src/settings_translation_file.cpp
msgid "Touch screen threshold"
-msgstr ""
+msgstr "Límite da pantalla táctil"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Límite da pantalla táctil"
#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
+msgstr "Compensacións para o rendemento"
+
+#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Trees noise"
-msgstr ""
+msgstr "Ruído das árbores"
#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
-msgstr ""
+msgstr "Filtrado trilineal"
#: src/settings_translation_file.cpp
msgid ""
@@ -6231,18 +7420,21 @@ msgid ""
"False = 128\n"
"Usable to make minimap smoother on slower machines."
msgstr ""
+"Verdadeiro = 256\n"
+"Falso = 128\n"
+"Pódese usar para facer o minimapa máis suave en ordenadores máis lentos."
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr ""
+msgstr "Mods seguros"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL á lista de servidores que aparece na xanela Xogo en liña."
#: src/settings_translation_file.cpp
msgid "Undersampling"
-msgstr ""
+msgstr "Submostraxe"
#: src/settings_translation_file.cpp
msgid ""
@@ -6252,38 +7444,44 @@ msgid ""
"image.\n"
"Higher values result in a less detailed image."
msgstr ""
+"A submostraxe é semellante ao uso dunha resolución de pantalla inferior, "
+"pero aplícase\n"
+"só para o mundo, mantendo a GUI intacta.\n"
+"Debería dar un aumento máis significativo do rendemento a costa dunha imaxe "
+"menos detallada.\n"
+"Os valores máis altos dan como resultado unha imaxe menos detallada."
#: src/settings_translation_file.cpp
msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "Distancia de transferencia de xogador ilimitada"
#: src/settings_translation_file.cpp
msgid "Unload unused server data"
-msgstr ""
+msgstr "Eliminar datos do servidor non utilizados"
#: src/settings_translation_file.cpp
msgid "Upper Y limit of dungeons."
-msgstr ""
+msgstr "Límite Y superior dos calabozos."
#: src/settings_translation_file.cpp
msgid "Upper Y limit of floatlands."
-msgstr ""
+msgstr "Límite Y superior dos terreos flotantes."
#: src/settings_translation_file.cpp
msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "Activa as nubes 3D en lugar de nubes 2D (planas)."
#: src/settings_translation_file.cpp
msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "Usa unha animación de nube para o fondo do menú principal."
#: src/settings_translation_file.cpp
msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr ""
+msgstr "Usa o filtro anisótropo ao ver texturas desde un ángulo."
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "Usa o filtro bilineal ao escalar texturas."
#: src/settings_translation_file.cpp
msgid ""
@@ -6291,6 +7489,10 @@ msgid ""
"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."
#: src/settings_translation_file.cpp
msgid ""
@@ -6302,116 +7504,135 @@ msgid ""
"If set to 0, MSAA is disabled.\n"
"A restart is required after changing this option."
msgstr ""
+"Use o suavizado de varias mostras (MSAA) para suavizar os bordos do bloque.\n"
+"Este algoritmo suaviza a ventana 3D mentres mantén a imaxe nítida,\n"
+"pero non afecta o interior das texturas\n"
+"(nótase especialmente con texturas transparentes).\n"
+"Aparecen espazos visibles entre os nós cando os sombreadores están "
+"desactivados.\n"
+"Se se establece en 0, MSAA está desactivado.\n"
+"É necesario reiniciar logo de cambiar esta opción."
#: src/settings_translation_file.cpp
msgid "Use trilinear filtering when scaling textures."
+msgstr "Usa o filtro trilineal ao escalar texturas."
+
+#: src/settings_translation_file.cpp
+msgid "User Interfaces"
msgstr ""
#: src/settings_translation_file.cpp
msgid "VBO"
-msgstr ""
+msgstr "VBO"
#: src/settings_translation_file.cpp
msgid "VSync"
-msgstr ""
+msgstr "Sincronizaión vertical"
#: src/settings_translation_file.cpp
msgid "Valley depth"
-msgstr ""
+msgstr "Profundade dos vales"
#: src/settings_translation_file.cpp
msgid "Valley fill"
-msgstr ""
+msgstr "Recheo dos vales"
#: src/settings_translation_file.cpp
msgid "Valley profile"
-msgstr ""
+msgstr "Perfil dos vales"
#: src/settings_translation_file.cpp
msgid "Valley slope"
-msgstr ""
+msgstr "Inclinación dos vales"
#: src/settings_translation_file.cpp
msgid "Variation of biome filler depth."
-msgstr ""
+msgstr "Variación da profundidade do recheo do bioma."
#: src/settings_translation_file.cpp
msgid "Variation of maximum mountain height (in nodes)."
-msgstr ""
+msgstr "Variación da altura máxima da montaña (en nós)."
#: src/settings_translation_file.cpp
msgid "Variation of number of caves."
-msgstr ""
+msgstr "Variación do número de covas."
#: src/settings_translation_file.cpp
msgid ""
"Variation of terrain vertical scale.\n"
"When noise is < -0.55 terrain is near-flat."
msgstr ""
+"Variación da escala vertical do terreo.\n"
+"Cando o ruído é < -0,55 o terreo é case plano."
#: src/settings_translation_file.cpp
msgid "Varies depth of biome surface nodes."
-msgstr ""
+msgstr "Variación da profundidade dos nós da superficie do bioma."
#: src/settings_translation_file.cpp
msgid ""
"Varies roughness of terrain.\n"
"Defines the 'persistence' value for terrain_base and terrain_alt noises."
msgstr ""
+"Varía a rugosidade do terreo.\n"
+"Define o valor de \"persistencia\" para os ruídos \"chánin_base\" e "
+"\"chánin_alt\"."
#: src/settings_translation_file.cpp
msgid "Varies steepness of cliffs."
-msgstr ""
+msgstr "Varía a pendiente dos acantilados."
#: src/settings_translation_file.cpp
msgid "Vertical climbing speed, in nodes per second."
-msgstr ""
+msgstr "Velocidade de escalada vertical, en nós por segundo."
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "Sincronización de pantalla vertical."
#: src/settings_translation_file.cpp
msgid "Video driver"
-msgstr ""
+msgstr "Controlador de vídeo"
#: src/settings_translation_file.cpp
msgid "View bobbing factor"
-msgstr ""
+msgstr "Ver o factor de balance"
#: src/settings_translation_file.cpp
msgid "View distance in nodes."
-msgstr ""
+msgstr "Distancia de visión en nós."
#: src/settings_translation_file.cpp
msgid "View range decrease key"
-msgstr ""
+msgstr "Ver a tecla de diminución do intervalo"
#: src/settings_translation_file.cpp
msgid "View range increase key"
-msgstr ""
+msgstr "Ver a tecla de aumento do intervalo"
#: src/settings_translation_file.cpp
msgid "View zoom key"
-msgstr ""
+msgstr "Ver tecla de zoom"
#: src/settings_translation_file.cpp
msgid "Viewing range"
-msgstr ""
+msgstr "Campo de visión"
#: src/settings_translation_file.cpp
msgid "Virtual joystick triggers Aux1 button"
-msgstr ""
+msgstr "O joystick virtual activa o botón Aux1"
#: src/settings_translation_file.cpp
msgid "Volume"
-msgstr ""
+msgstr "Volume"
#: src/settings_translation_file.cpp
msgid ""
"Volume of all sounds.\n"
"Requires the sound system to be enabled."
msgstr ""
+"Todos os sons.\n"
+"É necesario que o son do sistema estea activado."
#: src/settings_translation_file.cpp
msgid ""
@@ -6421,58 +7642,64 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Coordenada W da porción 3D xerada dun fractal 4D.\n"
+"Determina que parte 3D da forma 4D se xera.\n"
+"Altera a forma do fractal.\n"
+"Non ten efecto sobre os fractais 3D.\n"
+"Rango de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid "Walking and flying speed, in nodes per second."
-msgstr ""
+msgstr "Velocidade ao camiñar e voar, en nós por segundo."
#: src/settings_translation_file.cpp
msgid "Walking speed"
-msgstr ""
+msgstr "Velocidade ao camiñar"
#: src/settings_translation_file.cpp
msgid "Walking, flying and climbing speed in fast mode, in nodes per second."
msgstr ""
+"Velocidade ao camiñar, voar e escalar no modo rápido, en nós por segundo."
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Nivel da auga"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
-msgstr ""
+msgstr "Nivel da superficie da auga no mundo."
#: src/settings_translation_file.cpp
msgid "Waving Nodes"
-msgstr ""
+msgstr "Bloques ondulantes"
#: src/settings_translation_file.cpp
msgid "Waving leaves"
-msgstr ""
+msgstr "Movemento das follas"
#: src/settings_translation_file.cpp
msgid "Waving liquids"
-msgstr ""
+msgstr "Ondas dos líquidos"
#: src/settings_translation_file.cpp
msgid "Waving liquids wave height"
-msgstr ""
+msgstr "Altura das ondas dos líquidos"
#: src/settings_translation_file.cpp
msgid "Waving liquids wave speed"
-msgstr ""
+msgstr "Velocidade de movemento das ondas dos líquidos"
#: src/settings_translation_file.cpp
msgid "Waving liquids wavelength"
-msgstr ""
+msgstr "Movemento das ondas dos líquidos"
#: src/settings_translation_file.cpp
msgid "Waving plants"
-msgstr ""
+msgstr "Movemento das plantas"
#: src/settings_translation_file.cpp
msgid "Weblink color"
-msgstr ""
+msgstr "Cor de ligazóns web"
#: src/settings_translation_file.cpp
msgid ""
@@ -6480,6 +7707,10 @@ msgid ""
"filtered in software, but some images are generated directly\n"
"to hardware (e.g. render-to-texture for nodes in inventory)."
msgstr ""
+"Cando gui_scaling_filter ten valor verdadeiro, todas as imaxes da GUI deben "
+"ser\n"
+"filtradas no software, pero algunhas imaxes xéranse directamente\n"
+"ao hardware (por exemplo, renderizado en textura para nós do inventario)."
#: src/settings_translation_file.cpp
msgid ""
@@ -6488,6 +7719,11 @@ msgid ""
"to the old scaling method, for video drivers that don't\n"
"properly support downloading textures back from hardware."
msgstr ""
+"Cando gui_scaling_filter_txr2img teña un valor verdadeiro, copia esas "
+"imaxes\n"
+"do hardware ao software para escalar. Cando sexa falso, retrocede\n"
+"ao método de escala antigo para controladores de vídeo que non o fan\n"
+"admite correctamente a descarga de texturas desde o hardware."
#: src/settings_translation_file.cpp
msgid ""
@@ -6500,36 +7736,57 @@ msgid ""
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
+"Cando se usan filtros bilineais/trilineais/anisótropos, texturas de baixa "
+"resolución\n"
+"poden ser borrosas, polo que amplíaos automaticamente co veciño máis "
+"próximo\n"
+"interpolación para preservar píxeles nítidos. Isto establece o tamaño mínimo "
+"de textura\n"
+"para as texturas mejoradas; valores máis altos parecen máis nítidos, pero "
+"requiren máis\n"
+"memoria. Recoméndase potencias de 2. Esta configuración só se aplica se\n"
+"O filtrado bilineal/trilineal/anisótropo está activado.\n"
+"Tamén se usa como tamaño de textura do nodo base para aliñados ao mundo\n"
+"autoescalado de texturas."
#: src/settings_translation_file.cpp
msgid ""
"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
+"Indica se os fondos das etiquetas de nome deberían mostrarse por defecto.\n"
+"Os mods aínda poden establecer un fondo."
#: src/settings_translation_file.cpp
msgid "Whether node texture animations should be desynchronized per mapblock."
msgstr ""
+"Indica se as animacións de textura de nós deben desincronizarse por bloque "
+"de mapas."
#: src/settings_translation_file.cpp
msgid ""
"Whether players are shown to clients without any range limit.\n"
"Deprecated, use the setting player_transfer_distance instead."
msgstr ""
+"Indica se os xogadores son mostrados aos clientes sen límites.\n"
+"Se non, utiliza a configuración player_transfer_distance no seu lugar."
#: src/settings_translation_file.cpp
msgid "Whether to allow players to damage and kill each other."
-msgstr ""
+msgstr "Se permitir que os xogadores se danen e se maten entre si."
#: src/settings_translation_file.cpp
msgid ""
"Whether to ask clients to reconnect after a (Lua) crash.\n"
"Set this to true if your server is set up to restart automatically."
msgstr ""
+"Indica se pedir aos clientes volverse conectar logo dun fallo (Lua).\n"
+"Establece isto como verdadeiro se o teu servidor está configurado para "
+"reiniciarse automaticamente."
#: src/settings_translation_file.cpp
msgid "Whether to fog out the end of the visible area."
-msgstr ""
+msgstr "Indica se hai que poñar néboa ao final da zona visible."
#: src/settings_translation_file.cpp
msgid ""
@@ -6538,19 +7795,37 @@ msgid ""
"In-game, you can toggle the mute state with the mute key or by using the\n"
"pause menu."
msgstr ""
+"Indica se hai que silenciar os sons. Podes activar o son en calquera "
+"momento, a non ser que\n"
+"esté desactivado (enable_sound=false).\n"
+"No xogo podes cambiar o estado de silencio coa tecla de silencio ou no\n"
+"menú de pausa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
+"Debe mostrarse a información de depuración do cliente (premer F5 fai o "
+"mesmo)."
#: src/settings_translation_file.cpp
msgid "Width component of the initial window size. Ignored in fullscreen mode."
msgstr ""
+"Componente de largura do tamaño inicial da xanela. Ignórase en pantalla "
+"completa."
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
-msgstr ""
+msgstr "Largura das liñas do bloque de selección arredor dos nós."
#: src/settings_translation_file.cpp
msgid ""
@@ -6558,16 +7833,21 @@ msgid ""
"background.\n"
"Contains the same information as the file debug.txt (default name)."
msgstr ""
+"Só sistemas Windows: Inicia Minetest coa xanela da liña de comandos en "
+"segundo plano.\n"
+"Contén a mesma información que o ficheiro debug.txt (nome por defecto)."
#: src/settings_translation_file.cpp
msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"Directorio do mundo (todo almacénase aquí).\n"
+"Non é necesario se comeza desde o menú."
#: src/settings_translation_file.cpp
msgid "World start time"
-msgstr ""
+msgstr "Horario de inicio do mundo"
#: src/settings_translation_file.cpp
msgid ""
@@ -6578,28 +7858,39 @@ msgid ""
"See also texture_min_size.\n"
"Warning: This option is EXPERIMENTAL!"
msgstr ""
+"As texturas aliñadas ao mundo pódense escalar para abarcar varios nós. Non "
+"obstante,\n"
+"é posible que o servidor non envíe a escala que desexa, especialmente se "
+"usa\n"
+"un paquete de texturas especialmente deseñado; con esta opción, o cliente "
+"tenta\n"
+"determinar a escala automaticamente baseándose no tamaño da textura.\n"
+"Consulte tamén texture_min_size.\n"
+"Aviso: esta opción é EXPERIMENTAL!"
#: src/settings_translation_file.cpp
msgid "World-aligned textures mode"
-msgstr ""
+msgstr "Modo de texturas aliñadas ao mundo"
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
-msgstr ""
+msgstr "Y de terreo chán."
#: src/settings_translation_file.cpp
msgid ""
"Y of mountain density gradient zero level. Used to shift mountains "
"vertically."
msgstr ""
+"Y da densidade do gradiente nivel cero das montañas. Úsase para mover "
+"montañas verticalmente."
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large caves."
-msgstr ""
+msgstr "Límite Y máximo das covas grandes."
#: src/settings_translation_file.cpp
msgid "Y-distance over which caverns expand to full size."
-msgstr ""
+msgstr "Distancia Y sobre a cal as cavernas expándense até o seu tamaño total."
#: src/settings_translation_file.cpp
msgid ""
@@ -6608,38 +7899,119 @@ 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 ""
+"Distancia Y sobre a cal os terreos flotantes estrechanse desde a densidade "
+"total ata nada.\n"
+"A diminución comeza a esta distancia do límite Y.\n"
+"Para unha capa sólida de terreo flotante, isto controla a altura dos "
+"outeiros/montañas.\n"
+"Debe ser menor ou igual á metade da distancia entre os límites Y."
#: src/settings_translation_file.cpp
msgid "Y-level of average terrain surface."
-msgstr ""
+msgstr "Nivel Y da superficie media do terreo."
#: src/settings_translation_file.cpp
msgid "Y-level of cavern upper limit."
-msgstr ""
+msgstr "Nivel Y do límite superior da caverna."
#: src/settings_translation_file.cpp
msgid "Y-level of higher terrain that creates cliffs."
-msgstr ""
+msgstr "Nivel Y de terreo que crea acantilados."
#: src/settings_translation_file.cpp
msgid "Y-level of lower terrain and seabed."
-msgstr ""
+msgstr "Nivel Y do terreo inferior e do solo oceánico."
#: src/settings_translation_file.cpp
msgid "Y-level of seabed."
+msgstr "Nivel Y do fondo do mar."
+
+#: src/settings_translation_file.cpp
+msgid "cURL"
msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
-msgstr ""
+msgstr "Tempo límite de descarga do ficheiro por cURL"
#: src/settings_translation_file.cpp
msgid "cURL interactive timeout"
-msgstr ""
+msgstr "Tempo limite de cURL"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
-msgstr ""
+msgstr "Límite paralelo de cURL"
+
+#~ msgid "Basic"
+#~ msgstr "Básico"
+
+#~ msgid "Connect"
+#~ msgstr "Conectar"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Controla a velocidade de afundimento en líquidos."
+
+#~ msgid "Del. Favorite"
+#~ msgstr "Eliminar fav."
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Descarga un xogo como Minetest Game en minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Descarga un en minetest.net"
+
+#~ msgid "Enable register confirmation"
+#~ msgstr "Activar confirmación de rexistro"
+
+#~ msgid "Enter "
+#~ msgstr "Introducir: "
+
+#~ msgid "Filtering"
+#~ msgstr "Filtrado"
+
+#~ msgid "Game"
+#~ msgstr "Xogo"
+
+#~ msgid "HUD scale factor"
+#~ msgstr "Factor de escala HUD"
+
+#~ msgid "In-Game"
+#~ msgstr "No xogo"
+
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentación"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr "Combinacións de teclas"
+
+#~ msgid "Menus"
+#~ msgstr "Menús"
+
+#~ msgid "Player name"
+#~ msgstr "Nome do xogador"
+
+#~ msgid "Profiling"
+#~ msgstr "Perfilaxe"
+
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Servidor / Un xogador"
+
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Estás a piques de unirte ao servidor \"%s\" por primeira vez.\n"
+#~ "Se continúas, crearase unha nova conta neste servidor usando as túas "
+#~ "credenciais.\n"
+#~ "Reescribe o teu contrasinal e fai clic en \"Rexistrarse e unirse\" para "
+#~ "confirmar a creación da conta ou fai clic en \"Cancelar\" para deter o "
+#~ "proceso."
#, fuzzy
#~ msgid "You died."
diff --git a/po/he/minetest.po b/po/he/minetest.po
index a6beb9def..f396cc0ba 100644
--- a/po/he/minetest.po
+++ b/po/he/minetest.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Hebrew (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2021-04-17 07:27+0000\n"
"Last-Translator: Omer I.S. <omeritzicschwartz@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/minetest/minetest/"
@@ -120,6 +120,31 @@ msgid "The server has requested a reconnect:"
msgstr "השרת מבקש התחברות מחדש:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "בחירת שיפורים"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "שגיאה בגרסאות הפרוטוקול. "
@@ -132,6 +157,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "השרת תומך בפרוטוקולים בין גרסה $1 וגרסה $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "אנו תומכים רק בגירסה 1$ של הפרוטוקול."
@@ -139,14 +168,21 @@ msgstr "אנו תומכים רק בגירסה 1$ של הפרוטוקול."
msgid "We support protocol versions between version $1 and $2."
msgstr "אנו תומכים בגרסאות בין 1$ ל-2$ של הפרוטוקול."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "ביטול"
@@ -285,7 +321,6 @@ msgid "Failed to download $1"
msgstr "הורדת $1 נכשלה"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "משחקים"
@@ -307,7 +342,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "התקנה: סוג קובץ לא נתמך \"$1\" או שהארכיב פגום"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "שיפורים"
@@ -400,12 +434,9 @@ msgid "Decorations"
msgstr "קישוטים"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "הורדת משחק, כמו משחק Minetest, מאתר minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "הורד אחד מאתר minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "אזהרה: מצב בדיקת הפיתוח נועד למפתחים."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -423,10 +454,6 @@ msgstr "גושי אדמה צפים בשמים"
msgid "Floatlands (experimental)"
msgstr "אדמה צפה (נסיוני)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "משחק"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "צור שטח לא פרקטלי: אוקיינוסים ותת קרקעי"
@@ -444,6 +471,15 @@ msgid "Increases humidity around rivers"
msgstr "הגברת הלחות בסביבת נהרות"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "התקנת $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "אגמים"
@@ -543,10 +579,6 @@ msgid "Very large caverns deep in the underground"
msgstr "מערות גדולות מאוד עמוק מתחת לאדמה"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "אזהרה: מצב בדיקת הפיתוח נועד למפתחים."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "שם העולם"
@@ -576,6 +608,38 @@ msgstr "pkgmgr: נתיב לא חוקי \"$1\""
msgid "Delete World \"$1\"?"
msgstr "למחוק את העולם \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "אשר סיסמה"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "שם"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "סיסמה"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "סיסמאות לא תואמות!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "הרשם והצטרף"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "הסכמה"
@@ -608,6 +672,16 @@ msgstr "חזור לדף ההגדרות >"
msgid "Browse"
msgstr "דפדף"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "תוכן"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "תוכן"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "מושבת"
@@ -665,7 +739,7 @@ msgstr "נא לבחור תיקיה"
msgid "Select file"
msgstr "נא לבחור קובץ"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "הצגת שמות טכניים"
@@ -814,6 +888,10 @@ msgstr "תורמים קודמים"
msgid "Previous Core Developers"
msgstr "מפתחי ליבה קודמים"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "עיון בתוכן מקוון"
@@ -882,10 +960,6 @@ msgstr "אכסון שרת"
msgid "Install games from ContentDB"
msgstr "התקנת משחק מContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "שם"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "חדש"
@@ -894,10 +968,6 @@ msgstr "חדש"
msgid "No world created or selected!"
msgstr "אין עולם שנוצר או נבחר!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "סיסמה"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "להתחיל לשחק"
@@ -932,10 +1002,6 @@ msgid "Clear"
msgstr "נקה"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "התחברות"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "מצב יצירתי"
@@ -946,10 +1012,6 @@ msgid "Damage / PvP"
msgstr "חבלה"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "מחק מועדף"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "מועדף"
@@ -963,6 +1025,10 @@ msgid "Join Game"
msgstr "הצטרפות למשחק"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "פינג"
@@ -977,10 +1043,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "מחק מועדף"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "פורט לשרת"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "x2"
@@ -1025,7 +1100,7 @@ msgid "Dynamic shadows"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+msgid "Dynamic shadows:"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1121,7 +1196,8 @@ msgid "Tone Mapping"
msgstr "מיפוי גוונים"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "סף נגיעה: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1129,7 +1205,7 @@ msgid "Trilinear Filter"
msgstr "פילטר תלת לינארי"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1148,6 +1224,11 @@ msgstr "נוזלים עם גלים"
msgid "Waving Plants"
msgstr "צמחים מתנוענעים"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "בעיה בחיבור (נגמר זמן ההמתנה?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "זמן המתנה לחיבור אזל."
@@ -1285,7 +1366,7 @@ msgid "Camera update enabled"
msgstr "עדכון מצלמה מופעל"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1416,6 +1497,11 @@ msgid "Enabled unlimited viewing range"
msgstr "הפעלת טווח ראיה בלתי מוגבל"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "יוצר לקוח..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "יציאה לתפריט"
@@ -1922,28 +2008,6 @@ msgstr "הורדת $1 נכשלה"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "סיסמאות לא תואמות!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "הרשם והצטרף"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"אתה עומד להצטרף לשרת זה עם השם \"%s\" בפעם הראשונה.\n"
-"אם תמשיך, ייווצר חשבון חדש באמצעות אישוריך בשרת זה.\n"
-"אנא הקלד מחדש את הסיסמה שלך ולחץ על 'הירשם והצטרף' כדי לאשר את יצירת החשבון, "
-"או לחץ על 'ביטול' כדי לבטל."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "להמשיך"
@@ -1977,7 +2041,7 @@ msgstr ""
msgid "Change camera"
msgstr "שנה מצלמה"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "צ'אט"
@@ -2030,8 +2094,8 @@ msgid "Key already in use"
msgstr "מקש כבר בשימוש"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr "קישור מקשים (אם התפריט מתקלקל, הסר דברים מminetest.conf)"
+msgid "Keybindings."
+msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2102,10 +2166,6 @@ msgid "Change"
msgstr "שנה"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "אשר סיסמה"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "סיסמה חדשה"
@@ -2113,6 +2173,10 @@ msgstr "סיסמה חדשה"
msgid "Old Password"
msgstr "סיסמה ישנה"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "סיסמאות לא תואמות!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "יציאה"
@@ -2126,12 +2190,6 @@ msgstr "מושתק"
msgid "Sound Volume: %d%%"
msgstr "עוצמת שמע: "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "הכנס "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2139,6 +2197,16 @@ msgstr "הכנס "
msgid "LANG_CODE"
msgstr "he"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "נא לבחור שם!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2302,6 +2370,10 @@ msgstr ""
"שים לב שמצב interlaced מחייב הפעלת shaders."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2393,6 +2465,11 @@ msgstr ""
"כדי להיות בטוח) יוצר שכבת צף מוצקה."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "הוסף שם פריט"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "מתקדם"
@@ -2411,7 +2488,8 @@ msgstr ""
"זה משפיע מעט מאוד על אור הלילה הטבעי."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "תמיד לעוף ומהר"
#: src/settings_translation_file.cpp
@@ -2490,6 +2568,10 @@ msgstr ""
"מצוין במפה (16 קוביות)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "מקש התקדמות אוטומטית"
@@ -2531,10 +2613,6 @@ msgid "Base terrain height."
msgstr "גובה השטח."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "בסיסי"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "הרשאות בסיסיות"
@@ -2555,7 +2633,8 @@ msgid "Bind address"
msgstr "הצמד כתובת"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "פרמטרי רעש טמפרטורה ולחות של Biome API"
#: src/settings_translation_file.cpp
@@ -2567,6 +2646,10 @@ msgid "Block send optimize distance"
msgstr "אופטימיזצית שליחת בלוק"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "נתיב גופן עבה/מוטה"
@@ -2591,6 +2674,11 @@ msgid "Builtin"
msgstr "בילדאין"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "שנה מצלמה"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2758,6 +2846,11 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "קלינט"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2853,6 +2946,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2886,7 +2983,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2953,11 +3052,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3101,6 +3200,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Developer Options"
+msgstr "קישוטים"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Dig key"
msgstr "מקש התזוזה ימינה"
@@ -3122,6 +3226,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3191,6 +3301,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3207,19 +3321,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3293,6 +3401,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3311,6 +3423,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3388,8 +3504,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "החלקת קצוות (AA):"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3456,6 +3573,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3604,6 +3725,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "משחקים"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3631,6 +3765,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3648,10 +3790,15 @@ msgid "HTTP mods"
msgstr "מודים"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "מידע-על-מסך מוצג"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3889,11 +4036,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3954,6 +4108,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3975,7 +4135,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4015,10 +4177,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -4069,15 +4227,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4698,6 +4852,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4753,7 +4911,7 @@ msgstr "מקש התזוזה שמאלה"
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4763,15 +4921,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4783,7 +4944,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4811,6 +4973,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "החלקת תאורה"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5201,10 +5368,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5253,6 +5416,18 @@ msgid "Mipmapping"
msgstr "מיפמאפינג"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5339,16 +5514,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5361,6 +5536,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "הבלטת קוביות"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5398,10 +5578,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5495,10 +5671,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5546,10 +5718,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5718,6 +5886,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "מסך:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5745,6 +5918,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "צילום מסך"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5757,10 +5935,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5800,10 +5974,21 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
+#, fuzzy
+msgid "Server"
+msgstr "אכסון שרת"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
msgstr "שרת / שחקן יחיד"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "פורט לשרת"
+
+#: src/settings_translation_file.cpp
msgid "Server URL"
msgstr ""
@@ -5828,10 +6013,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "פורט לשרת"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5842,12 +6036,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5855,7 +6051,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5934,7 +6130,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6134,6 +6330,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "הגדרות"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6336,7 +6537,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6360,10 +6561,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6454,6 +6663,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6690,6 +6903,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6781,6 +7003,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "(cURL) זמן להורדה נגמר"
@@ -6802,25 +7028,47 @@ msgstr "(cURL) מגבלה לפעולות במקביל"
#~ msgid "Address / Port"
#~ msgstr "כתובת / פורט"
+#~ msgid "Basic"
+#~ msgstr "בסיסי"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "ביטים לפיקסל (עומק צבע) במצב מסך מלא."
#~ msgid "Configure"
#~ msgstr "קביעת תצורה"
+#~ msgid "Connect"
+#~ msgstr "התחברות"
+
#~ msgid "Credits"
#~ msgstr "תודות"
#~ msgid "Damage enabled"
#~ msgstr "נזק מופעל"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "הורדת משחק, כמו משחק Minetest, מאתר minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "הורד אחד מאתר minetest.net"
+
#, fuzzy
#~ msgid "Enable VBO"
#~ msgstr "אפשר בכל"
+#~ msgid "Enter "
+#~ msgstr "הכנס "
+
+#~ msgid "Game"
+#~ msgstr "משחק"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "התקנה: מקובץ: \"$1\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr "קישור מקשים (אם התפריט מתקלקל, הסר דברים מminetest.conf)"
+
#~ msgid "Main menu style"
#~ msgstr "סגנון התפריט הראשי"
@@ -6852,6 +7100,20 @@ msgstr "(cURL) מגבלה לפעולות במקביל"
#~ msgid "Yes"
#~ msgstr "כן"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "אתה עומד להצטרף לשרת זה עם השם \"%s\" בפעם הראשונה.\n"
+#~ "אם תמשיך, ייווצר חשבון חדש באמצעות אישוריך בשרת זה.\n"
+#~ "אנא הקלד מחדש את הסיסמה שלך ולחץ על 'הירשם והצטרף' כדי לאשר את יצירת "
+#~ "החשבון, או לחץ על 'ביטול' כדי לבטל."
+
#, fuzzy
#~ msgid "You died."
#~ msgstr "מתת"
diff --git a/po/hi/minetest.po b/po/hi/minetest.po
index f21076beb..dc79d1c87 100644
--- a/po/hi/minetest.po
+++ b/po/hi/minetest.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
"PO-Revision-Date: 2020-10-06 14:26+0000\n"
"Last-Translator: Eyekay49 <satvikpatwardhan@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/minetest/minetest/"
@@ -123,6 +123,31 @@ msgid "The server has requested a reconnect:"
msgstr "सर्वर वापस कनेक्ट करना चाहता है :"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "दुनिया चुन्हें :"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "प्रोटोकॉल संख्या एक नहीं है। "
@@ -135,6 +160,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "सर्वर केवल प्रोटोकॉल $1 से $2 ही लेता है। "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "हम केवल प्रोटोकॉल $1 ही लेते हैं।"
@@ -142,14 +171,21 @@ msgstr "हम केवल प्रोटोकॉल $1 ही लेते
msgid "We support protocol versions between version $1 and $2."
msgstr "हम प्रोटोकॉल $1 से $2 ही लेते हैं।"
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "रोकें"
@@ -289,7 +325,6 @@ msgid "Failed to download $1"
msgstr "$1 का डाऊनलोड असफल हुआ"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "अनेक खेल"
@@ -313,7 +348,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "इन्स्टाल : \"$1\" का फाईल टाईप अंजान है याफिर आरकाइव खराब है"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "माॅड"
@@ -407,12 +441,10 @@ msgid "Decorations"
msgstr "सजावट"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "मैनटेस्ट खेल जैसे अन्य खेल minetest.net से डाऊनलोड किए जा सकते हैं"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "आप किसी भी खेल को minetest.net से डाऊनलोड कर सकते हैं"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr ""
+"चेतावनी : न्यूनतम विकास खेल (Minimal development test) खेल बनाने वालों के लिए है।"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -430,10 +462,6 @@ msgstr "आसमान में तैरते हुए भूमि-खं
msgid "Floatlands (experimental)"
msgstr "फ्लोटलैंड्स (आसमान में तैरते हुए भूमि-खंड) (प्रायोगिक)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "खेल"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Non-fractal भूमि तैयार हो : समुद्र व भूमि के नीचे"
@@ -451,6 +479,15 @@ msgid "Increases humidity around rivers"
msgstr "नदियों के आसपास नमी बढ़ाता है"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "इन्स्टाल करें"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "झीलें"
@@ -550,11 +587,6 @@ msgid "Very large caverns deep in the underground"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-"चेतावनी : न्यूनतम विकास खेल (Minimal development test) खेल बनाने वालों के लिए है।"
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "दुनिया का नाम"
@@ -584,6 +616,39 @@ msgstr "pkgmgr: \"$1\" फाईल पार गलत है"
msgid "Delete World \"$1\"?"
msgstr "दुनिया रद्द करें?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "पासवर्ड दोबारा लिखें"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Missing name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Password"
+msgstr "नया पासवर्ड"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "पासवर्ड अलग-अलग हैं!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "पंजीकरण व खेलें"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "हां"
@@ -614,6 +679,16 @@ msgstr "वापस सेटिंग पृष्ठ पर जाएं"
msgid "Browse"
msgstr "ढूंढें"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "वस्तुएं"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "वस्तुएं"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "रुका हुआ"
@@ -671,7 +746,7 @@ msgstr "फाईल पाथ चुनें"
msgid "Select file"
msgstr "फाईल चुनें"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "तकनीकी नाम देखें"
@@ -818,6 +893,10 @@ msgstr "पूर्व सहायक"
msgid "Previous Core Developers"
msgstr "पूर्व मुख्य डेवेलपर"
+#: builtin/mainmenu/tab_about.lua
+msgid "Share debug log"
+msgstr ""
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "नेट पर वस्तुएं ढूंढें"
@@ -886,10 +965,6 @@ msgstr "सर्वर चलाएं"
msgid "Install games from ContentDB"
msgstr ""
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr ""
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "नया"
@@ -898,11 +973,6 @@ msgstr "नया"
msgid "No world created or selected!"
msgstr "कोई दुनिया उपस्थित या चुनी गयी नहीं है !"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-#, fuzzy
-msgid "Password"
-msgstr "नया पासवर्ड"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "खेल खेलें"
@@ -938,10 +1008,6 @@ msgid "Clear"
msgstr "खाली करें"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "कनेक्ट करें"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "असीमित संसाधन"
@@ -952,10 +1018,6 @@ msgid "Damage / PvP"
msgstr "- हानि : "
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "पसंद हटाएं"
-
-#: builtin/mainmenu/tab_online.lua
#, fuzzy
msgid "Favorites"
msgstr "पसंद"
@@ -969,6 +1031,10 @@ msgid "Join Game"
msgstr "खेल में शामिल होएं"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "पिंग"
@@ -983,10 +1049,19 @@ msgstr ""
#: builtin/mainmenu/tab_online.lua
#, fuzzy
+msgid "Remove favorite"
+msgstr "पसंद हटाएं"
+
+#: builtin/mainmenu/tab_online.lua
+#, fuzzy
msgid "Server Description"
msgstr "सर्वर पोर्ट"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "दुग्ना"
@@ -1031,7 +1106,7 @@ msgid "Dynamic shadows"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+msgid "Dynamic shadows:"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1128,7 +1203,8 @@ msgid "Tone Mapping"
msgstr "टोन मैपिंग"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "छूने की त्रिज्या : (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1136,7 +1212,7 @@ msgid "Trilinear Filter"
msgstr "त्रिरेखीय फिल्टर"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+msgid "Very High"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
@@ -1155,6 +1231,11 @@ msgstr "पानी में लहरें बनें"
msgid "Waving Plants"
msgstr "पाैधे लहराएं"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "कनेक्शन खराबी (समय अंत?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "कनेक्शन समय अंत|"
@@ -1292,7 +1373,7 @@ msgid "Camera update enabled"
msgstr "कैमरा चालू"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
#: src/client/game.cpp
@@ -1422,6 +1503,11 @@ msgid "Enabled unlimited viewing range"
msgstr "दृष्टि असीमित"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "क्लाइंट बनाया जा रहा है ..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "बंद करके मेनू पर जाएं"
@@ -1929,29 +2015,6 @@ msgstr "$1 का डाऊनलोड असफल हुआ"
msgid "Opening webpage"
msgstr ""
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "पासवर्ड अलग-अलग हैं!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "पंजीकरण व खेलें"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"आप \"%s\" नाम से इस सरवर में पहली बार आने वाले हैं। अगर आप आगे बढ़ते हैं तो आपके लिए इस "
-"सर्वर पर एक अकाउंट बनाया जाएगा।\n"
-"\n"
-"आगे बढ़ने ए लिखें कृपया अपने पासवर्ड को वापस लिखें और फिर 'पंजीकरण व खेलें' दबाएं, अथवा "
-"'रोकें' दबाएं।"
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "आगे बढ़े"
@@ -1985,7 +2048,7 @@ msgstr ""
msgid "Change camera"
msgstr "कैमरा बदलना"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "बातें"
@@ -2038,8 +2101,8 @@ msgid "Key already in use"
msgstr "की पहले से इस्तेमाल में है"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr "कीबोर्ड सेटिंग (अगर यह मेनू खराब हो जाए तो minetest.conf से सब कुछ खाली कर दें)"
+msgid "Keybindings."
+msgstr ""
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2110,10 +2173,6 @@ msgid "Change"
msgstr "बदलें"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "पासवर्ड दोबारा लिखें"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "नया पासवर्ड"
@@ -2121,6 +2180,10 @@ msgstr "नया पासवर्ड"
msgid "Old Password"
msgstr "पुराना पासवर्ड"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "पासवर्ड अलग-अलग हैं!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "निकास"
@@ -2134,12 +2197,6 @@ msgstr "चुप"
msgid "Sound Volume: %d%%"
msgstr "आवाज "
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "डालें "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2147,6 +2204,16 @@ msgstr "डालें "
msgid "LANG_CODE"
msgstr "hi"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "कृपया एक नाम चुनें!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2272,6 +2339,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2353,6 +2424,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "दुनिया का नाम"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr ""
@@ -2366,7 +2442,8 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "हमेशा उड़ान और तेज"
#: src/settings_translation_file.cpp
@@ -2435,6 +2512,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr ""
@@ -2476,10 +2557,6 @@ msgid "Base terrain height."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr ""
@@ -2500,7 +2577,7 @@ msgid "Bind address"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+msgid "Biome API noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2512,6 +2589,10 @@ msgid "Block send optimize distance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr ""
@@ -2536,6 +2617,11 @@ msgid "Builtin"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "कैमरा बदलना"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2694,6 +2780,10 @@ msgid "Client side node lookup range restriction"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Client-side Modding"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr ""
@@ -2789,6 +2879,10 @@ msgid "Console height"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Content Repository"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr ""
@@ -2822,7 +2916,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2889,11 +2985,11 @@ msgid "Debug log level"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
+msgid "Debugging"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
+msgid "Dec. volume key"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3036,6 +3132,11 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "सजावट"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
@@ -3056,6 +3157,12 @@ msgid "Display Density Scaling Factor"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr ""
@@ -3125,6 +3232,10 @@ msgid "Enable joysticks"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr ""
@@ -3141,19 +3252,13 @@ msgid "Enable random user input (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Enable smooth lighting with simple ambient occlusion.\n"
-"Disable for speed or for different looks."
+msgid "Enable split login/register"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3227,6 +3332,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr ""
@@ -3245,6 +3354,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr ""
@@ -3325,8 +3438,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr ""
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "ऐन्टी एलियासिंग :"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3393,6 +3507,10 @@ msgid "Fog toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr ""
@@ -3541,6 +3659,19 @@ msgid "GUI scaling filter txr2img"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "अनेक खेल"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr ""
@@ -3568,6 +3699,14 @@ msgid "Graphics"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Graphics Effects"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics and Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr ""
@@ -3584,10 +3723,15 @@ msgid "HTTP mods"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
+msgid "HUD"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "हे॰अ॰डि॰ दिखाई देंगी"
+
+#: src/settings_translation_file.cpp
msgid "HUD toggle key"
msgstr ""
@@ -3824,11 +3968,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr ""
@@ -3897,6 +4048,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
@@ -3918,7 +4075,9 @@ msgid ""
msgstr "चालू होने पर आप जहां देखेंगे उस दिशा को सामने माना जाएगा (पिच चलन)|"
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3960,10 +4119,6 @@ msgid "Ignore world errors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
@@ -4014,15 +4169,11 @@ msgid "Instrument the methods of entities on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4643,6 +4794,10 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
@@ -4698,7 +4853,7 @@ msgstr ""
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4708,15 +4863,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4728,7 +4886,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
#: src/settings_translation_file.cpp
@@ -4756,6 +4915,11 @@ msgid "Light curve low gradient"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "चिकना उजाला"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5140,10 +5304,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr ""
@@ -5192,6 +5352,18 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mod Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr ""
@@ -5278,16 +5450,16 @@ msgid "Near plane"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Networking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr ""
@@ -5300,6 +5472,11 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "डिब्बें उजाले हों"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr ""
@@ -5337,10 +5514,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr ""
@@ -5437,10 +5610,6 @@ msgstr ""
"इसके लिये \"उडान\" विषेशाधिकार आवश्यक है |"
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
@@ -5487,10 +5656,6 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr ""
@@ -5659,6 +5824,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "स्क्रीन :"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr ""
@@ -5686,6 +5856,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "स्क्रीनशॉट"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr ""
@@ -5698,10 +5873,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr ""
@@ -5741,8 +5912,19 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr ""
+#, fuzzy
+msgid "Server"
+msgstr "सर्वर चलाएं"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "- सर्वर का नाम : "
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "सर्वर पोर्ट"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -5769,10 +5951,19 @@ msgid "Server side occlusion culling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "सर्वर पोर्ट"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Serverlist and MOTD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr ""
@@ -5783,12 +5974,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
@@ -5796,7 +5989,7 @@ msgstr ""
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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
#: src/settings_translation_file.cpp
@@ -5872,7 +6065,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+msgid "Shadow strength gamma"
msgstr ""
#: src/settings_translation_file.cpp
@@ -6074,6 +6267,11 @@ msgid "Temperature variation for biomes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "सेटिंग"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr ""
@@ -6276,7 +6474,7 @@ msgid "Time speed"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
#: src/settings_translation_file.cpp
@@ -6300,10 +6498,18 @@ msgid "Touch screen threshold"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Touchscreen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr ""
@@ -6394,6 +6600,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr ""
@@ -6627,6 +6837,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
@@ -6716,6 +6935,10 @@ msgid "Y-level of seabed."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr ""
@@ -6751,21 +6974,41 @@ msgstr ""
#~ msgid "Configure"
#~ msgstr "सेटिंग बदलें"
+#~ msgid "Connect"
+#~ msgstr "कनेक्ट करें"
+
#~ msgid "Credits"
#~ msgstr "आभार सूची"
#~ msgid "Damage enabled"
#~ msgstr "हानि व मृत्यु हो सकती है"
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "मैनटेस्ट खेल जैसे अन्य खेल minetest.net से डाऊनलोड किए जा सकते हैं"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "आप किसी भी खेल को minetest.net से डाऊनलोड कर सकते हैं"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 का डाऊनलोड व इन्स्टाल चल रहा है, कृपया ठहरें ..."
+#~ msgid "Enter "
+#~ msgstr "डालें "
+
+#~ msgid "Game"
+#~ msgstr "खेल"
+
#~ msgid "Generate Normal Maps"
#~ msgstr "मामूली नक्शे बनाएं"
#~ msgid "Install: file: \"$1\""
#~ msgstr "इन्स्टाल : फाईल : \"$1\""
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "कीबोर्ड सेटिंग (अगर यह मेनू खराब हो जाए तो minetest.conf से सब कुछ खाली कर दें)"
+
#~ msgid "Main"
#~ msgstr "मुख्य"
@@ -6817,6 +7060,21 @@ msgstr ""
#~ msgid "Yes"
#~ msgstr "हां"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "आप \"%s\" नाम से इस सरवर में पहली बार आने वाले हैं। अगर आप आगे बढ़ते हैं तो आपके लिए "
+#~ "इस सर्वर पर एक अकाउंट बनाया जाएगा।\n"
+#~ "\n"
+#~ "आगे बढ़ने ए लिखें कृपया अपने पासवर्ड को वापस लिखें और फिर 'पंजीकरण व खेलें' दबाएं, अथवा "
+#~ "'रोकें' दबाएं।"
+
#, fuzzy
#~ msgid "You died."
#~ msgstr "आपकी मौत हो गयी"
diff --git a/po/hu/minetest.po b/po/hu/minetest.po
index ab9d0c49f..7bc6b5258 100644
--- a/po/hu/minetest.po
+++ b/po/hu/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Hungarian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-29 21:28+0000\n"
-"Last-Translator: Balázs Kovács <kovacs.balazs.ktk@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-06-05 13:19+0000\n"
+"Last-Translator: Ács Zoltán <acszoltan111@gmail.com>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/minetest/"
"minetest/hu/>\n"
"Language: hu\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 4.11-dev\n"
+"X-Generator: Weblate 4.13-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -44,7 +44,7 @@ msgstr "Online játékosok: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr "A kiemenő üzenetek sora jelenleg üres."
+msgstr "A kimenő üzenetek sora jelenleg üres."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
@@ -87,11 +87,11 @@ msgstr "[all | <cmd>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
-msgstr "OKÉ"
+msgstr "OK"
#: builtin/fstk/ui.lua
msgid "<none available>"
-msgstr "<egy sem elérhető>"
+msgstr "<nincs elérhető>"
#: builtin/fstk/ui.lua
msgid "An error occurred in a Lua script:"
@@ -111,7 +111,32 @@ msgstr "Újrakapcsolódás"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "A kiszolgáló újrakapcsolódást kért:"
+msgstr "A szerver újrakapcsolódást kért:"
+
+#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Modok kiválasztása"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
@@ -123,24 +148,35 @@ msgstr "A szerver által megkövetelt protokollverzió: $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "A kiszolgáló $1 és $2 protokollverzió közötti verziókat támogat. "
+msgstr "A szerver $1 és $2 protokollverzió közötti verziókat támogat. "
+
+#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr "Csak $1 protokollverziót támogjuk."
+msgstr "Csak $1 protokollverziót támogatjuk."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
msgstr "$1 és $2 közötti protokollverziókat támogatjuk."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Mégse"
@@ -279,7 +315,6 @@ msgid "Failed to download $1"
msgstr "$1 letöltése nem sikerült"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Játékok"
@@ -300,7 +335,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Telepítés: nem támogatott fájltípus vagy sérült archívum"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Modok"
@@ -314,19 +348,19 @@ msgstr "Nincs találat"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No updates"
-msgstr "nincs Frissiteni való"
+msgstr "Nincsenek frissítések"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
-msgstr "nem található"
+msgstr "Nem található"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
-msgstr "Felülír"
+msgstr "Felülírás"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr "az alapjáték ellenörzése szükséges ."
+msgstr "Az alapjáték ellenörzése szükséges ."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
@@ -350,7 +384,7 @@ msgstr "Összes frissítése [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr "További információ megnyitása a böngészőben"
+msgstr "További információ megtekintése böngészőben"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
@@ -393,12 +427,9 @@ msgid "Decorations"
msgstr "Dekorációk"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Játék (mint a minetest_game) letöltése a minetest.net címről"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Letöltés a minetest.net címről"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Figyelmeztetés: a Development Test fejlesztők számára készült."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -416,10 +447,6 @@ msgstr "Lebegő földtömegek az égben"
msgid "Floatlands (experimental)"
msgstr "Lebegő földek (kísérleti)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Játék"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Nem-fraktál terep generálása: Óceánok és földalatti rész"
@@ -437,6 +464,15 @@ msgid "Increases humidity around rivers"
msgstr "Megnöveli a páratartalmat a folyók körül"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "$1 telepítése"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Tavak"
@@ -464,7 +500,7 @@ msgstr "Hegyek"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr "Iszap áramlás"
+msgstr "Iszapáramlás"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
@@ -497,7 +533,7 @@ msgstr "Kezdőérték"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Smooth transition between biomes"
-msgstr "Sima átmenet a biomok között"
+msgstr "Lágy átmenet a biomok között"
#: builtin/mainmenu/dlg_create_world.lua
msgid ""
@@ -540,10 +576,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Nagyon nagy üregek mélyen a föld alatt"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Figyelmeztetés: a fejlesztői teszt fejlesztők számára készült."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Világ neve"
@@ -573,6 +605,39 @@ msgstr "pkgmgr: érvénytelen útvonal: „$1”"
msgid "Delete World \"$1\"?"
msgstr "Törlöd a(z) „$1” világot?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Jelszó megerősítése"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Térképgenerátor neve"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Név"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Jelszó"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "A jelszavak nem egyeznek!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Regisztráció és belépés"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Elfogadás"
@@ -605,6 +670,16 @@ msgstr "< Vissza a Beállításokra"
msgid "Browse"
msgstr "Tallózás"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Tartalom"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Tartalom"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Letiltva"
@@ -661,7 +736,7 @@ msgstr "Útvonal kiválasztása"
msgid "Select file"
msgstr "Fájl kiválasztása"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Technikai nevek megjelenítése"
@@ -767,12 +842,12 @@ msgstr "Betöltés…"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr "A nyilvános kiszolgálólista le van tiltva"
+msgstr "A nyilvános szerverlista le van tiltva"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
-"Próbáld újra engedélyezni a nyilvános kiszolgálólistát, és ellenőrizd az "
+"Próbáld újra engedélyezni a nyilvános szerverlistát, és ellenőrizd az "
"internetkapcsolatot."
#: builtin/mainmenu/tab_about.lua
@@ -789,11 +864,11 @@ msgstr "Aktív renderelő:"
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
-msgstr "Belső fejlesztők"
+msgstr "Játékmotor-fejlesztők"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
-msgstr "Felhasználói adatkönyvtár megnyitása"
+msgstr "Felhasználói adatok mappája"
#: builtin/mainmenu/tab_about.lua
msgid ""
@@ -810,7 +885,12 @@ msgstr "Korábbi közreműködők"
#: builtin/mainmenu/tab_about.lua
msgid "Previous Core Developers"
-msgstr "Korábbi belső fejlesztők"
+msgstr "Korábbi játékmotor-fejlesztők"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Hibakereső információ megjelenítése"
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
@@ -826,7 +906,7 @@ msgstr "Textúracsomag kikapcsolása"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
-msgstr "információ:"
+msgstr "Információ:"
#: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:"
@@ -870,7 +950,7 @@ msgstr "Sérülés engedélyezése"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr "Játék létrehozása"
+msgstr "Játék megosztása"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
@@ -880,10 +960,6 @@ msgstr "Szerver felállítása"
msgid "Install games from ContentDB"
msgstr "Játékok telepítése ContentDB-ről"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Név"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Új"
@@ -892,10 +968,6 @@ msgstr "Új"
msgid "No world created or selected!"
msgstr "Nincs létrehozott vagy kiválasztott világ!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Jelszó"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Játék indítása"
@@ -914,7 +986,7 @@ msgstr "Világ kiválasztása:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr "Szerver port"
+msgstr "Szerver portja"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
@@ -929,10 +1001,6 @@ msgid "Clear"
msgstr "Törlés"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Kapcsolódás"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Kreatív mód"
@@ -942,22 +1010,22 @@ msgid "Damage / PvP"
msgstr "Sérülés / PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Kedvenc törlése"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Kedvencek"
#: builtin/mainmenu/tab_online.lua
msgid "Incompatible Servers"
-msgstr "Inkompatibilis szerverek"
+msgstr "Nem kompatibilis szerverek"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
msgstr "Csatlakozás játékhoz"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -970,8 +1038,17 @@ msgid "Refresh"
msgstr "Frissítés"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Távoli port"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
-msgstr "Szerver leírás"
+msgstr "Szerver leírása"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -999,7 +1076,7 @@ msgstr "Élsimítás:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr "Képernyőméret automatikus mentése"
+msgstr "Képernyőméret megjegyzése"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
@@ -1011,14 +1088,15 @@ msgstr "Gombok megváltoztatása"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr "Csatlakozó üveg"
+msgstr "Csatlakoztatott üveg"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
msgstr "Dinamikus árnyékok"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Dinamikus árnyékok: "
#: builtin/mainmenu/tab_settings.lua
@@ -1039,11 +1117,11 @@ msgstr "Közepes"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr "Mipmap effekt"
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr "Mipmap + Anizotróp szűrés"
+msgstr "Mipmap + anizotróp szűrés"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
@@ -1051,15 +1129,15 @@ msgstr "Nincs szűrés"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr "Nincs Mipmap"
+msgstr "Nincs mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr "Node kiemelés"
+msgstr "Kockák kiemelése"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr "Node körvonal"
+msgstr "Kockák körvonala"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
@@ -1091,7 +1169,7 @@ msgstr "Árnyalók"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (experimental)"
-msgstr "Shaderek (kísérleti)"
+msgstr "Árnyalók (kísérleti)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
@@ -1103,7 +1181,7 @@ msgstr "Egyszerű levelek"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr "Simított megvilágítás"
+msgstr "Lágy megvilágítás"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
@@ -1111,10 +1189,11 @@ msgstr "Textúrázás:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr "Tónus rajzolás"
+msgstr "Színleképezés"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Érintésküszöb (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1122,7 +1201,8 @@ msgid "Trilinear Filter"
msgstr "Trilineáris szűrés"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Nagyon magas"
#: builtin/mainmenu/tab_settings.lua
@@ -1131,7 +1211,7 @@ msgstr "Nagyon alacsony"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr "Hullámzó levelek"
+msgstr "Ringatózó lombok"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
@@ -1139,7 +1219,12 @@ msgstr "Hullámzó folyadékok"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr "Hullámzó növények"
+msgstr "Ringatózó növények"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Kapcsolódási hiba (időtúllépés?)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
@@ -1151,11 +1236,11 @@ msgstr "Kész!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr "Node-ok előkészítése"
+msgstr "Kockák előkészítése"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr "Node-ok előkészítése…"
+msgstr "Kockák előkészítése…"
#: src/client/client.cpp
msgid "Loading textures..."
@@ -1187,7 +1272,7 @@ msgstr "Nincs világ kiválasztva és nincs cím megadva. Nincs mit tenni."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr "A játékos neve túl hosszú."
+msgstr "A játékosnév túl hosszú."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
@@ -1195,7 +1280,7 @@ msgstr "Válassz egy nevet!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr "jelszófájl megnyitás hiba: "
+msgstr "A megadott jelszófájlt nem sikerült megnyitni: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
@@ -1207,7 +1292,7 @@ msgid ""
"Check debug.txt for details."
msgstr ""
"\n"
-"Részletekért tekintsd meg a debug.txt fájlt."
+"A részletekért tekintsd meg a debug.txt fájlt."
#: src/client/game.cpp
msgid "- Address: "
@@ -1232,11 +1317,11 @@ msgstr "- PvP: "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr "- Kiszolgáló neve: "
+msgstr "- Szerver neve: "
#: src/client/game.cpp
msgid "A serialization error occurred:"
-msgstr "Szerializációs hiba történt:"
+msgstr "Hiba történt a sorosítás közben:"
#: src/client/game.cpp
#, c-format
@@ -1245,11 +1330,11 @@ msgstr "Hozzáférés megtagadva. Oka: %s"
#: src/client/game.cpp
msgid "Automatic forward disabled"
-msgstr "Automatikus előre kikapcsolva"
+msgstr "Önjárás letiltva"
#: src/client/game.cpp
msgid "Automatic forward enabled"
-msgstr "Automatikus előre engedélyezve"
+msgstr "Önjárás engedélyezve"
#: src/client/game.cpp
msgid "Block bounds hidden"
@@ -1265,7 +1350,7 @@ msgstr "Blokkhatárok mutatása az aktuális blokk esetén"
#: src/client/game.cpp
msgid "Block bounds shown for nearby blocks"
-msgstr "Blokkhatárok mutatása a közeli blokkok esetén"
+msgstr "Közeli blokkok blokkhatárainak megjelenítése"
#: src/client/game.cpp
msgid "Camera update disabled"
@@ -1276,21 +1361,22 @@ msgid "Camera update enabled"
msgstr "Kamera frissítés engedélyezve"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
"Blokkhatárok mutatása nem lehetséges ('basic_debug' jogosultság szükséges)"
#: src/client/game.cpp
msgid "Change Password"
-msgstr "Jelszó Módosítása"
+msgstr "Jelszó módosítása"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr "Filmszerű mód letiltva"
+msgstr "Operatőr mód letiltva"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr "Filmszerű mód engedélyezve"
+msgstr "Operatőr mód engedélyezve"
#: src/client/game.cpp
msgid "Client disconnected"
@@ -1356,7 +1442,7 @@ msgstr "Kliens létrehozása…"
#: src/client/game.cpp
msgid "Creating server..."
-msgstr "Kiszolgáló létrehozása…"
+msgstr "Szerver létrehozása…"
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
@@ -1407,6 +1493,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Korlátlan látótáv engedélyezése"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Kliens létrehozása…"
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Kilépés a főmenübe"
@@ -1496,7 +1587,7 @@ msgstr "Noclip mód engedélyezve (de nincs jogosultságod)"
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr "Node-ok meghatározása…"
+msgstr "Kockák meghatározása…"
#: src/client/game.cpp
msgid "Off"
@@ -1520,7 +1611,7 @@ msgstr "Profilergrafika megjelenítése"
#: src/client/game.cpp
msgid "Remote server"
-msgstr "Távoli kiszolgáló"
+msgstr "Távoli szerver"
#: src/client/game.cpp
msgid "Resolving address..."
@@ -1680,11 +1771,11 @@ msgstr "IME Kilépés"
#: src/client/keycode.cpp
msgid "IME Mode Change"
-msgstr "IME Mód váltás"
+msgstr "IME módváltás"
#: src/client/keycode.cpp
msgid "IME Nonconvert"
-msgstr "IME Nem átalakított"
+msgstr "IME nem átalakított"
#: src/client/keycode.cpp
msgid "Insert"
@@ -1897,11 +1988,11 @@ msgstr "Minimap radar módban, Nagyítás x%d"
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in surface mode, Zoom x%d"
-msgstr "kistérkép terület módban x%d"
+msgstr "Kistérkép terület módban x%d"
#: src/client/minimap.cpp
msgid "Minimap in texture mode"
-msgstr "Minimap textúra módban"
+msgstr "Kistérkép textúra módban"
#: src/gui/guiChatConsole.cpp
msgid "Failed to open webpage"
@@ -1911,30 +2002,6 @@ msgstr "Weblap megnyitása nem sikerült"
msgid "Opening webpage"
msgstr "Weblap megnyitása"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "A jelszavak nem egyeznek!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Regisztráció és belépés"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Most először csatlakozol erre a szerverre a \"%s\" névvel.\n"
-"Ha folytatod, akkor a hitelesítő adataiddal egy új fiók jön létre a "
-"szerveren.\n"
-"Kérlek írd be újra a jelszavad, majd kattints a \"Regisztráció és "
-"Bejelentkezés\"-re, hogy megerősítsd a fióklétrehozást, vagy kattints a "
-"\"Mégse\" gombra a megszakításhoz."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Folytatás"
@@ -1945,7 +2012,7 @@ msgstr "\"Aux1\" = lemászás"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
-msgstr "Automatikus előre"
+msgstr "Önjárás"
#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Automatic jumping"
@@ -1967,7 +2034,7 @@ msgstr "Blokkhatárok"
msgid "Change camera"
msgstr "Nézet váltása"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Csevegés"
@@ -2020,10 +2087,8 @@ msgid "Key already in use"
msgstr "A gomb már használatban van"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Billentyűzetkiosztás. (Ha ez a menü összeomlik, távolíts el néhány dolgot a "
-"minetest.conf-ból)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2094,10 +2159,6 @@ msgid "Change"
msgstr "Megváltoztatás"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Jelszó megerősítése"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Új jelszó"
@@ -2105,6 +2166,10 @@ msgstr "Új jelszó"
msgid "Old Password"
msgstr "Régi jelszó"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "A jelszavak nem egyeznek!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Kilépés"
@@ -2118,12 +2183,6 @@ msgstr "Némitva"
msgid "Sound Volume: %d%%"
msgstr "Hangerő: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Belépés "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2131,14 +2190,24 @@ msgstr "Belépés "
msgid "LANG_CODE"
msgstr "hu"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Válassz egy nevet!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
"If disabled, virtual joystick will center to first-touch's position."
msgstr ""
-"(Android) A virtuális joystick helyének javítása.\n"
-"Ha ez kikapcsolva, akkor a virtuális joystick középen lesz az 'Első "
-"kattintás' pozícióban."
+"(Android) A virtuális joystick helyének rögzítése.\n"
+"Ha le van tiltva, akkor a kijelző megérintésének kezdőpozíciója lesz a "
+"virtuális joystick középpontja."
#: src/settings_translation_file.cpp
msgid ""
@@ -2146,9 +2215,9 @@ msgid ""
"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
-"(Android) Használd a virtuális joystick-ot az \"Aux1\" gomb kapcsolásához.\n"
-"Ha ez engedélyezve van, akkor a virtuális joystick is aktiválja az \"Aux1\" "
-"gombot ha kint van a fő körből."
+"(Android) Használd a virtuális joystickot az \"Aux1\" gomb működtetéséhez.\n"
+"Ha ez engedélyezve van, akkor a virtuális joystick fő körén kívülre húzáskor "
+"az \"Aux1\" gomb is lenyomódik."
#: src/settings_translation_file.cpp
msgid ""
@@ -2170,7 +2239,7 @@ msgstr ""
"Az alapérték úgy lett meghatározva, hogy megfelelő játékoskezdőpontot adjon\n"
"az alapparaméterekkel generált Mandelbrot-halmazokhoz, de egyéb esetben\n"
"lehet, hogy meg kell változtatni.\n"
-"Nagyjából -2 és 2 közötti értékek. Blokkokban mért pozícióhoz szorzzunk az "
+"Nagyjából -2 és 2 közötti értékek. Kockákban mért pozícióhoz szorzunk az "
"egységgel."
#: src/settings_translation_file.cpp
@@ -2183,7 +2252,7 @@ msgid ""
"Default is for a vertically-squashed shape suitable for\n"
"an island, set all 3 numbers equal for the raw shape."
msgstr ""
-"A fraktál (X,Y,Z) méretezési faktora blokktávolságban kifejezve.\n"
+"A fraktál (X,Y,Z) méretezési faktora kockatávolságban kifejezve.\n"
"A fraktál tényleges mérete 2-3-szorosa lesz ennek.\n"
"Ezek a számok nagyon nagyok is lehetnek, a fraktálnak\n"
"nem kell elférnie a világban.\n"
@@ -2296,7 +2365,11 @@ msgstr ""
"- sidebyside: osztott képernyő kétoldalt.\n"
"- crossview: bandzsítva nézendő 3d\n"
"- pageflip: quadbuffer alapú 3d.\n"
-"Ne feledje, hogy az interlaced üzemmód, igényli az árnyékolók használatát."
+"Ne feledje, hogy az interlaced üzemmód, igényli az árnyalók használatát."
+
+#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
@@ -2332,7 +2405,7 @@ msgstr "Gyorsulás levegőben"
#: src/settings_translation_file.cpp
msgid "Acceleration of gravity, in nodes per second per second."
-msgstr "Gravitációs gyorsulás, node-okban másodpercenként."
+msgstr "Gravitációs gyorsulás, kocka/másodperc/másodpercben."
#: src/settings_translation_file.cpp
msgid "Active Block Modifiers"
@@ -2362,7 +2435,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Adds particles when digging a node."
-msgstr "Részecskéket hoz létre egy node ásásakor."
+msgstr "Részecskéket mutat a kockák ásásakor."
#: src/settings_translation_file.cpp
msgid ""
@@ -2388,14 +2461,19 @@ msgid ""
"to be sure) creates a solid floatland layer."
msgstr ""
"A lebegő föld réteg sűrűségét szabályozza.\n"
-"Nagyobb sűrűséghez használjon nagyobb értéket. Lehet pozitív vagy negatív is."
-"\n"
+"Nagyobb sűrűséghez használjon nagyobb értéket. Lehet pozitív vagy negatív "
+"is.\n"
"Érték = 0,0: a térfogat 50%-a lebegő föld.\n"
"Érték = 2,0 (magasabb is lehet az 'mgv7_np_floatland'-től függően, a "
"biztonság\n"
"kedvéért mindig próbálja ki) egybefüggő lebegő föld réteget eredményez."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Elemnév hozzáadása"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Haladó"
@@ -2414,8 +2492,9 @@ msgstr ""
"a természetes éjszakai fényre nagyon kis hatása van."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
-msgstr "Repülés és gyors mód mindig"
+#, fuzzy
+msgid "Always fly fast"
+msgstr "Állandó repülés és gyors mód"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
@@ -2492,15 +2571,19 @@ msgstr ""
"néha a felszínen lévők sem.)\n"
"Ha ez az érték nagyobb, mint a \"max_block_send_distance\", akkor nincs\n"
"optimalizáció.\n"
-"A távolság blokkokban értendő (16 node)."
+"A távolság blokkokban értendő (16 kocka)."
+
+#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Automatic forward key"
-msgstr "Automatikus előre gomb"
+msgstr "Önjárás gomb"
#: src/settings_translation_file.cpp
msgid "Automatically jump up single-node obstacles."
-msgstr "Automatikusan felugrik az egy node magas akadályokra."
+msgstr "Automatikusan felugrik az egy kocka magas akadályokra."
#: src/settings_translation_file.cpp
msgid "Automatically report to the serverlist."
@@ -2508,7 +2591,7 @@ msgstr "Automatikus bejelentés a szerverlistára."
#: src/settings_translation_file.cpp
msgid "Autosave screen size"
-msgstr "Képernyőméret automatikus mentése"
+msgstr "Képernyőméret megjegyzése"
#: src/settings_translation_file.cpp
msgid "Autoscaling mode"
@@ -2532,11 +2615,7 @@ msgstr "Talajszint"
#: src/settings_translation_file.cpp
msgid "Base terrain height."
-msgstr "Alap terep magassága."
-
-#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Alap"
+msgstr "Az elsődleges terep magassága."
#: src/settings_translation_file.cpp
msgid "Basic privileges"
@@ -2559,7 +2638,8 @@ msgid "Bind address"
msgstr "Cím csatolása"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Biom API hőmérséklet- és páratartalom zaj paraméterei"
#: src/settings_translation_file.cpp
@@ -2571,6 +2651,10 @@ msgid "Block send optimize distance"
msgstr "Max blokk küldési távolság"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Félkövér dőlt betűtípus útvonal"
@@ -2595,14 +2679,19 @@ msgid "Builtin"
msgstr "Beépített"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Nézet váltása"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
"Increasing can reduce artifacting on weaker GPUs.\n"
"0.1 = Default, 0.25 = Good value for weaker tablets."
msgstr ""
-"A kamera \"közelségi vágósíkjának\" blokktávolságban mért távolsága 0 és "
-"0,25 között.\n"
+"A kamera \"közelségi vágósíkjának\" kockákban mért távolsága 0 és 0,25 "
+"között.\n"
"Csak GLES platformon működik. A legtöbb felhasználó változatlanul "
"hagyhatja.\n"
"Növelése csökkentheti a grafikai hibákat a gyengébb GPU-kon.\n"
@@ -2610,11 +2699,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr "Kamera simítás"
+msgstr "Kamera stabilizálása"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr "Kamera simítás filmszerű módban"
+msgstr "Lágy kameramozgás operatőr módban"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
@@ -2722,11 +2811,11 @@ msgstr "Térképdarabka (chunk) mérete"
#: src/settings_translation_file.cpp
msgid "Cinematic mode"
-msgstr "Filmszerű mód"
+msgstr "Operatőr mód"
#: src/settings_translation_file.cpp
msgid "Cinematic mode key"
-msgstr "Filmszerű mód gomb"
+msgstr "Operatőr mód gomb"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
@@ -2758,7 +2847,12 @@ msgstr "Kliens modolási korlátozások"
#: src/settings_translation_file.cpp
msgid "Client side node lookup range restriction"
-msgstr "A blokk keresési távolság kliensoldali korlátozása"
+msgstr "A kockakeresési távolság kliensoldali korlátozása"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Kliens modolás"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
@@ -2774,7 +2868,7 @@ msgstr "Felhők"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
-msgstr "A felhő kliens oldali effekt."
+msgstr "A felhő kliens oldali effektus."
#: src/settings_translation_file.cpp
msgid "Clouds in menu"
@@ -2856,7 +2950,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Connect glass"
-msgstr "Üveg csatlakozása"
+msgstr "Üveg összeillesztése"
#: src/settings_translation_file.cpp
msgid "Connect to external media server"
@@ -2864,7 +2958,7 @@ msgstr "Csatlakozás külső médiaszerverhez"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
-msgstr "Üveg csatlakoztatása ha a node támogatja."
+msgstr "Üvegfelületek egybeolvasztása, ha a kocka támogatja."
#: src/settings_translation_file.cpp
msgid "Console alpha"
@@ -2879,6 +2973,11 @@ msgid "Console height"
msgstr "Konzol magasság"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Online tartalomtár"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "ContentDB zászló feketelista"
@@ -2892,16 +2991,15 @@ msgstr "ContentDB URL"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr "Folyamatos előre"
+msgstr "Önjárás"
#: src/settings_translation_file.cpp
msgid ""
"Continuous forward movement, toggled by autoforward key.\n"
"Press the autoforward key again or the backwards movement to disable."
msgstr ""
-"Folyamatos előre mozgás, az \"autoforward\" gomb segítségével.\n"
-"Nyomja meg az \"autoforward\" gombot, vagy a hátrafelé gombot a "
-"kikapcsoláshoz."
+"Az \"Önjárás\" gombbal aktiválható folyamatos előre mozgás.\n"
+"Nyomja meg az \"Önjárás\" vagy a hátrafelé gombot a kikapcsoláshoz."
#: src/settings_translation_file.cpp
msgid "Controls"
@@ -2919,8 +3017,10 @@ msgstr ""
"változatlan marad."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Folyadékban a süllyedési sebességet szabályozza."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2994,12 +3094,12 @@ msgid "Debug log level"
msgstr "Hibakereső naplózás szintje"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Hangerő csökkentés gomb"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Csökkentse ezt hogy megnövelje a folyadék ellenállását."
+msgid "Dec. volume key"
+msgstr "Hangerő csökkentés gomb"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3135,7 +3235,7 @@ msgid ""
"Description of server, to be displayed when players join and in the "
"serverlist."
msgstr ""
-"A szerver leírása, ami a szerverlistában jelenik meg és amikor a játékosok "
+"A szerver leírása, amely a szerverlistában jelenik meg és amikor a játékosok "
"csatlakoznak."
#: src/settings_translation_file.cpp
@@ -3155,6 +3255,11 @@ msgid "Desynchronize block animation"
msgstr "Blokkanimáció deszinkronizálása"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Dekorációk"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Ásás gomb"
@@ -3175,6 +3280,12 @@ msgid "Display Density Scaling Factor"
msgstr "Képsűrűség méretezési faktor"
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "A szerver domain neve, ami a szerverlistában megjelenik."
@@ -3238,7 +3349,7 @@ msgid ""
"On true translucent nodes cast colored shadows. This is expensive."
msgstr ""
"Színes árnyékok engedélyezése.\n"
-"Igaz érték esetén áttettsző blokkok színes árnyékot vethetnek. "
+"Igaz érték esetén az áttettsző kockák színes árnyékot vetnek. "
"Erőforrásigényes."
#: src/settings_translation_file.cpp
@@ -3254,6 +3365,10 @@ msgid "Enable joysticks"
msgstr "Joystick engedélyezése"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "A mod csatornák támogatásának engedélyezése."
@@ -3272,27 +3387,18 @@ msgstr ""
"használható)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Regisztráció megerősítés engedélyezése"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Ha be van kapcsolva, a regisztráció megerősítését kéri, amikor csatlakozik "
-"egy szerverhez.\n"
-"Ha ki van kapcsolva, az új fiók automatikusan regisztrálásra kerül."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
-"A simított megvilágítás engedélyezése egyszerű környezeti árnyékolással.\n"
+"A lágy megvilágítás engedélyezése egyszerű környezeti árnyékolással.\n"
"A sebesség érdekében vagy másféle kinézetért kikapcsolhatod."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3392,6 +3498,11 @@ msgstr ""
"befolyásolják a játszhatóságot."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Völgyek profilja"
+
+#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
msgstr "Játékmotor profiler adatok kiírási időköze"
@@ -3417,6 +3528,10 @@ msgstr ""
"egybefüggű lebegő föld réteghez használható."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "FPS, amikor a játék meg van állítva, vagy nincs fókuszban"
@@ -3488,7 +3603,7 @@ msgstr "Kitöltőanyag mélység zaj"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr "Filmes tónus effekt"
+msgstr "Filmes színhatás"
#: src/settings_translation_file.cpp
msgid ""
@@ -3507,8 +3622,9 @@ msgstr ""
"kapcsolva."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Szűrés"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Élsimítás:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3578,6 +3694,11 @@ msgid "Fog toggle key"
msgstr "Köd váltása gomb"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Betűtípus mérete"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Félkövér betűtípus alapértelmezetten"
@@ -3609,7 +3730,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
-msgstr "A monospace betűtípus betűmérete, ahol 1 egység = 1 pixel 96 DPI esetén"
+msgstr ""
+"A monospace betűtípus betűmérete, ahol 1 egység = 1 pixel 96 DPI esetén"
#: src/settings_translation_file.cpp
msgid ""
@@ -3711,14 +3833,14 @@ msgid ""
"nodes)."
msgstr ""
"Milyen távolságból generálódnak a blokkok a kliensek számára, "
-"térképblokkokban megadva (16 blokk)."
+"térképblokkokban megadva (16 kocka)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
"Milyen távolságból lesznek elküldve a blokkok a kliens számára, "
-"térképblokkokban megadva (16 blokk)."
+"térképblokkokban megadva (16 kocka)."
#: src/settings_translation_file.cpp
msgid ""
@@ -3729,7 +3851,7 @@ msgid ""
"player is looking. (This can avoid mobs suddenly disappearing from view)"
msgstr ""
"Mekkora távolságból észleljék a kliensek az objektumokat, térképblokkokban "
-"mérve (16 blokk).\n"
+"mérve (16 kocka).\n"
"\n"
"Ha nagyobbra van állítva, mint az active_block_range, akkor a szervert arra "
"kényszeríti, hogy\n"
@@ -3758,6 +3880,19 @@ msgid "GUI scaling filter txr2img"
msgstr "Felhasználói felület méretarány szűrő txr2img"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Játékok"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Globális visszatérések"
@@ -3794,6 +3929,16 @@ msgid "Graphics"
msgstr "Grafika"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravitáció"
@@ -3810,8 +3955,13 @@ msgid "HTTP mods"
msgstr "HTTP Modok"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Vezérlőelemek mérete"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Felhasználói felület méretaránya"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -3840,8 +3990,8 @@ msgid ""
msgstr ""
"Hagyja, hogy a profiler behangolja magát:\n"
"* Üres függvény behangolása.\n"
-"Ezáltal mérhető, hogy a hangolás maga mennyi időbe telik (+1 függvényhívás)."
-"\n"
+"Ezáltal mérhető, hogy a hangolás maga mennyi időbe telik (+1 "
+"függvényhívás).\n"
"* A mintavevő hangolása a mutatószámok frissítésehez."
#: src/settings_translation_file.cpp
@@ -3900,7 +4050,7 @@ msgid ""
"in nodes per second per second."
msgstr ""
"Vízszintes gyorsulás a levegőben ugráskor vagy leeséskor,\n"
-"node/másodperc/másodpercben."
+"kocka/másodperc/másodpercben."
#: src/settings_translation_file.cpp
msgid ""
@@ -3908,7 +4058,7 @@ msgid ""
"in nodes per second per second."
msgstr ""
"Vízszintes és függőleges gyorsulás gyors módban,\n"
-"node/másodperc/másodpercben."
+"kocka/másodperc/másodpercben."
#: src/settings_translation_file.cpp
msgid ""
@@ -3916,7 +4066,7 @@ msgid ""
"in nodes per second per second."
msgstr ""
"Vízszintes és függőleges gyorsulás a földön, vagy mászáskor,\n"
-"node/másodpercben."
+"kocka/másodperc/másodpercben."
#: src/settings_translation_file.cpp
msgid "Hotbar next key"
@@ -4066,16 +4216,25 @@ msgid ""
msgstr ""
"Milyen gyorsan mozognak a folyadékhullámok. Magasabb = gyorsabb.\n"
"Ha negatív, a folyadékhullámok hátrafelé mozognak.\n"
-"A hullámzó folyadékokat engedélyezni kell hozzá."
+"Engedélyezni kell a hullámzó folyadékokat hozzá."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Mennyi ideig vár a szerver, mielőtt eltávolítja a memóriából a nem használt "
"térképblokkokat.\n"
-"Magasabb érték egyenletesebb, de több RAM-ot használ."
+"Magasabb érték stabilabb, de több RAM-ot használ."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Csökkentse ezt hogy megnövelje a folyadék ellenállását."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
@@ -4114,8 +4273,8 @@ msgid ""
"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
-"Ha le van tiltva, az \"Aux1\" gomb lesz használatban a gyors repüléshez,\n"
-"ha a repülés és a gyors mód is engedélyezve van."
+"Ha le van tiltva, az \"Aux1\" gombbal lehet gyorsan repülni, ha a repülés és "
+"a gyors mód is engedélyezve van."
#: src/settings_translation_file.cpp
msgid ""
@@ -4137,7 +4296,7 @@ msgid ""
"This requires the \"noclip\" privilege on the server."
msgstr ""
"Ha a repülés móddal együtt van engedélyezve, a játékos átrepülhet szilárd\n"
-"node-okon. Szükséges hozzá a noclip jogosultság a szerveren."
+"kockákon. Szükséges hozzá a noclip jogosultság a szerveren."
#: src/settings_translation_file.cpp
msgid ""
@@ -4145,9 +4304,18 @@ msgid ""
"and\n"
"descending."
msgstr ""
-"Ha engedélyezve van, az \"Aux1\"gomb lesz használatban a \"lopakodás"
-"\" (sneak) helyett lefelé mászáskor,\n"
-"vagy ereszkedéskor."
+"Ha engedélyezve van, az \"Aux1\" gombbal lehet lefelé mászni vagy "
+"leereszkedni a \"Lopakodás\" gomb helyett."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Ha be van kapcsolva, a regisztráció megerősítését kéri, amikor csatlakozik "
+"egy szerverhez.\n"
+"Ha ki van kapcsolva, az új fiók automatikusan regisztrálásra kerül."
#: src/settings_translation_file.cpp
msgid ""
@@ -4176,11 +4344,14 @@ msgid ""
"If enabled, makes move directions relative to the player's pitch when flying "
"or swimming."
msgstr ""
-"Ha engedélyezve van a játékos abba az irányba megy amerre néz, amikor úszik "
-"vagy repül."
+"Ha engedélyezve van, a játékos abba az irányba megy, amerre néz, amikor "
+"úszik vagy repül."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr "Ha engedélyezve van, új játékosok nem csatlakozhatnak jelszó nélkül."
#: src/settings_translation_file.cpp
@@ -4189,7 +4360,7 @@ msgid ""
"you stand.\n"
"This is helpful when working with nodeboxes in small areas."
msgstr ""
-"Ha engedélyezve van, elhelyezhetsz node-okat oda, ahol állsz (láb + "
+"Ha engedélyezve van, lehelyezhetsz kockákat oda, ahol állsz (láb + "
"szemmagasság).\n"
"Ez segít, ha kis területen dolgozol."
@@ -4199,10 +4370,10 @@ msgid ""
"limited\n"
"to this distance from the player to the node."
msgstr ""
-"Ha a CSM korlátozás be van kapcsolva az aktív blokktávolságra, akkor a "
+"Ha a CSM-korlátozás be van kapcsolva az aktív kockák távolságára, akkor a "
"get_node\n"
-"hívások korlátozva lesznek a játkostól e távolságon belül található "
-"blokkokra."
+"hívások korlátozva lesznek a játékostól e távolságon belül található "
+"kockákra."
#: src/settings_translation_file.cpp
msgid ""
@@ -4236,10 +4407,6 @@ msgid "Ignore world errors"
msgstr "Világhibák figyelmen kívül hagyása"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Játékon belül"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Játékon belüli csevegő konzol hátterének átlátszósága (0 és 255 között)."
@@ -4259,7 +4426,7 @@ msgstr "Hangerő növelése gomb"
#: src/settings_translation_file.cpp
msgid "Initial vertical speed when jumping, in nodes per second."
-msgstr "Kezdeti függőleges sebesség ugráskor, node/másodpercben."
+msgstr "Kezdeti függőleges sebesség ugráskor, kocka/másodpercben."
#: src/settings_translation_file.cpp
msgid ""
@@ -4267,7 +4434,8 @@ msgid ""
"This is usually only needed by core/builtin contributors"
msgstr ""
"Beépülő behangolása.\n"
-"Erre általában csak core/builtin közreműködőknek van szükségük"
+"Erre általában csak a játékmotor vagy a beépülők készítésében "
+"közreműködőknek van szükségük"
#: src/settings_translation_file.cpp
msgid "Instrument chat commands on registration."
@@ -4284,29 +4452,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Instrument the action function of Active Block Modifiers on registration."
-msgstr "Az Aktív blokk módosítók akciófüggvényének behangolása regisztrációkor."
+msgstr ""
+"Az aktív blokk módosítók akciófüggvényének behangolása regisztrációkor."
#: src/settings_translation_file.cpp
msgid ""
"Instrument the action function of Loading Block Modifiers on registration."
msgstr ""
-"A Betöltendő blokk módosítók akciófüggvényének behangolása regisztrációkor."
+"A betöltendő blokk módosítók akciófüggvényének behangolása regisztrációkor."
#: src/settings_translation_file.cpp
msgid "Instrument the methods of entities on registration."
msgstr "Az entitások metódusainak hangolása regisztrációkor."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Behangolás"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Fontos változások mentésének időköze a világban, másodpercekben megadva."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "A napszak kliensnek való küldésének gyakorisága."
#: src/settings_translation_file.cpp
@@ -4319,7 +4485,7 @@ msgstr "Felszerelés gomb"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
-msgstr "Fordított egér"
+msgstr "Egér megfordítása"
#: src/settings_translation_file.cpp
msgid "Invert vertical mouse movement."
@@ -4327,11 +4493,11 @@ msgstr "Függőleges egérmozgás megfordítása."
#: src/settings_translation_file.cpp
msgid "Italic font path"
-msgstr "Dőlt betűtípus útvonal"
+msgstr "Dőlt betűtípus útvonala"
#: src/settings_translation_file.cpp
msgid "Italic monospace font path"
-msgstr "Dőlt monspace betűtípus útvonal"
+msgstr "Dőlt monospace betűtípus útvonala"
#: src/settings_translation_file.cpp
msgid "Item entity TTL"
@@ -4360,7 +4526,7 @@ msgstr "Joystick ID"
#: src/settings_translation_file.cpp
msgid "Joystick button repetition interval"
-msgstr "Joystick gomb ismétlési időköz"
+msgstr "Joystick gomb ismétlési időköze"
#: src/settings_translation_file.cpp
msgid "Joystick dead zone"
@@ -4368,11 +4534,11 @@ msgstr "Joystick holttér"
#: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity"
-msgstr "Joystick látómező érzékenység"
+msgstr "Joystick látómező-érzékenység"
#: src/settings_translation_file.cpp
msgid "Joystick type"
-msgstr "Joystick típus"
+msgstr "Joystick típusa"
#: src/settings_translation_file.cpp
msgid ""
@@ -4536,7 +4702,7 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Gomb a játékos hátrafelé mozgásához.\n"
-"Az automatikus előremozgást is kikapcsolja, ha aktív.\n"
+"Kikapcsolja az önjárást is, ha aktív.\n"
"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4626,7 +4792,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Gomb az elhelyezéshez.\n"
+"Gomb a lehelyezéshez.\n"
"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -4979,8 +5145,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Gomb a lopakodáshoz.\n"
-"A lefelé mászáshoz és vízben történő ereszkedéshez is használt, ha a "
-"aux1_descends le van tiltva.\n"
+"A lefelé mászáshoz és vízben történő ereszkedéshez is ezt lehet használni, "
+"ha az aux1_descends le van tiltva.\n"
"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5010,7 +5176,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Gomb az automatikus előrehaladás módra váltáshoz.\n"
+"Gomb az automatikus előrehaladás bekapcsolásához.\n"
"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5020,7 +5186,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Gomb a filmszerű mód váltásához.\n"
+"Gomb az operatőr mód kapcsolgatásához.\n"
"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -5165,6 +5331,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Azon játékosok kirúgása, akik 10 másodpercenként több mint X üzenetet "
@@ -5214,20 +5384,21 @@ msgid ""
"- Opaque: disable transparency"
msgstr ""
"Levelek stílusa:\n"
-"- Szép: minden oldal látható\n"
-"- Egyszerű: csak a külső oldalak láthatók, ha meg van határozva a "
-"special_tiles használt\n"
-"- Átlátszatlan: átlátszóság kikapcsolása"
+"- fancy: (szép) minden oldal látható\n"
+"- simple: (egyszerű) csak a külső oldalak láthatók, a special_tiles-t "
+"használja, ha meg van adva\n"
+"- opaque: (átlátszatlan) átlátszóság kikapcsolása"
#: src/settings_translation_file.cpp
msgid "Left key"
msgstr "Bal gomb"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"A szerver órajelének hossza és az az intervallum, amely alatt az "
"objektumokat általánosan\n"
@@ -5242,18 +5413,25 @@ msgstr ""
"A hullámzó folyadékok engedélyezése szükséges hozzá."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Az Aktív Blokk módosító (ABM) végrehajtási ciklusok közötti időtartam"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Két NodeTimer végrehajtás között eltelt idő"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Két aktív blokk kezelési fázis között eltelt idő"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5262,7 +5440,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"A debug.txt fájlba írandó naplózási szint:\n"
"-semmi (nincs naplózás)\n"
@@ -5298,12 +5477,17 @@ msgid "Light curve low gradient"
msgstr "A fénygörbe aljának gradiense"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Lágy megvilágítás"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
"Value is stored per-world."
msgstr ""
-"A térképgenerálás határa, node-okban, mind a 6 irányban a (0, 0, 0) "
+"A térképgenerálás határa, kockákban, mind a 6 irányban a (0, 0, 0) "
"pozíciótól kezdve.\n"
"Csak a teljesen a térképgenerálási határon belül lévő térképdarabkák "
"generálódnak le.\n"
@@ -5329,7 +5513,7 @@ msgstr "Folyadék folyékonysága"
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
-msgstr "Folyadék folyásának simítása"
+msgstr "Folyadékok egyenletesebb folyása"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
@@ -5364,7 +5548,7 @@ msgstr ""
"A játék profiler betöltése hogy játékprofílozási adatokat gyűjtsön.\n"
"Elérhetővé teszi a /profiler parancsot, amellyel elérhetők az összeállított "
"profilok.\n"
-"Hasznos lehet mod fejelsztőknek és szerver üzemeltetőknek."
+"Hasznos lehet modfejelsztőknek és szerverüzemeltetőknek."
#: src/settings_translation_file.cpp
msgid "Loading Block Modifiers"
@@ -5748,10 +5932,6 @@ msgid "Maximum users"
msgstr "Maximum felhasználók"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menük"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Poligonháló cashe"
@@ -5804,6 +5984,20 @@ msgid "Mipmapping"
msgstr "Mipmapping"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Profiler"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Biztonság"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Mod csatornák"
@@ -5841,11 +6035,11 @@ msgstr "Hegyek legkisebb szintje"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr "Egér érzékenység"
+msgstr "Egér érzékenysége"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
-msgstr "Egér érzékenység szorzó."
+msgstr "Egér érzékenységi faktora."
#: src/settings_translation_file.cpp
msgid "Mud noise"
@@ -5901,10 +6095,6 @@ msgid "Near plane"
msgstr "Majdnem mint a repülőgép"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Hálózat"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5913,6 +6103,11 @@ msgstr ""
"Főmenüből való indításkor felülíródik ez az érték."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Hálózat"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Az új felhasználóknak ezt a jelszót kell megadniuk."
@@ -5925,8 +6120,13 @@ msgid "Noclip key"
msgstr "Noclip mód gomb"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Kockák kiemelése"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr "Node kiemelés"
+msgstr "Kockák kiemelése"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
@@ -5980,10 +6180,6 @@ msgstr ""
"memóriahasználat között (4096=100MB hüvelykujjszabályként)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Online tartalomtár"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Átlátszatlan folyadékok"
@@ -6032,7 +6228,7 @@ msgid ""
"Path to shader directory. If no path is defined, default location will be "
"used."
msgstr ""
-"Az árnyékolókat tartalmazó mappa elérési útvonala. Ha nincs beállítva, az "
+"Az árnyalókat tartalmazó mappa elérési útvonala. Ha nincs beállítva, az "
"alapértelmezett útvonalat használja."
#: src/settings_translation_file.cpp
@@ -6044,8 +6240,8 @@ msgid ""
"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
-"Az alapértelmezett betűtípus elérési útja. TrueType betűtípusnak kell lenni."
-"\n"
+"Az alapértelmezett betűtípus elérési útja. TrueType betűtípusnak kell "
+"lenni.\n"
"Ha nem lehet betölteni a betűtípust, a tartalék betűtípust fogja használni."
#: src/settings_translation_file.cpp
@@ -6080,15 +6276,15 @@ msgstr "Pályamozgás mód gomb"
#: src/settings_translation_file.cpp
msgid "Pitch move mode"
-msgstr "Pályamozgás mód"
+msgstr "Tekintet irányába mozgás"
#: src/settings_translation_file.cpp
msgid "Place key"
-msgstr "Elhelyezés gomb"
+msgstr "Lehelyezés gomb"
#: src/settings_translation_file.cpp
msgid "Place repetition interval"
-msgstr "Elhelyezés ismétlési időköz"
+msgstr "Lehelyezés-ismétlési időköz"
#: src/settings_translation_file.cpp
msgid ""
@@ -6099,10 +6295,6 @@ msgstr ""
"Szükséges hozzá a repülés jogosultság a szerveren."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Játékos neve"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Játékosátviteli távolság"
@@ -6128,7 +6320,7 @@ msgid ""
"Enable this when you dig or place too often by accident."
msgstr ""
"Ásás és lehelyezés ismétlődésének megakadályozása, amikor nyomva tartod az "
-"egérbombokat.\n"
+"egérgombokat.\n"
"Engedélyezd, ha túl gyakran fordul elő, hogy véletlenül lehelyezel vagy "
"kiásol blokkokat."
@@ -6160,10 +6352,6 @@ msgid "Profiler toggle key"
msgstr "Profiler váltó gomb"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Pfolilozás"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Prometheus figyelési cím"
@@ -6175,8 +6363,8 @@ msgid ""
"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
"Prometheus figyelési cím.\n"
-"Ha a Minetest-et az ENABLE_PROMETHEUS opció engedélyezésével állítták össze,"
-"\n"
+"Ha a Minetest-et az ENABLE_PROMETHEUS opció engedélyezésével állítták "
+"össze,\n"
"elérhetővé válnak a Prometheus mérőszám figyelői ezen a címen.\n"
"A mérőszámok itt érhetők el: http://127.0.0.1:30000/metrics"
@@ -6190,7 +6378,7 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
-"A felhők kiterjedése 64 blokkos felhőnégyzetek számában mérve.\n"
+"A felhők kiterjedése 64 kockás felhőnégyzetek számában mérve.\n"
"26-nál nagyobb értékek éles határt eredményeznek a felhők sarkainál."
#: src/settings_translation_file.cpp
@@ -6324,7 +6512,7 @@ msgstr "Kerek kistérkép"
#: src/settings_translation_file.cpp
msgid "Safe digging and placing"
-msgstr "Biztonságos ásás és elhelyezés"
+msgstr "Biztonságos ásás és lehelyezés"
#: src/settings_translation_file.cpp
msgid "Sandy beaches occur when np_beach exceeds this value."
@@ -6352,12 +6540,17 @@ msgid ""
msgstr ""
"A felhasználói felület méretezése egy meghatározott értékkel.\n"
"A legközelebbi-szomszéd-élsimítás szűrőt használja a GUI méretezésére.\n"
-"Ez elsimít néhány durva élt, és elhajlítja a pixeleket a méretezés "
+"Ez elsimít néhány durva élt, és elhajlítja a pixeleket a méret "
"csökkentésekor,\n"
"de ennek az ára, hogy elhomályosít néhány szélső pixelt, ha a képek nem\n"
"egész számok alapján vannak méretezve."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Képernyő:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Képernyő magasság"
@@ -6388,6 +6581,11 @@ msgstr ""
"Használd a 0-t az alapértelmezett minőséghez."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Képernyőkép"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Folyómeder zaj"
@@ -6403,10 +6601,6 @@ msgstr ""
"A második a két 3D zajból, amelyek együttesen meghatározzák az alagutakat."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Biztonság"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Lásd: http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6465,8 +6659,19 @@ msgstr ""
"18 = 4D \"Mandelbulb\" Julia-halmaz."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Szerver / Egyjátékos"
+#, fuzzy
+msgid "Server"
+msgstr "Szerver URL"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Szerver név"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Szerver leírása"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6486,17 +6691,27 @@ msgstr "Szerver név"
#: src/settings_translation_file.cpp
msgid "Server port"
-msgstr "Szerver port"
+msgstr "Szerver portja"
#: src/settings_translation_file.cpp
msgid "Server side occlusion culling"
msgstr "Takarásban lévő térképblokkok szerveroldali kiválogatása"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Szerver portja"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "Szerverlista URL"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "Szerverlista URL"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Szerverlista fájl"
@@ -6509,22 +6724,27 @@ msgstr ""
"A változtatás után a játék újraindítása szükséges."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr "A csevegés maximális szöveghossza amelyet a kliensek küldhetnek."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
"Az árnyékok kivehetőségét szabályozza.\n"
"Kisebb érték világosabb, magasabb érték sötétebb árnyékokat jelent."
#: 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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
"Az árnyékok lágy szélének kiterjedését szabályozza.\n"
"Kisebb érték élesebb, nagyobb érték lágyabb árnyékokat jelent.\n"
@@ -6545,7 +6765,7 @@ msgid ""
"Set to true to enable Shadow Mapping.\n"
"Requires shaders to be enabled."
msgstr ""
-"Állítsa igazra az árnyáktérképezés (Shadow Mapping) engedélyezéséhez.\n"
+"Állítsa igazra az árnyéktérképezés (Shadow Mapping) engedélyezéséhez.\n"
"Az árnyalók engedélyezése szükséges hozzá."
#: src/settings_translation_file.cpp
@@ -6604,7 +6824,7 @@ msgstr "Árnyék szűrő minőség"
#: src/settings_translation_file.cpp
msgid "Shadow map max distance in nodes to render shadows"
-msgstr "Az árnyéktérkép maximális renderelési távolsága blokkban"
+msgstr "Az árnyéktérkép maximális renderelési távolsága kockákban"
#: src/settings_translation_file.cpp
msgid "Shadow map texture in 32 bits"
@@ -6621,7 +6841,8 @@ msgid ""
msgstr "Betűtípus árnyékának eltolása. Ha 0, akkor nem lesz árnyék rajzolva."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+#, fuzzy
+msgid "Shadow strength gamma"
msgstr "Árnyék kivehetősége"
#: src/settings_translation_file.cpp
@@ -6648,7 +6869,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Show name tag backgrounds by default"
-msgstr "Névcímkék háttere alapértelmezésben látszik"
+msgstr "Névcédulák háttere alapértelmezésben látszik"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -6663,7 +6884,7 @@ msgid ""
"Altering this value is for special usage, leaving it unchanged is\n"
"recommended."
msgstr ""
-"A mapgen által generált térképdarabka mérete térképblokkokban (16 blokk) "
+"A mapgen által generált térképdarabka mérete térképblokkokban (16 kocka) "
"mérve.\n"
"FIGYELEM!: Nincs értelme és bizonyos veszélyekkel is jár ennek az értéknek\n"
"5 fölés emelése.\n"
@@ -6716,24 +6937,24 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
-msgstr "Simított megvilágítás"
+msgstr "Lágy megvilágítás"
#: src/settings_translation_file.cpp
msgid ""
"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
-"Kamera mozgásának simítása körbenézéskor. Körbenézés és egérsimításnak is "
-"hívják.\n"
+"Kamera mozgásának lágyítása körbenézéskor. Nézet- vagy egérstabilizálásnak "
+"is hívják.\n"
"Hasznos videók felvételénél."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr "A kamera forgását simítja filmszerű módban. 0 a letiltáshoz."
+msgstr "A kameraforgást lágyítja operatőr módban. 0 a letiltáshoz."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr "Kamera forgás simítása. 0 = letiltás."
+msgstr "Kameraforgás lágyítása. 0 = letiltás."
#: src/settings_translation_file.cpp
msgid "Sneak key"
@@ -6745,7 +6966,7 @@ msgstr "Lopakodás sebessége"
#: src/settings_translation_file.cpp
msgid "Sneaking speed, in nodes per second."
-msgstr "Lopakodás sebessége node/másodpercben."
+msgstr "Lopakodás sebessége kocka/másodpercben."
#: src/settings_translation_file.cpp
msgid "Soft shadow radius"
@@ -6766,8 +6987,8 @@ msgstr ""
"helyett.\n"
"$filename -nek elérhetőnek kell lennie a $remote_media$filename helyről "
"cURL\n"
-"használatával (nyilván, a remote_media elérési útnak perjelre kell végződni)."
-"\n"
+"használatával (nyilván, a remote_media elérési útnak perjelre kell "
+"végződni).\n"
"A nem elérhető fájlokat a normál módon fogja letölteni."
#: src/settings_translation_file.cpp
@@ -6776,7 +6997,7 @@ msgid ""
"Note that mods or games may explicitly set a stack for certain (or all) "
"items."
msgstr ""
-"A blokkok, tárgyak és eszközök alapértelmezett kötegméretét szabályozza.\n"
+"A kockák, tárgyak és eszközök alapértelmezett kötegméretét szabályozza.\n"
"Megjegyzendő, hogy a modok vagy játékok kifejezetten meghatározhatják a "
"kötegek méretét bizonyos vagy az összes tárgy esetén."
@@ -6853,15 +7074,15 @@ msgid ""
"server-intensive extreme water flow and to avoid vast flooding of the\n"
"world surface below."
msgstr ""
-"Az egybefüggő lebegő föld rétegre opcionálisan helyezhető vízfelület szintje."
-"\n"
+"Az egybefüggő lebegő föld rétegre opcionálisan helyezhető vízfelület "
+"szintje.\n"
"Alapértelmezésben a víz nem engedélyezett és csak akkor helyezi le, ha ez "
"az\n"
"érték nagyobb, mint 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (a "
"vékonyítás\n"
"felső részének kezdete).\n"
"***FIGYELEM! VESZÉLYES LEHET A VILÁGOKRA ÉS A SZERVERTELJESÍTMÉNYRE***:\n"
-"Ha endgedélyezve van a vízelhelyezés, úgy kell konfigurálni a lebegő "
+"Ha endgedélyezve van a vízlehelyezés, úgy kell konfigurálni a lebegő "
"földeket és\n"
"tesztelni kell, hogy valóban egybefüggő réteget alkosson, az "
"'mgv7_floatland_density'\n"
@@ -6880,6 +7101,11 @@ msgid "Temperature variation for biomes."
msgstr "Hőmérséklet-változékonyság a biomokban."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Beállítások"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Terep alternatív zaj"
@@ -6947,13 +7173,13 @@ msgid ""
"this option allows enforcing it for certain node types. Note though that\n"
"that is considered EXPERIMENTAL and may not work properly."
msgstr ""
-"Egy blokk textúráját lehet a blokkhoz vagy a világhoz igazítani.\n"
+"Egy kocka textúráját lehet a kockához vagy a világhoz igazítani.\n"
"Az első megoldás jobban illik olyan dolgokhoz, mint a gépek, bútorok stb.,\n"
"míg a másodikkal jobban beleillenek a környezetükbe a lépcsők és "
"mikroblokkok.\n"
"Mivel azonban ez a lehetőség még új, és így a régebbi szerverek még nem "
"használják,\n"
-"ezzel az opcióval ki lehet kényszeríteni ezt bizonyos blokkokra. Meg kell "
+"ezzel az opcióval ki lehet kényszeríteni ezt bizonyos kockákra. Meg kell "
"azonban\n"
"jegyezni, hogy ez még KÍSÉRLETI fázisban van és lehet, hogy nem működik "
"helyesen."
@@ -6976,7 +7202,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other biome filler node."
-msgstr "A föld vagy egyéb biom feltöltő blokk mélysége."
+msgstr "A föld vagy egyéb biomkitöltő kockaréteg mélysége."
#: src/settings_translation_file.cpp
msgid ""
@@ -6991,7 +7217,7 @@ msgstr "A használni kívánt joystick azonosítója"
#: src/settings_translation_file.cpp
msgid "The length in pixels it takes for touch screen interaction to start."
msgstr ""
-"Az érintőképernyős interakció megkezdéséhez szükséges távolság pixelekben."
+"Az érintőképernyős interakció aktiválódásához szükséges távolság pixelekben."
#: src/settings_translation_file.cpp
msgid ""
@@ -7002,9 +7228,9 @@ msgid ""
"Requires waving liquids to be enabled."
msgstr ""
"A hullámzó folyadékok felszínének maximális magassága.\n"
-"4,0 = A hullámok magasága két blokk.\n"
+"4,0 = A hullámok magasága két kocka.\n"
"0,0 = A hullámok egyáltalán nem mozognak.\n"
-"Az alapértelmezett érték 1,0 (1/2 blokk).\n"
+"Az alapértelmezett érték 1,0 (1/2 kocka).\n"
"A hullámzó folyadék engedélyezése szükséges hozzá."
#: src/settings_translation_file.cpp
@@ -7031,7 +7257,7 @@ msgid ""
"This should be configured together with active_object_send_range_blocks."
msgstr ""
"A játékosok körüli blokktérfogat sugara, amelyen belül érvényesülnek\n"
-"az aktív blokkok dolgai. Térképblokkban (16 blokk) mérve.\n"
+"az aktív blokkok dolgai. Térképblokkban (16 kocka) mérve.\n"
"Az aktív blokkokban betöltődnek az objektumok és ABM-ek futnak.\n"
"Ez egyben az a legkisebb sugár is, amelyen belül az aktív objektumokról "
"(mobok) gondoskodik a játék.\n"
@@ -7052,7 +7278,7 @@ msgstr ""
"Megjegyzés: Androidon, hagyd OGLES1-en, ha bizonytalan vagy! Lehet, hogy nem "
"indul az app különben.\n"
"Más platformokon az OpenGL az ajánlott.\n"
-"Az árnyékolókat az OpenGL (csak asztali rendszeren) és OGLES2 (kísérleti) "
+"Az árnyalókat az OpenGL (csak asztali rendszeren) és OGLES2 (kísérleti) "
"támogatja"
#: src/settings_translation_file.cpp
@@ -7060,8 +7286,8 @@ msgid ""
"The sensitivity of the joystick axes for moving the\n"
"in-game view frustum around."
msgstr ""
-"A jostick tengelyeinek érzékenysége, amely\n"
-"a játékbeli látómező mozgatását befolyásolja."
+"A jostick tengelyeinek érzékenysége, amely a játékbeli látómező mozgatását "
+"befolyásolja."
#: src/settings_translation_file.cpp
msgid ""
@@ -7070,7 +7296,7 @@ msgid ""
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
"set to the nearest valid value."
msgstr ""
-"A körülvett, illetve takarásban lévő blokkok árnyékolásának erőssége "
+"A körülvett, illetve takarásban lévő kockák árnyékolásának erőssége "
"(sötétsége).\n"
"Alacsonyabb érték sötétebb, magasabb érték világosabb. E beállítás érvényes\n"
"értéktartománya 0,25-től 4,0-ig terjed. Ha a tartományon kívüli értéket "
@@ -7084,8 +7310,8 @@ msgid ""
"items. A value of 0 disables the functionality."
msgstr ""
"A másodpercben megadott idő, ameddig a folyadékok várólistája a számítási\n"
-"teljesítmény fölé nőhet, és ezután megpróbálja csökkenteni a méretét azáltal,"
-"\n"
+"teljesítmény fölé nőhet, és ezután megpróbálja csökkenteni a méretét "
+"azáltal,\n"
"hogy törli a régóta sorbanálló elemeket. A 0 érték letiltja ezt a funkciót."
#: src/settings_translation_file.cpp
@@ -7101,15 +7327,15 @@ msgid ""
"The time in seconds it takes between repeated events\n"
"when holding down a joystick button combination."
msgstr ""
-"Ennyi másodperc szükséges az esemény megismétléséhez\n"
-"a joystick gombok nyomva tartásakor."
+"Ennyi másodperc szükséges az esemény megismétléséhez a joystick gombok "
+"nyomva tartásakor."
#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated node placements when holding\n"
"the place button."
msgstr ""
-"Ennyi másodperc szükséges az ismételt node elhelyezéshez az elhelyezés gomb\n"
+"Ennyi másodperc szükséges az ismételt kockalehelyezéshez a lehelyezés gomb "
"nyomva tartásakor."
#: src/settings_translation_file.cpp
@@ -7155,7 +7381,8 @@ msgid "Time speed"
msgstr "Idő sebessége"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, fuzzy
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
"A kliens rendelkezésére álló időkorlát, hogy eltávolítsa a használaton "
"kívüli térképadatokat a memóriából."
@@ -7167,10 +7394,10 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
-"A lag (késés) csökkentéséért a node-ok lerakása le van lassítva, ha a "
-"játékos épít valamit.\n"
-"Ez azt határozza meg, hogy mennyire van lelassítva node-ok elhelyezésekor, "
-"vagy eltávolításakor."
+"A lag (késés) csökkentése érdekében a kockainformációk küldése le van "
+"lassítva, ha a játékos épít valamit.\n"
+"Ez azt határozza meg, hogy mennyire van lelassítva a küldés a kockák "
+"lehelyezése, vagy eltávolítása után."
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
@@ -7182,13 +7409,22 @@ msgstr "Eszköztipp késleltetés"
#: src/settings_translation_file.cpp
msgid "Touch screen threshold"
-msgstr "Érintőképernyő küszöbe"
+msgstr "Érintőképernyő érzékenysége"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Érintőképernyő érzékenysége"
#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
msgstr "Teljesítménybeli kompromisszumok"
#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Trees noise"
msgstr "Fa zaj"
@@ -7204,7 +7440,7 @@ msgid ""
msgstr ""
"True = 256\n"
"False = 128\n"
-"Arra használható, hogy simábbá tegye a minitérképet lassabb gépeken."
+"Arra használható, hogy egyenletesebbé tegye a minitérképet lassabb gépeken."
#: src/settings_translation_file.cpp
msgid "Trusted mods"
@@ -7289,7 +7525,7 @@ msgstr ""
"Ez az algoritmus kisimítja a 3D látómezőt miközben a kép éles marad,\n"
"a textúrák beljsejét azonban nem módosítja\n"
"(ami főleg az átlátszó textúráknál vehető észre).\n"
-"A blokkok között látható rések jelennek meg, ha az árnyékolók nincsenek\n"
+"A kockák között látható rések jelennek meg, ha az árnyalók nincsenek\n"
"engedélyezve. Ha 0-ra van állítva, az MSAA tiltva van.\n"
"E beállítás megváltoztatása után újraindítás szükséges."
@@ -7298,6 +7534,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Trilineáris szűrés a textúrák méretezéséhez."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7327,7 +7567,7 @@ msgstr "A biom töltőanyag mélységének változékonysága."
#: src/settings_translation_file.cpp
msgid "Variation of maximum mountain height (in nodes)."
-msgstr "A legnagyobb eltérés a hegyek magasságában (blokkokban)."
+msgstr "A legnagyobb eltérés a hegyek magasságában (hány kocka)."
#: src/settings_translation_file.cpp
msgid "Variation of number of caves."
@@ -7343,7 +7583,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Varies depth of biome surface nodes."
-msgstr "A biomok felületét képező blokkréteg mélységét variálja."
+msgstr "A biomok felületét képező kockaréteg mélységét variálja."
#: src/settings_translation_file.cpp
msgid ""
@@ -7359,7 +7599,7 @@ msgstr "A szirtek meredekségét variálja."
#: src/settings_translation_file.cpp
msgid "Vertical climbing speed, in nodes per second."
-msgstr "Függőleges mászási sebesség node/másodpercben."
+msgstr "Függőleges mászási sebesség kocka/másodpercben."
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
@@ -7375,7 +7615,7 @@ msgstr "Fejbillegési faktor"
#: src/settings_translation_file.cpp
msgid "View distance in nodes."
-msgstr "Látótávolság node-okban megadva."
+msgstr "Látótávolság kockában megadva."
#: src/settings_translation_file.cpp
msgid "View range decrease key"
@@ -7395,7 +7635,7 @@ msgstr "Látóterület"
#: src/settings_translation_file.cpp
msgid "Virtual joystick triggers Aux1 button"
-msgstr "Virtuális joystick gombok Aux1 gomb"
+msgstr "A virtuális joystick működteti az Aux1 gombot"
#: src/settings_translation_file.cpp
msgid "Volume"
@@ -7425,7 +7665,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Walking and flying speed, in nodes per second."
-msgstr "Sétálás, repülés és mászás sebessége gyors módban node/másodpercben."
+msgstr "Sétálás és repülés sebessége kocka/másodpercben."
#: src/settings_translation_file.cpp
msgid "Walking speed"
@@ -7433,7 +7673,7 @@ msgstr "Sétálás sebessége"
#: src/settings_translation_file.cpp
msgid "Walking, flying and climbing speed in fast mode, in nodes per second."
-msgstr "Sétálás, repülés és mászás sebessége gyors módban node/másodpercben."
+msgstr "Sétálás, repülés és mászás sebessége gyors módban kocka/másodpercben."
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -7445,11 +7685,11 @@ msgstr "A világ vízfelszínének szintje."
#: src/settings_translation_file.cpp
msgid "Waving Nodes"
-msgstr "Hullámzó node-ok"
+msgstr "Hullámzó kockák"
#: src/settings_translation_file.cpp
msgid "Waving leaves"
-msgstr "Hullámzó levelek"
+msgstr "Ringatózó levelek"
#: src/settings_translation_file.cpp
msgid "Waving liquids"
@@ -7469,7 +7709,7 @@ msgstr "Hullámzó folyadékok hullámhossza"
#: src/settings_translation_file.cpp
msgid "Waving plants"
-msgstr "Hullámzó növények"
+msgstr "Ringatózó növények"
#: src/settings_translation_file.cpp
msgid "Weblink color"
@@ -7483,7 +7723,7 @@ msgid ""
msgstr ""
"Ha a gui_scaling_filter értéke igaz, minden GUI képet szoftveres\n"
"szűrő fogja kezelni, de néhány kép közvetlenül a harverre\n"
-"generálódik (pl. a felszerelésben lévő blokkok textúrára renderelése)."
+"generálódik (pl. a felszerelésben lévő kockák textúrára renderelése)."
#: src/settings_translation_file.cpp
msgid ""
@@ -7518,7 +7758,7 @@ msgstr ""
"de több memóriát igényel. 2 hatványait ajánlott használni. CSAK akkor "
"érvényes ez a\n"
"beállítás, ha a bilineáris/trilineáris/anizotróp szűrés engedélyezett.\n"
-"Ez egyben azon blokkok alap textúraméreteként is használatos, amelyeknél a "
+"Ez egyben azon kockák alap textúraméreteként is használatos, amelyeknél a "
"világhoz\n"
"igazítva kell méretezni a textúrát."
@@ -7527,13 +7767,13 @@ msgid ""
"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
-"Látszódjon-e a névcímkék háttere alapértelmezésként.\n"
+"Látszódjon-e a névcédulák háttere alapértelmezésként.\n"
"A modok ettől még a beállíthatják a hátteret."
#: src/settings_translation_file.cpp
msgid "Whether node texture animations should be desynchronized per mapblock."
msgstr ""
-"Legyen-e független a blokkok textúraanimációinak időzítése az egyes "
+"Legyen-e független a kockák textúraanimációinak időzítése az egyes "
"térképblokkokban."
#: src/settings_translation_file.cpp
@@ -7574,6 +7814,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
"A hibakereső információ megjelenítése (ugyanaz a hatás, ha F5-öt nyomunk)."
@@ -7585,7 +7834,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Width of the selection box lines around nodes."
-msgstr "A kijelölésdoboz vonalainak szélessége a node-ok körül."
+msgstr "A kijelölésdoboz vonalainak szélessége a kockák körül."
#: src/settings_translation_file.cpp
msgid ""
@@ -7618,12 +7867,12 @@ msgid ""
"See also texture_min_size.\n"
"Warning: This option is EXPERIMENTAL!"
msgstr ""
-"A világhoz igazított textúrák több blokkra is ki kiterjedhetnek. A szerver\n"
-"azonban nem biztos, hogy az általad kívánt módon terjeszti ki azt, különösen,"
-"\n"
+"A világhoz igazított textúrák több kockára is ki kiterjedhetnek. A szerver\n"
+"azonban nem biztos, hogy az általad kívánt módon terjeszti ki azt, "
+"különösen,\n"
"ha egyedi tervezésű textúracsomagról van szó; ezzel a beállítással a kliens\n"
-"megpróbálja automatikusan meghatározni a méretezést a textúra mérete alapján."
-"\n"
+"megpróbálja automatikusan meghatározni a méretezést a textúra mérete "
+"alapján.\n"
"Lásd még texture_min_size.\n"
"Figyelem: Ez KÍSÉRLETI beállítás!"
@@ -7686,6 +7935,10 @@ msgid "Y-level of seabed."
msgstr "Tengerfenék Y szintje."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "cURL fájlletöltés időkorlát"
@@ -7728,6 +7981,9 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Back"
#~ msgstr "Vissza"
+#~ msgid "Basic"
+#~ msgstr "Alap"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bit/pixel (vagyis színmélység) teljes képernyős módban."
@@ -7759,6 +8015,12 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Configure"
#~ msgstr "Beállítás"
+#~ msgid "Connect"
+#~ msgstr "Kapcsolódás"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Folyadékban a süllyedési sebességet szabályozza."
+
#, fuzzy
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
@@ -7805,12 +8067,24 @@ msgstr "cURL párhuzamossági korlát"
#~ "A textúrák mintavételezési lépésközét adja meg.\n"
#~ "Nagyobb érték simább normal map-et eredményez."
+#~ msgid "Del. Favorite"
+#~ msgstr "Kedvenc törlése"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Játék (mint a minetest_game) letöltése a minetest.net címről"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Letöltés a minetest.net címről"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "$1 letöltése és telepítése, kérlek várj…"
#~ msgid "Enable VBO"
#~ msgstr "VBO engedélyez"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Regisztráció megerősítés engedélyezése"
+
#~ msgid "Enables filmic tone mapping"
#~ msgstr "filmes tónus effektek bekapcsolása"
@@ -7821,6 +8095,9 @@ msgstr "cURL párhuzamossági korlát"
#~ "Parallax occlusion mapping bekapcsolása.\n"
#~ "A shaderek engedélyezve kell hogy legyenek."
+#~ msgid "Enter "
+#~ msgstr "Belépés "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7840,6 +8117,9 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Fallback font size"
#~ msgstr "Tartalék betűtípus mérete"
+#~ msgid "Filtering"
+#~ msgstr "Szűrés"
+
#, fuzzy
#~ msgid "Floatland base height noise"
#~ msgstr "A lebegő hegyek alapmagassága"
@@ -7857,6 +8137,9 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Full screen BPP"
#~ msgstr "Teljes képernyő BPP"
+#~ msgid "Game"
+#~ msgstr "Játék"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7866,15 +8149,30 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Generate normalmaps"
#~ msgstr "Normálfelületek generálása"
+#~ msgid "HUD scale factor"
+#~ msgstr "Vezérlőelemek mérete"
+
#~ msgid "High-precision FPU"
#~ msgstr "Nagy pontosságú FPU"
#~ msgid "IPv6 support."
#~ msgstr "IPv6 támogatás."
+#~ msgid "In-Game"
+#~ msgstr "Játékon belül"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Fájl telepítése: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Behangolás"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Billentyűzetkiosztás. (Ha ez a menü összeomlik, távolíts el néhány dolgot "
+#~ "a minetest.conf-ból)"
+
#, fuzzy
#~ msgid "Lava depth"
#~ msgstr "Nagy barlang mélység"
@@ -7894,6 +8192,9 @@ msgstr "cURL párhuzamossági korlát"
#~ "Lehetővé teszi, hogy a DirectX működjön a LuaJIT-tel. Tiltsd le, ha "
#~ "problémákat okoz."
+#~ msgid "Menus"
+#~ msgstr "Menük"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Kistérkép radar módban x2"
@@ -7936,6 +8237,12 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Path to save screenshots at."
#~ msgstr "Képernyőmentések mappája."
+#~ msgid "Player name"
+#~ msgstr "Játékos neve"
+
+#~ msgid "Profiling"
+#~ msgstr "Pfolilozás"
+
#~ msgid "PvP enabled"
#~ msgstr "PvP engedélyezve"
@@ -7945,6 +8252,9 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Select Package File:"
#~ msgstr "csomag fájl kiválasztása:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Szerver / Egyjátékos"
+
#, fuzzy
#~ msgid "Shadow limit"
#~ msgstr "Térképblokk korlát"
@@ -7999,6 +8309,22 @@ msgstr "cURL párhuzamossági korlát"
#~ msgid "Yes"
#~ msgstr "Igen"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Most először csatlakozol erre a szerverre a \"%s\" névvel.\n"
+#~ "Ha folytatod, akkor a hitelesítő adataiddal egy új fiók jön létre a "
+#~ "szerveren.\n"
+#~ "Kérlek írd be újra a jelszavad, majd kattints a \"Regisztráció és "
+#~ "Bejelentkezés\"-re, hogy megerősítsd a fióklétrehozást, vagy kattints a "
+#~ "\"Mégse\" gombra a megszakításhoz."
+
#~ msgid "You died."
#~ msgstr "Meghaltál."
diff --git a/po/id/minetest.po b/po/id/minetest.po
index 82f1da18f..d3a32b87f 100644
--- a/po/id/minetest.po
+++ b/po/id/minetest.po
@@ -2,10 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Indonesian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2022-01-10 23:53+0000\n"
-"Last-Translator: Muhammad Rifqi Priyo Susanto "
-"<muhammadrifqipriyosusanto@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-02-05 02:53+0000\n"
+"Last-Translator: Linerly <linerly@protonmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/minetest/"
"minetest/id/>\n"
"Language: id\n"
@@ -13,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 4.10.1\n"
+"X-Generator: Weblate 4.11-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
@@ -115,6 +114,31 @@ msgid "The server has requested a reconnect:"
msgstr "Server ini meminta untuk menyambung ulang:"
#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Pilih Mod"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
msgstr "Versi protokol tidak sesuai. "
@@ -127,6 +151,10 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Server mendukung protokol antara versi $1 dan versi $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Kami hanya mendukung protokol versi $1."
@@ -134,14 +162,21 @@ msgstr "Kami hanya mendukung protokol versi $1."
msgid "We support protocol versions between version $1 and $2."
msgstr "Kami mendukung protokol antara versi $1 dan versi $2."
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
+
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Batal"
@@ -280,7 +315,6 @@ msgid "Failed to download $1"
msgstr "Gagal mengunduh $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Permainan"
@@ -301,7 +335,6 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Pemasangan: Tipe berkas tidak didukung atau arsip rusak"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
msgstr "Mod"
@@ -394,12 +427,9 @@ msgid "Decorations"
msgstr "Dekorasi"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Unduh suatu permainan, misalnya Minetest Game, dari minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Unduh satu dari minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Peringatan: Development Test ditujukan untuk para pengembang."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -417,10 +447,6 @@ msgstr "Tanah mengambang di langit"
msgid "Floatlands (experimental)"
msgstr "Floatland (tahap percobaan)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Permainan"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
msgstr "Buat medan nonfraktal: Samudra dan bawah tanah"
@@ -438,6 +464,15 @@ msgid "Increases humidity around rivers"
msgstr "Tambah kelembapan di sekitar sungai"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Pasang $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Danau"
@@ -539,10 +574,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Gua sangat besar di kedalaman bawah tanah"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr "Peringatan: Development Test ditujukan untuk para pengembang."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nama dunia"
@@ -572,6 +603,39 @@ msgstr "pkgmgr: jalur tidak sah \"$1\""
msgid "Delete World \"$1\"?"
msgstr "Hapus dunia \"$1\"?"
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Konfirmasi kata sandi"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Nama pembuat peta"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nama"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Kata sandi"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Kata sandi tidak cocok!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Daftar dan Gabung"
+
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
msgstr "Setuju"
@@ -604,6 +668,16 @@ msgstr "< Halaman pengaturan"
msgid "Browse"
msgstr "Jelajahi"
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Konten"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Konten"
+
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
msgstr "Dimatikan"
@@ -660,7 +734,7 @@ msgstr "Pilih direktori"
msgid "Select file"
msgstr "Pilih berkas"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Tampilkan nama teknis"
@@ -810,6 +884,11 @@ msgstr "Penyumbang Sebelumnya"
msgid "Previous Core Developers"
msgstr "Pengembang Inti Sebelumnya"
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Tampilkan info awakutu"
+
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
msgstr "Jelajahi konten daring"
@@ -878,10 +957,6 @@ msgstr "Host Server"
msgid "Install games from ContentDB"
msgstr "Pasang permainan dari ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nama"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Baru"
@@ -890,10 +965,6 @@ msgstr "Baru"
msgid "No world created or selected!"
msgstr "Tiada dunia yang dibuat atau dipilih!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Kata sandi"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Mainkan Permainan"
@@ -927,10 +998,6 @@ msgid "Clear"
msgstr "Clear"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Sambung"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Mode kreatif"
@@ -940,10 +1007,6 @@ msgid "Damage / PvP"
msgstr "Kerusakan/PvP"
#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Hapus favorit"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
msgstr "Favorit"
@@ -956,6 +1019,10 @@ msgid "Join Game"
msgstr "Gabung Permainan"
#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
+
+#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr "Ping"
@@ -968,10 +1035,19 @@ msgid "Refresh"
msgstr "Segarkan"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Port utk Kendali Jarak Jauh"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
msgstr "Keterangan Server"
#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "2x"
msgstr "2x"
@@ -1016,7 +1092,8 @@ msgid "Dynamic shadows"
msgstr "Bayangan dinamis"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Bayangan dinamis: "
#: builtin/mainmenu/tab_settings.lua
@@ -1112,7 +1189,8 @@ msgid "Tone Mapping"
msgstr "Pemetaan Nada"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
msgstr "Batas Sentuhan: (px)"
#: builtin/mainmenu/tab_settings.lua
@@ -1120,7 +1198,8 @@ msgid "Trilinear Filter"
msgstr "Filter Trilinear"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
+#, fuzzy
+msgid "Very High"
msgstr "Ultratinggi"
#: builtin/mainmenu/tab_settings.lua
@@ -1139,6 +1218,11 @@ msgstr "Air Berombak"
msgid "Waving Plants"
msgstr "Tanaman Berayun"
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Galat sambungan (terlalu lama?)"
+
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
msgstr "Sambungan kehabisan waktu."
@@ -1274,7 +1358,8 @@ msgid "Camera update enabled"
msgstr "Pembaruan kamera dinyalakan"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr "Tidak bisa menampilkan batasan blok (butuh hak 'basic_debug')"
#: src/client/game.cpp
@@ -1404,6 +1489,11 @@ msgid "Enabled unlimited viewing range"
msgstr "Nyalakan jarak pandang tak terbatas"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Membuat klien..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
msgstr "Menu Utama"
@@ -1908,29 +1998,6 @@ msgstr "Gagal membuka laman web"
msgid "Opening webpage"
msgstr "Membuka laman web"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Kata sandi tidak cocok!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Daftar dan Gabung"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Anda akan bergabung ke server dengan nama \"%s\" untuk pertama kalinya.\n"
-"Jika Anda melanjutkan, akun baru yang telah Anda isikan akan dibuat pada "
-"server ini.\n"
-"Silakan ketik ulang kata sandi Anda dan klik \"Daftar dan Gabung\" untuk "
-"mengonfirmasi pembuatan akun atau klik Batal untuk membatalkan."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Lanjut"
@@ -1963,7 +2030,7 @@ msgstr "Batasan blok"
msgid "Change camera"
msgstr "Ubah kamera"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Obrolan"
@@ -2016,10 +2083,8 @@ msgid "Key already in use"
msgstr "Tombol telah terpakai"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Pengaturan tombol. (Jika menu ini kacau, hapus pengaturan kontrol dari "
-"minetest.conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2090,10 +2155,6 @@ msgid "Change"
msgstr "Ubah"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Konfirmasi kata sandi"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Kata sandi baru"
@@ -2101,6 +2162,10 @@ msgstr "Kata sandi baru"
msgid "Old Password"
msgstr "Kata sandi lama"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Kata sandi tidak cocok!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Keluar"
@@ -2114,12 +2179,6 @@ msgstr "Dibisukan"
msgid "Sound Volume: %d%%"
msgstr "Volume Suara: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Masuk "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2127,6 +2186,16 @@ msgstr "Masuk "
msgid "LANG_CODE"
msgstr "id"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Tolong pilih sebuah nama!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2289,6 +2358,10 @@ msgstr ""
"Catat bahwa mode interlaced membutuhkan penggunaan shader."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2385,6 +2458,11 @@ msgstr ""
"terlebih dahulu) membuat lapisan floatland padat (penuh)."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Sisipkan nama barang"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Lanjutan"
@@ -2403,7 +2481,8 @@ msgstr ""
"buatan. Ini punya pengaruh kecil kepada cahaya malam alami."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Selalu terbang dan bergerak cepat"
#: src/settings_translation_file.cpp
@@ -2482,6 +2561,10 @@ msgstr ""
"Dalam satuan blok peta (16 nodus)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Tombol maju otomatis"
@@ -2522,10 +2605,6 @@ msgid "Base terrain height."
msgstr "Ketinggian dasar medan."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Dasar"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Hak-hak dasar"
@@ -2546,7 +2625,8 @@ msgid "Bind address"
msgstr "Alamat sambungan"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Parameter noise suhu dan kelembapan Biome API"
#: src/settings_translation_file.cpp
@@ -2558,6 +2638,10 @@ msgid "Block send optimize distance"
msgstr "Jarak optimasi pengiriman blok"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Jalur fon tebal dan miring"
@@ -2582,6 +2666,11 @@ msgid "Builtin"
msgstr "Terpasang bawaan"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Ubah kamera"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2746,6 +2835,11 @@ msgid "Client side node lookup range restriction"
msgstr "Batas jangkauan pencarian nodus sisi klien"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Mod klien"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Kelajuan memanjat"
@@ -2863,6 +2957,11 @@ msgid "Console height"
msgstr "Tombol konsol"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Gudang konten daring"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Daftar Hitam Flag ContentDB"
@@ -2902,8 +3001,10 @@ msgstr ""
"berubah."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Atur kelajuan tenggelam dalam cairan."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2976,12 +3077,12 @@ msgid "Debug log level"
msgstr "Tingkat log awakutu"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Tombol turunkan volume"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Turunkan ini untuk menaikkan ketahanan cairan terhadap gerakan."
+msgid "Dec. volume key"
+msgstr "Tombol turunkan volume"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3137,6 +3238,11 @@ msgid "Desynchronize block animation"
msgstr "Putuskan sinkronasi animasi blok"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Dekorasi"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Tombol gali"
@@ -3157,6 +3263,12 @@ msgid "Display Density Scaling Factor"
msgstr "Faktor Skala Kepadatan Tampilan"
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Nama domain dari server yang akan ditampilkan pada daftar server."
@@ -3237,6 +3349,10 @@ msgid "Enable joysticks"
msgstr "Gunakan joystick"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Nyalakan dukungan saluran mod."
@@ -3253,18 +3369,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Gunakan masukan pengguna acak (hanya digunakan untuk pengujian)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Gunakan konfirmasi pendaftaran"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Gunakan konfirmasi pendaftaran saat menyambung ke server.\n"
-"Jika dimatikan, akun baru akan didaftarkan otomatis."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3273,6 +3377,10 @@ msgstr ""
"Jangan gunakan untuk kecepatan atau untuk tampilan lain."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3363,6 +3471,14 @@ 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 ""
+"Mengaktifkan pertukaran yang mengurangi beban CPU atau meningkatkan kinerja "
+"rendering\n"
+"atas biaya gangguan visual kecil yang tidak memengaruhi pemutaran game."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Profil lembah"
#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
@@ -3389,6 +3505,10 @@ msgstr ""
"yang rata dan cocok untuk lapisan floatland padat (penuh)."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "FPS (bingkai per detik) saat dijeda atau tidak difokuskan"
@@ -3476,8 +3596,9 @@ msgstr ""
"otomatis jika mipmap dinyalakan."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Pemfilteran"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Antialiasing:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3544,6 +3665,11 @@ msgid "Fog toggle key"
msgstr "Tombol beralih kabut"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Ukuran fon"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Fon tebal bawaan"
@@ -3565,17 +3691,15 @@ msgstr "Ukuran fon"
#: src/settings_translation_file.cpp
msgid "Font size divisible by"
-msgstr ""
+msgstr "Ukuran fon dapat dibagi dengan"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Ukuran fon bawaan dalam poin (pt)."
+msgstr "Ukuran fon bawaan dalam dimana 1 unit = 1 pixel di 96 DPI"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Ukuran fon monospace bawaan dalam poin (pt)."
+msgstr "Ukuran fon monospace bawaan dimana 1 unit = 1 pixel di 96 DPI"
#: src/settings_translation_file.cpp
msgid ""
@@ -3595,6 +3719,13 @@ msgid ""
"be\n"
"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
msgstr ""
+"Untuk fon bergaya pixel yang tidak dapat diskalakan dengan baik, ini "
+"memastikan ukuran fon yang digunakan\n"
+"dengan fon ini akan selalu dapat dibagi dengan nilai ini, dalam pixel. "
+"Misalnya,\n"
+"fon pixel setinggi 16 pixel harus diatur ke 16, jadi itu hanya akan "
+"berukuran 16, 32, 48, dll.,\n"
+"jadi sebuah mod yang meminta ukuran 25 akan mendapatkan 32."
#: src/settings_translation_file.cpp
msgid ""
@@ -3706,6 +3837,19 @@ msgid "GUI scaling filter txr2img"
msgstr "Filter txr2img skala GUI"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Permainan"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Callback global"
@@ -3741,6 +3885,16 @@ msgid "Graphics"
msgstr "Grafika"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafika"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravitasi"
@@ -3757,8 +3911,13 @@ msgid "HTTP mods"
msgstr "Mod HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Faktor skala HUD"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Skala GUI"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4015,8 +4174,10 @@ msgstr ""
"Membutuhkan air berombak untuk dinyalakan."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Seberapa lama server akan menunggu sebelum membongkar blok peta yang tidak "
@@ -4024,6 +4185,13 @@ msgstr ""
"Semakin tinggi semakin halus, tetapi menggunakan lebih banyak RAM."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Turunkan ini untuk menaikkan ketahanan cairan terhadap gerakan."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Lebar sungai yang dibuat."
@@ -4096,6 +4264,15 @@ msgstr ""
"tombol \"menyelinap\"."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Gunakan konfirmasi pendaftaran saat menyambung ke server.\n"
+"Jika dimatikan, akun baru akan didaftarkan otomatis."
+
+#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
@@ -4125,7 +4302,10 @@ msgstr ""
"menyelam."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
"Jika dinyalakan, pemain baru tidak dapat bergabung dengan kata sandi kosong."
@@ -4179,10 +4359,6 @@ msgid "Ignore world errors"
msgstr "Abaikan galat pada dunia"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Dalam permainan"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Keburaman konsol obrolan dalam permainan (keopakan, dari 0 sampai 255)."
@@ -4243,15 +4419,12 @@ msgid "Instrument the methods of entities on registration."
msgstr "Melengkapi metode entitas dengan perkakas ketika didaftarkan."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Instrumentasi"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "Jarak waktu penyimpanan perubahan penting dari dunia dalam detik."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Jarak pengiriman waktu ke klien."
#: src/settings_translation_file.cpp
@@ -5109,6 +5282,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr "Keluarkan pemain yang mengirim lebih dari X pesan per 10 detik."
@@ -5166,10 +5343,11 @@ msgid "Left key"
msgstr "Tombol kiri"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Lama detikan server dan selang waktu bagi objek secara umum untuk "
"diperbarui\n"
@@ -5184,18 +5362,25 @@ msgstr ""
"Membutuhkan air berombak untuk dinyalakan."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr "Jarak waktu antarsiklus pelaksanaan Pengubah Blok Aktif (ABM)"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Jarak waktu antarsiklus pelaksanaan NodeTimer"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Jarak waktu antarsiklus pengelola blok aktif"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5204,7 +5389,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Tingkatan log yang ditulis ke debug.txt:\n"
"- <kosong> (tanpa pencatatan)\n"
@@ -5240,6 +5426,11 @@ msgid "Light curve low gradient"
msgstr "Titik rendah gradasi kurva cahaya"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Pencahayaan Halus"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5684,10 +5875,6 @@ msgid "Maximum users"
msgstr "Jumlah pengguna maksimum"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menu"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Tembolok mesh"
@@ -5736,6 +5923,20 @@ msgid "Mipmapping"
msgstr "Mipmapping"
#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Profiler"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Keamanan"
+
+#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Saluran mod"
@@ -5752,9 +5953,8 @@ msgid "Monospace font size"
msgstr "Ukuran fon monospace"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Monospace font size divisible by"
-msgstr "Ukuran fon monospace"
+msgstr "Ukuran fon monospace dapat dibagi dengan"
#: src/settings_translation_file.cpp
msgid "Mountain height noise"
@@ -5833,10 +6033,6 @@ msgid "Near plane"
msgstr "Bidang dekat"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Jaringan"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5845,6 +6041,11 @@ msgstr ""
"Nilai ini akan diubah saat memulai dari menu utama."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Jaringan"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "Pengguna baru butuh memasukkan kata sandi."
@@ -5857,6 +6058,11 @@ msgid "Noclip key"
msgstr "Tombol tembus nodus"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Sorot Nodus"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Penyorotan nodus"
@@ -5909,10 +6115,6 @@ msgstr ""
"penggunaan memori (4096=100MB, kasarannya)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Gudang konten daring"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Cairan opak"
@@ -5936,16 +6138,14 @@ msgid "Optional override for chat weblink color."
msgstr "Penimpaan opsional untuk warna tautan web pada obrolan."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
-"Jalur ke fon cadangan.\n"
-"Jika pengaturan \"freetype\" dinyalakan, harus fon TrueType.\n"
-"Jika pengaturan \"freetype\" dimatikan, harus fon bitmap atau vektor XML.\n"
-"Fon ini akan dipakai dalam bahasa tertentu jika tidak didukung fon bawaan."
+"Jalur ke fon cadangan. Harus sebuah font TrueType.\n"
+"Fon ini akan digunakan untuk beberapa bahasa atau jika fon bawaan tidak "
+"tersedia."
#: src/settings_translation_file.cpp
msgid ""
@@ -5967,26 +6167,20 @@ msgid "Path to texture directory. All textures are first searched from here."
msgstr "Jalur ke direktori tekstur. Semua tekstur akan dicari mulai dari sini."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
-"Jalur ke fon bawaan.\n"
-"Jika pengaturan \"freetype\" dinyalakan, harus fon TrueType.\n"
-"Jika pengaturan \"freetype\" dimatikan, harus fon bitmap atau vektor XML.\n"
+"Jalur ke fon bawaan. Harus sebuah fon TrueType.\n"
"Fon cadangan akan dipakai jika fon tidak dapat dimuat."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
-"Jalur ke fon monospace.\n"
-"Jika pengaturan \"freetype\" dinyalakan, harus fon TrueType.\n"
-"Jika pengaturan \"freetype\" dimatikan, harus fon bitmap atau vektor XML.\n"
-"Fon ini dipakai dalam layar konsol dan profiler."
+"Jalur ke fon monospace. Harus sebuah fon TrueType.\n"
+"Fon ini dipakai dalam layar konsol dan profiler, misalnya."
#: src/settings_translation_file.cpp
msgid "Pause on lost window focus"
@@ -6029,10 +6223,6 @@ msgstr ""
"Hal ini membutuhkan hak \"fly\" pada server."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Nama pemain"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Jarak pemindahan pemain"
@@ -6087,10 +6277,6 @@ msgid "Profiler toggle key"
msgstr "Tombol profiler"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Profiling"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Alamat pendengar Prometheus"
@@ -6284,6 +6470,11 @@ msgstr ""
"bulat."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Layar:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Tinggi layar"
@@ -6314,6 +6505,11 @@ msgstr ""
"Gunakan 0 untuk kualitas bawaan."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Tangkapan layar"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Noise dasar laut"
@@ -6326,10 +6522,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Noise 3D kedua dari dua yang mengatur terowongan."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Keamanan"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Lihat https://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6388,8 +6580,19 @@ msgstr ""
"18 = Julia set 4D \"Mandelbulb\"."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Server/Pemain tunggal"
+#, fuzzy
+msgid "Server"
+msgstr "URL server"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Nama server"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Keterangan Server"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6416,10 +6619,20 @@ msgid "Server side occlusion culling"
msgstr "Occlusion culling sisi server"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Port Server"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "URL daftar server"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "URL daftar server"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "Berkas daftar server"
@@ -6432,22 +6645,27 @@ msgstr ""
"Dibutuhkan mulai ulang setelah mengganti ini."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr "Atur jumlah karakter maksimum per pesan obrolan yang dikirim klien."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
"Atur kekuatan bayangan.\n"
"Nilai rendah berarti bayangan lebih terang, nilai tinggi berarti lebih gelap."
#: 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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
"Atur besar jari-jari bayangan halus.\n"
"Nilai rendah berarti bayangan lebih tajam, nilai tinggi berarti lebih "
@@ -6547,7 +6765,8 @@ msgstr ""
"digambar."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+#, fuzzy
+msgid "Shadow strength gamma"
msgstr "Kekuatan bayangan"
#: src/settings_translation_file.cpp
@@ -6790,6 +7009,11 @@ msgid "Temperature variation for biomes."
msgstr "Variasi suhu pada bioma."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Pengaturan"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Noise medan alternatif"
@@ -7051,7 +7275,8 @@ msgid "Time speed"
msgstr "Kelajuan waktu"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, fuzzy
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
"Batas waktu bagi klien untuk menghapus data peta yang tidak digunakan dari "
"memori."
@@ -7081,7 +7306,16 @@ msgid "Touch screen threshold"
msgstr "Ambang batas layar sentuh"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Ambang batas layar sentuh"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
+msgstr "Pertukaran untuk kinerja"
+
+#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
msgstr ""
#: src/settings_translation_file.cpp
@@ -7193,6 +7427,10 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Gunakan pemfilteran trilinear saat mengubah ukuran tekstur."
#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "VBO"
msgstr "VBO"
@@ -7465,6 +7703,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr "Apakah menampilkan informasi awakutu klien (sama dengan menekan F5)."
@@ -7571,6 +7818,10 @@ msgid "Y-level of seabed."
msgstr "Ketinggian Y dari dasar laut."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Batas waktu cURL mengunduh berkas"
@@ -7617,6 +7868,9 @@ msgstr "Batas cURL paralel"
#~ msgid "Back"
#~ msgstr "Kembali"
+#~ msgid "Basic"
+#~ msgstr "Dasar"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bit per piksel (alias kedalaman warna) dalam mode layar penuh."
@@ -7650,6 +7904,12 @@ msgstr "Batas cURL paralel"
#~ msgid "Configure"
#~ msgstr "Konfigurasi"
+#~ msgid "Connect"
+#~ msgstr "Sambung"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Atur kelajuan tenggelam dalam cairan."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7694,12 +7954,24 @@ msgstr "Batas cURL paralel"
#~ "Menentukan langkah penyampelan tekstur.\n"
#~ "Nilai lebih tinggi menghasilkan peta lebih halus."
+#~ msgid "Del. Favorite"
+#~ msgstr "Hapus favorit"
+
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Unduh suatu permainan, misalnya Minetest Game, dari minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Unduh satu dari minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Mengunduh dan memasang $1, mohon tunggu..."
#~ msgid "Enable VBO"
#~ msgstr "Gunakan VBO"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Gunakan konfirmasi pendaftaran"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7727,6 +7999,9 @@ msgstr "Batas cURL paralel"
#~ "Gunakan pemetaan parallax occlusion.\n"
#~ "Membutuhkan penggunaan shader."
+#~ msgid "Enter "
+#~ msgstr "Masuk "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7746,6 +8021,9 @@ msgstr "Batas cURL paralel"
#~ msgid "Fallback font size"
#~ msgstr "Ukuran fon cadangan"
+#~ msgid "Filtering"
+#~ msgstr "Pemfilteran"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Noise ketinggian dasar floatland"
@@ -7764,6 +8042,9 @@ msgstr "Batas cURL paralel"
#~ msgid "Full screen BPP"
#~ msgstr "BPP layar penuh"
+#~ msgid "Game"
+#~ msgstr "Permainan"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7773,15 +8054,30 @@ msgstr "Batas cURL paralel"
#~ msgid "Generate normalmaps"
#~ msgstr "Buat normalmap"
+#~ msgid "HUD scale factor"
+#~ msgstr "Faktor skala HUD"
+
#~ msgid "High-precision FPU"
#~ msgstr "FPU (satuan titik mengambang) berketelitian tinggi"
#~ msgid "IPv6 support."
#~ msgstr "Dukungan IPv6."
+#~ msgid "In-Game"
+#~ msgstr "Dalam permainan"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Pemasangan: berkas: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Instrumentasi"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Pengaturan tombol. (Jika menu ini kacau, hapus pengaturan kontrol dari "
+#~ "minetest.conf)"
+
#~ msgid "Lava depth"
#~ msgstr "Kedalaman lava"
@@ -7800,6 +8096,9 @@ msgstr "Batas cURL paralel"
#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
#~ msgstr "Buat DirectX bekerja dengan LuaJIT. Matikan jika bermasalah."
+#~ msgid "Menus"
+#~ msgstr "Menu"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Peta mini mode radar, perbesaran 2x"
@@ -7872,6 +8171,12 @@ msgstr "Batas cURL paralel"
#~ msgid "Path to save screenshots at."
#~ msgstr "Jalur untuk menyimpan tangkapan layar."
+#~ msgid "Player name"
+#~ msgstr "Nama pemain"
+
+#~ msgid "Profiling"
+#~ msgstr "Profiling"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Dungeon yang menonjol"
@@ -7884,6 +8189,9 @@ msgstr "Batas cURL paralel"
#~ msgid "Select Package File:"
#~ msgstr "Pilih berkas paket:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Server/Pemain tunggal"
+
#~ msgid "Shadow limit"
#~ msgstr "Batas bayangan"
@@ -7962,6 +8270,21 @@ msgstr "Batas cURL paralel"
#~ msgid "Yes"
#~ msgstr "Ya"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Anda akan bergabung ke server dengan nama \"%s\" untuk pertama kalinya.\n"
+#~ "Jika Anda melanjutkan, akun baru yang telah Anda isikan akan dibuat pada "
+#~ "server ini.\n"
+#~ "Silakan ketik ulang kata sandi Anda dan klik \"Daftar dan Gabung\" untuk "
+#~ "mengonfirmasi pembuatan akun atau klik Batal untuk membatalkan."
+
#, fuzzy
#~ msgid "You died."
#~ msgstr "Anda mati"
diff --git a/po/it/minetest.po b/po/it/minetest.po
index 0a0997f38..b986bfb0a 100644
--- a/po/it/minetest.po
+++ b/po/it/minetest.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Italian (Minetest)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-01-25 23:19+0100\n"
-"PO-Revision-Date: 2021-12-02 01:31+0000\n"
-"Last-Translator: Simone Starace <simone.starace93@gmail.com>\n"
+"POT-Creation-Date: 2022-07-20 21:43+0200\n"
+"PO-Revision-Date: 2022-06-20 09:52+0000\n"
+"Last-Translator: Giov4 <brancacciogiovanni1@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/minetest/"
"minetest/it/>\n"
"Language: it\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 4.10-dev\n"
+"X-Generator: Weblate 4.13.1-dev\n"
#: builtin/client/chatcommands.lua
msgid "Clear the out chat queue"
-msgstr "Pulisci la coda esterna della chat"
+msgstr "Pulisci la coda di uscita dei messaggi della chat"
#: builtin/client/chatcommands.lua
msgid "Empty command."
@@ -28,23 +28,23 @@ msgstr "Ritorna al menu principale"
#: builtin/client/chatcommands.lua
msgid "Invalid command: "
-msgstr "Comando Invalido: "
+msgstr "Comando non valido: "
#: builtin/client/chatcommands.lua
msgid "Issued command: "
-msgstr "Comando rilasciato: "
+msgstr "Comando eseguito: "
#: builtin/client/chatcommands.lua
msgid "List online players"
-msgstr "Lista di giocatori online"
+msgstr "Elenca i giocatori connessi"
#: builtin/client/chatcommands.lua
msgid "Online players: "
-msgstr "Giocatori Online: "
+msgstr "Giocatori connessi: "
#: builtin/client/chatcommands.lua
msgid "The out chat queue is now empty."
-msgstr "La coda esterna della chat è vuota adesso."
+msgstr "La coda di uscita dei messaggi della chat ora è vuota."
#: builtin/client/chatcommands.lua
msgid "This command is disabled by server."
@@ -78,16 +78,16 @@ msgstr "Ottieni aiuto per i comandi"
msgid ""
"Use '.help <cmd>' to get more information, or '.help all' to list everything."
msgstr ""
-"Scrivi '.help <cmd>' per avere più informazioni, oppure '.help all' per "
-"avere la lista completa."
+"Digita '.help <cmd>' per ricevere ulteriori informazioni sul comando, o "
+"digita '.help all' per elencare tutti i comandi."
#: builtin/common/chatcommands.lua
msgid "[all | <cmd>]"
-msgstr ""
+msgstr "[tutto | <cmd>]"
#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp
msgid "OK"
-msgstr "Ok"
+msgstr "Conferma"
#: builtin/fstk/ui.lua
msgid "<none available>"
@@ -111,7 +111,32 @@ msgstr "Riconnettiti"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "Il server ha richiesto una riconnessione:"
+msgstr "Il server ha richiesto la riconnessione:"
+
+#: builtin/mainmenu/common.lua
+msgid "A new $1 version is available"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+#, fuzzy
+msgid "Client Mods"
+msgstr "Seleziona i Moduli"
+
+#: builtin/mainmenu/common.lua
+msgid ""
+"Installed version: $1\n"
+"New version: $2\n"
+"Visit $3 to find out how to get the newest version and stay up to date with "
+"features and bugfixes."
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Later"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
+msgid "Never"
+msgstr ""
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
@@ -126,21 +151,32 @@ msgid "Server supports protocol versions between $1 and $2. "
msgstr "Il server supporta versioni di protocollo comprese tra la $1 e la $2. "
#: builtin/mainmenu/common.lua
+msgid "Visit website"
+msgstr ""
+
+#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
msgstr "Supportiamo solo la versione $1 del protocollo."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr "Supportiamo solo le versioni di protocollo comprese tra la $1 e la $2."
+msgstr "Supportiamo versioni di protocollo comprese tra la $1 e la $2."
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Enabled, has error)"
+msgstr ""
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "(Unsatisfied)"
+msgstr ""
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua
-#: builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/dlg_register.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiKeyChangeMenu.cpp
-#: src/gui/guiPasswordChange.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp
msgid "Cancel"
msgstr "Annulla"
@@ -155,7 +191,7 @@ msgstr "Disattiva tutto"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable modpack"
-msgstr "Disattiva il pacchetto mod"
+msgstr "Disattiva la raccolta di mod"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -163,19 +199,19 @@ msgstr "Attiva tutto"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable modpack"
-msgstr "Attiva il pacchetto mod"
+msgstr "Attiva la raccolta di mod"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"characters [a-z0-9_] are allowed."
msgstr ""
-"Impossibile abilitare la mod \"$1\" poiché contiene caratteri non ammessi. "
-"Sono ammessi solo i caratteri [a-z0-9_]."
+"Impossibile abilitare la mod \"$1\" poiché contiene caratteri non "
+"consentiti. Sono ammessi solo caratteri [a-z0-9_]."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Find More Mods"
-msgstr "Trova più mod"
+msgstr "Trova Più Moduli"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
@@ -191,11 +227,11 @@ msgstr "Non è stata fornita alcuna descrizione del gioco."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No hard dependencies"
-msgstr "Nessuna dipendenza"
+msgstr "Nessuna dipendenza necessaria"
#: builtin/mainmenu/dlg_config_world.lua
msgid "No modpack description provided."
-msgstr "Non è stata fornita alcuna descrizione per il pacchetto mod."
+msgstr "Non è stata fornita alcuna descrizione per la raccolta di mod."
#: builtin/mainmenu/dlg_config_world.lua
msgid "No optional dependencies"
@@ -220,22 +256,22 @@ msgstr "abilitato"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
-msgstr "\"$1\" già esiste. Vuoi sovrascriverlo?"
+msgstr "\"$1\" esiste già. Vuoi sovrascriverlo?"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
-msgstr "Le dipendenze $1 e $2 verranno installate."
+msgstr "Le dipendenze $1 e $2 saranno installate."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
-msgstr "$1 di $2"
+msgstr "$1 con $2"
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
-"$1 in scaricamento,\n"
+"Scaricando $1,\n"
"$2 in coda"
#: builtin/mainmenu/dlg_contentstore.lua
@@ -244,15 +280,15 @@ msgstr "Scaricando $1..."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
-msgstr "Le dipendeze richieste per $1 non sono state trovate."
+msgstr "$1 impossibile trovare le dipendeze necessarie."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
-msgstr "$1 verrà installato, e $2 dipendenze verranno ignorate."
+msgstr "$1 sarà installato, e $2 dipendenze verranno ignorate."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "All packages"
-msgstr "Tutti i pacchetti"
+msgstr "Tutti i contenuti"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Already installed"
@@ -264,11 +300,11 @@ msgstr "Torna al Menu Principale"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
-msgstr "Gioco base:"
+msgstr "Gioco di Base:"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "ContentDB is not available when Minetest was compiled without cURL"
-msgstr "ContentDB non è disponibile quando Minetest viene compilato senza cuRL"
+msgstr "ContentDB non è disponibile quando Minetest viene compilato senza cURL"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Downloading..."
@@ -279,7 +315,6 @@ msgid "Failed to download $1"
msgstr "Impossibile scaricare $1"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
msgstr "Giochi"
@@ -300,13 +335,12 @@ msgid "Install: Unsupported file type or broken archive"
msgstr "Installazione: Tipo di file non supportato o archivio danneggiato"
#: builtin/mainmenu/dlg_contentstore.lua
-#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Mods"
-msgstr "Mod"
+msgstr "Moduli"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No packages could be retrieved"
-msgstr "Non è stato possibile recuperare alcun pacchetto"
+msgstr "Non è stato possibile recuperare alcun contenuto"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No results"
@@ -326,7 +360,7 @@ msgstr "Sovrascrivi"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
-msgstr "Per favore, controlla che il gioco base sia corretto."
+msgstr "Per favore, controlla che il gioco di base sia corretto."
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Queued"
@@ -334,7 +368,7 @@ msgstr "In coda"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Texture packs"
-msgstr "Pacchetti texture"
+msgstr "Raccolte di texture"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Uninstall"
@@ -346,11 +380,11 @@ msgstr "Aggiorna"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
-msgstr "Aggiornat tutti [$1]"
+msgstr "Aggiorna Tutto [$1]"
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View more information in a web browser"
-msgstr "Visualizza ulteriori informazioni in un browser web"
+msgstr "Visualizza ulteriori informazioni in un browser Web"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
@@ -370,7 +404,7 @@ msgstr "Siccità da altitudine"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biome blending"
-msgstr "Miscelatura biomi"
+msgstr "Mescolamento biomi"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Biomes"
@@ -393,12 +427,9 @@ msgid "Decorations"
msgstr "Decorazioni"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download a game, such as Minetest Game, from minetest.net"
-msgstr "Scarica un gioco, come Minetest Game, da minetest.net"
-
-#: builtin/mainmenu/dlg_create_world.lua
-msgid "Download one from minetest.net"
-msgstr "Scaricane uno da minetest.net"
+#, fuzzy
+msgid "Development Test is meant for developers."
+msgstr "Avviso: Il Development Test è inteso per gli sviluppatori."
#: builtin/mainmenu/dlg_create_world.lua
msgid "Dungeons"
@@ -410,19 +441,15 @@ msgstr "Terreno piatto"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floating landmasses in the sky"
-msgstr "Pietre miliari fluttuanti nel cielo"
+msgstr "Regioni di terreno fluttuanti nel cielo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Floatlands (experimental)"
msgstr "Terre fluttuanti (sperimentale)"
-#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
-msgid "Game"
-msgstr "Gioco"
-
#: builtin/mainmenu/dlg_create_world.lua
msgid "Generate non-fractal terrain: Oceans and underground"
-msgstr "Generare terreno non-frattale: oceani e sottoterra"
+msgstr "Generare terreno non-frattale: oceani e spazio sotterraneo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Hills"
@@ -437,24 +464,33 @@ msgid "Increases humidity around rivers"
msgstr "Aumenta l'umidità attorno ai fiumi"
#: builtin/mainmenu/dlg_create_world.lua
+#, fuzzy
+msgid "Install a game"
+msgstr "Installa $1"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Install another game"
+msgstr ""
+
+#: builtin/mainmenu/dlg_create_world.lua
msgid "Lakes"
msgstr "Laghi"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Low humidity and high heat causes shallow or dry rivers"
-msgstr "Bassa umidità e calore elevato producono fiumi bassi o secchi"
+msgstr "Bassa umidità e calore elevato rendono i fiumi bassi o secchi"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr "Generatore mappa"
+msgstr "generatore della mappatura del terreno"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr "Valori del generatore mappa"
+msgstr "Valori del generatore della mappatura del terreno"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mapgen-specific flags"
-msgstr "Valori specifici del generatore di mappe"
+msgstr "Valori specifici del generatore della mappatura del terreno"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mountains"
@@ -462,7 +498,7 @@ msgstr "Montagne"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Mud flow"
-msgstr "Colata di fango"
+msgstr "Scorrimento fangoso"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Network of tunnels and caves"
@@ -538,11 +574,6 @@ msgid "Very large caverns deep in the underground"
msgstr "Caverne davvero grandi in profondità sottoterra"
#: builtin/mainmenu/dlg_create_world.lua
-msgid "Warning: The Development Test is meant for developers."
-msgstr ""
-"Avvertimento: il Minimal Development Test è inteso per gli sviluppatori."
-
-#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
msgstr "Nome del mondo"
@@ -558,11 +589,11 @@ msgstr "Siete sicuri di volere cancellare \"$1\"?"
#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua
#: src/client/keycode.cpp
msgid "Delete"
-msgstr "Cancella"
+msgstr "Rimuovi"
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: failed to delete \"$1\""
-msgstr "pkgmgr: non è stato possibile cancellare \"$1\""
+msgstr "pkgmgr: non è stato possibile eliminare \"$1\""
#: builtin/mainmenu/dlg_delete_content.lua
msgid "pkgmgr: invalid path \"$1\""
@@ -570,27 +601,60 @@ msgstr "pkgmgr: percorso non valido \"$1\""
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
-msgstr "Cancellare il mondo \"$1\"?"
+msgstr "Eliminare il mondo \"$1\"?"
+
+#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Conferma la password"
+
+#: builtin/mainmenu/dlg_register.lua
+msgid "Joining $1"
+msgstr ""
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Missing name"
+msgstr "Nome del generatore mappa"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Name"
+msgstr "Nome"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua
+#: builtin/mainmenu/tab_online.lua
+msgid "Password"
+msgstr "Password"
+
+#: builtin/mainmenu/dlg_register.lua
+#, fuzzy
+msgid "Passwords do not match"
+msgstr "Le password non corrispondono!"
+
+#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Register"
+msgstr "Registrati e accedi"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Accept"
-msgstr "Accetta"
+msgstr "Conferma"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr "Rinomina il pacchetto mod:"
+msgstr "Rinomina la raccolta di mod:"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid ""
"This modpack has an explicit name given in its modpack.conf which will "
"override any renaming here."
msgstr ""
-"Questo pacchetto mod esplicita un nome in modpack.conf che sovrascriverà "
-"ogni modifica qui effettuata."
+"Questa raccolta di mod esplicita un nome fornito in modpack.conf che "
+"sovrascriverà ogni modifica del nome qui effettuata."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr "(Nessuna descrizione o impostazione data)"
+msgstr "(Nessuna descrizione fornita per l'impostazione)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "2D Noise"
@@ -598,11 +662,21 @@ msgstr "Rumore 2D"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr "< Torna a Impostazioni"
+msgstr "< Torna alla pagina Impostazioni"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr "Scorri"
+msgstr "Esplora"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Games"
+msgstr "Contenuto"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
+msgid "Content: Mods"
+msgstr "Contenuto"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua
msgid "Disabled"
@@ -642,25 +716,25 @@ msgstr "Per favore inserisci un numero valido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr "Ripristina"
+msgstr "Ripristina predefinito"
#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Scale"
-msgstr "Scala"
+msgstr "Ridimensiona"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
-msgstr "Cerca"
+msgstr "Ricerca"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select directory"
-msgstr "Scegli la cartella"
+msgstr "Scegli l'indirizzo"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select file"
-msgstr "Scegli il file"
+msgstr "Scegli un file"
-#: builtin/mainmenu/dlg_settings_advanced.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp
msgid "Show technical names"
msgstr "Mostra i nomi tecnici"
@@ -670,7 +744,7 @@ msgstr "Il valore deve essere almeno $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must not be larger than $1."
-msgstr "Il valore deve essere più piccolo di $1."
+msgstr "Il valore non deve essere più grande di $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "X"
@@ -702,14 +776,14 @@ msgstr "Propagazione Z"
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "absvalue"
-msgstr "'absvalue'"
+msgstr "\"absvalue\""
#. ~ "defaults" is a noise parameter flag.
#. It describes the default processing options
#. for noise settings in main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "defaults"
-msgstr "'defaults'"
+msgstr "\"defaults\""
#. ~ "eased" is a noise parameter flag.
#. It is used to make the map smoother and
@@ -717,37 +791,37 @@ msgstr "'defaults'"
#. main menu -> "All Settings".
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "eased"
-msgstr "'eased'"
+msgstr "\"eased\""
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 (Enabled)"
-msgstr "$1 (abilitato)"
+msgstr "$1 (Attivato)"
#: builtin/mainmenu/pkgmgr.lua
msgid "$1 mods"
-msgstr "$1 mod"
+msgstr "$1 moduli"
#: builtin/mainmenu/pkgmgr.lua
msgid "Failed to install $1 to $2"
-msgstr "Impossibile installare $1 in $2"
+msgstr "installazione fallita di $1 a $2"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find real mod name for: $1"
-msgstr "Installa mod: Impossibile trovare il vero nome del mod per: $1"
+msgstr "Installa Modulo: Impossibile trovare il nome vero del mod per: $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Install Mod: Unable to find suitable folder name for modpack $1"
msgstr ""
-"Installa mod: Impossibile trovare un nome cartella corretto per il pacchetto "
-"mod $1"
+"Installa Modulo: Impossibile trovare un nome della cartella adeguato per la "
+"raccolta di mod $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to find a valid mod or modpack"
-msgstr "Impossibile trovare un mod o un pacchetto mod validi"
+msgstr "Impossibile trovare un mod o una raccolta di mod validi"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a $1 as a texture pack"
-msgstr "Impossibile installare un $1 come un pacchetto texture"
+msgstr "Impossibile installare un $1 come una raccolta di texture"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a game as a $1"
@@ -759,7 +833,7 @@ msgstr "Impossibile installare un mod come un $1"
#: builtin/mainmenu/pkgmgr.lua
msgid "Unable to install a modpack as a $1"
-msgstr "Impossibile installare un pacchetto mod come un $1"
+msgstr "Impossibile installare una raccolta di mod come un $1"
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
@@ -767,41 +841,41 @@ msgstr "Caricamento..."
#: builtin/mainmenu/serverlistmgr.lua
msgid "Public server list is disabled"
-msgstr "La lista dei server pubblici è disabilitata"
+msgstr "L'elenco dei server pubblici è disabilitato"
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
"Prova a riabilitare l'elenco dei server pubblici e controlla la tua "
-"connessione internet."
+"connessione Internet."
#: builtin/mainmenu/tab_about.lua
msgid "About"
-msgstr "Riguardo a"
+msgstr "Informazioni"
#: builtin/mainmenu/tab_about.lua
msgid "Active Contributors"
-msgstr "Contributori attivi"
+msgstr "Contributori Attivi"
#: builtin/mainmenu/tab_about.lua
msgid "Active renderer:"
-msgstr "Rendering Attivo:"
+msgstr "Algoritmo di resa attivo:"
#: builtin/mainmenu/tab_about.lua
msgid "Core Developers"
-msgstr "Sviluppatori principali"
+msgstr "Sviluppatori Principali"
#: builtin/mainmenu/tab_about.lua
msgid "Open User Data Directory"
-msgstr "Apri la cartella dei dati utente"
+msgstr "Apri l'Indirizzo dei Dati Utente"
#: builtin/mainmenu/tab_about.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
-"Apre la cartella che contiene mondi, giochi, mod e pacchetti \n"
-"texture forniti dall'utente in un gestore di file / explorer."
+"Apre l'indirizzo contenente mondi, giochi, mod e raccolte di\n"
+"textures forniti dall'utente in un gestore / visualizzatore di file ."
#: builtin/mainmenu/tab_about.lua
msgid "Previous Contributors"
@@ -809,19 +883,24 @@ msgstr "Contributori precedenti"
#: builtin/mainmenu/tab_about.lua
msgid "Previous Core Developers"
-msgstr "Sviluppatori principali precedenti"
+msgstr "Sviluppatori Principali Precedenti"
+
+#: builtin/mainmenu/tab_about.lua
+#, fuzzy
+msgid "Share debug log"
+msgstr "Mostra le informazioni di debug"
#: builtin/mainmenu/tab_content.lua
msgid "Browse online content"
-msgstr "Mostra contenuti online"
+msgstr "Esplora i contenuti online"
#: builtin/mainmenu/tab_content.lua
msgid "Content"
-msgstr "Contenuti"
+msgstr "Contenuto"
#: builtin/mainmenu/tab_content.lua
msgid "Disable Texture Pack"
-msgstr "Disattiva pacchetto texture"
+msgstr "Disattiva la Raccolta di Texture"
#: builtin/mainmenu/tab_content.lua
msgid "Information:"
@@ -829,7 +908,7 @@ msgstr "Informazioni:"
#: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:"
-msgstr "Pacchetti installati:"
+msgstr "Contenuti Installati:"
#: builtin/mainmenu/tab_content.lua
msgid "No dependencies."
@@ -837,7 +916,7 @@ msgstr "Nessuna dipendenza."
#: builtin/mainmenu/tab_content.lua
msgid "No package description available"
-msgstr "Nessuna descrizione disponibile per la raccolta"
+msgstr "Nessuna descrizione disponibile per il contenuto"
#: builtin/mainmenu/tab_content.lua
msgid "Rename"
@@ -845,44 +924,40 @@ msgstr "Rinomina"
#: builtin/mainmenu/tab_content.lua
msgid "Uninstall Package"
-msgstr "Disinstalla pacchetto"
+msgstr "Disinstalla il Contenuto"
#: builtin/mainmenu/tab_content.lua
msgid "Use Texture Pack"
-msgstr "Usa pacchetto texture"
+msgstr "Utilizza la Raccolta di Textures"
#: builtin/mainmenu/tab_local.lua
msgid "Announce Server"
-msgstr "Annunciare il server"
+msgstr "Annunciare il Server"
#: builtin/mainmenu/tab_local.lua
msgid "Bind Address"
-msgstr "Legare indirizzo"
+msgstr "Indirizzo Incorporato"
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
-msgstr "Modalità creativa"
+msgstr "Modalità Creativa"
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
-msgstr "Abilita il ferimento"
+msgstr "Abilita il Ferimento"
#: builtin/mainmenu/tab_local.lua
msgid "Host Game"
-msgstr "Ospita un gioco"
+msgstr "Ospita un Gioco"
#: builtin/mainmenu/tab_local.lua
msgid "Host Server"
-msgstr "Ospita un server"
+msgstr "Ospita un Server"
#: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB"
msgstr "Installa giochi da ContentDB"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Name"
-msgstr "Nome"
-
#: builtin/mainmenu/tab_local.lua
msgid "New"
msgstr "Nuovo"
@@ -891,10 +966,6 @@ msgstr "Nuovo"
msgid "No world created or selected!"
msgstr "Nessun mondo creato o selezionato!"
-#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua
-msgid "Password"
-msgstr "Password"
-
#: builtin/mainmenu/tab_local.lua
msgid "Play Game"
msgstr "Avvia il gioco"
@@ -905,15 +976,15 @@ msgstr "Porta"
#: builtin/mainmenu/tab_local.lua
msgid "Select Mods"
-msgstr "Seleziona mod"
+msgstr "Seleziona i Moduli"
#: builtin/mainmenu/tab_local.lua
msgid "Select World:"
-msgstr "Seleziona mondo:"
+msgstr "Seleziona il Mondo:"
#: builtin/mainmenu/tab_local.lua
msgid "Server Port"
-msgstr "Porta del server"
+msgstr "Porta del Server"
#: builtin/mainmenu/tab_local.lua
msgid "Start Game"
@@ -928,22 +999,13 @@ msgid "Clear"
msgstr "Canc"
#: builtin/mainmenu/tab_online.lua
-msgid "Connect"
-msgstr "Connettiti"
-
-#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr "Modalità creativa"
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua
-#, fuzzy
msgid "Damage / PvP"
-msgstr "Ferimento"
-
-#: builtin/mainmenu/tab_online.lua
-msgid "Del. Favorite"
-msgstr "Elimina preferito"
+msgstr "Ferimento / PvP"
#: builtin/mainmenu/tab_online.lua
msgid "Favorites"
@@ -955,7 +1017,11 @@ msgstr "Server Incompatibili"
#: builtin/mainmenu/tab_online.lua
msgid "Join Game"
-msgstr "Gioca online"
+msgstr "Unisciti al Gioco"
+
+#: builtin/mainmenu/tab_online.lua
+msgid "Login"
+msgstr ""
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
@@ -970,8 +1036,17 @@ msgid "Refresh"
msgstr "Ricarica"
#: builtin/mainmenu/tab_online.lua
+#, fuzzy
+msgid "Remove favorite"
+msgstr "Porta remota"
+
+#: builtin/mainmenu/tab_online.lua
msgid "Server Description"
-msgstr "Descrizione del server"
+msgstr "Descrizione del Server"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "(game support required)"
+msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -991,39 +1066,40 @@ msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
msgid "All Settings"
-msgstr "Tutte le impostazioni"
+msgstr "Tutte le Impostazioni"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr "Antialiasing:"
+msgstr "Anti-Scalettatura:"
#: builtin/mainmenu/tab_settings.lua
msgid "Autosave Screen Size"
-msgstr "Ricorda dim. finestra"
+msgstr "Ricorda Dim. Finestra"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr "Filtro bilineare"
+msgstr "Filtro Bilineare"
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
msgid "Change Keys"
-msgstr "Cambia i tasti"
+msgstr "Cambia i Tasti"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr "Vetro contiguo"
+msgstr "Vetro Contiguo"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Dynamic shadows"
-msgstr "Ombre dinamiche"
+msgstr "Ombre Dinamiche"
#: builtin/mainmenu/tab_settings.lua
-msgid "Dynamic shadows: "
+#, fuzzy
+msgid "Dynamic shadows:"
msgstr "Ombre dinamiche: "
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr "Foglie di qualità"
+msgstr "Foglie di Qualità"
#: builtin/mainmenu/tab_settings.lua
msgid "High"
@@ -1039,27 +1115,27 @@ msgstr "Medio"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr "Mipmap"
+msgstr "MIP map"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr "Mipmap + Filtro aniso."
+msgstr "Mipmap + Filtro Aniso."
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr "Nessun filtro"
+msgstr "Nessun Filtro"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr "Nessuna mipmap"
+msgstr "Nessuna Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr "Evidenzia nodi"
+msgstr "Evidenziatura dei Nodi"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr "Profilo nodi"
+msgstr "Profilo dei Nodi"
#: builtin/mainmenu/tab_settings.lua
msgid "None"
@@ -1067,11 +1143,11 @@ msgstr "Nessuno"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
-msgstr "Foglie opache"
+msgstr "Foglie Opache"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Water"
-msgstr "Acqua opaca"
+msgstr "Acqua Opaca"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
@@ -1087,11 +1163,11 @@ msgstr "Impostazioni"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr "Shaders"
+msgstr "Shader"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (experimental)"
-msgstr "Shader (sperimentali)"
+msgstr "Shaders (sperimentali)"
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
@@ -1099,31 +1175,33 @@ msgstr "Shaders (non disponibili)"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr "Foglie semplici"
+msgstr "Foglie Semplici"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr "Luce uniforme"
+msgstr "Illuminazione Uniforme"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr "Resa immagini:"
+msgstr "Resa Immagini:"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr "Tone Mapping"
+msgstr "Mappatura del Tono"
#: builtin/mainmenu/tab_settings.lua
-msgid "Touchthreshold: (px)"
-msgstr "Soglia tocco: (px)"
+#, fuzzy
+msgid "Touch threshold (px):"
+msgstr "Soglia del Tocco: (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr "Filtro trilineare"
+msgstr "Filtro Trilineare"
#: builtin/mainmenu/tab_settings.lua
-msgid "Ultra High"
-msgstr "Molto Alto"
+#, fuzzy
+msgid "Very High"
+msgstr "Ultra"
#: builtin/mainmenu/tab_settings.lua
msgid "Very Low"
@@ -1131,15 +1209,20 @@ msgstr "Molto Basso"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr "Foglie ondeggianti"
+msgstr "Foglie Ondeggianti"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
-msgstr "Liquidi ondeggianti"
+msgstr "Liquidi Ondeggianti"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr "Piante ondeggianti"
+msgstr "Piante Ondeggianti"
+
+#: src/client/client.cpp
+#, fuzzy
+msgid "Connection aborted (protocol error?)."
+msgstr "Errore di connessione (scaduta?)"
#: src/client/client.cpp src/client/game.cpp
msgid "Connection timed out."
@@ -1151,19 +1234,19 @@ msgstr "Fatto!"
#: src/client/client.cpp
msgid "Initializing nodes"
-msgstr "Inizializzazione nodi"
+msgstr "Inizializzando i nodi"
#: src/client/client.cpp
msgid "Initializing nodes..."
-msgstr "Inizializzazione nodi..."
+msgstr "Inizializzando i nodi..."
#: src/client/client.cpp
msgid "Loading textures..."
-msgstr "Caricando le texture..."
+msgstr "Caricando le textures..."
#: src/client/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Ricostruzione shader..."
+msgstr "Ricostruendo le shaders..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -1171,15 +1254,15 @@ msgstr "Errore di connessione (scaduta?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game: "
-msgstr "Impossibile trovare o caricare il gioco \" "
+msgstr "Impossibile trovare o caricare il gioco: "
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr "Requisiti gioco non validi."
+msgstr "Requisiti del gioco non validi."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
-msgstr "Menu principale"
+msgstr "Menu Principale"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
@@ -1187,7 +1270,7 @@ msgstr "Nessun mondo selezionato e nessun indirizzo fornito. Nulla da fare."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr "Nome giocatore troppo lungo."
+msgstr "Nome del giocatore troppo lungo."
#: src/client/clientlauncher.cpp
msgid "Please choose a name!"
@@ -1195,11 +1278,11 @@ msgstr "Per favore scegli un nome!"
#: src/client/clientlauncher.cpp
msgid "Provided password file failed to open: "
-msgstr "Impossibile aprire il file password fornito: "
+msgstr "Impossibile aprire il file di password fornito: "
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr "Il percorso fornito per il mondo non esiste: "
+msgstr "Il percorso del mondo fornito non esiste: "
#: src/client/game.cpp
msgid ""
@@ -1232,11 +1315,11 @@ msgstr "- PvP: "
#: src/client/game.cpp
msgid "- Server Name: "
-msgstr "- Nome server: "
+msgstr "- Nome del Server: "
#: src/client/game.cpp
msgid "A serialization error occurred:"
-msgstr "Un errore di serializzazione si è verificato:"
+msgstr "Si è verificato un errore di serializzazione:"
#: src/client/game.cpp
#, c-format
@@ -1253,7 +1336,7 @@ msgstr "Avanzamento automatico abilitato"
#: src/client/game.cpp
msgid "Block bounds hidden"
-msgstr "Limiti del blocco nascosto"
+msgstr "Limiti del blocco nascosti"
#: src/client/game.cpp
msgid "Block bounds shown for all blocks"
@@ -1269,29 +1352,30 @@ msgstr "I limiti del blocco sono mostrati per i blocchi vicini"
#: src/client/game.cpp
msgid "Camera update disabled"
-msgstr "Aggiornamento telecamera disabilitato"
+msgstr "Aggiornamento della telecamera disabilitato"
#: src/client/game.cpp
msgid "Camera update enabled"
msgstr "Aggiornamento telecamera abilitato"
#: src/client/game.cpp
-msgid "Can't show block bounds (need 'basic_debug' privilege)"
+#, fuzzy
+msgid "Can't show block bounds (disabled by mod or game)"
msgstr ""
"Impossibile mostrare i limiti del blocco (si ha bisogno del privilegio "
-"'baisc_debug')"
+"'basic_debug')"
#: src/client/game.cpp
msgid "Change Password"
-msgstr "Cambia password"
+msgstr "Cambia la Password"
#: src/client/game.cpp
msgid "Cinematic mode disabled"
-msgstr "Modalità cinematica disabilitata"
+msgstr "Modalità cinematica disattiva"
#: src/client/game.cpp
msgid "Cinematic mode enabled"
-msgstr "Modalità cinematica abilitata"
+msgstr "Modalità cinematica attiva"
#: src/client/game.cpp
msgid "Client disconnected"
@@ -1336,13 +1420,13 @@ msgstr ""
"- %s: arretra\n"
"- %s: sinistra\n"
"- %s: destra\n"
-"- %s: salta/arrampicati\n"
+"- %s: salta/scala su\n"
"- %s: scava/colpisci\n"
-"- %s: piazza/usa\n"
+"- %s: piazza/utilizza\n"
"- %s: furtivo/scendi\n"
-"- %s: lascia oggetto\n"
+"- %s: getta via oggetto\n"
"- %s: inventario\n"
-"- Mouse: gira/guarda\n"
+"- Mouse: girati/guarda\n"
"- Rotella mouse: scegli oggetto\n"
"- %s: chat\n"
@@ -1353,11 +1437,11 @@ msgstr "Impossibile risolvere l'indirizzo: %s"
#: src/client/game.cpp
msgid "Creating client..."
-msgstr "Creazione client..."
+msgstr "Creazione del client..."
#: src/client/game.cpp
msgid "Creating server..."
-msgstr "Creazione server..."
+msgstr "Creazione del server..."
#: src/client/game.cpp
msgid "Debug info and profiler graph hidden"
@@ -1369,7 +1453,7 @@ msgstr "Info debug mostrate"
#: src/client/game.cpp
msgid "Debug info, profiler graph, and wireframe hidden"
-msgstr "Info debug, grafico profiler, e struttura nascosti"
+msgstr "Info debug, grafico profiler e struttura a fili nascosti"
#: src/client/game.cpp
msgid ""
@@ -1386,18 +1470,18 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
-"Controlli predefiniti:\n"
+"Controlli Predefiniti:\n"
"Nessun menu visibile:\n"
"- tocco singolo: attiva pulsante\n"
-"- tocco doppio; piazza/usa\n"
-"- trascina: guarda attorno\n"
+"- tocco doppio; piazza/utilizza\n"
+"- trascina il dito: guarda attorno\n"
"Menu/Inventario visibile:\n"
-"- tocco doppio (esterno):\n"
+"- doppio tocco (esterno):\n"
" -->chiudi\n"
"- tocco pila, tocco casella:\n"
" --> sposta pila\n"
-"- tocco e trascina, tocco 2° dito\n"
-" --> piazza singolo oggetto in casella\n"
+"- tocca e trascina, tocco 2° dito\n"
+" --> piazza oggetto singolo nella casella\n"
#: src/client/game.cpp
msgid "Disabled unlimited viewing range"
@@ -1408,8 +1492,13 @@ msgid "Enabled unlimited viewing range"
msgstr "Raggio visivo illimitato abilitato"
#: src/client/game.cpp
+#, fuzzy, c-format
+msgid "Error creating client: %s"
+msgstr "Creazione del client..."
+
+#: src/client/game.cpp
msgid "Exit to Menu"
-msgstr "Torna al menu"
+msgstr "Menu Principale"
#: src/client/game.cpp
msgid "Exit to OS"
@@ -1425,7 +1514,7 @@ msgstr "Modalità rapida abilitata"
#: src/client/game.cpp
msgid "Fast mode enabled (note: no 'fast' privilege)"
-msgstr "Modalità rapida abilitata (nota: niente privilegio 'fast')"
+msgstr "Modalità rapida abilitata (nota: privilegio 'fast' mancante)"
#: src/client/game.cpp
msgid "Fly mode disabled"
@@ -1437,19 +1526,19 @@ msgstr "Modalità volo abilitata"
#: src/client/game.cpp
msgid "Fly mode enabled (note: no 'fly' privilege)"
-msgstr "Modalità volo abilitata (nota: niente privilegio 'fly')"
+msgstr "Modalità volo abilitata (nota: privilegio 'fly' mancante)"
#: src/client/game.cpp
msgid "Fog disabled"
-msgstr "Nebbia disabilitata"
+msgstr "Nebbia disattivata"
#: src/client/game.cpp
msgid "Fog enabled"
-msgstr "Nebbia abilitata"
+msgstr "Nebbia attivata"
#: src/client/game.cpp
msgid "Game info:"
-msgstr "Info gioco:"
+msgstr "Informazioni del gioco:"
#: src/client/game.cpp
msgid "Game paused"
@@ -1457,11 +1546,11 @@ msgstr "Gioco in pausa"
#: src/client/game.cpp
msgid "Hosting server"
-msgstr "Server ospite"
+msgstr "Server ospitante"
#: src/client/game.cpp
msgid "Item definitions..."
-msgstr "Definizioni oggetti..."
+msgstr "Definizione degli oggetti..."
#: src/client/game.cpp
msgid "KiB/s"
@@ -1477,11 +1566,11 @@ msgstr "MiB/s"
#: src/client/game.cpp
msgid "Minimap currently disabled by game or mod"
-msgstr "Minimappa attualmente disabilitata dal gioco o da una mod"
+msgstr "Minimappa attualmente disabilitata dal gioco o da un modulo"
#: src/client/game.cpp
msgid "Multiplayer"
-msgstr "Multi giocatore"
+msgstr "Multigiocatore"
#: src/client/game.cpp
msgid "Noclip mode disabled"
@@ -1493,11 +1582,11 @@ msgstr "Modalità incorporea abilitata"
#: src/client/game.cpp
msgid "Noclip mode enabled (note: no 'noclip' privilege)"
-msgstr "Modalità incorporea abilitata (nota: niente privilegio 'noclip')"
+msgstr "Modalità incorporea abilitata (nota: privilegio 'noclip' mancante)"
#: src/client/game.cpp
msgid "Node definitions..."
-msgstr "Definizioni nodi..."
+msgstr "Definizione dei nodi..."
#: src/client/game.cpp
msgid "Off"
@@ -1525,11 +1614,11 @@ msgstr "Server remoto"
#: src/client/game.cpp
msgid "Resolving address..."
-msgstr "Risoluzione indirizzo..."
+msgstr "Risoluzione dell'indirizzo..."
#: src/client/game.cpp
msgid "Shutting down..."
-msgstr "Chiusura..."
+msgstr "Uscita dal gioco..."
#: src/client/game.cpp
msgid "Singleplayer"
@@ -1537,7 +1626,7 @@ msgstr "Gioco locale"
#: src/client/game.cpp
msgid "Sound Volume"
-msgstr "Volume suono"
+msgstr "Volume del Suono"
#: src/client/game.cpp
msgid "Sound muted"
@@ -1549,7 +1638,7 @@ msgstr "Il sistema audio è disabilitato"
#: src/client/game.cpp
msgid "Sound system is not supported on this build"
-msgstr "Il sistema audio non è supportato su questa build"
+msgstr "Il sistema audio non è supportato su questa compilazione"
#: src/client/game.cpp
msgid "Sound unmuted"
@@ -1592,7 +1681,7 @@ msgstr "Volume cambiato a %d%%"
#: src/client/game.cpp
msgid "Wireframe shown"
-msgstr "Struttura visualizzata"
+msgstr "Struttura a fili visualizzata"
#: src/client/game.cpp
msgid "Zoom currently disabled by game or mod"
@@ -1608,7 +1697,7 @@ msgstr "Chat nascosta"
#: src/client/gameui.cpp
msgid "Chat shown"
-msgstr "Chat visualizzata"
+msgstr "Chat mostrata"
#: src/client/gameui.cpp
msgid "HUD hidden"
@@ -1620,28 +1709,28 @@ msgstr "HUD visibile"
#: src/client/gameui.cpp
msgid "Profiler hidden"
-msgstr "Profiler nascosto"
+msgstr "Profilatore nascosto"
#: src/client/gameui.cpp
#, c-format
msgid "Profiler shown (page %d of %d)"
-msgstr "Profiler visualizzato (pagina %d di %d)"
+msgstr "Profilatore visualizzato (pagina %d di %d)"
#: src/client/keycode.cpp
msgid "Apps"
-msgstr "App"
+msgstr "Applicazioni"
#: src/client/keycode.cpp
msgid "Backspace"
-msgstr "Indietro"
+msgstr "Tasto di ritorno"
#: src/client/keycode.cpp
msgid "Caps Lock"
-msgstr "Blocca maiusc."
+msgstr "Blocco Maiusc."
#: src/client/keycode.cpp
msgid "Control"
-msgstr "Ctrl"
+msgstr "Control"
#: src/client/keycode.cpp
msgid "Down"
@@ -1669,27 +1758,27 @@ msgstr "Inizio"
#: src/client/keycode.cpp
msgid "IME Accept"
-msgstr "IME Accept"
+msgstr "Accetta IME"
#: src/client/keycode.cpp
msgid "IME Convert"
-msgstr "IME Convert"
+msgstr "Converti IME"
#: src/client/keycode.cpp
msgid "IME Escape"
-msgstr "Esc"
+msgstr "Ritorno da IME"
#: src/client/keycode.cpp
msgid "IME Mode Change"
-msgstr "IME Mode Change"
+msgstr "Cambia Modalità IME"
#: src/client/keycode.cpp
msgid "IME Nonconvert"
-msgstr "IME Nonconvert"
+msgstr "Non Convertire IME"
#: src/client/keycode.cpp
msgid "Insert"
-msgstr "Ins"
+msgstr "Inserisci"
#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp
msgid "Left"
@@ -1697,23 +1786,23 @@ msgstr "Sinistra"
#: src/client/keycode.cpp
msgid "Left Button"
-msgstr "Pulsante sinistro"
+msgstr "Pulsante Sinistro"
#: src/client/keycode.cpp
msgid "Left Control"
-msgstr "Ctrl sinistro"
+msgstr "Control Sinistro"
#: src/client/keycode.cpp
msgid "Left Menu"
-msgstr "Alt sinistro"
+msgstr "Menu Sinistro"
#: src/client/keycode.cpp
msgid "Left Shift"
-msgstr "Maiusc sinistro"
+msgstr "Shift Sinistro"
#: src/client/keycode.cpp
msgid "Left Windows"
-msgstr "Windows sinistro"
+msgstr "Windows Sinistro"
#. ~ Key name, common on Windows keyboards
#: src/client/keycode.cpp
@@ -1722,7 +1811,7 @@ msgstr "Menu"
#: src/client/keycode.cpp
msgid "Middle Button"
-msgstr "Pulsante centrale"
+msgstr "Pulsante Centrale"
#: src/client/keycode.cpp
msgid "Num Lock"
@@ -1806,7 +1895,7 @@ msgstr "Pausa"
#: src/client/keycode.cpp
msgid "Play"
-msgstr "Play"
+msgstr "Avvia"
#. ~ "Print screen" key
#: src/client/keycode.cpp
@@ -1912,37 +2001,13 @@ msgstr "Impossibile aprire la pagina web"
msgid "Opening webpage"
msgstr "Apertura pagina web"
-#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp
-msgid "Passwords do not match!"
-msgstr "Le password non corrispondono!"
-
-#: src/gui/guiConfirmRegistration.cpp
-msgid "Register and Join"
-msgstr "Registrati e accedi"
-
-#: src/gui/guiConfirmRegistration.cpp
-#, c-format
-msgid ""
-"You are about to join this server with the name \"%s\" for the first time.\n"
-"If you proceed, a new account using your credentials will be created on this "
-"server.\n"
-"Please retype your password and click 'Register and Join' to confirm account "
-"creation, or click 'Cancel' to abort."
-msgstr ""
-"Stai per accedere a questo server col nome \"%s\" per la prima volta. \n"
-"Se prosegui, su questo server sarà creato un nuovo account usando le tue "
-"credenziali.\n"
-"Per favore reinserisci la tua password e premi Registrati e accedi per "
-"confermare la creazione dell'account, o premi Annulla per interrompere."
-
#: src/gui/guiFormSpecMenu.cpp
msgid "Proceed"
msgstr "Prosegui"
#: src/gui/guiKeyChangeMenu.cpp
-#, fuzzy
msgid "\"Aux1\" = climb down"
-msgstr "\"Speciale\" = scendi"
+msgstr "\"Speciale\" = discendi"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Autoforward"
@@ -1954,7 +2019,7 @@ msgstr "Salto automatico"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Aux1"
-msgstr ""
+msgstr "Speciale"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Backward"
@@ -1968,7 +2033,7 @@ msgstr "Limiti del blocco nascosto"
msgid "Change camera"
msgstr "Cambia vista"
-#: src/gui/guiKeyChangeMenu.cpp
+#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Chat"
msgstr "Chat"
@@ -2021,9 +2086,8 @@ msgid "Key already in use"
msgstr "Tasto già usato"
#: src/gui/guiKeyChangeMenu.cpp
-msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgid "Keybindings."
msgstr ""
-"Associamenti tasti. (Se questo menu si incasina, togli roba da minetest.conf)"
#: src/gui/guiKeyChangeMenu.cpp
msgid "Local command"
@@ -2094,10 +2158,6 @@ msgid "Change"
msgstr "Cambia"
#: src/gui/guiPasswordChange.cpp
-msgid "Confirm Password"
-msgstr "Conferma la password"
-
-#: src/gui/guiPasswordChange.cpp
msgid "New Password"
msgstr "Nuova password"
@@ -2105,6 +2165,10 @@ msgstr "Nuova password"
msgid "Old Password"
msgstr "Vecchia password"
+#: src/gui/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Le password non corrispondono!"
+
#: src/gui/guiVolumeChange.cpp
msgid "Exit"
msgstr "Uscita"
@@ -2118,12 +2182,6 @@ msgstr "Silenziato"
msgid "Sound Volume: %d%%"
msgstr "Volume suono: %d%%"
-#. ~ Imperative, as in "Enter/type in text".
-#. Don't forget the space.
-#: src/gui/modalMenu.cpp
-msgid "Enter "
-msgstr "Inserisci "
-
#. ~ DO NOT TRANSLATE THIS LITERALLY!
#. This is a special string which needs to contain the translation's
#. language code (e.g. "de" for German).
@@ -2131,6 +2189,16 @@ msgstr "Inserisci "
msgid "LANG_CODE"
msgstr "it"
+#: src/network/clientpackethandler.cpp
+msgid ""
+"Name is not registered. To create an account on this server, click 'Register'"
+msgstr ""
+
+#: src/network/clientpackethandler.cpp
+#, fuzzy
+msgid "Name is taken. Please choose another name"
+msgstr "Per favore scegli un nome!"
+
#: src/settings_translation_file.cpp
msgid ""
"(Android) Fixes the position of virtual joystick.\n"
@@ -2140,14 +2208,13 @@ msgstr ""
"Se disabilitato, il joystick sarà centrato alla posizione del primo tocco."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"(Android) Use virtual joystick to trigger \"Aux1\" button.\n"
"If enabled, virtual joystick will also tap \"Aux1\" button when out of main "
"circle."
msgstr ""
-"(Android) Usa il joystick virtuale per attivare il pulsante \"aux\".\n"
-"Se abilitato, inoltre il joystick virtuale premerà il pulsante \"aux\" "
+"(Android) Usa il joystick virtuale per attivare il pulsante \"Speciale\".\n"
+"Se abilitato, inoltre, il joystick virtuale premerà il pulsante \"Speciale\" "
"quando fuori dal cerchio principale."
#: src/settings_translation_file.cpp
@@ -2305,6 +2372,10 @@ msgstr ""
"Si noti che la modalità intrecciata richiede l'abilitazione degli shader."
#: src/settings_translation_file.cpp
+msgid "3d"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
@@ -2377,8 +2448,8 @@ msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
-"Regola la configurazione dpi per il tuo schermo (solo non X11/Android) per "
-"es. per schermi 4K."
+"Regolate la configurazione dpi per il vostro schermo (solo non X11/Android) "
+"per es. per schermi 4K."
#: src/settings_translation_file.cpp
msgid "Adjust the detected display density, used for scaling UI elements."
@@ -2395,15 +2466,20 @@ msgid ""
"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n"
"to be sure) creates a solid floatland layer."
msgstr ""
-"Aggiusta la densità dello strato della terra fluttuante.\n"
+"Calibra la densità dello strato della terra fluttuante.\n"
"Si aumenti il valore per aumentare la densità. Può essere positivo o "
"negativo.\n"
"Valore = 0.0: 50% del volume è terra fluttuante.\n"
"Value = 2.0 (può essere maggiore dipendentemente da 'mgv7_np_floatland', "
-"provate sempre\n"
+"provare sempre\n"
"per essere sicuri) crea uno strato solido di terre fluttuanti."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Admin name"
+msgstr "Posponi nome oggetto"
+
+#: src/settings_translation_file.cpp
msgid "Advanced"
msgstr "Avanzate"
@@ -2423,7 +2499,8 @@ msgstr ""
"ha pochissimo effetto sulla luce notturna naturale."
#: src/settings_translation_file.cpp
-msgid "Always fly and fast"
+#, fuzzy
+msgid "Always fly fast"
msgstr "Sempre volo e veloce"
#: src/settings_translation_file.cpp
@@ -2503,6 +2580,10 @@ msgstr ""
"Fissata in blocchi mappa (16 nodi)."
#: src/settings_translation_file.cpp
+msgid "Audio"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Automatic forward key"
msgstr "Tasto di avanzamento automatico"
@@ -2523,14 +2604,12 @@ msgid "Autoscaling mode"
msgstr "Modalità scalamento automatico"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Aux1 key"
-msgstr "Tasto salta"
+msgstr "Tasto Speciale"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Aux1 key for climbing/descending"
-msgstr "Tasto speciale per arrampicarsi/scendere"
+msgstr "Tasto Speciale per scendere/immergersi"
#: src/settings_translation_file.cpp
msgid "Backward key"
@@ -2545,10 +2624,6 @@ msgid "Base terrain height."
msgstr "Altezza base del terreno."
#: src/settings_translation_file.cpp
-msgid "Basic"
-msgstr "Base"
-
-#: src/settings_translation_file.cpp
msgid "Basic privileges"
msgstr "Privilegi di base"
@@ -2569,7 +2644,8 @@ msgid "Bind address"
msgstr "Lega indirizzo"
#: src/settings_translation_file.cpp
-msgid "Biome API temperature and humidity noise parameters"
+#, fuzzy
+msgid "Biome API noise parameters"
msgstr "Parametri di rumore dell'API dei biomi per temperatura e umidità"
#: src/settings_translation_file.cpp
@@ -2581,6 +2657,10 @@ msgid "Block send optimize distance"
msgstr "Distanza di ottimizzazione dell'invio dei blocchi"
#: src/settings_translation_file.cpp
+msgid "Bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bold and italic font path"
msgstr "Percorso dei caratteri in grassetto e corsivo"
@@ -2605,6 +2685,11 @@ msgid "Builtin"
msgstr "Incorporato"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Camera"
+msgstr "Cambia vista"
+
+#: src/settings_translation_file.cpp
msgid ""
"Camera 'near clipping plane' distance in nodes, between 0 and 0.25\n"
"Only works on GLES platforms. Most users will not need to change this.\n"
@@ -2682,9 +2767,10 @@ msgstr ""
"Dove 0.0 è il livello di luce minimo, 1.0 è il livello di luce massimo."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat command time message threshold"
-msgstr "Limite dei messaggi di chat per l'espulsione"
+msgstr ""
+"Limite di tempo per il completamento di un comando, oltre cui mostrare un "
+"messaggio nella chat"
#: src/settings_translation_file.cpp
msgid "Chat commands"
@@ -2723,9 +2809,8 @@ msgid "Chat toggle key"
msgstr "Tasto di (dis)attivazione della chat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat weblinks"
-msgstr "Chat visualizzata"
+msgstr "Collegamenti a siti Web nella chat"
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -2741,7 +2826,7 @@ msgstr "Tasto modalità cinematic"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
-msgstr "Pulizia delle texture trasparenti"
+msgstr "Pulizia delle textures trasparenti"
#: src/settings_translation_file.cpp
msgid ""
@@ -2772,6 +2857,11 @@ msgid "Client side node lookup range restriction"
msgstr "Restrizione dell'area di ricerca dei nodi su lato client"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Client-side Modding"
+msgstr "Modifica del client"
+
+#: src/settings_translation_file.cpp
msgid "Climbing speed"
msgstr "Velocità di arrampicata"
@@ -2809,7 +2899,7 @@ msgid ""
"These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/"
msgstr ""
-"Elenco di valori separato da virgole che si vuole nascondere dall'archivio "
+"Elenco di valori separato da virgole che si vuole nascondere dal deposito "
"dei contenuti.\n"
"\"nonfree\" può essere usato per nascondere pacchetti che non si "
"qualificano\n"
@@ -2843,36 +2933,30 @@ msgid "Command key"
msgstr "Tasto comando"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Compression level to use when saving mapblocks to disk.\n"
"-1 - use default compression level\n"
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
-"Livello di compressione ZLib da utilizzare quando si salvano i blocchi mappa "
-"su disco.\n"
-"-1 - Livello di compressione predefinito di Zlib\n"
-"0 - nessuna compressione, più veloce\n"
-"9 - migliore compressione, più lenta\n"
-"(i livelli 1-3 usano il metodo \"veloce\" di Zlib, 4-9 usano il metodo "
-"normale)"
+"Livello di compressione da utilizzare durante il salvataggio dei blocchi-"
+"mappa su disco.\n"
+"-1 - utilizza il livello di compressione predefinito\n"
+"0 - compressione minima, più veloce\n"
+"9 - compressione migliore, più lento"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Compression level to use when sending mapblocks to the client.\n"
"-1 - use default compression level\n"
"0 - least compression, fastest\n"
"9 - best compression, slowest"
msgstr ""
-"Livello di compressione ZLib da utilizzare quando si inviano i blocchi mappa "
-"al client.\n"
-"-1 - Livello di compressione predefinito di Zlib\n"
-"0 - nessuna compressione, più veloce\n"
-"9 - migliore compressione, più lenta\n"
-"(i livelli 1-3 usano il metodo \"veloce\" di Zlib, 4-9 usano il metodo "
-"normale)"
+"Livello di compressione da utilizzare per l'invio dei blocchi-mappa al "
+"client.\n"
+"-1 - utilizza il livello di compressione predefinito\n"
+"0 - compressione minima, più veloce\n"
+"9 - compressione migliore, più lento"
#: src/settings_translation_file.cpp
msgid "Connect glass"
@@ -2899,6 +2983,11 @@ msgid "Console height"
msgstr "Altezza della console"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Content Repository"
+msgstr "Deposito dei contenuti in linea"
+
+#: src/settings_translation_file.cpp
msgid "ContentDB Flag Blacklist"
msgstr "Contenuti esclusi da ContentDB"
@@ -2938,8 +3027,10 @@ msgstr ""
"72 = 20min, 360 = 4min, 1 = 24ore, 0 = giorno/notte/ecc. restano invariati."
#: src/settings_translation_file.cpp
-msgid "Controls sinking speed in liquid."
-msgstr "Controlla la velocità di affondamento nei liquidi."
+msgid ""
+"Controls sinking speed in liquid when idling. Negative values will cause\n"
+"you to rise instead."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
@@ -2974,13 +3065,12 @@ msgid "Crosshair alpha"
msgstr "Trasparenza del mirino"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
"This also applies to the object crosshair."
msgstr ""
"Trasparenza del mirino (opacità, tra 0 e 255).\n"
-"Controlla anche il colore del mirino dell'oggetto"
+"Lo stesso si applica al mirino dell'oggetto."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
@@ -3015,12 +3105,12 @@ msgid "Debug log level"
msgstr "Livello del registro di debug"
#: src/settings_translation_file.cpp
-msgid "Dec. volume key"
-msgstr "Tasto dim. volume"
+msgid "Debugging"
+msgstr ""
#: src/settings_translation_file.cpp
-msgid "Decrease this to increase liquid resistance to movement."
-msgstr "Decrementalo per aumentare la resistenza al movimento nel liquido."
+msgid "Dec. volume key"
+msgstr "Tasto dim. volume"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
@@ -3180,6 +3270,11 @@ msgid "Desynchronize block animation"
msgstr "De-sincronizza l'animazione del blocco"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Developer Options"
+msgstr "Decorazioni"
+
+#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr "Tasto scava"
@@ -3200,6 +3295,12 @@ msgid "Display Density Scaling Factor"
msgstr "Fattore di Scala della densità del display"
#: src/settings_translation_file.cpp
+msgid ""
+"Distance in nodes at which transparency depth sorting is enabled\n"
+"Use this to limit the performance impact of transparency depth sorting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
msgstr "Nome di dominio del server, da mostrarsi nell'elenco dei server."
@@ -3279,6 +3380,10 @@ msgid "Enable joysticks"
msgstr "Abilitare i joystick"
#: src/settings_translation_file.cpp
+msgid "Enable joysticks. Requires a restart to take effect"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable mod channels support."
msgstr "Abilita il supporto canali mod."
@@ -3297,18 +3402,6 @@ msgstr ""
"i test)."
#: src/settings_translation_file.cpp
-msgid "Enable register confirmation"
-msgstr "Abilita conferma registrazione"
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Enable register confirmation when connecting to server.\n"
-"If disabled, new account will be registered automatically."
-msgstr ""
-"Abilita la conferma della registrazione quando ci si connette al server.\n"
-"Se disabilitata, i nuovi account saranno registrati automaticamente."
-
-#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -3317,6 +3410,10 @@ msgstr ""
"Disattivarla per velocizzare o per un aspetto diverso."
#: src/settings_translation_file.cpp
+msgid "Enable split login/register"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Enable to disallow old clients from connecting.\n"
"Older clients are compatible in the sense that they will not crash when "
@@ -3341,7 +3438,7 @@ msgstr ""
"server).\n"
"I server remoti offrono un sistema significativamente più rapido per "
"scaricare\n"
-"contenuti multimediali (es. texture) quando ci si connette al server."
+"contenuti multimediali (es. textures) quando ci si connette al server."
#: src/settings_translation_file.cpp
msgid ""
@@ -3413,6 +3510,14 @@ 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 ""
+"Consente compromessi che riducono il carico della CPU o aumentano le "
+"prestazioni di rendering\n"
+"a scapito di piccoli difetti visivi che non influiscono sulla giocabilità."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiler"
+msgstr "Profilo valli"
#: src/settings_translation_file.cpp
msgid "Engine profiling data print interval"
@@ -3441,6 +3546,10 @@ msgstr ""
"pianure più piatte, adatti a uno strato solido di terre fluttuanti."
#: src/settings_translation_file.cpp
+msgid "FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "FPS when unfocused or paused"
msgstr "FPS quando il gioco è in pausa o in secondo piano"
@@ -3477,13 +3586,12 @@ msgid "Fast movement"
msgstr "Movimento rapido"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Fast movement (via the \"Aux1\" key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
-"Movimento rapido (tramite il tasto \"speciale\").\n"
-"Richiede il privilegio \"fast\" sul server."
+"Movimento rapido (tramite il tasto \"Speciale\").\n"
+"Richiede il privilegio \"fast\" sul server di gioco."
#: src/settings_translation_file.cpp
msgid "Field of view"
@@ -3499,7 +3607,7 @@ msgid ""
"the\n"
"Multiplayer Tab."
msgstr ""
-"File in client/serverlist/ contenente i tuoi server preferiti mostrati "
+"File in client/serverlist/ contenente i vostri server preferiti mostrati "
"nella\n"
"scheda di gioco in rete."
@@ -3513,26 +3621,28 @@ msgstr "Profondità di rumore dello riempitore"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr "Filmic tone mapping"
+msgstr "Mappatura del tono filmica"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Filtered textures can blend RGB values with fully-transparent neighbors,\n"
"which PNG optimizers usually discard, often resulting in dark or\n"
"light edges to transparent textures. Apply a filter to clean that up\n"
"at texture load time. This is automatically enabled if mipmapping is enabled."
msgstr ""
-"Le texture a cui si applicano i filtri possono amalgamare i valori RGB con "
-"quelle vicine completamente trasparenti,\n"
-"che normalmente vengono scartati dagli ottimizzatori PNG, risultando a volte "
-"in texture trasparenti scure o\n"
-"dai bordi chiari. Applicare questo filtro aiuta a ripulire tutto ciò\n"
-"al momento del caricamento della texture."
+"Le textures a cui si applicano i filtri possono amalgamare i valori RGB con "
+"quelle vicine\n"
+"completamente trasparenti, che normalmente vengono scartati dagli "
+"ottimizzatori PNG, risultando\n"
+"spesso in bordi chiari o scuri per le textures trasparenti. Applicare un "
+"filtro per ripulire tutto ciò al\n"
+"caricamento delle texture. Viene attivato automaticamente se si abilita il "
+"mipmapping."
#: src/settings_translation_file.cpp
-msgid "Filtering"
-msgstr "Filtraggio"
+#, fuzzy
+msgid "Filtering and Antialiasing"
+msgstr "Anti-Scalettatura:"
#: src/settings_translation_file.cpp
msgid "First of 4 2D noises that together define hill/mountain range height."
@@ -3601,6 +3711,11 @@ msgid "Fog toggle key"
msgstr "Tasto (dis)attivazione nebbia"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Font"
+msgstr "Dimensione del carattere"
+
+#: src/settings_translation_file.cpp
msgid "Font bold by default"
msgstr "Carattere grassetto per impostazione predefinita"
@@ -3622,17 +3737,19 @@ msgstr "Dimensione del carattere"
#: src/settings_translation_file.cpp
msgid "Font size divisible by"
-msgstr ""
+msgstr "Dimensione carattere divisibile per"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Dimensione carattere del carattere predefinito, in punti (pt)."
+msgstr ""
+"Dimensione carattere del carattere predefinito, dove 1 unità equivale ad 1 "
+"pixel a DPI 96"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"
-msgstr "Dimensione carattere del carattere a spaziatura fissa, in punti (pt)."
+msgstr ""
+"Dimensione carattere del carattere a spaziatura fissa, dove 1 unità equivale "
+"ad 1 pixel a DPI 96"
#: src/settings_translation_file.cpp
msgid ""
@@ -3653,6 +3770,14 @@ msgid ""
"be\n"
"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."
msgstr ""
+"Assicura che le grandezze utilizzate con questo carattere saranno sempre "
+"divisibili per questo\n"
+"valore, in pixel, in caso di caratteri in stile pixel che non vengono "
+"ridimensionati correttamente.\n"
+"Per esempio, un carattere pixelato alto 16 pixels richiederebbe che questo "
+"sia 16, così sarà sempre\n"
+"solo grande 16, 32, 48, etc., e una mod che richiede una grandezza di 25 "
+"otterrà 32."
#: src/settings_translation_file.cpp
msgid ""
@@ -3717,7 +3842,8 @@ msgstr "Tipo di frattale"
#: src/settings_translation_file.cpp
msgid "Fraction of the visible distance at which fog starts to be rendered"
msgstr ""
-"Frazione della distanza visibile alla quale si comincia a disegnare la nebbia"
+"Frazione della distanza visibile oltre cui si comincia a renderizzare la "
+"nebbia"
#: src/settings_translation_file.cpp
msgid ""
@@ -3771,21 +3897,33 @@ msgid "GUI scaling filter txr2img"
msgstr "Filtro di scala txr2img"
#: src/settings_translation_file.cpp
+msgid "GUIs"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Gamepads"
+msgstr "Giochi"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Global callbacks"
msgstr "Callback globali"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and jungle grass, in all other mapgens this flag controls all decorations."
msgstr ""
"Attributi globali di generazione della mappa.\n"
-"In Mapgen v6 il valore 'decorations' controlla tutte le decorazioni eccetto "
+"Nel Mapgen v6 il valore 'decorations' controlla tutte le decorazioni eccetto "
"alberi\n"
-"ed erba della giungla, in tutti gli altri questa opzione controlla tutte le "
-"decorazioni."
+"ed erba della giungla, in tutti gli altri Mapgens questa opzione controlla "
+"tutte le decorazioni."
#: src/settings_translation_file.cpp
msgid ""
@@ -3808,6 +3946,16 @@ msgid "Graphics"
msgstr "Grafica"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics Effects"
+msgstr "Grafica"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Graphics and Audio"
+msgstr "Grafica"
+
+#: src/settings_translation_file.cpp
msgid "Gravity"
msgstr "Gravità"
@@ -3824,8 +3972,13 @@ msgid "HTTP mods"
msgstr "Moduli HTTP"
#: src/settings_translation_file.cpp
-msgid "HUD scale factor"
-msgstr "Fattore di scala dell'HUD"
+msgid "HUD"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "HUD scaling"
+msgstr "Scala dell'interfaccia grafica"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -4080,19 +4233,28 @@ msgid ""
"If negative, liquid waves will move backwards.\n"
"Requires waving liquids to be enabled."
msgstr ""
-"Con quale velocità si muovono le onde dei liquidi. Più alto = più veloce.\n"
-"Se negativo, le onde dei liquidi si sposteranno all'indietro.\n"
-"Richiede l'abilitazione dei liquidi ondulanti."
+"A quale velocità si muovono le onde dei liquidi. Maggiore = più veloce.\n"
+"Se negativa, le onde dei liquidi si sposteranno all'indietro.\n"
+"Richiede l'abilitazione dei liquidi ondeggianti."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"How much the server will wait before unloading unused mapblocks.\n"
+"How long the server will wait before unloading unused mapblocks, stated in "
+"seconds.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
"Quanto aspetterà il server prima di scaricare i blocchi mappa inutilizzati.\n"
"Con un valore più alto sarà più fluido, ma userà più RAM."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"How much you are slowed down when moving inside a liquid.\n"
+"Decrease this to increase liquid resistance to movement."
+msgstr "Decrementalo per aumentare la resistenza al movimento nel liquido."
+
+#: src/settings_translation_file.cpp
msgid "How wide to make rivers."
msgstr "Quanto fare larghi i fiumi."
@@ -4125,12 +4287,12 @@ msgstr ""
"per non sprecare la potenza della CPU senza alcun beneficio."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n"
"enabled."
msgstr ""
-"Se disabilitata, si usa il tasto \"speciale\" per volare velocemente,\n"
+"Se disabilitata, viene utilizzato il tasto \"Speciale\" per volare "
+"velocemente\n"
"se le modalità volo e corsa sono entrambe attive."
#: src/settings_translation_file.cpp
@@ -4160,15 +4322,23 @@ msgstr ""
"Richiede il privilegio \"noclip\" sul server."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down "
"and\n"
"descending."
msgstr ""
-"Se abilitata, si usa il tasto \"speciale\" invece di \"furtivo\" per "
-"arrampicarsi e\n"
-"scendere."
+"Se abilitata, viene utilizzato il tasto \"Speciale\" invece di \"Furtivo\" "
+"per\n"
+"scendere e immergersi."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"If enabled, account registration is separate from login in the UI.\n"
+"If disabled, new accounts will be registered automatically when logging in."
+msgstr ""
+"Abilita la conferma della registrazione quando ci si connette al server.\n"
+"Se disabilitata, i nuovi account saranno registrati automaticamente."
#: src/settings_translation_file.cpp
msgid ""
@@ -4200,7 +4370,10 @@ msgstr ""
"giocatore quando vola o nuota."
#: src/settings_translation_file.cpp
-msgid "If enabled, new players cannot join with an empty password."
+#, fuzzy
+msgid ""
+"If enabled, players cannot join without a password or change theirs to an "
+"empty password."
msgstr ""
"Se abilitata, i nuovi giocatori non possono accedere con una password vuota."
@@ -4255,10 +4428,6 @@ msgid "Ignore world errors"
msgstr "Ignorare gli errori del mondo"
#: src/settings_translation_file.cpp
-msgid "In-Game"
-msgstr "Nel gioco"
-
-#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
"Trasparenza dello sfondo della console di chat nel gioco (opacità, tra 0 e "
@@ -4289,7 +4458,6 @@ msgstr ""
"Questo normalmente serve solo ai contributori principali"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Instrument chat commands on registration."
msgstr "Predisporre i comandi della chat alla registrazione."
@@ -4320,17 +4488,14 @@ msgid "Instrument the methods of entities on registration."
msgstr "Predisporre i metodi delle entità alla registrazione."
#: src/settings_translation_file.cpp
-msgid "Instrumentation"
-msgstr "Predisposizione"
-
-#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervallo di salvataggio dei cambiamenti importanti nel mondo, fissato in "
"secondi."
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+#, fuzzy
+msgid "Interval of sending time of day to clients, stated in seconds."
msgstr "Intervallo di invio dell'ora del giorno ai client."
#: src/settings_translation_file.cpp
@@ -4387,9 +4552,8 @@ msgid "Joystick button repetition interval"
msgstr "Intervallo di ripetizione del pulsante del joystick"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Joystick dead zone"
-msgstr "Deadzone joystick"
+msgstr "Punto cieco joystick"
#: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity"
@@ -4451,19 +4615,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Julia w"
-msgstr "Julia w"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Julia x"
-msgstr "Julia x"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Julia y"
-msgstr "Julia y"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Julia z"
-msgstr "Julia z"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Jump key"
@@ -5192,6 +5356,10 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+msgid "Keyboard and Mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Kick players who sent more than X messages per 10 seconds."
msgstr ""
"Allontana i giocatori che hanno inviato più di X messaggi in 10 secondi."
@@ -5250,10 +5418,11 @@ msgid "Left key"
msgstr "Tasto sin."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over\n"
-"network."
+"network, stated in seconds."
msgstr ""
"Durata di uno scatto del server e intervallo con cui gli oggetti\n"
"sono aggiornati in generale sulla rete."
@@ -5267,20 +5436,27 @@ msgstr ""
"Richiede l'attivazione dei liquidi ondeggianti."
#: src/settings_translation_file.cpp
-msgid "Length of time between Active Block Modifier (ABM) execution cycles"
+#, fuzzy
+msgid ""
+"Length of time between Active Block Modifier (ABM) execution cycles, stated "
+"in seconds."
msgstr ""
"Durata di tempo tra i cicli di esecuzione dei modificatori dei blocchi "
"attivi (ABM)"
#: src/settings_translation_file.cpp
-msgid "Length of time between NodeTimer execution cycles"
+#, fuzzy
+msgid "Length of time between NodeTimer execution cycles, stated in seconds."
msgstr "Intervallo di tempo tra l'esecuzione dei cicli del NodeTimer"
#: src/settings_translation_file.cpp
-msgid "Length of time between active block management cycles"
+#, fuzzy
+msgid ""
+"Length of time between active block management cycles, stated in seconds."
msgstr "Durata di tempo tra cicli di gestione del blocco attivo"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Level of logging to be written to debug.txt:\n"
"- <nothing> (no logging)\n"
@@ -5289,7 +5465,8 @@ msgid ""
"- warning\n"
"- action\n"
"- info\n"
-"- verbose"
+"- verbose\n"
+"- trace"
msgstr ""
"Livello di registro da scriversi su debug.txt:\n"
"- <niente> (nessun registro)\n"
@@ -5325,6 +5502,11 @@ msgid "Light curve low gradient"
msgstr "Gradiente basso della curva di luce"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Lighting"
+msgstr "Illuminazione Uniforme"
+
+#: src/settings_translation_file.cpp
msgid ""
"Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n"
"Only mapchunks completely within the mapgen limit are generated.\n"
@@ -5431,7 +5613,7 @@ msgstr "Livello di compressione della mappa per il trasferimento in rete"
#: src/settings_translation_file.cpp
msgid "Map directory"
-msgstr "Cartella della mappa"
+msgstr "Indirizzo della mappa"
#: src/settings_translation_file.cpp
msgid "Map generation attributes specific to Mapgen Carpathian."
@@ -5785,10 +5967,6 @@ msgid "Maximum users"
msgstr "Utenti massimi"
#: src/settings_translation_file.cpp
-msgid "Menus"
-msgstr "Menu"
-
-#: src/settings_translation_file.cpp
msgid "Mesh cache"
msgstr "Cache mesh"
@@ -5835,16 +6013,29 @@ msgstr "Dimensione minima della texture"
#: src/settings_translation_file.cpp
msgid "Mipmapping"
-msgstr "Mipmapping"
+msgstr "MIP mapping"
+
+#: src/settings_translation_file.cpp
+msgid "Misc"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Profiler"
+msgstr "Generatore di profili"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Mod Security"
+msgstr "Sicurezza"
#: src/settings_translation_file.cpp
msgid "Mod channels"
msgstr "Canali mod"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Modifies the size of the HUD elements."
-msgstr "Modifica la dimensione degli elementi della barra dell'HUD."
+msgstr "Modifica la dimensione degli elementi dello HUD."
#: src/settings_translation_file.cpp
msgid "Monospace font path"
@@ -5855,9 +6046,8 @@ msgid "Monospace font size"
msgstr "Dimensione del carattere a spaziatura fissa"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Monospace font size divisible by"
-msgstr "Dimensione del carattere a spaziatura fissa"
+msgstr "Dimensione del carattere a spaziatura fissa divisibile per"
#: src/settings_translation_file.cpp
msgid "Mountain height noise"
@@ -5938,10 +6128,6 @@ msgid "Near plane"
msgstr "Piano vicino"
#: src/settings_translation_file.cpp
-msgid "Network"
-msgstr "Rete"
-
-#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
@@ -5950,6 +6136,11 @@ msgstr ""
"Questo valore verrà scavalcato quando si avvia dal menu principale."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Networking"
+msgstr "Rete"
+
+#: src/settings_translation_file.cpp
msgid "New users need to input this password."
msgstr "I nuovi utenti devono immettere questa password."
@@ -5962,6 +6153,11 @@ msgid "Noclip key"
msgstr "Tasto incorporeo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Node and Entity Highlighting"
+msgstr "Evidenziatura dei Nodi"
+
+#: src/settings_translation_file.cpp
msgid "Node highlighting"
msgstr "Evidenziamento nodo"
@@ -6017,10 +6213,6 @@ msgstr ""
"consumo di memoria (4096 = 100MB, come regola generale)."
#: src/settings_translation_file.cpp
-msgid "Online Content Repository"
-msgstr "Deposito dei contenuti in linea"
-
-#: src/settings_translation_file.cpp
msgid "Opaque liquids"
msgstr "Liquidi opachi"
@@ -6044,17 +6236,12 @@ msgid "Optional override for chat weblink color."
msgstr "Sovrascrittura opzionale per i colori dei link web in chat."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path of the fallback font. Must be a TrueType font.\n"
"This font will be used for certain languages or if the default font is "
"unavailable."
msgstr ""
-"Percorso del carattere di riserva.\n"
-"Se l'impostazione \"freetype\" è abilitata: deve essere un carattere "
-"TrueType.\n"
-"Se l'impostazione \"freetype\" è disabilitata: deve essere un carattere "
-"bitmap o XML vettoriale.\n"
+"Percorso del carattere di riserva. Deve essere un carattere TrueType.\n"
"Questo carattere verrà utilizzato per alcune lingue o se il carattere "
"predefinito non è disponibile."
@@ -6072,40 +6259,31 @@ msgid ""
"Path to shader directory. If no path is defined, default location will be "
"used."
msgstr ""
-"Percorso della cartella degli shader. Se non se ne stabilisce nessuno, verrà "
+"Percorso dell'indirizzo degli shader. Se non se ne stabilisce nessuno, verrà "
"usato quello predefinito."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
msgstr ""
-"Percorso della cartella contenente le texture. Tutte le texture vengono "
+"Percorso dell'indirizzo contenente le textures. Tutte le textures vengono "
"cercate a partire da qui."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path to the default font. Must be a TrueType font.\n"
"The fallback font will be used if the font cannot be loaded."
msgstr ""
-"Percorso del carattere predefinito.\n"
-"Se l'impostazione \"freetype\" è abilitata: deve essere un carattere "
-"TrueType.\n"
-"Se l'impostazione \"freetype\" è disabilitata: deve essere un carattere "
-"bitmap o XML vettoriale.\n"
+"Percorso del carattere predefinito. Deve essere un carattere TrueType.\n"
"Il carattere di riserva verrà utilizzato se il carattere non può essere "
"caricato."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Path to the monospace font. Must be a TrueType font.\n"
"This font is used for e.g. the console and profiler screen."
msgstr ""
-"Percorso del carattere a spaziatura fissa.\n"
-"Se l'impostazione \"freetype\" è abilitata: deve essere un carattere "
+"Percorso del carattere a spaziatura fissa. Deve essere un carattere "
"TrueType.\n"
-"Se l'impostazione \"freetype\" è disabilitata: deve essere un carattere "
-"bitmap o XML vettoriale.\n"
"Questo carattere viene utilizzato ad es. per la console e lo schermo del "
"profilatore."
@@ -6150,10 +6328,6 @@ msgstr ""
"Ciò richiede il privilegio \"fly\" sul server."
#: src/settings_translation_file.cpp
-msgid "Player name"
-msgstr "Nome del giocatore"
-
-#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr "Distanza di trasferimento del giocatore"
@@ -6211,15 +6385,10 @@ msgid "Profiler toggle key"
msgstr "Tasto di (dis)attivazione del generatore di profili"
#: src/settings_translation_file.cpp
-msgid "Profiling"
-msgstr "Generazione di profili"
-
-#: src/settings_translation_file.cpp
msgid "Prometheus listener address"
msgstr "Indirizzo del listener Prometheus"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Prometheus listener address.\n"
"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n"
@@ -6227,7 +6396,7 @@ msgid ""
"Metrics can be fetched on http://127.0.0.1:30000/metrics"
msgstr ""
"Indirizzo del listener Prometheus.\n"
-"Se Minetest viene compilato con l'opzione ENABLE_PROMETHEUS abilitata,\n"
+"Se Minetest viene compilato con l'opzione ENABLE_PROMETHEUS attivata,\n"
"abilita il listener delle statistiche per Prometheus su quell'indirizzo.\n"
"Le statistiche possono essere recuperate su http://127.0.0.1:30000/metrics"
@@ -6414,6 +6583,11 @@ msgstr ""
"quando le immagini sono ridimensionate per valori frazionari."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screen"
+msgstr "Schermo:"
+
+#: src/settings_translation_file.cpp
msgid "Screen height"
msgstr "Altezza dello schermo"
@@ -6444,6 +6618,11 @@ msgstr ""
"Usa 0 per la qualità predefinita."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Screenshots"
+msgstr "Screenshot"
+
+#: src/settings_translation_file.cpp
msgid "Seabed noise"
msgstr "Rumore del fondale marino"
@@ -6458,10 +6637,6 @@ msgid "Second of two 3D noises that together define tunnels."
msgstr "Secondo di due rumori 3D che assieme definiscono le gallerie."
#: src/settings_translation_file.cpp
-msgid "Security"
-msgstr "Sicurezza"
-
-#: src/settings_translation_file.cpp
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "Si veda http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -6520,8 +6695,19 @@ msgstr ""
"18 = 4D Serie Julia \"Mandelbulb\"."
#: src/settings_translation_file.cpp
-msgid "Server / Singleplayer"
-msgstr "Server / Gioco locale"
+#, fuzzy
+msgid "Server"
+msgstr "URL del server"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Gameplay"
+msgstr "Nome del server"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server Security"
+msgstr "Descrizione del Server"
#: src/settings_translation_file.cpp
msgid "Server URL"
@@ -6548,10 +6734,20 @@ msgid "Server side occlusion culling"
msgstr "Occlusion culling su lato server"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Server/Env Performance"
+msgstr "Porta del Server"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist URL"
msgstr "URL dell'elenco dei server"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Serverlist and MOTD"
+msgstr "URL dell'elenco dei server"
+
+#: src/settings_translation_file.cpp
msgid "Serverlist file"
msgstr "File dell'elenco dei server"
@@ -6564,14 +6760,18 @@ msgstr ""
"Dopo avere modificato questa impostazione è necessario il riavvio."
#: src/settings_translation_file.cpp
-msgid "Set the maximum character length of a chat message sent by clients."
+#, fuzzy
+msgid ""
+"Set the maximum length of a chat message (in characters) sent by clients."
msgstr ""
"Imposta la lunghezza massima di caratteri di un messaggio di chat inviato "
"dai client."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Set the shadow strength.\n"
+"Set the shadow strength gamma.\n"
+"Adjusts the intensity of in-game dynamic shadows.\n"
"Lower value means lighter shadows, higher value means darker shadows."
msgstr ""
"Imposta l'intensità dell'ombra.\n"
@@ -6579,10 +6779,11 @@ msgstr ""
"ombre scure."
#: 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: 10.0"
+"Minimum value: 1.0; maximum value: 15.0"
msgstr ""
"Imposta la dimensione del raggio delle ombre morbide.\n"
"Valori bassi significano ombre nitide, valori alti significano ombre "
@@ -6684,7 +6885,8 @@ msgstr ""
"allora l'ombra non sarà disegnata."
#: src/settings_translation_file.cpp
-msgid "Shadow strength"
+#, fuzzy
+msgid "Shadow strength gamma"
msgstr "Intensità dell'ombra"
#: src/settings_translation_file.cpp
@@ -6708,9 +6910,8 @@ msgstr ""
"È necessario riavviare dopo aver cambiato questo."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Show name tag backgrounds by default"
-msgstr "Mostra lo sfondo del nome per impostazione predefinita"
+msgstr "Mostra lo sfondo dell'etichetta del nome per impostazione predefinita"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -6745,7 +6946,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Sky Body Orbit Tilt"
-msgstr ""
+msgstr "Inclinazione dell'orbita di un corpo celeste"
#: src/settings_translation_file.cpp
msgid "Slice w"
@@ -6939,6 +7140,11 @@ msgid "Temperature variation for biomes."
msgstr "Variazione di temperatura per i biomi."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Temporary Settings"
+msgstr "Impostazioni"
+
+#: src/settings_translation_file.cpp
msgid "Terrain alternative noise"
msgstr "Rumore alternativo del terreno"
@@ -7005,7 +7211,7 @@ msgid ""
"this option allows enforcing it for certain node types. Note though that\n"
"that is considered EXPERIMENTAL and may not work properly."
msgstr ""
-"Le texture su un nodo possono essere allineate sia al nodo che al mondo.\n"
+"Le textures su un nodo possono essere allineate sia al nodo che al mondo.\n"
"Il primo modo si addice meglio a cose come macchine, arredamento, ecc.,\n"
"mentre il secondo fa sì che scale e microblocchi si adattino meglio ai "
"dintorni.\n"
@@ -7019,9 +7225,8 @@ msgid "The URL for the content repository"
msgstr "L'URL per il deposito dei contenuti"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "The dead zone of the joystick"
-msgstr "La deadzone del joystick"
+msgstr "Il punto cieco del joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -7066,7 +7271,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
-msgstr "L'interfaccia di rete sulla quale il server ascolta."
+msgstr "Su quale interfaccia di rete sarà in ascolto il server."
#: src/settings_translation_file.cpp
msgid ""
@@ -7113,13 +7318,12 @@ msgstr ""
"(sperimentale)"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"The sensitivity of the joystick axes for moving the\n"
"in-game view frustum around."
msgstr ""
"La sensibilità degli assi del joystick per spostare\n"
-"il campo visivo durante il gioco."
+"il campo visivo nel gioco."
#: src/settings_translation_file.cpp
msgid ""
@@ -7183,10 +7387,10 @@ msgid ""
"enabled. Also the vertical distance over which humidity drops by 10 if\n"
"'altitude_dry' is enabled."
msgstr ""
-"La distanza verticale alla quale il calore crolla di 20 se \"altitude_chill"
-"\"\n"
-"è abilitata. È anche la distanza verticale su cui l'umidità crolla di 10\n"
-"se \"altitude_dry\" è abilitata."
+"La distanza verticale oltre la quale il calore diminuisce di 20 se "
+"\"altitude_chill\"\n"
+"è abilitata. Rappresenta anche la distanza verticale oltre cui l'umidità\n"
+"diminuisce di 10 se \"altitude_dry\" è abilitata."
#: src/settings_translation_file.cpp
msgid "Third of 4 2D noises that together define hill/mountain range height."
@@ -7217,7 +7421,8 @@ msgid "Time speed"
msgstr "Velocità del tempo"
#: src/settings_translation_file.cpp
-msgid "Timeout for client to remove unused map data from memory."
+#, fuzzy
+msgid "Timeout for client to remove unused map data from memory, in seconds."
msgstr ""
"Scadenza per il client per rimuovere dalla memoria dati mappa inutilizzati."
@@ -7246,7 +7451,16 @@ msgid "Touch screen threshold"
msgstr "Soglia del touch screen"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Touchscreen"
+msgstr "Soglia del touch screen"
+
+#: src/settings_translation_file.cpp
msgid "Tradeoffs for performance"
+msgstr "Compromessi per migliorare le prestazioni"
+
+#: src/settings_translation_file.cpp
+msgid "Transparency Sorting Distance"
msgstr ""
#: src/settings_translation_file.cpp
@@ -7322,24 +7536,24 @@ msgstr "Usare un'animazione con le nuvole per lo sfondo del menu principale."
#: src/settings_translation_file.cpp
msgid "Use anisotropic filtering when viewing at textures from an angle."
msgstr ""
-"Usare il filtraggio anisotropico quando si guardano le texture da "
+"Usare il filtraggio anisotropico quando si guardano le textures da "
"un'angolazione."
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
-msgstr "Usare il filtraggio bilineare quando si ridimensionano le texture."
+msgstr "Usare il filtraggio bilineare quando si ridimensionano le textures."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Use mipmapping to scale textures. May slightly increase performance,\n"
"especially when using a high resolution texture pack.\n"
"Gamma correct downscaling is not supported."
msgstr ""
-"Usare il mip mapping per ridimensionare le texture. Potrebbe aumentare "
+"Usare il mipmapping per ridimensionare le textures. Potrebbe aumentare "
"leggermente le prestazioni,\n"
-"specialmente quando si usa un pacchetto texture ad alta risoluzione.\n"
-"La correzione gamma del downscaling non è supportata."
+"specialmente quando si utilizza un pacchetto di texture ad alta "
+"risoluzione.\n"
+"Il ridimensionamento mediante downscaling gamma-corretto non è supportato."
#: src/settings_translation_file.cpp
msgid ""
@@ -7355,7 +7569,7 @@ msgstr ""
"blocco.\n"
"Questo algoritmo uniforma la visualizzazione 3D mantenendo l'immagine "
"nitida,\n"
-"ma non influenza l'interno delle texture\n"
+"ma non influenza l'interno delle textures\n"
"(che è particolarmente evidente con trame trasparenti).\n"
"Gli spazi visibili appaiono tra i nodi quando gli shader sono disabilitati.\n"
"Se impostato a 0, MSAA è disabilitato.\n"
@@ -7363,7 +7577,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Use trilinear filtering when scaling textures."
-msgstr "Usare il filtraggio trilineare quando si ridimensionano le texture."
+msgstr "Usare il filtraggio trilineare quando si ridimensionano le textures."
+
+#: src/settings_translation_file.cpp
+msgid "User Interfaces"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "VBO"
@@ -7463,9 +7681,8 @@ msgid "Viewing range"
msgstr "Raggio visivo"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Virtual joystick triggers Aux1 button"
-msgstr "Il joystick virtuale attiva il pulsante aux"
+msgstr "Il joystick virtuale aziona il pulsante \"Speciale\""
#: src/settings_translation_file.cpp
msgid "Volume"
@@ -7568,7 +7785,7 @@ msgstr ""
"Quando gui_scaling_filter_txr2img è Vero, copia quelle immagini\n"
"dall'hardware al software per il ridimensionamento. Quando è Falso,\n"
"ripiega sul vecchio metodo di ridimensionamento, per i driver video che\n"
-"non supportano correttamente lo scaricamento delle texture dall'hardware."
+"non supportano correttamente lo scaricamento delle textures dall'hardware."
#: src/settings_translation_file.cpp
msgid ""
@@ -7581,29 +7798,29 @@ msgid ""
"This is also used as the base node texture size for world-aligned\n"
"texture autoscaling."
msgstr ""
-"Quando si usano i filtri bilineare/trilineare/anisotropico, le texture a "
-"bassa risoluzione\n"
-"possono essere sfocate, così viene eseguito l'ingrandimento automatico con "
-"l'interpolazione nearest-neighbor\n"
-"per conservare pixel chiari. Questo imposta la dimensione minima delle "
-"texture\n"
-"per le texture ingrandite; valori più alti hanno un aspetto più nitido, ma "
-"richiedono più memoria.\n"
-"Sono raccomandate le potenze di 2. Questa impostazione è SOLO applicabile "
-"se\n"
-"il filtraggio bilineare/trilineare/anisotropico è abilitato.\n"
-"Questo viene anche usato come dimensione di base per le immagini\n"
-"dei nodi per l'autoridimensionamento delle immagini con allineamento\n"
-"relativo al mondo."
+"Quando si usano i filtri bilineare/trilineare/anisotropico, le textures a "
+"bassa risoluzione possono\n"
+"essere sfocate, così viene eseguito l'ingrandimento automatico con "
+"l'interpolazione\n"
+"nearest-neighbor per conservare la chiarezza dei pixels. Questa opzione "
+"imposta la dimensione\n"
+"minima per le textures ingrandite; valori superiori permettono un aspetto "
+"più nitido, ma richiedono\n"
+"più memoria. Sono raccomandate le potenze di 2. Questa impostazione si "
+"attiva SOLO SE il filtraggio\n"
+"bilineare/trilineare/anisotropico è abilitato.\n"
+"Viene anche utilizzata come dimensione di base delle texturesdei nodi per "
+"l'auto-ridimensionamento\n"
+"delle textures con allineamento relativo al mondo."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Whether name tag backgrounds should be shown by default.\n"
"Mods may still set a background."
msgstr ""
-"Se lo sfondo del nome deve essere mostrato per impostazione predefinita.\n"
-"I moderatori possono comunque impostare uno sfondo."
+"Se lo sfondo dell'etichetta del nome debba essere mostrato per impostazione "
+"predefinita.\n"
+"Le mod possono comunque impostare uno sfondo."
#: src/settings_translation_file.cpp
msgid "Whether node texture animations should be desynchronized per mapblock."
@@ -7629,7 +7846,7 @@ msgid ""
"Set this to true if your server is set up to restart automatically."
msgstr ""
"Se chiedere ai client di riconnettersi dopo un crash (Lua).\n"
-"Impostala su Vero se il tuo server è impostato per riavviarsi "
+"Impostatela su Vero se il vostro server è configurato per riavviarsi "
"automaticamente."
#: src/settings_translation_file.cpp
@@ -7651,6 +7868,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Whether to show technical names.\n"
+"Affects mods and texture packs in the Content and Select Mods menus, as well "
+"as\n"
+"setting names in All Settings.\n"
+"Controlled by the checkbox in the \"All settings\" menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
"Se mostrare le informazioni di debug del client (ha lo stesso effetto di "
@@ -7681,7 +7907,7 @@ msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
-"Cartella del mondo (ogni cosa nel mondo viene immagazzinata qui).\n"
+"Indirizzo del mondo (ogni cosa nel mondo viene immagazzinata qui).\n"
"Non necessaria se si avvia dal menu principale."
#: src/settings_translation_file.cpp
@@ -7697,19 +7923,19 @@ msgid ""
"See also texture_min_size.\n"
"Warning: This option is EXPERIMENTAL!"
msgstr ""
-"Le texture allineate al mondo possono essere ridimensionate per estendersi "
+"Le textures allineate al mondo possono essere ridimensionate per estendersi "
"su diversi nodi.\n"
-"Comunque, il server potrebbe non inviare la scala che vuoi, specialmente se "
-"usi un pacchetto texture\n"
-"progettato specificamente; con questa opzione, il client prova a stabilire "
-"automaticamente la scala\n"
-"basandosi sulla dimensione della texture.\n"
+"Tuttavia, il server potrebbe non inviare le dimensioni desiderate, "
+"specialmente se è in uso un\n"
+"pacchetto texture progettato in modo specifico; con questa opzione, il "
+"client prova a stabilire\n"
+"automaticamente le dimensioni basandosi sulla grandezza della texture.\n"
"Si veda anche texture_min_size.\n"
"Avviso: questa opzione è SPERIMENTALE!"
#: src/settings_translation_file.cpp
msgid "World-aligned textures mode"
-msgstr "Modalità texture allineate al mondo"
+msgstr "Modalità delle textures allineate al mondo"
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
@@ -7766,13 +7992,16 @@ msgid "Y-level of seabed."
msgstr "Livello Y del fondale marino."
#: src/settings_translation_file.cpp
+msgid "cURL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
msgstr "Scadenza cURL scaricamento file"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "cURL interactive timeout"
-msgstr "Scadenza cURL"
+msgstr "Scadenza interattiva cURL"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
@@ -7815,6 +8044,9 @@ msgstr "Limite parallelo cURL"
#~ msgid "Back"
#~ msgstr "Indietro"
+#~ msgid "Basic"
+#~ msgstr "Base"
+
#~ msgid "Bits per pixel (aka color depth) in fullscreen mode."
#~ msgstr "Bit per pixel (o profondità di colore) in modalità schermo intero."
@@ -7848,6 +8080,12 @@ msgstr "Limite parallelo cURL"
#~ msgid "Configure"
#~ msgstr "Configura"
+#~ msgid "Connect"
+#~ msgstr "Connettiti"
+
+#~ msgid "Controls sinking speed in liquid."
+#~ msgstr "Controlla la velocità di affondamento nei liquidi."
+
#~ msgid ""
#~ "Controls the density of mountain-type floatlands.\n"
#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value."
@@ -7894,6 +8132,9 @@ msgstr "Limite parallelo cURL"
#~ "Stabilisce il passo di campionamento della texture.\n"
#~ "Un valore maggiore dà normalmap più uniformi."
+#~ msgid "Del. Favorite"
+#~ msgstr "Elimina il Preferito"
+
#~ msgid ""
#~ "Deprecated, define and locate cave liquids using biome definitions "
#~ "instead.\n"
@@ -7903,12 +8144,21 @@ msgstr "Limite parallelo cURL"
#~ "posizionare le caverne di liquido.\n"
#~ "Limite verticale della lava nelle caverne grandi."
+#~ msgid "Download a game, such as Minetest Game, from minetest.net"
+#~ msgstr "Scarica un gioco, come Minetest Game, da minetest.net"
+
+#~ msgid "Download one from minetest.net"
+#~ msgstr "Scaricane uno da minetest.net"
+
#~ msgid "Downloading and installing $1, please wait..."
#~ msgstr "Scaricamento e installazione di $1, attendere prego..."
#~ msgid "Enable VBO"
#~ msgstr "Abilitare i VBO"
+#~ msgid "Enable register confirmation"
+#~ msgstr "Abilita conferma registrazione"
+
#~ msgid ""
#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the "
#~ "texture pack\n"
@@ -7936,6 +8186,9 @@ msgstr "Limite parallelo cURL"
#~ "Attiva la parallax occlusion mapping.\n"
#~ "Necessita l'attivazione degli shader."
+#~ msgid "Enter "
+#~ msgstr "Inserisci "
+
#~ msgid ""
#~ "Experimental option, might cause visible spaces between blocks\n"
#~ "when set to higher number than 0."
@@ -7955,6 +8208,9 @@ msgstr "Limite parallelo cURL"
#~ msgid "Fallback font size"
#~ msgstr "Dimensione del carattere di ripiego"
+#~ msgid "Filtering"
+#~ msgstr "Filtraggio"
+
#~ msgid "Floatland base height noise"
#~ msgstr "Rumore base dell'altezza delle terre fluttuanti"
@@ -7973,6 +8229,9 @@ msgstr "Limite parallelo cURL"
#~ msgid "Full screen BPP"
#~ msgstr "BPP dello schermo intero"
+#~ msgid "Game"
+#~ msgstr "Gioco"
+
#~ msgid "Gamma"
#~ msgstr "Gamma"
@@ -7982,15 +8241,30 @@ msgstr "Limite parallelo cURL"
#~ msgid "Generate normalmaps"
#~ msgstr "Generare le normalmap"
+#~ msgid "HUD scale factor"
+#~ msgstr "Fattore di scala dell'HUD"
+
#~ msgid "High-precision FPU"
#~ msgstr "FPU ad alta precisione"
#~ msgid "IPv6 support."
#~ msgstr "Supporto IPv6."
+#~ msgid "In-Game"
+#~ msgstr "Nel gioco"
+
#~ msgid "Install: file: \"$1\""
#~ msgstr "Install: File: \"$1\""
+#~ msgid "Instrumentation"
+#~ msgstr "Predisposizione"
+
+#~ msgid ""
+#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+#~ msgstr ""
+#~ "Associamenti tasti. (Se questo menu si incasina, togli roba da minetest."
+#~ "conf)"
+
#~ msgid "Lava depth"
#~ msgstr "Profondità della lava"
@@ -8009,6 +8283,9 @@ msgstr "Limite parallelo cURL"
#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
#~ msgstr "Fa lavorare DirectX con LuaJIT. Disabilitare se provoca problemi."
+#~ msgid "Menus"
+#~ msgstr "Menu"
+
#~ msgid "Minimap in radar mode, Zoom x2"
#~ msgstr "Minimappa in modalità radar, ingrandimento x2"
@@ -8083,6 +8360,12 @@ msgstr "Limite parallelo cURL"
#~ msgid "Path to save screenshots at."
#~ msgstr "Percorso dove salvare le schermate."
+#~ msgid "Player name"
+#~ msgstr "Nome del giocatore"
+
+#~ msgid "Profiling"
+#~ msgstr "Generazione di profili"
+
#~ msgid "Projecting dungeons"
#~ msgstr "Sotterranei protundenti"
@@ -8095,6 +8378,9 @@ msgstr "Limite parallelo cURL"
#~ msgid "Select Package File:"
#~ msgstr "Seleziona pacchetto file:"
+#~ msgid "Server / Singleplayer"
+#~ msgstr "Server / Gioco locale"
+
#~ msgid "Shadow limit"
#~ msgstr "Limite dell'ombra"
@@ -8175,6 +8461,21 @@ msgstr "Limite parallelo cURL"
#~ msgid "Yes"
#~ msgstr "Sì"
+#, c-format
+#~ msgid ""
+#~ "You are about to join this server with the name \"%s\" for the first "
+#~ "time.\n"
+#~ "If you proceed, a new account using your credentials will be created on "
+#~ "this server.\n"
+#~ "Please retype your password and click 'Register and Join' to confirm "
+#~ "account creation, or click 'Cancel' to abort."
+#~ msgstr ""
+#~ "Stai per accedere a questo server col nome \"%s\" per la prima volta. \n"
+#~ "Se prosegui, su questo server sarà creato un nuovo account usando le tue "
+#~ "credenziali.\n"
+#~ "Per favore reinserisci la tua password e premi Registrati e accedi per "
+#~ "confermare la creazione dell'account, o premi Annulla per interrompere."
+
#, fuzzy
#~ msgid "You died."
#~ msgstr "Sei morto"
diff --git a/po/ja/minetest.po b/po/ja/minetest.po
index 722f8a728..bb80f775a 100644
--- a/po/ja/minetest.po
+++ b/po/ja/minetest.po